@shware/http 2.4.4 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -35,9 +35,11 @@ __export(index_exports, {
35
35
  DetailType: () => import_detail.DetailType,
36
36
  Details: () => import_detail.Details,
37
37
  ISO_3601_1: () => import_iso_3601_1.ISO_3601_1,
38
+ Items: () => import_response.Items,
38
39
  LoginCanceledError: () => import_error.LoginCanceledError,
39
40
  LoginTimeoutError: () => import_error.LoginTimeoutError,
40
41
  MAX_LENGTH: () => MAX_LENGTH,
42
+ Pages: () => import_response.Pages,
41
43
  PurchaseError: () => import_error.PurchaseError,
42
44
  Status: () => import_status.Status,
43
45
  StatusError: () => import_status.StatusError,
@@ -48,9 +50,7 @@ __export(index_exports, {
48
50
  getNextPageParam: () => import_response.getNextPageParam,
49
51
  getPreviousPageParam: () => import_response.getPreviousPageParam,
50
52
  initialPageParam: () => import_response.initialPageParam,
51
- items: () => import_response.items,
52
53
  pageParamsSchema: () => import_response.pageParamsSchema,
53
- pages: () => import_response.pages,
54
54
  timing: () => import_timing.timing,
55
55
  uid: () => import_snowflake.uid
56
56
  });
@@ -71,9 +71,11 @@ var import_iso_3601_1 = require("./iso/iso_3601_1.cjs");
71
71
  DetailType,
72
72
  Details,
73
73
  ISO_3601_1,
74
+ Items,
74
75
  LoginCanceledError,
75
76
  LoginTimeoutError,
76
77
  MAX_LENGTH,
78
+ Pages,
77
79
  PurchaseError,
78
80
  Status,
79
81
  StatusError,
@@ -84,9 +86,7 @@ var import_iso_3601_1 = require("./iso/iso_3601_1.cjs");
84
86
  getNextPageParam,
85
87
  getPreviousPageParam,
86
88
  initialPageParam,
87
- items,
88
89
  pageParamsSchema,
89
- pages,
90
90
  timing,
91
91
  uid
92
92
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @example\n * import { Details, Status } from '@repo/error';\n *\n * Status.adapter = () => new Error('Error');\n *\n * const details = Details.new()\n * .requestInfo({ requestId: '1234567890', servingData: '/v1/tests' })\n * .errorInfo({ reason: 'ACCOUNT_LOCKED' });\n *\n * throw Status.alreadyExists('xxx').error(details);\n */\n\nexport {\n LoginTimeoutError,\n LoginCanceledError,\n CheckoutCreateError,\n PurchaseError,\n} from './error/index';\nexport type {\n NetworkErrorReason,\n StatusErrorReason,\n AuthenticationErrorReason,\n ModerationErrorReason,\n MultipartErrorReason,\n AppErrorReason,\n ErrorReason,\n} from './error/reason';\nexport {\n DetailType,\n Details,\n type ErrorInfo,\n type RetryInfo,\n type DebugInfo,\n type QuotaFailure,\n type PreconditionFailure,\n type BadRequest,\n type RequestInfo,\n type ResourceInfo,\n type Help,\n type LocalizedMessage,\n type Detail,\n} from './error/detail';\nexport { Status, StatusError, type ErrorBody } from './error/status';\nexport { getErrorReason, getErrorMessage, getFieldViolations } from './error/parse';\nexport {\n items,\n pages,\n Cursor,\n pageParamsSchema,\n initialPageParam,\n getPreviousPageParam,\n getNextPageParam,\n} from './response';\nexport type {\n Empty,\n EntityId,\n Entity,\n Response,\n InitParams,\n NextParams,\n PrevParams,\n PageParams,\n ParentPageParams,\n Page,\n InfinitePageData,\n} from './response';\n\nexport { UidGenerator, uid } from './snowflake';\n\nexport * as MAX_LENGTH from './max-length/index';\nexport { timing } from './utils/timing';\nexport { ISO_3601_1, type ISO3166CountryCode } from './iso/iso_3601_1';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,mBAKO;AAUP,oBAcO;AACP,oBAAoD;AACpD,mBAAoE;AACpE,sBAQO;AAeP,uBAAkC;AAElC,iBAA4B;AAC5B,oBAAuB;AACvB,wBAAoD;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @example\n * import { Details, Status } from '@repo/error';\n *\n * Status.adapter = () => new Error('Error');\n *\n * const details = Details.new()\n * .requestInfo({ requestId: '1234567890', servingData: '/v1/tests' })\n * .errorInfo({ reason: 'ACCOUNT_LOCKED' });\n *\n * throw Status.alreadyExists('xxx').error(details);\n */\n\nexport {\n LoginTimeoutError,\n LoginCanceledError,\n CheckoutCreateError,\n PurchaseError,\n} from './error/index';\nexport type {\n NetworkErrorReason,\n StatusErrorReason,\n AuthenticationErrorReason,\n ModerationErrorReason,\n MultipartErrorReason,\n AppErrorReason,\n ErrorReason,\n} from './error/reason';\nexport {\n DetailType,\n Details,\n type ErrorInfo,\n type RetryInfo,\n type DebugInfo,\n type QuotaFailure,\n type PreconditionFailure,\n type BadRequest,\n type RequestInfo,\n type ResourceInfo,\n type Help,\n type LocalizedMessage,\n type Detail,\n} from './error/detail';\nexport { Status, StatusError, type ErrorBody } from './error/status';\nexport { getErrorReason, getErrorMessage, getFieldViolations } from './error/parse';\nexport {\n Items,\n Pages,\n Cursor,\n pageParamsSchema,\n initialPageParam,\n getPreviousPageParam,\n getNextPageParam,\n} from './response';\nexport type {\n Empty,\n EntityId,\n Entity,\n Response,\n InitParams,\n NextParams,\n PrevParams,\n PageParams,\n ParentPageParams,\n Page,\n InfinitePageData,\n} from './response';\n\nexport { UidGenerator, uid } from './snowflake';\n\nexport * as MAX_LENGTH from './max-length/index';\nexport { timing } from './utils/timing';\nexport { ISO_3601_1, type ISO3166CountryCode } from './iso/iso_3601_1';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,mBAKO;AAUP,oBAcO;AACP,oBAAoD;AACpD,mBAAoE;AACpE,sBAQO;AAeP,uBAAkC;AAElC,iBAA4B;AAC5B,oBAAuB;AACvB,wBAAoD;","names":[]}
package/dist/index.d.cts CHANGED
@@ -3,7 +3,7 @@ export { AppErrorReason, AuthenticationErrorReason, ErrorReason, ModerationError
3
3
  export { BadRequest, DebugInfo, Detail, DetailType, Details, ErrorInfo, Help, LocalizedMessage, PreconditionFailure, QuotaFailure, RequestInfo, ResourceInfo, RetryInfo } from './error/detail.cjs';
4
4
  export { ErrorBody, Status, StatusError } from './error/status.cjs';
5
5
  export { getErrorMessage, getErrorReason, getFieldViolations } from './error/parse.cjs';
6
- export { Cursor, Empty, Entity, EntityId, InfinitePageData, InitParams, NextParams, Page, PageParams, ParentPageParams, PrevParams, Response, getNextPageParam, getPreviousPageParam, initialPageParam, items, pageParamsSchema, pages } from './response.cjs';
6
+ export { Cursor, Empty, Entity, EntityId, InfinitePageData, InitParams, Items, NextParams, Page, PageParams, Pages, ParentPageParams, PrevParams, Response, getNextPageParam, getPreviousPageParam, initialPageParam, pageParamsSchema } from './response.cjs';
7
7
  export { UidGenerator, uid } from './snowflake.cjs';
8
8
  export { i as MAX_LENGTH } from './index-BnPgRQDl.cjs';
9
9
  export { timing } from './utils/timing.cjs';
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export { AppErrorReason, AuthenticationErrorReason, ErrorReason, ModerationError
3
3
  export { BadRequest, DebugInfo, Detail, DetailType, Details, ErrorInfo, Help, LocalizedMessage, PreconditionFailure, QuotaFailure, RequestInfo, ResourceInfo, RetryInfo } from './error/detail.js';
4
4
  export { ErrorBody, Status, StatusError } from './error/status.js';
5
5
  export { getErrorMessage, getErrorReason, getFieldViolations } from './error/parse.js';
6
- export { Cursor, Empty, Entity, EntityId, InfinitePageData, InitParams, NextParams, Page, PageParams, ParentPageParams, PrevParams, Response, getNextPageParam, getPreviousPageParam, initialPageParam, items, pageParamsSchema, pages } from './response.js';
6
+ export { Cursor, Empty, Entity, EntityId, InfinitePageData, InitParams, Items, NextParams, Page, PageParams, Pages, ParentPageParams, PrevParams, Response, getNextPageParam, getPreviousPageParam, initialPageParam, pageParamsSchema } from './response.js';
7
7
  export { UidGenerator, uid } from './snowflake.js';
8
8
  export { i as MAX_LENGTH } from './index-BnPgRQDl.js';
9
9
  export { timing } from './utils/timing.js';
package/dist/index.mjs CHANGED
@@ -12,8 +12,8 @@ import {
12
12
  import { Status, StatusError } from "./error/status.mjs";
13
13
  import { getErrorReason, getErrorMessage, getFieldViolations } from "./error/parse.mjs";
14
14
  import {
15
- items,
16
- pages,
15
+ Items,
16
+ Pages,
17
17
  Cursor,
18
18
  pageParamsSchema,
19
19
  initialPageParam,
@@ -30,9 +30,11 @@ export {
30
30
  DetailType,
31
31
  Details,
32
32
  ISO_3601_1,
33
+ Items,
33
34
  LoginCanceledError,
34
35
  LoginTimeoutError,
35
36
  MAX_LENGTH,
37
+ Pages,
36
38
  PurchaseError,
37
39
  Status,
38
40
  StatusError,
@@ -43,9 +45,7 @@ export {
43
45
  getNextPageParam,
44
46
  getPreviousPageParam,
45
47
  initialPageParam,
46
- items,
47
48
  pageParamsSchema,
48
- pages,
49
49
  timing,
50
50
  uid
51
51
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @example\n * import { Details, Status } from '@repo/error';\n *\n * Status.adapter = () => new Error('Error');\n *\n * const details = Details.new()\n * .requestInfo({ requestId: '1234567890', servingData: '/v1/tests' })\n * .errorInfo({ reason: 'ACCOUNT_LOCKED' });\n *\n * throw Status.alreadyExists('xxx').error(details);\n */\n\nexport {\n LoginTimeoutError,\n LoginCanceledError,\n CheckoutCreateError,\n PurchaseError,\n} from './error/index';\nexport type {\n NetworkErrorReason,\n StatusErrorReason,\n AuthenticationErrorReason,\n ModerationErrorReason,\n MultipartErrorReason,\n AppErrorReason,\n ErrorReason,\n} from './error/reason';\nexport {\n DetailType,\n Details,\n type ErrorInfo,\n type RetryInfo,\n type DebugInfo,\n type QuotaFailure,\n type PreconditionFailure,\n type BadRequest,\n type RequestInfo,\n type ResourceInfo,\n type Help,\n type LocalizedMessage,\n type Detail,\n} from './error/detail';\nexport { Status, StatusError, type ErrorBody } from './error/status';\nexport { getErrorReason, getErrorMessage, getFieldViolations } from './error/parse';\nexport {\n items,\n pages,\n Cursor,\n pageParamsSchema,\n initialPageParam,\n getPreviousPageParam,\n getNextPageParam,\n} from './response';\nexport type {\n Empty,\n EntityId,\n Entity,\n Response,\n InitParams,\n NextParams,\n PrevParams,\n PageParams,\n ParentPageParams,\n Page,\n InfinitePageData,\n} from './response';\n\nexport { UidGenerator, uid } from './snowflake';\n\nexport * as MAX_LENGTH from './max-length/index';\nexport { timing } from './utils/timing';\nexport { ISO_3601_1, type ISO3166CountryCode } from './iso/iso_3601_1';\n"],"mappings":";AAaA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAUP;AAAA,EACE;AAAA,EACA;AAAA,OAYK;AACP,SAAS,QAAQ,mBAAmC;AACpD,SAAS,gBAAgB,iBAAiB,0BAA0B;AACpE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAeP,SAAS,cAAc,WAAW;AAElC,YAAY,gBAAgB;AAC5B,SAAS,cAAc;AACvB,SAAS,kBAA2C;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @example\n * import { Details, Status } from '@repo/error';\n *\n * Status.adapter = () => new Error('Error');\n *\n * const details = Details.new()\n * .requestInfo({ requestId: '1234567890', servingData: '/v1/tests' })\n * .errorInfo({ reason: 'ACCOUNT_LOCKED' });\n *\n * throw Status.alreadyExists('xxx').error(details);\n */\n\nexport {\n LoginTimeoutError,\n LoginCanceledError,\n CheckoutCreateError,\n PurchaseError,\n} from './error/index';\nexport type {\n NetworkErrorReason,\n StatusErrorReason,\n AuthenticationErrorReason,\n ModerationErrorReason,\n MultipartErrorReason,\n AppErrorReason,\n ErrorReason,\n} from './error/reason';\nexport {\n DetailType,\n Details,\n type ErrorInfo,\n type RetryInfo,\n type DebugInfo,\n type QuotaFailure,\n type PreconditionFailure,\n type BadRequest,\n type RequestInfo,\n type ResourceInfo,\n type Help,\n type LocalizedMessage,\n type Detail,\n} from './error/detail';\nexport { Status, StatusError, type ErrorBody } from './error/status';\nexport { getErrorReason, getErrorMessage, getFieldViolations } from './error/parse';\nexport {\n Items,\n Pages,\n Cursor,\n pageParamsSchema,\n initialPageParam,\n getPreviousPageParam,\n getNextPageParam,\n} from './response';\nexport type {\n Empty,\n EntityId,\n Entity,\n Response,\n InitParams,\n NextParams,\n PrevParams,\n PageParams,\n ParentPageParams,\n Page,\n InfinitePageData,\n} from './response';\n\nexport { UidGenerator, uid } from './snowflake';\n\nexport * as MAX_LENGTH from './max-length/index';\nexport { timing } from './utils/timing';\nexport { ISO_3601_1, type ISO3166CountryCode } from './iso/iso_3601_1';\n"],"mappings":";AAaA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAUP;AAAA,EACE;AAAA,EACA;AAAA,OAYK;AACP,SAAS,QAAQ,mBAAmC;AACpD,SAAS,gBAAgB,iBAAiB,0BAA0B;AACpE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAeP,SAAS,cAAc,WAAW;AAElC,YAAY,gBAAgB;AAC5B,SAAS,cAAc;AACvB,SAAS,kBAA2C;","names":[]}
package/dist/response.cjs CHANGED
@@ -21,12 +21,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var response_exports = {};
22
22
  __export(response_exports, {
23
23
  Cursor: () => Cursor,
24
+ Items: () => Items,
25
+ Pages: () => Pages,
24
26
  getNextPageParam: () => getNextPageParam,
25
27
  getPreviousPageParam: () => getPreviousPageParam,
26
28
  initialPageParam: () => initialPageParam,
27
- items: () => items,
28
- pageParamsSchema: () => pageParamsSchema,
29
- pages: () => pages
29
+ pageParamsSchema: () => pageParamsSchema
30
30
  });
31
31
  module.exports = __toCommonJS(response_exports);
32
32
  var import_utils = require("@shware/utils");
@@ -68,7 +68,7 @@ function getPreviousPageParam(first) {
68
68
  function getNextPageParam(last) {
69
69
  return (0, import_utils.hasText)(last.paging.next) ? { next: last.paging.next } : null;
70
70
  }
71
- var pages = {
71
+ var Pages = {
72
72
  flatten(data) {
73
73
  return data.pages.flatMap((page) => page.data);
74
74
  },
@@ -96,10 +96,10 @@ var pages = {
96
96
  append(item) {
97
97
  return (data) => {
98
98
  if (!data) return data;
99
- const pages2 = data.pages;
100
- const last = pages2[pages2.length - 1];
99
+ const pages = data.pages;
100
+ const last = pages[pages.length - 1];
101
101
  if (!last) return { ...data, pages: [{ data: [item], paging: {} }] };
102
- return { ...data, pages: [...pages2.slice(0, -1), { ...last, data: [...last.data, item] }] };
102
+ return { ...data, pages: [...pages.slice(0, -1), { ...last, data: [...last.data, item] }] };
103
103
  };
104
104
  },
105
105
  update(updater, predicate) {
@@ -133,7 +133,7 @@ var pages = {
133
133
  return this.remove((item) => item.id === id);
134
134
  }
135
135
  };
136
- var items = {
136
+ var Items = {
137
137
  push(newItems) {
138
138
  return (data) => {
139
139
  if (!data) return newItems;
@@ -208,11 +208,11 @@ var items = {
208
208
  // Annotate the CommonJS export names for ESM import in node:
209
209
  0 && (module.exports = {
210
210
  Cursor,
211
+ Items,
212
+ Pages,
211
213
  getNextPageParam,
212
214
  getPreviousPageParam,
213
215
  initialPageParam,
214
- items,
215
- pageParamsSchema,
216
- pages
216
+ pageParamsSchema
217
217
  });
218
218
  //# sourceMappingURL=response.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/response.ts"],"sourcesContent":["import { hasText } from '@shware/utils';\nimport { _default, coerce, int, maximum, minimum, object, optional, string } from 'zod/mini';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport type Empty = {};\nexport type EntityId = string | number;\nexport type Entity = { id: EntityId };\n\nexport type Response<T = never> = { data: T };\n\nexport type InitParams = { limit: number; parent?: string };\nexport type NextParams = { limit: number; parent?: string; next: string };\nexport type PrevParams = { limit: number; parent?: string; prev: string };\nexport type PageParams = { limit: number; prev?: string; next?: string };\nexport type ParentPageParams = { limit: number; parent: string; prev?: string; next?: string };\nexport type Page<T = never> = { data: T[]; paging: { next?: string; prev?: string } };\n\nexport function pageParamsSchema(max = 100, defaultLimit = 20) {\n return object({\n limit: _default(coerce.number().check(int(), minimum(1), maximum(max)), defaultLimit),\n prev: optional(string()),\n next: optional(string()),\n });\n}\n\nexport const Cursor = {\n of(\n prev: bigint | number | string | undefined,\n next: bigint | number | string | undefined\n ): Page['paging'] {\n return {\n prev: prev ? this.encode(prev) : undefined,\n next: next ? this.encode(next) : undefined,\n };\n },\n empty(): Page['paging'] {\n return { prev: undefined, next: undefined };\n },\n encode(id: bigint | number | string | undefined): string | undefined {\n if (!id) return undefined;\n return Buffer.from(id.toString(), 'utf-8').toString('base64');\n },\n decode<T extends 'bigint' | 'number' | 'string' = 'bigint'>(\n token: string,\n type: T = 'bigint' as T\n ): T extends 'bigint' ? bigint : T extends 'number' ? number : string {\n const value = Buffer.from(token, 'base64').toString('utf-8');\n if (type === 'bigint')\n return BigInt(value) as T extends 'bigint' ? bigint : T extends 'number' ? number : string;\n if (type === 'number')\n return Number(value) as T extends 'bigint' ? bigint : T extends 'number' ? number : string;\n return value as T extends 'bigint' ? bigint : T extends 'number' ? number : string;\n },\n};\n\nexport const initialPageParam: Page['paging'] = {};\n\nexport function getPreviousPageParam<T = never>(first: Page<T>): Page['paging'] | null {\n return hasText(first.paging.prev) ? { prev: first.paging.prev } : null;\n}\n\nexport function getNextPageParam<T = never>(last: Page<T>): Page['paging'] | null {\n return hasText(last.paging.next) ? { next: last.paging.next } : null;\n}\n\nexport type InfinitePageData<T> = {\n pages: Array<Page<T>>;\n pageParams: Array<Page['paging']>;\n};\n\nexport const pages = {\n flatten<T>(data: InfinitePageData<T>): T[] {\n return data.pages.flatMap((page) => page.data);\n },\n dedupe<T extends Entity>(data: InfinitePageData<T>): T[] {\n const seen = new Set<EntityId>();\n const result: T[] = [];\n for (const page of data.pages) {\n for (const item of page.data) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n }\n return result;\n },\n prepend<T>(item: T) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n const [first, ...rest] = data.pages;\n if (!first) return { ...data, pages: [{ data: [item], paging: {} }] };\n return { ...data, pages: [{ ...first, data: [item, ...first.data] }, ...rest] };\n };\n },\n append<T>(item: T) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n const pages = data.pages;\n const last = pages[pages.length - 1];\n if (!last) return { ...data, pages: [{ data: [item], paging: {} }] };\n return { ...data, pages: [...pages.slice(0, -1), { ...last, data: [...last.data, item] }] };\n };\n },\n update<T>(updater: T, predicate: (item: T) => boolean) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n return {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.map((item) => (predicate(item) ? updater : item)),\n })),\n };\n };\n },\n updateById<T extends Entity>(updated: T) {\n return this.update<T>(updated, (item) => item.id === updated.id);\n },\n remove<T>(predicate: (item: T) => boolean) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n return {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((item) => !predicate(item)),\n })),\n };\n };\n },\n removeById<T extends Entity>(id: EntityId) {\n return this.remove<T>((item) => item.id === id);\n },\n};\n\nexport const items = {\n push<T>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n return [...data, ...newItems];\n };\n },\n unshift<T>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n return [...newItems, ...data];\n };\n },\n pushAndDedupe<T extends Entity>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n const seen = new Set<EntityId>();\n const result: T[] = [];\n for (const item of data) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n for (const item of newItems) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n return result;\n };\n },\n unshiftAndDedupe<T extends Entity>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n const seen = new Set<EntityId>();\n const result: T[] = [];\n for (const item of newItems) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n for (const item of data) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n return result;\n };\n },\n update<T>(updater: T, predicate: (item: T) => boolean) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return data;\n return data.map((item) => (predicate(item) ? updater : item));\n };\n },\n updateById<T extends Entity>(updated: T) {\n return this.update<T>(updated, (item) => item.id === updated.id);\n },\n remove<T>(predicate: (item: T) => boolean) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return data;\n return data.filter((item) => !predicate(item));\n };\n },\n removeById<T extends Entity>(id: EntityId) {\n return this.remove<T>((item) => item.id === id);\n },\n};\n"],"mappings":"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","names":["pages"]}
1
+ {"version":3,"sources":["../src/response.ts"],"sourcesContent":["import { hasText } from '@shware/utils';\nimport { _default, coerce, int, maximum, minimum, object, optional, string } from 'zod/mini';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport type Empty = {};\nexport type EntityId = string | number;\nexport type Entity = { id: EntityId };\n\nexport type Response<T = never> = { data: T };\n\nexport type InitParams = { limit: number; parent?: string };\nexport type NextParams = { limit: number; parent?: string; next: string };\nexport type PrevParams = { limit: number; parent?: string; prev: string };\nexport type PageParams = { limit: number; prev?: string; next?: string };\nexport type ParentPageParams = { limit: number; parent: string; prev?: string; next?: string };\nexport type Page<T = never> = { data: T[]; paging: { next?: string; prev?: string } };\n\nexport function pageParamsSchema(max = 100, defaultLimit = 20) {\n return object({\n limit: _default(coerce.number().check(int(), minimum(1), maximum(max)), defaultLimit),\n prev: optional(string()),\n next: optional(string()),\n });\n}\n\nexport const Cursor = {\n of(\n prev: bigint | number | string | undefined,\n next: bigint | number | string | undefined\n ): Page['paging'] {\n return {\n prev: prev ? this.encode(prev) : undefined,\n next: next ? this.encode(next) : undefined,\n };\n },\n empty(): Page['paging'] {\n return { prev: undefined, next: undefined };\n },\n encode(id: bigint | number | string | undefined): string | undefined {\n if (!id) return undefined;\n return Buffer.from(id.toString(), 'utf-8').toString('base64');\n },\n decode<T extends 'bigint' | 'number' | 'string' = 'bigint'>(\n token: string,\n type: T = 'bigint' as T\n ): T extends 'bigint' ? bigint : T extends 'number' ? number : string {\n const value = Buffer.from(token, 'base64').toString('utf-8');\n if (type === 'bigint')\n return BigInt(value) as T extends 'bigint' ? bigint : T extends 'number' ? number : string;\n if (type === 'number')\n return Number(value) as T extends 'bigint' ? bigint : T extends 'number' ? number : string;\n return value as T extends 'bigint' ? bigint : T extends 'number' ? number : string;\n },\n};\n\nexport const initialPageParam: Page['paging'] = {};\n\nexport function getPreviousPageParam<T = never>(first: Page<T>): Page['paging'] | null {\n return hasText(first.paging.prev) ? { prev: first.paging.prev } : null;\n}\n\nexport function getNextPageParam<T = never>(last: Page<T>): Page['paging'] | null {\n return hasText(last.paging.next) ? { next: last.paging.next } : null;\n}\n\nexport type InfinitePageData<T> = {\n pages: Array<Page<T>>;\n pageParams: Array<Page['paging']>;\n};\n\nexport const Pages = {\n flatten<T>(data: InfinitePageData<T>): T[] {\n return data.pages.flatMap((page) => page.data);\n },\n dedupe<T extends Entity>(data: InfinitePageData<T>): T[] {\n const seen = new Set<EntityId>();\n const result: T[] = [];\n for (const page of data.pages) {\n for (const item of page.data) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n }\n return result;\n },\n prepend<T>(item: T) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n const [first, ...rest] = data.pages;\n if (!first) return { ...data, pages: [{ data: [item], paging: {} }] };\n return { ...data, pages: [{ ...first, data: [item, ...first.data] }, ...rest] };\n };\n },\n append<T>(item: T) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n const pages = data.pages;\n const last = pages[pages.length - 1];\n if (!last) return { ...data, pages: [{ data: [item], paging: {} }] };\n return { ...data, pages: [...pages.slice(0, -1), { ...last, data: [...last.data, item] }] };\n };\n },\n update<T>(updater: T, predicate: (item: T) => boolean) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n return {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.map((item) => (predicate(item) ? updater : item)),\n })),\n };\n };\n },\n updateById<T extends Entity>(updated: T) {\n return this.update<T>(updated, (item) => item.id === updated.id);\n },\n remove<T>(predicate: (item: T) => boolean) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n return {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((item) => !predicate(item)),\n })),\n };\n };\n },\n removeById<T extends Entity>(id: EntityId) {\n return this.remove<T>((item) => item.id === id);\n },\n};\n\nexport const Items = {\n push<T>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n return [...data, ...newItems];\n };\n },\n unshift<T>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n return [...newItems, ...data];\n };\n },\n pushAndDedupe<T extends Entity>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n const seen = new Set<EntityId>();\n const result: T[] = [];\n for (const item of data) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n for (const item of newItems) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n return result;\n };\n },\n unshiftAndDedupe<T extends Entity>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n const seen = new Set<EntityId>();\n const result: T[] = [];\n for (const item of newItems) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n for (const item of data) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n return result;\n };\n },\n update<T>(updater: T, predicate: (item: T) => boolean) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return data;\n return data.map((item) => (predicate(item) ? updater : item));\n };\n },\n updateById<T extends Entity>(updated: T) {\n return this.update<T>(updated, (item) => item.id === updated.id);\n },\n remove<T>(predicate: (item: T) => boolean) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return data;\n return data.filter((item) => !predicate(item));\n };\n },\n removeById<T extends Entity>(id: EntityId) {\n return this.remove<T>((item) => item.id === id);\n },\n};\n"],"mappings":"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","names":[]}
@@ -59,7 +59,7 @@ type InfinitePageData<T> = {
59
59
  pages: Array<Page<T>>;
60
60
  pageParams: Array<Page['paging']>;
61
61
  };
62
- declare const pages: {
62
+ declare const Pages: {
63
63
  flatten<T>(data: InfinitePageData<T>): T[];
64
64
  dedupe<T extends Entity>(data: InfinitePageData<T>): T[];
65
65
  prepend<T>(item: T): (data: InfinitePageData<T> | undefined) => InfinitePageData<T> | undefined;
@@ -69,7 +69,7 @@ declare const pages: {
69
69
  remove<T>(predicate: (item: T) => boolean): (data: InfinitePageData<T> | undefined) => InfinitePageData<T> | undefined;
70
70
  removeById<T extends Entity>(id: EntityId): (data: InfinitePageData<T> | undefined) => InfinitePageData<T> | undefined;
71
71
  };
72
- declare const items: {
72
+ declare const Items: {
73
73
  push<T>(newItems: T[]): (data: T[] | undefined) => T[] | undefined;
74
74
  unshift<T>(newItems: T[]): (data: T[] | undefined) => T[] | undefined;
75
75
  pushAndDedupe<T extends Entity>(newItems: T[]): (data: T[] | undefined) => T[] | undefined;
@@ -80,4 +80,4 @@ declare const items: {
80
80
  removeById<T extends Entity>(id: EntityId): (data: T[] | undefined) => T[] | undefined;
81
81
  };
82
82
 
83
- export { Cursor, type Empty, type Entity, type EntityId, type InfinitePageData, type InitParams, type NextParams, type Page, type PageParams, type ParentPageParams, type PrevParams, type Response, getNextPageParam, getPreviousPageParam, initialPageParam, items, pageParamsSchema, pages };
83
+ export { Cursor, type Empty, type Entity, type EntityId, type InfinitePageData, type InitParams, Items, type NextParams, type Page, type PageParams, Pages, type ParentPageParams, type PrevParams, type Response, getNextPageParam, getPreviousPageParam, initialPageParam, pageParamsSchema };
@@ -59,7 +59,7 @@ type InfinitePageData<T> = {
59
59
  pages: Array<Page<T>>;
60
60
  pageParams: Array<Page['paging']>;
61
61
  };
62
- declare const pages: {
62
+ declare const Pages: {
63
63
  flatten<T>(data: InfinitePageData<T>): T[];
64
64
  dedupe<T extends Entity>(data: InfinitePageData<T>): T[];
65
65
  prepend<T>(item: T): (data: InfinitePageData<T> | undefined) => InfinitePageData<T> | undefined;
@@ -69,7 +69,7 @@ declare const pages: {
69
69
  remove<T>(predicate: (item: T) => boolean): (data: InfinitePageData<T> | undefined) => InfinitePageData<T> | undefined;
70
70
  removeById<T extends Entity>(id: EntityId): (data: InfinitePageData<T> | undefined) => InfinitePageData<T> | undefined;
71
71
  };
72
- declare const items: {
72
+ declare const Items: {
73
73
  push<T>(newItems: T[]): (data: T[] | undefined) => T[] | undefined;
74
74
  unshift<T>(newItems: T[]): (data: T[] | undefined) => T[] | undefined;
75
75
  pushAndDedupe<T extends Entity>(newItems: T[]): (data: T[] | undefined) => T[] | undefined;
@@ -80,4 +80,4 @@ declare const items: {
80
80
  removeById<T extends Entity>(id: EntityId): (data: T[] | undefined) => T[] | undefined;
81
81
  };
82
82
 
83
- export { Cursor, type Empty, type Entity, type EntityId, type InfinitePageData, type InitParams, type NextParams, type Page, type PageParams, type ParentPageParams, type PrevParams, type Response, getNextPageParam, getPreviousPageParam, initialPageParam, items, pageParamsSchema, pages };
83
+ export { Cursor, type Empty, type Entity, type EntityId, type InfinitePageData, type InitParams, Items, type NextParams, type Page, type PageParams, Pages, type ParentPageParams, type PrevParams, type Response, getNextPageParam, getPreviousPageParam, initialPageParam, pageParamsSchema };
package/dist/response.mjs CHANGED
@@ -38,7 +38,7 @@ function getPreviousPageParam(first) {
38
38
  function getNextPageParam(last) {
39
39
  return hasText(last.paging.next) ? { next: last.paging.next } : null;
40
40
  }
41
- var pages = {
41
+ var Pages = {
42
42
  flatten(data) {
43
43
  return data.pages.flatMap((page) => page.data);
44
44
  },
@@ -66,10 +66,10 @@ var pages = {
66
66
  append(item) {
67
67
  return (data) => {
68
68
  if (!data) return data;
69
- const pages2 = data.pages;
70
- const last = pages2[pages2.length - 1];
69
+ const pages = data.pages;
70
+ const last = pages[pages.length - 1];
71
71
  if (!last) return { ...data, pages: [{ data: [item], paging: {} }] };
72
- return { ...data, pages: [...pages2.slice(0, -1), { ...last, data: [...last.data, item] }] };
72
+ return { ...data, pages: [...pages.slice(0, -1), { ...last, data: [...last.data, item] }] };
73
73
  };
74
74
  },
75
75
  update(updater, predicate) {
@@ -103,7 +103,7 @@ var pages = {
103
103
  return this.remove((item) => item.id === id);
104
104
  }
105
105
  };
106
- var items = {
106
+ var Items = {
107
107
  push(newItems) {
108
108
  return (data) => {
109
109
  if (!data) return newItems;
@@ -177,11 +177,11 @@ var items = {
177
177
  };
178
178
  export {
179
179
  Cursor,
180
+ Items,
181
+ Pages,
180
182
  getNextPageParam,
181
183
  getPreviousPageParam,
182
184
  initialPageParam,
183
- items,
184
- pageParamsSchema,
185
- pages
185
+ pageParamsSchema
186
186
  };
187
187
  //# sourceMappingURL=response.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/response.ts"],"sourcesContent":["import { hasText } from '@shware/utils';\nimport { _default, coerce, int, maximum, minimum, object, optional, string } from 'zod/mini';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport type Empty = {};\nexport type EntityId = string | number;\nexport type Entity = { id: EntityId };\n\nexport type Response<T = never> = { data: T };\n\nexport type InitParams = { limit: number; parent?: string };\nexport type NextParams = { limit: number; parent?: string; next: string };\nexport type PrevParams = { limit: number; parent?: string; prev: string };\nexport type PageParams = { limit: number; prev?: string; next?: string };\nexport type ParentPageParams = { limit: number; parent: string; prev?: string; next?: string };\nexport type Page<T = never> = { data: T[]; paging: { next?: string; prev?: string } };\n\nexport function pageParamsSchema(max = 100, defaultLimit = 20) {\n return object({\n limit: _default(coerce.number().check(int(), minimum(1), maximum(max)), defaultLimit),\n prev: optional(string()),\n next: optional(string()),\n });\n}\n\nexport const Cursor = {\n of(\n prev: bigint | number | string | undefined,\n next: bigint | number | string | undefined\n ): Page['paging'] {\n return {\n prev: prev ? this.encode(prev) : undefined,\n next: next ? this.encode(next) : undefined,\n };\n },\n empty(): Page['paging'] {\n return { prev: undefined, next: undefined };\n },\n encode(id: bigint | number | string | undefined): string | undefined {\n if (!id) return undefined;\n return Buffer.from(id.toString(), 'utf-8').toString('base64');\n },\n decode<T extends 'bigint' | 'number' | 'string' = 'bigint'>(\n token: string,\n type: T = 'bigint' as T\n ): T extends 'bigint' ? bigint : T extends 'number' ? number : string {\n const value = Buffer.from(token, 'base64').toString('utf-8');\n if (type === 'bigint')\n return BigInt(value) as T extends 'bigint' ? bigint : T extends 'number' ? number : string;\n if (type === 'number')\n return Number(value) as T extends 'bigint' ? bigint : T extends 'number' ? number : string;\n return value as T extends 'bigint' ? bigint : T extends 'number' ? number : string;\n },\n};\n\nexport const initialPageParam: Page['paging'] = {};\n\nexport function getPreviousPageParam<T = never>(first: Page<T>): Page['paging'] | null {\n return hasText(first.paging.prev) ? { prev: first.paging.prev } : null;\n}\n\nexport function getNextPageParam<T = never>(last: Page<T>): Page['paging'] | null {\n return hasText(last.paging.next) ? { next: last.paging.next } : null;\n}\n\nexport type InfinitePageData<T> = {\n pages: Array<Page<T>>;\n pageParams: Array<Page['paging']>;\n};\n\nexport const pages = {\n flatten<T>(data: InfinitePageData<T>): T[] {\n return data.pages.flatMap((page) => page.data);\n },\n dedupe<T extends Entity>(data: InfinitePageData<T>): T[] {\n const seen = new Set<EntityId>();\n const result: T[] = [];\n for (const page of data.pages) {\n for (const item of page.data) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n }\n return result;\n },\n prepend<T>(item: T) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n const [first, ...rest] = data.pages;\n if (!first) return { ...data, pages: [{ data: [item], paging: {} }] };\n return { ...data, pages: [{ ...first, data: [item, ...first.data] }, ...rest] };\n };\n },\n append<T>(item: T) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n const pages = data.pages;\n const last = pages[pages.length - 1];\n if (!last) return { ...data, pages: [{ data: [item], paging: {} }] };\n return { ...data, pages: [...pages.slice(0, -1), { ...last, data: [...last.data, item] }] };\n };\n },\n update<T>(updater: T, predicate: (item: T) => boolean) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n return {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.map((item) => (predicate(item) ? updater : item)),\n })),\n };\n };\n },\n updateById<T extends Entity>(updated: T) {\n return this.update<T>(updated, (item) => item.id === updated.id);\n },\n remove<T>(predicate: (item: T) => boolean) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n return {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((item) => !predicate(item)),\n })),\n };\n };\n },\n removeById<T extends Entity>(id: EntityId) {\n return this.remove<T>((item) => item.id === id);\n },\n};\n\nexport const items = {\n push<T>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n return [...data, ...newItems];\n };\n },\n unshift<T>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n return [...newItems, ...data];\n };\n },\n pushAndDedupe<T extends Entity>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n const seen = new Set<EntityId>();\n const result: T[] = [];\n for (const item of data) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n for (const item of newItems) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n return result;\n };\n },\n unshiftAndDedupe<T extends Entity>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n const seen = new Set<EntityId>();\n const result: T[] = [];\n for (const item of newItems) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n for (const item of data) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n return result;\n };\n },\n update<T>(updater: T, predicate: (item: T) => boolean) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return data;\n return data.map((item) => (predicate(item) ? updater : item));\n };\n },\n updateById<T extends Entity>(updated: T) {\n return this.update<T>(updated, (item) => item.id === updated.id);\n },\n remove<T>(predicate: (item: T) => boolean) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return data;\n return data.filter((item) => !predicate(item));\n };\n },\n removeById<T extends Entity>(id: EntityId) {\n return this.remove<T>((item) => item.id === id);\n },\n};\n"],"mappings":"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","names":["pages"]}
1
+ {"version":3,"sources":["../src/response.ts"],"sourcesContent":["import { hasText } from '@shware/utils';\nimport { _default, coerce, int, maximum, minimum, object, optional, string } from 'zod/mini';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport type Empty = {};\nexport type EntityId = string | number;\nexport type Entity = { id: EntityId };\n\nexport type Response<T = never> = { data: T };\n\nexport type InitParams = { limit: number; parent?: string };\nexport type NextParams = { limit: number; parent?: string; next: string };\nexport type PrevParams = { limit: number; parent?: string; prev: string };\nexport type PageParams = { limit: number; prev?: string; next?: string };\nexport type ParentPageParams = { limit: number; parent: string; prev?: string; next?: string };\nexport type Page<T = never> = { data: T[]; paging: { next?: string; prev?: string } };\n\nexport function pageParamsSchema(max = 100, defaultLimit = 20) {\n return object({\n limit: _default(coerce.number().check(int(), minimum(1), maximum(max)), defaultLimit),\n prev: optional(string()),\n next: optional(string()),\n });\n}\n\nexport const Cursor = {\n of(\n prev: bigint | number | string | undefined,\n next: bigint | number | string | undefined\n ): Page['paging'] {\n return {\n prev: prev ? this.encode(prev) : undefined,\n next: next ? this.encode(next) : undefined,\n };\n },\n empty(): Page['paging'] {\n return { prev: undefined, next: undefined };\n },\n encode(id: bigint | number | string | undefined): string | undefined {\n if (!id) return undefined;\n return Buffer.from(id.toString(), 'utf-8').toString('base64');\n },\n decode<T extends 'bigint' | 'number' | 'string' = 'bigint'>(\n token: string,\n type: T = 'bigint' as T\n ): T extends 'bigint' ? bigint : T extends 'number' ? number : string {\n const value = Buffer.from(token, 'base64').toString('utf-8');\n if (type === 'bigint')\n return BigInt(value) as T extends 'bigint' ? bigint : T extends 'number' ? number : string;\n if (type === 'number')\n return Number(value) as T extends 'bigint' ? bigint : T extends 'number' ? number : string;\n return value as T extends 'bigint' ? bigint : T extends 'number' ? number : string;\n },\n};\n\nexport const initialPageParam: Page['paging'] = {};\n\nexport function getPreviousPageParam<T = never>(first: Page<T>): Page['paging'] | null {\n return hasText(first.paging.prev) ? { prev: first.paging.prev } : null;\n}\n\nexport function getNextPageParam<T = never>(last: Page<T>): Page['paging'] | null {\n return hasText(last.paging.next) ? { next: last.paging.next } : null;\n}\n\nexport type InfinitePageData<T> = {\n pages: Array<Page<T>>;\n pageParams: Array<Page['paging']>;\n};\n\nexport const Pages = {\n flatten<T>(data: InfinitePageData<T>): T[] {\n return data.pages.flatMap((page) => page.data);\n },\n dedupe<T extends Entity>(data: InfinitePageData<T>): T[] {\n const seen = new Set<EntityId>();\n const result: T[] = [];\n for (const page of data.pages) {\n for (const item of page.data) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n }\n return result;\n },\n prepend<T>(item: T) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n const [first, ...rest] = data.pages;\n if (!first) return { ...data, pages: [{ data: [item], paging: {} }] };\n return { ...data, pages: [{ ...first, data: [item, ...first.data] }, ...rest] };\n };\n },\n append<T>(item: T) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n const pages = data.pages;\n const last = pages[pages.length - 1];\n if (!last) return { ...data, pages: [{ data: [item], paging: {} }] };\n return { ...data, pages: [...pages.slice(0, -1), { ...last, data: [...last.data, item] }] };\n };\n },\n update<T>(updater: T, predicate: (item: T) => boolean) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n return {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.map((item) => (predicate(item) ? updater : item)),\n })),\n };\n };\n },\n updateById<T extends Entity>(updated: T) {\n return this.update<T>(updated, (item) => item.id === updated.id);\n },\n remove<T>(predicate: (item: T) => boolean) {\n return (data: InfinitePageData<T> | undefined): InfinitePageData<T> | undefined => {\n if (!data) return data;\n return {\n ...data,\n pages: data.pages.map((page) => ({\n ...page,\n data: page.data.filter((item) => !predicate(item)),\n })),\n };\n };\n },\n removeById<T extends Entity>(id: EntityId) {\n return this.remove<T>((item) => item.id === id);\n },\n};\n\nexport const Items = {\n push<T>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n return [...data, ...newItems];\n };\n },\n unshift<T>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n return [...newItems, ...data];\n };\n },\n pushAndDedupe<T extends Entity>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n const seen = new Set<EntityId>();\n const result: T[] = [];\n for (const item of data) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n for (const item of newItems) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n return result;\n };\n },\n unshiftAndDedupe<T extends Entity>(newItems: T[]) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return newItems;\n const seen = new Set<EntityId>();\n const result: T[] = [];\n for (const item of newItems) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n for (const item of data) {\n if (!seen.has(item.id)) {\n seen.add(item.id);\n result.push(item);\n }\n }\n return result;\n };\n },\n update<T>(updater: T, predicate: (item: T) => boolean) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return data;\n return data.map((item) => (predicate(item) ? updater : item));\n };\n },\n updateById<T extends Entity>(updated: T) {\n return this.update<T>(updated, (item) => item.id === updated.id);\n },\n remove<T>(predicate: (item: T) => boolean) {\n return (data: T[] | undefined): T[] | undefined => {\n if (!data) return data;\n return data.filter((item) => !predicate(item));\n };\n },\n removeById<T extends Entity>(id: EntityId) {\n return this.remove<T>((item) => item.id === id);\n },\n};\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shware/http",
3
- "version": "2.4.4",
3
+ "version": "2.5.0",
4
4
  "private": false,
5
5
  "repository": {
6
6
  "type": "git",