@igstack/app-catalog-table-sync 0.3.1-alpha-20260328001855 → 0.3.1-alpha-20260328160000

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.
@@ -1,20 +1,20 @@
1
1
  import { FilteredKeys } from 'radashi';
2
- export interface TableSyncParams<T extends object, TUniqColumns extends ReadonlyArray<keyof T>, TId extends keyof T & (string | number)> {
2
+ export interface TableSyncParams<T extends object, TUniqColumns extends readonly (keyof T)[], TId extends keyof T & (string | number)> {
3
3
  id: TId;
4
- readAll: () => Promise<Array<T>>;
5
- writeAll: (create: Array<Omit<T, TId>>, update: Array<{
4
+ readAll: () => Promise<T[]>;
5
+ writeAll: (create: Omit<T, TId>[], update: {
6
6
  data: Partial<T>;
7
7
  where: Pick<T, FilteredKeys<T, TUniqColumns>>;
8
- }>, deleteIds: Array<T[TId]>) => Promise<Array<T>>;
8
+ }[], deleteIds: T[TId][]) => Promise<T[]>;
9
9
  uniqColumns: TUniqColumns;
10
10
  }
11
- export declare function tableSync<T extends object, TUniqColumns extends ReadonlyArray<keyof T>, TId extends keyof T & (string | number)>(params: TableSyncParams<T, TUniqColumns, TId>): {
12
- sync<TUpsert extends Partial<T> & Pick<T, TUniqColumns[number]>>(upsertRaw: Array<TUpsert>): Promise<{
11
+ export declare function tableSync<T extends object, TUniqColumns extends readonly (keyof T)[], TId extends keyof T & (string | number)>(params: TableSyncParams<T, TUniqColumns, TId>): {
12
+ sync<TUpsert extends Partial<T> & Pick<T, TUniqColumns[number]>>(upsertRaw: TUpsert[]): Promise<{
13
13
  findIdMaybe: (key: Pick<T, TUniqColumns[number]>) => T[TId] | undefined;
14
14
  findIdOrThrow: (key: Pick<T, TUniqColumns[number]>) => T[TId];
15
15
  getActual(): (Pick<T, TUniqColumns[number]> & T[TId])[];
16
16
  }>;
17
17
  };
18
- export interface TableSyncIdBag<T, TUniqColumns extends ReadonlyArray<keyof T>> {
18
+ export interface TableSyncIdBag<T, TUniqColumns extends readonly (keyof T)[]> {
19
19
  findId: (key: Pick<T, TUniqColumns[number]>) => T[keyof T] | undefined;
20
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tableSync.js","sources":["../../src/tableSync.ts"],"sourcesContent":["import type { FilteredKeys } from 'radashi'\nimport { group, isEqual, objectify, pick } from 'radashi'\n\nexport interface TableSyncParams<\n T extends object,\n TUniqColumns extends ReadonlyArray<keyof T>,\n TId extends keyof T & (string | number),\n> {\n id: TId\n readAll: () => Promise<Array<T>>\n writeAll: (\n create: Array<Omit<T, TId>>,\n update: Array<{\n data: Partial<T>\n where: Pick<T, FilteredKeys<T, TUniqColumns>>\n }>,\n deleteIds: Array<T[TId]>,\n ) => Promise<Array<T>>\n uniqColumns: TUniqColumns\n}\n\nexport function tableSync<\n T extends object,\n TUniqColumns extends ReadonlyArray<keyof T>,\n TId extends keyof T & (string | number),\n>(params: TableSyncParams<T, TUniqColumns, TId>) {\n return {\n async sync<TUpsert extends Partial<T> & Pick<T, TUniqColumns[number]>>(\n upsertRaw: Array<TUpsert>,\n ) {\n const existingData = await params.readAll()\n\n function toStrKey(item: T) {\n return params.uniqColumns\n .map((column) => {\n if (item[column] === undefined) {\n throw new Error(\n `unique column ${String(column)} can't be undefined in entry ${JSON.stringify(item)}`,\n )\n }\n return item[column]\n })\n .join(':')\n }\n\n const existingByStrKey = objectify(existingData, (item) => toStrKey(item))\n\n const isEqualOnKeys = (upsert: Partial<T>, existing: T) => {\n for (const key in upsert) {\n if (!(key in existing)) {\n return false\n }\n if (!isEqual(existing[key], upsert[key])) {\n return false\n }\n }\n return true\n }\n\n const upsertItems = upsertRaw\n const { toCreate, toUpdate, unmodified } = group(\n upsertItems,\n (upsertItem) => {\n const strKey = toStrKey(upsertItem)\n const existing = existingByStrKey[strKey]\n if (existing !== undefined) {\n if (isEqualOnKeys(upsertItem, existing)) {\n return 'unmodified'\n } else {\n return 'toUpdate'\n }\n } else {\n return 'toCreate'\n }\n },\n )\n\n const deletedStrKeys = new Set<keyof typeof existingByStrKey>(\n Object.keys(existingByStrKey),\n )\n for (const item of upsertItems) {\n deletedStrKeys.delete(toStrKey(item))\n }\n const deletedIds = [...deletedStrKeys].map((strKey) => {\n const existingByStrKeyElementElement =\n existingByStrKey[strKey]?.[params.id]\n if (existingByStrKeyElementElement === undefined) {\n throw new Error(\n `The PK column '${params.id}' is not presented in ${JSON.stringify(existingByStrKey[strKey])}`,\n )\n }\n return existingByStrKeyElementElement\n })\n\n const inserted = await params.writeAll(\n toCreate || [],\n (toUpdate || []).map((update) => {\n return {\n data: update,\n where: pick<T, TUniqColumns>(update, params.uniqColumns),\n }\n }),\n deletedIds as Array<T[TId]>,\n )\n\n const findActual = (key: Pick<T, TUniqColumns[number]>) => {\n const strKey = toStrKey(key)\n const maybeExisting = existingByStrKey[strKey]\n if (maybeExisting !== undefined && !(strKey in deletedStrKeys)) {\n return maybeExisting\n }\n return inserted.find((ins) => {\n return toStrKey(ins) === strKey\n })\n }\n\n function getActual() {\n return [...inserted, ...(toUpdate || []), ...(unmodified || [])].map(\n (row) => findActual(row),\n ) as Array<Pick<T, TUniqColumns[number]> & T[TId]>\n }\n\n return {\n findIdMaybe: (\n key: Pick<T, TUniqColumns[number]>,\n ): T[TId] | undefined => {\n return findActual(key)?.[params.id]\n },\n\n findIdOrThrow: (key: Pick<T, TUniqColumns[number]>): T[TId] => {\n const maybeInserted = findActual(key)?.[params.id]\n if (!maybeInserted) {\n const total = [toCreate, toUpdate, unmodified]\n .map((s) => s?.length || 0)\n .reduce((a, c) => a + c, 0)\n throw new Error(\n `findOrThrow: '${toStrKey(key)}' not found. (Existed #: ${total})`,\n )\n }\n return maybeInserted\n },\n getActual() {\n return getActual()\n },\n }\n },\n }\n}\n\nexport interface TableSyncIdBag<\n T,\n TUniqColumns extends ReadonlyArray<keyof T>,\n> {\n findId: (key: Pick<T, TUniqColumns[number]>) => T[keyof T] | undefined\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tableSync.js","sources":["../../src/tableSync.ts"],"sourcesContent":["import type { FilteredKeys } from 'radashi'\nimport { group, isEqual, objectify, pick } from 'radashi'\n\nexport interface TableSyncParams<\n T extends object,\n TUniqColumns extends readonly (keyof T)[],\n TId extends keyof T & (string | number),\n> {\n id: TId\n readAll: () => Promise<T[]>\n writeAll: (\n create: Omit<T, TId>[],\n update: {\n data: Partial<T>\n where: Pick<T, FilteredKeys<T, TUniqColumns>>\n }[],\n deleteIds: T[TId][],\n ) => Promise<T[]>\n uniqColumns: TUniqColumns\n}\n\nexport function tableSync<\n T extends object,\n TUniqColumns extends readonly (keyof T)[],\n TId extends keyof T & (string | number),\n>(params: TableSyncParams<T, TUniqColumns, TId>) {\n return {\n async sync<TUpsert extends Partial<T> & Pick<T, TUniqColumns[number]>>(\n upsertRaw: TUpsert[],\n ) {\n const existingData = await params.readAll()\n\n function toStrKey(item: T) {\n return params.uniqColumns\n .map((column) => {\n if (item[column] === undefined) {\n throw new Error(\n `unique column ${String(column)} can't be undefined in entry ${JSON.stringify(item)}`,\n )\n }\n return item[column]\n })\n .join(':')\n }\n\n const existingByStrKey = objectify(existingData, (item) => toStrKey(item))\n\n const isEqualOnKeys = (upsert: Partial<T>, existing: T) => {\n for (const key in upsert) {\n if (!(key in existing)) {\n return false\n }\n if (!isEqual(existing[key], upsert[key])) {\n return false\n }\n }\n return true\n }\n\n const upsertItems = upsertRaw\n const { toCreate, toUpdate, unmodified } = group(\n upsertItems,\n (upsertItem) => {\n const strKey = toStrKey(upsertItem)\n const existing = existingByStrKey[strKey]\n if (existing !== undefined) {\n if (isEqualOnKeys(upsertItem, existing)) {\n return 'unmodified'\n } else {\n return 'toUpdate'\n }\n } else {\n return 'toCreate'\n }\n },\n )\n\n const deletedStrKeys = new Set<keyof typeof existingByStrKey>(\n Object.keys(existingByStrKey),\n )\n for (const item of upsertItems) {\n deletedStrKeys.delete(toStrKey(item))\n }\n const deletedIds = [...deletedStrKeys].map((strKey) => {\n const existingByStrKeyElementElement =\n existingByStrKey[strKey]?.[params.id]\n if (existingByStrKeyElementElement === undefined) {\n throw new Error(\n `The PK column '${params.id}' is not presented in ${JSON.stringify(existingByStrKey[strKey])}`,\n )\n }\n return existingByStrKeyElementElement\n })\n\n const inserted = await params.writeAll(\n toCreate || [],\n (toUpdate || []).map((update) => {\n return {\n data: update,\n where: pick<T, TUniqColumns>(update, params.uniqColumns),\n }\n }),\n deletedIds as T[TId][],\n )\n\n const findActual = (key: Pick<T, TUniqColumns[number]>) => {\n const strKey = toStrKey(key)\n const maybeExisting = existingByStrKey[strKey]\n if (maybeExisting !== undefined && !(strKey in deletedStrKeys)) {\n return maybeExisting\n }\n return inserted.find((ins) => {\n return toStrKey(ins) === strKey\n })\n }\n\n function getActual() {\n return [...inserted, ...(toUpdate || []), ...(unmodified || [])].map(\n (row) => findActual(row),\n ) as (Pick<T, TUniqColumns[number]> & T[TId])[]\n }\n\n return {\n findIdMaybe: (\n key: Pick<T, TUniqColumns[number]>,\n ): T[TId] | undefined => {\n return findActual(key)?.[params.id]\n },\n\n findIdOrThrow: (key: Pick<T, TUniqColumns[number]>): T[TId] => {\n const maybeInserted = findActual(key)?.[params.id]\n if (!maybeInserted) {\n const total = [toCreate, toUpdate, unmodified]\n .map((s) => s?.length || 0)\n .reduce((a, c) => a + c, 0)\n throw new Error(\n `findOrThrow: '${toStrKey(key)}' not found. (Existed #: ${total})`,\n )\n }\n return maybeInserted\n },\n getActual() {\n return getActual()\n },\n }\n },\n }\n}\n\nexport interface TableSyncIdBag<T, TUniqColumns extends readonly (keyof T)[]> {\n findId: (key: Pick<T, TUniqColumns[number]>) => T[keyof T] | undefined\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@igstack/app-catalog-table-sync",
3
- "version": "0.3.1-alpha-20260328001855",
3
+ "version": "0.3.1-alpha-20260328160000",
4
4
  "description": "Database table sync utilities for App Catalog",
5
5
  "homepage": "https://github.com/lislon/app-catalog",
6
6
  "repository": {
package/src/tableSync.ts CHANGED
@@ -3,30 +3,30 @@ import { group, isEqual, objectify, pick } from 'radashi'
3
3
 
4
4
  export interface TableSyncParams<
5
5
  T extends object,
6
- TUniqColumns extends ReadonlyArray<keyof T>,
6
+ TUniqColumns extends readonly (keyof T)[],
7
7
  TId extends keyof T & (string | number),
8
8
  > {
9
9
  id: TId
10
- readAll: () => Promise<Array<T>>
10
+ readAll: () => Promise<T[]>
11
11
  writeAll: (
12
- create: Array<Omit<T, TId>>,
13
- update: Array<{
12
+ create: Omit<T, TId>[],
13
+ update: {
14
14
  data: Partial<T>
15
15
  where: Pick<T, FilteredKeys<T, TUniqColumns>>
16
- }>,
17
- deleteIds: Array<T[TId]>,
18
- ) => Promise<Array<T>>
16
+ }[],
17
+ deleteIds: T[TId][],
18
+ ) => Promise<T[]>
19
19
  uniqColumns: TUniqColumns
20
20
  }
21
21
 
22
22
  export function tableSync<
23
23
  T extends object,
24
- TUniqColumns extends ReadonlyArray<keyof T>,
24
+ TUniqColumns extends readonly (keyof T)[],
25
25
  TId extends keyof T & (string | number),
26
26
  >(params: TableSyncParams<T, TUniqColumns, TId>) {
27
27
  return {
28
28
  async sync<TUpsert extends Partial<T> & Pick<T, TUniqColumns[number]>>(
29
- upsertRaw: Array<TUpsert>,
29
+ upsertRaw: TUpsert[],
30
30
  ) {
31
31
  const existingData = await params.readAll()
32
32
 
@@ -100,7 +100,7 @@ export function tableSync<
100
100
  where: pick<T, TUniqColumns>(update, params.uniqColumns),
101
101
  }
102
102
  }),
103
- deletedIds as Array<T[TId]>,
103
+ deletedIds as T[TId][],
104
104
  )
105
105
 
106
106
  const findActual = (key: Pick<T, TUniqColumns[number]>) => {
@@ -117,7 +117,7 @@ export function tableSync<
117
117
  function getActual() {
118
118
  return [...inserted, ...(toUpdate || []), ...(unmodified || [])].map(
119
119
  (row) => findActual(row),
120
- ) as Array<Pick<T, TUniqColumns[number]> & T[TId]>
120
+ ) as (Pick<T, TUniqColumns[number]> & T[TId])[]
121
121
  }
122
122
 
123
123
  return {
@@ -147,9 +147,6 @@ export function tableSync<
147
147
  }
148
148
  }
149
149
 
150
- export interface TableSyncIdBag<
151
- T,
152
- TUniqColumns extends ReadonlyArray<keyof T>,
153
- > {
150
+ export interface TableSyncIdBag<T, TUniqColumns extends readonly (keyof T)[]> {
154
151
  findId: (key: Pick<T, TUniqColumns[number]>) => T[keyof T] | undefined
155
152
  }