@open-aih/payload-ddb 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +146 -0
- package/dist/connect.d.ts +3 -0
- package/dist/connect.d.ts.map +1 -0
- package/dist/connect.js +6 -0
- package/dist/connect.js.map +1 -0
- package/dist/count.d.ts +3 -0
- package/dist/count.d.ts.map +1 -0
- package/dist/count.js +9 -0
- package/dist/count.js.map +1 -0
- package/dist/countGlobalVersions.d.ts +3 -0
- package/dist/countGlobalVersions.d.ts.map +1 -0
- package/dist/countGlobalVersions.js +9 -0
- package/dist/countGlobalVersions.js.map +1 -0
- package/dist/countVersions.d.ts +3 -0
- package/dist/countVersions.d.ts.map +1 -0
- package/dist/countVersions.js +9 -0
- package/dist/countVersions.js.map +1 -0
- package/dist/create.d.ts +3 -0
- package/dist/create.d.ts.map +1 -0
- package/dist/create.js +38 -0
- package/dist/create.js.map +1 -0
- package/dist/createGlobal.d.ts +8 -0
- package/dist/createGlobal.d.ts.map +1 -0
- package/dist/createGlobal.js +29 -0
- package/dist/createGlobal.js.map +1 -0
- package/dist/createGlobalVersion.d.ts +8 -0
- package/dist/createGlobalVersion.d.ts.map +1 -0
- package/dist/createGlobalVersion.js +80 -0
- package/dist/createGlobalVersion.js.map +1 -0
- package/dist/createVersion.d.ts +18 -0
- package/dist/createVersion.d.ts.map +1 -0
- package/dist/createVersion.js +106 -0
- package/dist/createVersion.js.map +1 -0
- package/dist/deleteMany.d.ts +12 -0
- package/dist/deleteMany.d.ts.map +1 -0
- package/dist/deleteMany.js +27 -0
- package/dist/deleteMany.js.map +1 -0
- package/dist/deleteOne.d.ts +3 -0
- package/dist/deleteOne.d.ts.map +1 -0
- package/dist/deleteOne.js +48 -0
- package/dist/deleteOne.js.map +1 -0
- package/dist/deleteVersions.d.ts +9 -0
- package/dist/deleteVersions.d.ts.map +1 -0
- package/dist/deleteVersions.js +28 -0
- package/dist/deleteVersions.js.map +1 -0
- package/dist/destroy.d.ts +3 -0
- package/dist/destroy.d.ts.map +1 -0
- package/dist/destroy.js +10 -0
- package/dist/destroy.js.map +1 -0
- package/dist/find.d.ts +20 -0
- package/dist/find.d.ts.map +1 -0
- package/dist/find.js +54 -0
- package/dist/find.js.map +1 -0
- package/dist/findDistinct.d.ts +13 -0
- package/dist/findDistinct.d.ts.map +1 -0
- package/dist/findDistinct.js +52 -0
- package/dist/findDistinct.js.map +1 -0
- package/dist/findGlobal.d.ts +11 -0
- package/dist/findGlobal.d.ts.map +1 -0
- package/dist/findGlobal.js +34 -0
- package/dist/findGlobal.js.map +1 -0
- package/dist/findGlobalVersions.d.ts +3 -0
- package/dist/findGlobalVersions.d.ts.map +1 -0
- package/dist/findGlobalVersions.js +32 -0
- package/dist/findGlobalVersions.js.map +1 -0
- package/dist/findOne.d.ts +9 -0
- package/dist/findOne.d.ts.map +1 -0
- package/dist/findOne.js +22 -0
- package/dist/findOne.js.map +1 -0
- package/dist/findVersions.d.ts +10 -0
- package/dist/findVersions.d.ts.map +1 -0
- package/dist/findVersions.js +42 -0
- package/dist/findVersions.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +16 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +24 -0
- package/dist/init.js.map +1 -0
- package/dist/queryDrafts.d.ts +3 -0
- package/dist/queryDrafts.d.ts.map +1 -0
- package/dist/queryDrafts.js +103 -0
- package/dist/queryDrafts.js.map +1 -0
- package/dist/types.d.ts +119 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/updateGlobal.d.ts +9 -0
- package/dist/updateGlobal.d.ts.map +1 -0
- package/dist/updateGlobal.js +45 -0
- package/dist/updateGlobal.js.map +1 -0
- package/dist/updateGlobalVersion.d.ts +8 -0
- package/dist/updateGlobalVersion.d.ts.map +1 -0
- package/dist/updateGlobalVersion.js +59 -0
- package/dist/updateGlobalVersion.js.map +1 -0
- package/dist/updateMany.d.ts +13 -0
- package/dist/updateMany.d.ts.map +1 -0
- package/dist/updateMany.js +48 -0
- package/dist/updateMany.js.map +1 -0
- package/dist/updateOne.d.ts +13 -0
- package/dist/updateOne.d.ts.map +1 -0
- package/dist/updateOne.js +68 -0
- package/dist/updateOne.js.map +1 -0
- package/dist/updateVersion.d.ts +15 -0
- package/dist/updateVersion.d.ts.map +1 -0
- package/dist/updateVersion.js +69 -0
- package/dist/updateVersion.js.map +1 -0
- package/dist/upsert.d.ts +10 -0
- package/dist/upsert.d.ts.map +1 -0
- package/dist/upsert.js +55 -0
- package/dist/upsert.js.map +1 -0
- package/dist/utilities/applySorts.d.ts +11 -0
- package/dist/utilities/applySorts.d.ts.map +1 -0
- package/dist/utilities/applySorts.js +47 -0
- package/dist/utilities/applySorts.js.map +1 -0
- package/dist/utilities/buildFilterExpression.d.ts +42 -0
- package/dist/utilities/buildFilterExpression.d.ts.map +1 -0
- package/dist/utilities/buildFilterExpression.js +137 -0
- package/dist/utilities/buildFilterExpression.js.map +1 -0
- package/dist/utilities/draftsFallback.d.ts +28 -0
- package/dist/utilities/draftsFallback.d.ts.map +1 -0
- package/dist/utilities/draftsFallback.js +52 -0
- package/dist/utilities/draftsFallback.js.map +1 -0
- package/dist/utilities/ensureConnected.d.ts +12 -0
- package/dist/utilities/ensureConnected.d.ts.map +1 -0
- package/dist/utilities/ensureConnected.js +20 -0
- package/dist/utilities/ensureConnected.js.map +1 -0
- package/dist/utilities/ensureTable.d.ts +16 -0
- package/dist/utilities/ensureTable.d.ts.map +1 -0
- package/dist/utilities/ensureTable.js +62 -0
- package/dist/utilities/ensureTable.js.map +1 -0
- package/dist/utilities/findFirst.d.ts +16 -0
- package/dist/utilities/findFirst.d.ts.map +1 -0
- package/dist/utilities/findFirst.js +79 -0
- package/dist/utilities/findFirst.js.map +1 -0
- package/dist/utilities/getByPath.d.ts +9 -0
- package/dist/utilities/getByPath.d.ts.map +1 -0
- package/dist/utilities/getByPath.js +22 -0
- package/dist/utilities/getByPath.js.map +1 -0
- package/dist/utilities/matchesWhere.d.ts +12 -0
- package/dist/utilities/matchesWhere.d.ts.map +1 -0
- package/dist/utilities/matchesWhere.js +98 -0
- package/dist/utilities/matchesWhere.js.map +1 -0
- package/dist/utilities/normalizeForDynamo.d.ts +15 -0
- package/dist/utilities/normalizeForDynamo.d.ts.map +1 -0
- package/dist/utilities/normalizeForDynamo.js +27 -0
- package/dist/utilities/normalizeForDynamo.js.map +1 -0
- package/dist/utilities/operators.d.ts +26 -0
- package/dist/utilities/operators.d.ts.map +1 -0
- package/dist/utilities/operators.js +58 -0
- package/dist/utilities/operators.js.map +1 -0
- package/dist/utilities/pickConfiguredFields.d.ts +10 -0
- package/dist/utilities/pickConfiguredFields.d.ts.map +1 -0
- package/dist/utilities/pickConfiguredFields.js +113 -0
- package/dist/utilities/pickConfiguredFields.js.map +1 -0
- package/dist/utilities/queryCount.d.ts +9 -0
- package/dist/utilities/queryCount.d.ts.map +1 -0
- package/dist/utilities/queryCount.js +56 -0
- package/dist/utilities/queryCount.js.map +1 -0
- package/dist/utilities/queryMatching.d.ts +18 -0
- package/dist/utilities/queryMatching.d.ts.map +1 -0
- package/dist/utilities/queryMatching.js +71 -0
- package/dist/utilities/queryMatching.js.map +1 -0
- package/dist/utilities/resolveSchema.d.ts +56 -0
- package/dist/utilities/resolveSchema.d.ts.map +1 -0
- package/dist/utilities/resolveSchema.js +84 -0
- package/dist/utilities/resolveSchema.js.map +1 -0
- package/dist/utilities/scrubUnknownFields.d.ts +44 -0
- package/dist/utilities/scrubUnknownFields.d.ts.map +1 -0
- package/dist/utilities/scrubUnknownFields.js +88 -0
- package/dist/utilities/scrubUnknownFields.js.map +1 -0
- package/dist/utilities/stripInternalKeys.d.ts +7 -0
- package/dist/utilities/stripInternalKeys.d.ts.map +1 -0
- package/dist/utilities/stripInternalKeys.js +10 -0
- package/dist/utilities/stripInternalKeys.js.map +1 -0
- package/dist/utilities/whereToId.d.ts +11 -0
- package/dist/utilities/whereToId.d.ts.map +1 -0
- package/dist/utilities/whereToId.js +38 -0
- package/dist/utilities/whereToId.js.map +1 -0
- package/package.json +65 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { createDatabaseAdapter } from 'payload';
|
|
2
|
+
import { connect } from './connect.js';
|
|
3
|
+
import { count } from './count.js';
|
|
4
|
+
import { countGlobalVersions } from './countGlobalVersions.js';
|
|
5
|
+
import { countVersions } from './countVersions.js';
|
|
6
|
+
import { create } from './create.js';
|
|
7
|
+
import { createGlobal } from './createGlobal.js';
|
|
8
|
+
import { createGlobalVersion } from './createGlobalVersion.js';
|
|
9
|
+
import { createVersion } from './createVersion.js';
|
|
10
|
+
import { deleteMany } from './deleteMany.js';
|
|
11
|
+
import { deleteOne } from './deleteOne.js';
|
|
12
|
+
import { deleteVersions } from './deleteVersions.js';
|
|
13
|
+
import { destroy } from './destroy.js';
|
|
14
|
+
import { find } from './find.js';
|
|
15
|
+
import { findDistinct } from './findDistinct.js';
|
|
16
|
+
import { findGlobal } from './findGlobal.js';
|
|
17
|
+
import { findGlobalVersions } from './findGlobalVersions.js';
|
|
18
|
+
import { findOne } from './findOne.js';
|
|
19
|
+
import { findVersions } from './findVersions.js';
|
|
20
|
+
import { init } from './init.js';
|
|
21
|
+
import { queryDrafts } from './queryDrafts.js';
|
|
22
|
+
import { updateGlobal } from './updateGlobal.js';
|
|
23
|
+
import { updateGlobalVersion } from './updateGlobalVersion.js';
|
|
24
|
+
import { updateMany } from './updateMany.js';
|
|
25
|
+
import { updateOne } from './updateOne.js';
|
|
26
|
+
import { updateVersion } from './updateVersion.js';
|
|
27
|
+
import { upsert } from './upsert.js';
|
|
28
|
+
export { scrubUnknownFields } from './utilities/scrubUnknownFields.js';
|
|
29
|
+
const NAME = 'dynamodb';
|
|
30
|
+
const PACKAGE_NAME = '@aih-software/payload-ddb';
|
|
31
|
+
const DEFAULT_TABLE_NAME = 'payload';
|
|
32
|
+
export function dynamoAdapter(args = {}) {
|
|
33
|
+
function adapterInit({ payload }) {
|
|
34
|
+
const tableName = args.tableName ?? DEFAULT_TABLE_NAME;
|
|
35
|
+
const resolvePartition = (slug)=>slug;
|
|
36
|
+
const resolveVersionsPartition = (slug)=>`${slug}_versions`;
|
|
37
|
+
return createDatabaseAdapter({
|
|
38
|
+
name: NAME,
|
|
39
|
+
packageName: PACKAGE_NAME,
|
|
40
|
+
defaultIDType: 'text',
|
|
41
|
+
payload,
|
|
42
|
+
// ----- adapter-specific state -----
|
|
43
|
+
clientConfig: args.clientConfig ?? {},
|
|
44
|
+
translateConfig: args.translateConfig ?? {
|
|
45
|
+
marshallOptions: {
|
|
46
|
+
removeUndefinedValues: true,
|
|
47
|
+
convertClassInstanceToMap: true
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
client: args.client,
|
|
51
|
+
docClient: undefined,
|
|
52
|
+
ownsClient: !args.client,
|
|
53
|
+
tableName,
|
|
54
|
+
ensureTables: args.ensureTables ?? false,
|
|
55
|
+
resolvePartition,
|
|
56
|
+
resolveVersionsPartition,
|
|
57
|
+
// ----- lifecycle -----
|
|
58
|
+
connect,
|
|
59
|
+
destroy,
|
|
60
|
+
init,
|
|
61
|
+
// ----- transactions (no-op until DynamoDB transact-writes are wired) -----
|
|
62
|
+
beginTransaction: async ()=>null,
|
|
63
|
+
commitTransaction: async ()=>{},
|
|
64
|
+
rollbackTransaction: async ()=>{},
|
|
65
|
+
// ----- methods -----
|
|
66
|
+
count,
|
|
67
|
+
countGlobalVersions,
|
|
68
|
+
countVersions,
|
|
69
|
+
create,
|
|
70
|
+
createGlobal,
|
|
71
|
+
createGlobalVersion,
|
|
72
|
+
createVersion,
|
|
73
|
+
deleteMany,
|
|
74
|
+
deleteOne,
|
|
75
|
+
deleteVersions,
|
|
76
|
+
find,
|
|
77
|
+
findDistinct,
|
|
78
|
+
findGlobal,
|
|
79
|
+
findGlobalVersions,
|
|
80
|
+
findOne,
|
|
81
|
+
findVersions,
|
|
82
|
+
queryDrafts,
|
|
83
|
+
updateGlobal,
|
|
84
|
+
updateGlobalVersion,
|
|
85
|
+
updateMany,
|
|
86
|
+
updateOne,
|
|
87
|
+
updateVersion,
|
|
88
|
+
upsert
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
name: NAME,
|
|
93
|
+
defaultIDType: 'text',
|
|
94
|
+
init: adapterInit
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { DatabaseAdapterObj, Payload } from 'payload'\n\nimport { createDatabaseAdapter } from 'payload'\n\nimport type { Args, DynamoAdapter } from './types.js'\n\nimport { connect } from './connect.js'\nimport { count } from './count.js'\nimport { countGlobalVersions } from './countGlobalVersions.js'\nimport { countVersions } from './countVersions.js'\nimport { create } from './create.js'\nimport { createGlobal } from './createGlobal.js'\nimport { createGlobalVersion } from './createGlobalVersion.js'\nimport { createVersion } from './createVersion.js'\nimport { deleteMany } from './deleteMany.js'\nimport { deleteOne } from './deleteOne.js'\nimport { deleteVersions } from './deleteVersions.js'\nimport { destroy } from './destroy.js'\nimport { find } from './find.js'\nimport { findDistinct } from './findDistinct.js'\nimport { findGlobal } from './findGlobal.js'\nimport { findGlobalVersions } from './findGlobalVersions.js'\nimport { findOne } from './findOne.js'\nimport { findVersions } from './findVersions.js'\nimport { init } from './init.js'\nimport { queryDrafts } from './queryDrafts.js'\nimport { updateGlobal } from './updateGlobal.js'\nimport { updateGlobalVersion } from './updateGlobalVersion.js'\nimport { updateMany } from './updateMany.js'\nimport { updateOne } from './updateOne.js'\nimport { updateVersion } from './updateVersion.js'\nimport { upsert } from './upsert.js'\n\nexport type { Args, DynamoAdapter } from './types.js'\nexport { scrubUnknownFields } from './utilities/scrubUnknownFields.js'\nexport type { ScrubReport } from './utilities/scrubUnknownFields.js'\n\nconst NAME = 'dynamodb'\nconst PACKAGE_NAME = '@aih-software/payload-ddb'\nconst DEFAULT_TABLE_NAME = 'payload'\n\nexport function dynamoAdapter(args: Args = {}): DatabaseAdapterObj<DynamoAdapter> {\n function adapterInit({ payload }: { payload: Payload }): DynamoAdapter {\n const tableName = args.tableName ?? DEFAULT_TABLE_NAME\n\n const resolvePartition = (slug: string): string => slug\n const resolveVersionsPartition = (slug: string): string => `${slug}_versions`\n\n return createDatabaseAdapter<DynamoAdapter>({\n name: NAME,\n packageName: PACKAGE_NAME,\n defaultIDType: 'text',\n payload,\n\n // ----- adapter-specific state -----\n clientConfig: args.clientConfig ?? {},\n translateConfig: args.translateConfig ?? {\n marshallOptions: {\n removeUndefinedValues: true,\n convertClassInstanceToMap: true,\n },\n },\n client: args.client,\n docClient: undefined,\n ownsClient: !args.client,\n tableName,\n ensureTables: args.ensureTables ?? false,\n resolvePartition,\n resolveVersionsPartition,\n\n // ----- lifecycle -----\n connect,\n destroy,\n init,\n\n // ----- transactions (no-op until DynamoDB transact-writes are wired) -----\n beginTransaction: async () => null,\n commitTransaction: async () => {},\n rollbackTransaction: async () => {},\n\n // ----- methods -----\n count,\n countGlobalVersions,\n countVersions,\n create,\n createGlobal,\n createGlobalVersion,\n createVersion,\n deleteMany,\n deleteOne,\n deleteVersions,\n find,\n findDistinct,\n findGlobal,\n findGlobalVersions,\n findOne,\n findVersions,\n queryDrafts,\n updateGlobal,\n updateGlobalVersion,\n updateMany,\n updateOne,\n updateVersion,\n upsert,\n })\n }\n\n return {\n name: NAME,\n defaultIDType: 'text',\n init: adapterInit,\n }\n}\n"],"names":["createDatabaseAdapter","connect","count","countGlobalVersions","countVersions","create","createGlobal","createGlobalVersion","createVersion","deleteMany","deleteOne","deleteVersions","destroy","find","findDistinct","findGlobal","findGlobalVersions","findOne","findVersions","init","queryDrafts","updateGlobal","updateGlobalVersion","updateMany","updateOne","updateVersion","upsert","scrubUnknownFields","NAME","PACKAGE_NAME","DEFAULT_TABLE_NAME","dynamoAdapter","args","adapterInit","payload","tableName","resolvePartition","slug","resolveVersionsPartition","name","packageName","defaultIDType","clientConfig","translateConfig","marshallOptions","removeUndefinedValues","convertClassInstanceToMap","client","docClient","undefined","ownsClient","ensureTables","beginTransaction","commitTransaction","rollbackTransaction"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ,UAAS;AAI/C,SAASC,OAAO,QAAQ,eAAc;AACtC,SAASC,KAAK,QAAQ,aAAY;AAClC,SAASC,mBAAmB,QAAQ,2BAA0B;AAC9D,SAASC,aAAa,QAAQ,qBAAoB;AAClD,SAASC,MAAM,QAAQ,cAAa;AACpC,SAASC,YAAY,QAAQ,oBAAmB;AAChD,SAASC,mBAAmB,QAAQ,2BAA0B;AAC9D,SAASC,aAAa,QAAQ,qBAAoB;AAClD,SAASC,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,SAAS,QAAQ,iBAAgB;AAC1C,SAASC,cAAc,QAAQ,sBAAqB;AACpD,SAASC,OAAO,QAAQ,eAAc;AACtC,SAASC,IAAI,QAAQ,YAAW;AAChC,SAASC,YAAY,QAAQ,oBAAmB;AAChD,SAASC,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,kBAAkB,QAAQ,0BAAyB;AAC5D,SAASC,OAAO,QAAQ,eAAc;AACtC,SAASC,YAAY,QAAQ,oBAAmB;AAChD,SAASC,IAAI,QAAQ,YAAW;AAChC,SAASC,WAAW,QAAQ,mBAAkB;AAC9C,SAASC,YAAY,QAAQ,oBAAmB;AAChD,SAASC,mBAAmB,QAAQ,2BAA0B;AAC9D,SAASC,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,SAAS,QAAQ,iBAAgB;AAC1C,SAASC,aAAa,QAAQ,qBAAoB;AAClD,SAASC,MAAM,QAAQ,cAAa;AAGpC,SAASC,kBAAkB,QAAQ,oCAAmC;AAGtE,MAAMC,OAAO;AACb,MAAMC,eAAe;AACrB,MAAMC,qBAAqB;AAE3B,OAAO,SAASC,cAAcC,OAAa,CAAC,CAAC;IAC3C,SAASC,YAAY,EAAEC,OAAO,EAAwB;QACpD,MAAMC,YAAYH,KAAKG,SAAS,IAAIL;QAEpC,MAAMM,mBAAmB,CAACC,OAAyBA;QACnD,MAAMC,2BAA2B,CAACD,OAAyB,GAAGA,KAAK,SAAS,CAAC;QAE7E,OAAOrC,sBAAqC;YAC1CuC,MAAMX;YACNY,aAAaX;YACbY,eAAe;YACfP;YAEA,qCAAqC;YACrCQ,cAAcV,KAAKU,YAAY,IAAI,CAAC;YACpCC,iBAAiBX,KAAKW,eAAe,IAAI;gBACvCC,iBAAiB;oBACfC,uBAAuB;oBACvBC,2BAA2B;gBAC7B;YACF;YACAC,QAAQf,KAAKe,MAAM;YACnBC,WAAWC;YACXC,YAAY,CAAClB,KAAKe,MAAM;YACxBZ;YACAgB,cAAcnB,KAAKmB,YAAY,IAAI;YACnCf;YACAE;YAEA,wBAAwB;YACxBrC;YACAW;YACAO;YAEA,4EAA4E;YAC5EiC,kBAAkB,UAAY;YAC9BC,mBAAmB,WAAa;YAChCC,qBAAqB,WAAa;YAElC,sBAAsB;YACtBpD;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAE;YACAC;YACAC;YACAC;YACAC;YACAC;YACAE;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;QACF;IACF;IAEA,OAAO;QACLa,MAAMX;QACNa,eAAe;QACftB,MAAMc;IACR;AACF"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Init } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Lifecycle hook called once after the factory `init` returns the adapter.
|
|
4
|
+
* Payload's order is `init → connect`, so we call `ensureConnected` here
|
|
5
|
+
* to populate the client before any DynamoDB operations.
|
|
6
|
+
*
|
|
7
|
+
* In single-table mode, every collection, global, and versions stream lives
|
|
8
|
+
* under a different `pk` value in the same physical table — so provisioning
|
|
9
|
+
* just means making sure that one table exists.
|
|
10
|
+
*
|
|
11
|
+
* Provisioning is opt-in because real deployments typically manage tables
|
|
12
|
+
* out-of-band (CDK, Terraform, CloudFormation). It's a meaningful dev-loop
|
|
13
|
+
* convenience for local testing against DynamoDB Local.
|
|
14
|
+
*/
|
|
15
|
+
export declare const init: Init;
|
|
16
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAOnC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,IAAI,EAAE,IAWlB,CAAA"}
|
package/dist/init.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ensureConnected } from './utilities/ensureConnected.js';
|
|
2
|
+
import { ensureTable } from './utilities/ensureTable.js';
|
|
3
|
+
/**
|
|
4
|
+
* Lifecycle hook called once after the factory `init` returns the adapter.
|
|
5
|
+
* Payload's order is `init → connect`, so we call `ensureConnected` here
|
|
6
|
+
* to populate the client before any DynamoDB operations.
|
|
7
|
+
*
|
|
8
|
+
* In single-table mode, every collection, global, and versions stream lives
|
|
9
|
+
* under a different `pk` value in the same physical table — so provisioning
|
|
10
|
+
* just means making sure that one table exists.
|
|
11
|
+
*
|
|
12
|
+
* Provisioning is opt-in because real deployments typically manage tables
|
|
13
|
+
* out-of-band (CDK, Terraform, CloudFormation). It's a meaningful dev-loop
|
|
14
|
+
* convenience for local testing against DynamoDB Local.
|
|
15
|
+
*/ export const init = async function() {
|
|
16
|
+
ensureConnected(this);
|
|
17
|
+
this.payload.logger.debug(`payload-ddb: init using table \`${this.tableName}\`; ensureTables=${this.ensureTables}`);
|
|
18
|
+
if (this.ensureTables) {
|
|
19
|
+
await ensureTable(this, this.tableName);
|
|
20
|
+
this.payload.logger.debug('payload-ddb: table ready');
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/init.ts"],"sourcesContent":["import type { Init } from 'payload'\n\nimport type { DynamoAdapter } from './types.js'\n\nimport { ensureConnected } from './utilities/ensureConnected.js'\nimport { ensureTable } from './utilities/ensureTable.js'\n\n/**\n * Lifecycle hook called once after the factory `init` returns the adapter.\n * Payload's order is `init → connect`, so we call `ensureConnected` here\n * to populate the client before any DynamoDB operations.\n *\n * In single-table mode, every collection, global, and versions stream lives\n * under a different `pk` value in the same physical table — so provisioning\n * just means making sure that one table exists.\n *\n * Provisioning is opt-in because real deployments typically manage tables\n * out-of-band (CDK, Terraform, CloudFormation). It's a meaningful dev-loop\n * convenience for local testing against DynamoDB Local.\n */\nexport const init: Init = async function (this: DynamoAdapter) {\n ensureConnected(this)\n\n this.payload.logger.debug(\n `payload-ddb: init using table \\`${this.tableName}\\`; ensureTables=${this.ensureTables}`,\n )\n\n if (this.ensureTables) {\n await ensureTable(this, this.tableName)\n this.payload.logger.debug('payload-ddb: table ready')\n }\n}\n"],"names":["ensureConnected","ensureTable","init","payload","logger","debug","tableName","ensureTables"],"mappings":"AAIA,SAASA,eAAe,QAAQ,iCAAgC;AAChE,SAASC,WAAW,QAAQ,6BAA4B;AAExD;;;;;;;;;;;;CAYC,GACD,OAAO,MAAMC,OAAa;IACxBF,gBAAgB,IAAI;IAEpB,IAAI,CAACG,OAAO,CAACC,MAAM,CAACC,KAAK,CACvB,CAAC,gCAAgC,EAAE,IAAI,CAACC,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAACC,YAAY,EAAE;IAG1F,IAAI,IAAI,CAACA,YAAY,EAAE;QACrB,MAAMN,YAAY,IAAI,EAAE,IAAI,CAACK,SAAS;QACtC,IAAI,CAACH,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;IAC5B;AACF,EAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryDrafts.d.ts","sourceRoot":"","sources":["../src/queryDrafts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,WAAW,EAAS,MAAM,SAAS,CAAA;AA6ChE,eAAO,MAAM,WAAW,EAAE,WAsEzB,CAAA"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { applySorts } from './utilities/applySorts.js';
|
|
2
|
+
import { matchesWhere } from './utilities/matchesWhere.js';
|
|
3
|
+
import { queryMatching } from './utilities/queryMatching.js';
|
|
4
|
+
/**
|
|
5
|
+
* Return the latest version of every doc as a paginated, doc-shaped result.
|
|
6
|
+
*
|
|
7
|
+
* Strategy:
|
|
8
|
+
* 1. Query the versions partition for `latest=true` rows (one per parent).
|
|
9
|
+
* 2. Project each row's `version` payload up to top-level so the result
|
|
10
|
+
* looks like a doc — this lets the user's `where` / `sort` operate in
|
|
11
|
+
* doc-field terms instead of `version.x` paths.
|
|
12
|
+
* 3. Fill in any docs that have a row in the *main* partition but no
|
|
13
|
+
* `latest=true` version row. This covers two cases:
|
|
14
|
+
* - documents created before versioning was enabled
|
|
15
|
+
* - data orphaned by historical adapter bugs that dropped version writes
|
|
16
|
+
* 4. Apply `where` post-projection, sort, paginate.
|
|
17
|
+
*
|
|
18
|
+
* No `_status` filter is applied — `queryDrafts` returns the latest version
|
|
19
|
+
* regardless of draft/published state. Payload's higher-level code decides
|
|
20
|
+
* how to use the result.
|
|
21
|
+
*/ // Payload core calls appendVersionToQueryKey before invoking queryDrafts,
|
|
22
|
+
// transforming e.g. `{ slug: { equals: 'x' } }` → `{ 'version.slug': { equals: 'x' } }`.
|
|
23
|
+
// But we project versionData flat to the top level, so those prefixed paths
|
|
24
|
+
// never resolve. Strip the leading `version.` to match the projected shape.
|
|
25
|
+
function stripVersionPrefix(where) {
|
|
26
|
+
if (!where || typeof where !== 'object') return where;
|
|
27
|
+
const result = {};
|
|
28
|
+
for (const [key, value] of Object.entries(where)){
|
|
29
|
+
if (key === 'and' || key === 'or') {
|
|
30
|
+
if (Array.isArray(value)) {
|
|
31
|
+
result[key] = value.map((sub)=>stripVersionPrefix(sub)).filter(Boolean);
|
|
32
|
+
}
|
|
33
|
+
} else {
|
|
34
|
+
result[key.startsWith('version.') ? key.slice(8) : key] = value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
export const queryDrafts = async function queryDrafts({ collection, limit = 10, page = 1, pagination = true, sort, where }) {
|
|
40
|
+
const versionsPartition = this.resolveVersionsPartition(collection);
|
|
41
|
+
const docsPartition = this.resolvePartition(collection);
|
|
42
|
+
const [latestRows, mainRows] = await Promise.all([
|
|
43
|
+
queryMatching(this, versionsPartition, {
|
|
44
|
+
latest: {
|
|
45
|
+
equals: true
|
|
46
|
+
}
|
|
47
|
+
}),
|
|
48
|
+
queryMatching(this, docsPartition, undefined)
|
|
49
|
+
]);
|
|
50
|
+
// Latest-version rows win. We key by parent id so `mainRows` only fills
|
|
51
|
+
// entries that have no version backing.
|
|
52
|
+
const docsByParent = new Map();
|
|
53
|
+
for (const row of latestRows){
|
|
54
|
+
const version = row['version'];
|
|
55
|
+
if (!version || typeof version !== 'object') continue;
|
|
56
|
+
docsByParent.set(row['parent'], {
|
|
57
|
+
...version,
|
|
58
|
+
id: row['parent']
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
for (const doc of mainRows){
|
|
62
|
+
if (!docsByParent.has(doc['id'])) {
|
|
63
|
+
docsByParent.set(doc['id'], doc);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const projected = [
|
|
67
|
+
...docsByParent.values()
|
|
68
|
+
];
|
|
69
|
+
// Payload core calls appendVersionToQueryKey before invoking queryDrafts,
|
|
70
|
+
// which transforms e.g. `{ slug: { equals: 'x' } }` into
|
|
71
|
+
// `{ 'version.slug': { equals: 'x' } }`. But we project versionData flat
|
|
72
|
+
// to the top level above, so those prefixed paths never resolve via
|
|
73
|
+
// getByPath. Strip the leading `version.` from every field key so the
|
|
74
|
+
// in-memory filter matches the projected shape.
|
|
75
|
+
const normalizedWhere = stripVersionPrefix(where);
|
|
76
|
+
const matched = normalizedWhere ? projected.filter((doc)=>matchesWhere(doc, normalizedWhere)) : projected;
|
|
77
|
+
applySorts(matched, sort);
|
|
78
|
+
const totalDocs = matched.length;
|
|
79
|
+
const useLimit = limit > 0;
|
|
80
|
+
const safePage = useLimit ? Math.max(1, page) : 1;
|
|
81
|
+
const start = useLimit ? (safePage - 1) * limit : 0;
|
|
82
|
+
const end = useLimit ? start + limit : totalDocs;
|
|
83
|
+
const docs = matched.slice(start, end);
|
|
84
|
+
const effectiveLimit = useLimit ? limit : totalDocs;
|
|
85
|
+
const totalPages = pagination && useLimit ? Math.max(1, Math.ceil(totalDocs / limit)) : 1;
|
|
86
|
+
const hasNextPage = pagination && useLimit && safePage < totalPages;
|
|
87
|
+
const hasPrevPage = pagination && useLimit && safePage > 1;
|
|
88
|
+
const result = {
|
|
89
|
+
docs,
|
|
90
|
+
hasNextPage,
|
|
91
|
+
hasPrevPage,
|
|
92
|
+
limit: effectiveLimit,
|
|
93
|
+
nextPage: hasNextPage ? safePage + 1 : null,
|
|
94
|
+
page: safePage,
|
|
95
|
+
pagingCounter: useLimit ? (safePage - 1) * limit + 1 : 1,
|
|
96
|
+
prevPage: hasPrevPage ? safePage - 1 : null,
|
|
97
|
+
totalDocs,
|
|
98
|
+
totalPages
|
|
99
|
+
};
|
|
100
|
+
return result;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
//# sourceMappingURL=queryDrafts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/queryDrafts.ts"],"sourcesContent":["import type { PaginatedDocs, QueryDrafts, Where } from 'payload'\n\nimport type { DynamoAdapter } from './types.js'\n\nimport { applySorts } from './utilities/applySorts.js'\nimport { matchesWhere } from './utilities/matchesWhere.js'\nimport { queryMatching } from './utilities/queryMatching.js'\n\n/**\n * Return the latest version of every doc as a paginated, doc-shaped result.\n *\n * Strategy:\n * 1. Query the versions partition for `latest=true` rows (one per parent).\n * 2. Project each row's `version` payload up to top-level so the result\n * looks like a doc — this lets the user's `where` / `sort` operate in\n * doc-field terms instead of `version.x` paths.\n * 3. Fill in any docs that have a row in the *main* partition but no\n * `latest=true` version row. This covers two cases:\n * - documents created before versioning was enabled\n * - data orphaned by historical adapter bugs that dropped version writes\n * 4. Apply `where` post-projection, sort, paginate.\n *\n * No `_status` filter is applied — `queryDrafts` returns the latest version\n * regardless of draft/published state. Payload's higher-level code decides\n * how to use the result.\n */\n// Payload core calls appendVersionToQueryKey before invoking queryDrafts,\n// transforming e.g. `{ slug: { equals: 'x' } }` → `{ 'version.slug': { equals: 'x' } }`.\n// But we project versionData flat to the top level, so those prefixed paths\n// never resolve. Strip the leading `version.` to match the projected shape.\nfunction stripVersionPrefix(where: Where | null | undefined): Where | null | undefined {\n if (!where || typeof where !== 'object') return where\n const result: Where = {}\n for (const [key, value] of Object.entries(where)) {\n if (key === 'and' || key === 'or') {\n if (Array.isArray(value)) {\n result[key] = value.map((sub) => stripVersionPrefix(sub as Where)).filter(Boolean) as Where[]\n }\n } else {\n result[key.startsWith('version.') ? key.slice(8) : key] = value as Where[string]\n }\n }\n return result\n}\n\nexport const queryDrafts: QueryDrafts = async function queryDrafts(\n this: DynamoAdapter,\n { collection, limit = 10, page = 1, pagination = true, sort, where },\n) {\n const versionsPartition = this.resolveVersionsPartition(collection)\n const docsPartition = this.resolvePartition(collection)\n\n const [latestRows, mainRows] = await Promise.all([\n queryMatching(this, versionsPartition, { latest: { equals: true } }),\n queryMatching(this, docsPartition, undefined),\n ])\n\n // Latest-version rows win. We key by parent id so `mainRows` only fills\n // entries that have no version backing.\n const docsByParent = new Map<unknown, Record<string, unknown>>()\n for (const row of latestRows) {\n const version = row['version']\n if (!version || typeof version !== 'object') continue\n docsByParent.set(row['parent'], {\n ...(version as Record<string, unknown>),\n id: row['parent'],\n })\n }\n\n for (const doc of mainRows) {\n if (!docsByParent.has(doc['id'])) {\n docsByParent.set(doc['id'], doc)\n }\n }\n\n const projected = [...docsByParent.values()]\n // Payload core calls appendVersionToQueryKey before invoking queryDrafts,\n // which transforms e.g. `{ slug: { equals: 'x' } }` into\n // `{ 'version.slug': { equals: 'x' } }`. But we project versionData flat\n // to the top level above, so those prefixed paths never resolve via\n // getByPath. Strip the leading `version.` from every field key so the\n // in-memory filter matches the projected shape.\n const normalizedWhere = stripVersionPrefix(where)\n const matched = normalizedWhere\n ? projected.filter((doc) => matchesWhere(doc, normalizedWhere))\n : projected\n\n applySorts(matched, sort)\n\n const totalDocs = matched.length\n const useLimit = limit > 0\n const safePage = useLimit ? Math.max(1, page) : 1\n\n const start = useLimit ? (safePage - 1) * limit : 0\n const end = useLimit ? start + limit : totalDocs\n const docs = matched.slice(start, end)\n\n const effectiveLimit = useLimit ? limit : totalDocs\n const totalPages = pagination && useLimit ? Math.max(1, Math.ceil(totalDocs / limit)) : 1\n const hasNextPage = pagination && useLimit && safePage < totalPages\n const hasPrevPage = pagination && useLimit && safePage > 1\n\n const result: PaginatedDocs<Record<string, unknown>> = {\n docs,\n hasNextPage,\n hasPrevPage,\n limit: effectiveLimit,\n nextPage: hasNextPage ? safePage + 1 : null,\n page: safePage,\n pagingCounter: useLimit ? (safePage - 1) * limit + 1 : 1,\n prevPage: hasPrevPage ? safePage - 1 : null,\n totalDocs,\n totalPages,\n }\n return result as never\n}\n"],"names":["applySorts","matchesWhere","queryMatching","stripVersionPrefix","where","result","key","value","Object","entries","Array","isArray","map","sub","filter","Boolean","startsWith","slice","queryDrafts","collection","limit","page","pagination","sort","versionsPartition","resolveVersionsPartition","docsPartition","resolvePartition","latestRows","mainRows","Promise","all","latest","equals","undefined","docsByParent","Map","row","version","set","id","doc","has","projected","values","normalizedWhere","matched","totalDocs","length","useLimit","safePage","Math","max","start","end","docs","effectiveLimit","totalPages","ceil","hasNextPage","hasPrevPage","nextPage","pagingCounter","prevPage"],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { DynamoDBClient, DynamoDBClientConfig } from '@aws-sdk/client-dynamodb';
|
|
2
|
+
import type { DynamoDBDocumentClient, TranslateConfig } from '@aws-sdk/lib-dynamodb';
|
|
3
|
+
import type { ArrayField, BaseDatabaseAdapter, BlocksField, CheckboxField, CodeField, CollapsibleField, CollectionSlug, DateField, EmailField, Field, GlobalSlug, GroupField, JoinField, JSONField, NumberField, PointField, RadioField, RelationshipField, RichTextField, RowField, SanitizedConfig, SelectField, TabsField, TextareaField, TextField, UploadField } from 'payload';
|
|
4
|
+
/**
|
|
5
|
+
* User-facing options for the `dynamoAdapter` factory.
|
|
6
|
+
*/
|
|
7
|
+
export type Args = {
|
|
8
|
+
/**
|
|
9
|
+
* Configuration passed straight through to `new DynamoDBClient(...)`.
|
|
10
|
+
* Use this for region, credentials, endpoint (e.g. DynamoDB Local), retry
|
|
11
|
+
* strategy, etc.
|
|
12
|
+
*/
|
|
13
|
+
clientConfig?: DynamoDBClientConfig;
|
|
14
|
+
/**
|
|
15
|
+
* Optional pre-built DynamoDB client. If supplied, `clientConfig` is ignored
|
|
16
|
+
* and the adapter will not call `.destroy()` on shutdown — the caller owns
|
|
17
|
+
* the client lifecycle.
|
|
18
|
+
*/
|
|
19
|
+
client?: DynamoDBClient;
|
|
20
|
+
/**
|
|
21
|
+
* Marshalling/unmarshalling options forwarded to
|
|
22
|
+
* `DynamoDBDocumentClient.from(client, translateConfig)`.
|
|
23
|
+
*
|
|
24
|
+
* Defaults applied when omitted:
|
|
25
|
+
* - `removeUndefinedValues: true`
|
|
26
|
+
* - `convertClassInstanceToMap: true`
|
|
27
|
+
*/
|
|
28
|
+
translateConfig?: TranslateConfig;
|
|
29
|
+
/**
|
|
30
|
+
* Name of the single DynamoDB table that backs every collection, global,
|
|
31
|
+
* and version. The adapter expects a composite-key schema (`pk` + `sk`).
|
|
32
|
+
*
|
|
33
|
+
* @default 'payload'
|
|
34
|
+
*/
|
|
35
|
+
tableName?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Path to read and write migration files from.
|
|
38
|
+
* @default 'migrations'
|
|
39
|
+
*/
|
|
40
|
+
migrationDir?: string;
|
|
41
|
+
/**
|
|
42
|
+
* If true, the adapter will provision the table at init time when it
|
|
43
|
+
* doesn't already exist. Disable in production where infra is managed
|
|
44
|
+
* out-of-band (CDK, Terraform, CloudFormation).
|
|
45
|
+
*
|
|
46
|
+
* @default false
|
|
47
|
+
*/
|
|
48
|
+
ensureTables?: boolean;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* The fully-resolved adapter instance, accessible as `payload.db` at runtime.
|
|
52
|
+
*
|
|
53
|
+
* Method implementations should be defined as `function` declarations (not
|
|
54
|
+
* arrows) and may use `this: DynamoAdapter` to reach the live client and
|
|
55
|
+
* resolved partition keys.
|
|
56
|
+
*/
|
|
57
|
+
export interface DynamoAdapter extends BaseDatabaseAdapter {
|
|
58
|
+
/** Underlying low-level DynamoDB client. Populated by `connect`. */
|
|
59
|
+
client: DynamoDBClient | undefined;
|
|
60
|
+
/** Document client wrapper around `client`. Populated by `connect`. */
|
|
61
|
+
docClient: DynamoDBDocumentClient | undefined;
|
|
62
|
+
/** Original options passed to the factory. */
|
|
63
|
+
clientConfig: DynamoDBClientConfig;
|
|
64
|
+
translateConfig: TranslateConfig;
|
|
65
|
+
/** True when the adapter constructed `client` itself and owns its lifecycle. */
|
|
66
|
+
ownsClient: boolean;
|
|
67
|
+
/** The single table name that backs all collections, globals, and versions. */
|
|
68
|
+
tableName: string;
|
|
69
|
+
ensureTables: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Resolve a collection or global slug to its DynamoDB partition key value.
|
|
72
|
+
* Today this is the slug verbatim — kept as a method so future schemes
|
|
73
|
+
* (e.g. tenant-scoped prefixes) can land without touching every method.
|
|
74
|
+
*/
|
|
75
|
+
resolvePartition: (slug: CollectionSlug | GlobalSlug | string) => string;
|
|
76
|
+
/**
|
|
77
|
+
* Resolve a slug to the partition key value used for its versions —
|
|
78
|
+
* `${slug}_versions`. Mirrors the v1 `_versions` sibling-table convention,
|
|
79
|
+
* just expressed as a partition within the single table.
|
|
80
|
+
*/
|
|
81
|
+
resolveVersionsPartition: (slug: CollectionSlug | GlobalSlug | string) => string;
|
|
82
|
+
}
|
|
83
|
+
export type BuildSchemaOptions = {
|
|
84
|
+
allowIDField?: boolean;
|
|
85
|
+
disableUnique?: boolean;
|
|
86
|
+
draftsEnabled?: boolean;
|
|
87
|
+
indexSortableFields?: boolean;
|
|
88
|
+
};
|
|
89
|
+
export type FieldGenerator<TSchema, TField> = {
|
|
90
|
+
config: SanitizedConfig;
|
|
91
|
+
field: TField;
|
|
92
|
+
options: BuildSchemaOptions;
|
|
93
|
+
schema: TSchema;
|
|
94
|
+
};
|
|
95
|
+
export type FieldGeneratorFunction<TSchema, TField extends Field> = (args: FieldGenerator<TSchema, TField>) => void;
|
|
96
|
+
export type FieldToSchemaMap<TSchema> = {
|
|
97
|
+
array: FieldGeneratorFunction<TSchema, ArrayField>;
|
|
98
|
+
blocks: FieldGeneratorFunction<TSchema, BlocksField>;
|
|
99
|
+
checkbox: FieldGeneratorFunction<TSchema, CheckboxField>;
|
|
100
|
+
code: FieldGeneratorFunction<TSchema, CodeField>;
|
|
101
|
+
collapsible: FieldGeneratorFunction<TSchema, CollapsibleField>;
|
|
102
|
+
date: FieldGeneratorFunction<TSchema, DateField>;
|
|
103
|
+
email: FieldGeneratorFunction<TSchema, EmailField>;
|
|
104
|
+
group: FieldGeneratorFunction<TSchema, GroupField>;
|
|
105
|
+
join: FieldGeneratorFunction<TSchema, JoinField>;
|
|
106
|
+
json: FieldGeneratorFunction<TSchema, JSONField>;
|
|
107
|
+
number: FieldGeneratorFunction<TSchema, NumberField>;
|
|
108
|
+
point: FieldGeneratorFunction<TSchema, PointField>;
|
|
109
|
+
radio: FieldGeneratorFunction<TSchema, RadioField>;
|
|
110
|
+
relationship: FieldGeneratorFunction<TSchema, RelationshipField>;
|
|
111
|
+
richText: FieldGeneratorFunction<TSchema, RichTextField>;
|
|
112
|
+
row: FieldGeneratorFunction<TSchema, RowField>;
|
|
113
|
+
select: FieldGeneratorFunction<TSchema, SelectField>;
|
|
114
|
+
tabs: FieldGeneratorFunction<TSchema, TabsField>;
|
|
115
|
+
text: FieldGeneratorFunction<TSchema, TextField>;
|
|
116
|
+
textarea: FieldGeneratorFunction<TSchema, TextareaField>;
|
|
117
|
+
upload: FieldGeneratorFunction<TSchema, UploadField>;
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { DynamoDBClient, DynamoDBClientConfig } from '@aws-sdk/client-dynamodb'\nimport type { DynamoDBDocumentClient, TranslateConfig } from '@aws-sdk/lib-dynamodb'\nimport type {\n ArrayField,\n BaseDatabaseAdapter,\n BlocksField,\n CheckboxField,\n CodeField,\n CollapsibleField,\n CollectionSlug,\n DateField,\n EmailField,\n Field,\n GlobalSlug,\n GroupField,\n JoinField,\n JSONField,\n NumberField,\n PointField,\n RadioField,\n RelationshipField,\n RichTextField,\n RowField,\n SanitizedConfig,\n SelectField,\n TabsField,\n TextareaField,\n TextField,\n UploadField,\n} from 'payload'\n\n/**\n * User-facing options for the `dynamoAdapter` factory.\n */\nexport type Args = {\n /**\n * Configuration passed straight through to `new DynamoDBClient(...)`.\n * Use this for region, credentials, endpoint (e.g. DynamoDB Local), retry\n * strategy, etc.\n */\n clientConfig?: DynamoDBClientConfig\n /**\n * Optional pre-built DynamoDB client. If supplied, `clientConfig` is ignored\n * and the adapter will not call `.destroy()` on shutdown — the caller owns\n * the client lifecycle.\n */\n client?: DynamoDBClient\n /**\n * Marshalling/unmarshalling options forwarded to\n * `DynamoDBDocumentClient.from(client, translateConfig)`.\n *\n * Defaults applied when omitted:\n * - `removeUndefinedValues: true`\n * - `convertClassInstanceToMap: true`\n */\n translateConfig?: TranslateConfig\n /**\n * Name of the single DynamoDB table that backs every collection, global,\n * and version. The adapter expects a composite-key schema (`pk` + `sk`).\n *\n * @default 'payload'\n */\n tableName?: string\n /**\n * Path to read and write migration files from.\n * @default 'migrations'\n */\n migrationDir?: string\n /**\n * If true, the adapter will provision the table at init time when it\n * doesn't already exist. Disable in production where infra is managed\n * out-of-band (CDK, Terraform, CloudFormation).\n *\n * @default false\n */\n ensureTables?: boolean\n}\n\n/**\n * The fully-resolved adapter instance, accessible as `payload.db` at runtime.\n *\n * Method implementations should be defined as `function` declarations (not\n * arrows) and may use `this: DynamoAdapter` to reach the live client and\n * resolved partition keys.\n */\nexport interface DynamoAdapter extends BaseDatabaseAdapter {\n /** Underlying low-level DynamoDB client. Populated by `connect`. */\n client: DynamoDBClient | undefined\n /** Document client wrapper around `client`. Populated by `connect`. */\n docClient: DynamoDBDocumentClient | undefined\n /** Original options passed to the factory. */\n clientConfig: DynamoDBClientConfig\n translateConfig: TranslateConfig\n /** True when the adapter constructed `client` itself and owns its lifecycle. */\n ownsClient: boolean\n /** The single table name that backs all collections, globals, and versions. */\n tableName: string\n ensureTables: boolean\n /**\n * Resolve a collection or global slug to its DynamoDB partition key value.\n * Today this is the slug verbatim — kept as a method so future schemes\n * (e.g. tenant-scoped prefixes) can land without touching every method.\n */\n resolvePartition: (slug: CollectionSlug | GlobalSlug | string) => string\n /**\n * Resolve a slug to the partition key value used for its versions —\n * `${slug}_versions`. Mirrors the v1 `_versions` sibling-table convention,\n * just expressed as a partition within the single table.\n */\n resolveVersionsPartition: (slug: CollectionSlug | GlobalSlug | string) => string\n}\n\nexport type BuildSchemaOptions = {\n allowIDField?: boolean\n disableUnique?: boolean\n draftsEnabled?: boolean\n indexSortableFields?: boolean\n}\n\nexport type FieldGenerator<TSchema, TField> = {\n config: SanitizedConfig\n field: TField\n options: BuildSchemaOptions\n schema: TSchema\n}\n\nexport type FieldGeneratorFunction<TSchema, TField extends Field> = (\n args: FieldGenerator<TSchema, TField>,\n) => void\n\nexport type FieldToSchemaMap<TSchema> = {\n array: FieldGeneratorFunction<TSchema, ArrayField>\n blocks: FieldGeneratorFunction<TSchema, BlocksField>\n checkbox: FieldGeneratorFunction<TSchema, CheckboxField>\n code: FieldGeneratorFunction<TSchema, CodeField>\n collapsible: FieldGeneratorFunction<TSchema, CollapsibleField>\n date: FieldGeneratorFunction<TSchema, DateField>\n email: FieldGeneratorFunction<TSchema, EmailField>\n group: FieldGeneratorFunction<TSchema, GroupField>\n join: FieldGeneratorFunction<TSchema, JoinField>\n json: FieldGeneratorFunction<TSchema, JSONField>\n number: FieldGeneratorFunction<TSchema, NumberField>\n point: FieldGeneratorFunction<TSchema, PointField>\n radio: FieldGeneratorFunction<TSchema, RadioField>\n relationship: FieldGeneratorFunction<TSchema, RelationshipField>\n richText: FieldGeneratorFunction<TSchema, RichTextField>\n row: FieldGeneratorFunction<TSchema, RowField>\n select: FieldGeneratorFunction<TSchema, SelectField>\n tabs: FieldGeneratorFunction<TSchema, TabsField>\n text: FieldGeneratorFunction<TSchema, TextField>\n textarea: FieldGeneratorFunction<TSchema, TextareaField>\n upload: FieldGeneratorFunction<TSchema, UploadField>\n}\n"],"names":[],"mappings":"AAkIA,WAsBC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { UpdateGlobal } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Read-merge-write for the global's singleton row. Per Payload's contract,
|
|
4
|
+
* if the global doesn't exist callers should use `createGlobal` first — we
|
|
5
|
+
* surface the missing case as `null` cast (matching `updateOne`) rather than
|
|
6
|
+
* silently upserting, which would mask programmer errors.
|
|
7
|
+
*/
|
|
8
|
+
export declare const updateGlobal: UpdateGlobal;
|
|
9
|
+
//# sourceMappingURL=updateGlobal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateGlobal.d.ts","sourceRoot":"","sources":["../src/updateGlobal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAU3C;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,YAuC1B,CAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { GetCommand, PutCommand } from '@aws-sdk/lib-dynamodb';
|
|
2
|
+
import { normalizeForDynamo } from './utilities/normalizeForDynamo.js';
|
|
3
|
+
import { projectForGlobal } from './utilities/resolveSchema.js';
|
|
4
|
+
import { stripInternalKeys } from './utilities/stripInternalKeys.js';
|
|
5
|
+
/**
|
|
6
|
+
* Read-merge-write for the global's singleton row. Per Payload's contract,
|
|
7
|
+
* if the global doesn't exist callers should use `createGlobal` first — we
|
|
8
|
+
* surface the missing case as `null` cast (matching `updateOne`) rather than
|
|
9
|
+
* silently upserting, which would mask programmer errors.
|
|
10
|
+
*/ export const updateGlobal = async function updateGlobal({ slug, data, returning }) {
|
|
11
|
+
const docClient = this.docClient;
|
|
12
|
+
if (!docClient) {
|
|
13
|
+
throw new Error('payload-ddb: docClient is not initialized — call connect() first.');
|
|
14
|
+
}
|
|
15
|
+
const partition = this.resolvePartition(slug);
|
|
16
|
+
const result = await docClient.send(new GetCommand({
|
|
17
|
+
TableName: this.tableName,
|
|
18
|
+
Key: {
|
|
19
|
+
pk: partition,
|
|
20
|
+
sk: slug
|
|
21
|
+
},
|
|
22
|
+
ConsistentRead: true
|
|
23
|
+
}));
|
|
24
|
+
if (!result.Item) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const existing = stripInternalKeys(result.Item);
|
|
28
|
+
const merged = {
|
|
29
|
+
...existing,
|
|
30
|
+
...data,
|
|
31
|
+
id: slug
|
|
32
|
+
};
|
|
33
|
+
const projected = projectForGlobal(this, slug, merged);
|
|
34
|
+
await docClient.send(new PutCommand({
|
|
35
|
+
TableName: this.tableName,
|
|
36
|
+
Item: normalizeForDynamo({
|
|
37
|
+
...projected,
|
|
38
|
+
pk: partition,
|
|
39
|
+
sk: slug
|
|
40
|
+
})
|
|
41
|
+
}));
|
|
42
|
+
return returning === false ? null : projected;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=updateGlobal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/updateGlobal.ts"],"sourcesContent":["import type { UpdateGlobal } from 'payload'\n\nimport { GetCommand, PutCommand } from '@aws-sdk/lib-dynamodb'\n\nimport type { DynamoAdapter } from './types.js'\n\nimport { normalizeForDynamo } from './utilities/normalizeForDynamo.js'\nimport { projectForGlobal } from './utilities/resolveSchema.js'\nimport { stripInternalKeys } from './utilities/stripInternalKeys.js'\n\n/**\n * Read-merge-write for the global's singleton row. Per Payload's contract,\n * if the global doesn't exist callers should use `createGlobal` first — we\n * surface the missing case as `null` cast (matching `updateOne`) rather than\n * silently upserting, which would mask programmer errors.\n */\nexport const updateGlobal: UpdateGlobal = async function updateGlobal(\n this: DynamoAdapter,\n { slug, data, returning },\n) {\n const docClient = this.docClient\n if (!docClient) {\n throw new Error('payload-ddb: docClient is not initialized — call connect() first.')\n }\n\n const partition = this.resolvePartition(slug)\n\n const result = await docClient.send(\n new GetCommand({\n TableName: this.tableName,\n Key: { pk: partition, sk: slug },\n ConsistentRead: true,\n }),\n )\n\n if (!result.Item) {\n return null as never\n }\n\n const existing = stripInternalKeys(result.Item)\n const merged: Record<string, unknown> = { ...existing, ...data, id: slug }\n const projected = projectForGlobal(this, slug, merged)\n\n await docClient.send(\n new PutCommand({\n TableName: this.tableName,\n Item: normalizeForDynamo({\n ...projected,\n pk: partition,\n sk: slug,\n }),\n }),\n )\n\n return returning === false ? (null as never) : (projected as never)\n}\n"],"names":["GetCommand","PutCommand","normalizeForDynamo","projectForGlobal","stripInternalKeys","updateGlobal","slug","data","returning","docClient","Error","partition","resolvePartition","result","send","TableName","tableName","Key","pk","sk","ConsistentRead","Item","existing","merged","id","projected"],"mappings":"AAEA,SAASA,UAAU,EAAEC,UAAU,QAAQ,wBAAuB;AAI9D,SAASC,kBAAkB,QAAQ,oCAAmC;AACtE,SAASC,gBAAgB,QAAQ,+BAA8B;AAC/D,SAASC,iBAAiB,QAAQ,mCAAkC;AAEpE;;;;;CAKC,GACD,OAAO,MAAMC,eAA6B,eAAeA,aAEvD,EAAEC,IAAI,EAAEC,IAAI,EAAEC,SAAS,EAAE;IAEzB,MAAMC,YAAY,IAAI,CAACA,SAAS;IAChC,IAAI,CAACA,WAAW;QACd,MAAM,IAAIC,MAAM;IAClB;IAEA,MAAMC,YAAY,IAAI,CAACC,gBAAgB,CAACN;IAExC,MAAMO,SAAS,MAAMJ,UAAUK,IAAI,CACjC,IAAId,WAAW;QACbe,WAAW,IAAI,CAACC,SAAS;QACzBC,KAAK;YAAEC,IAAIP;YAAWQ,IAAIb;QAAK;QAC/Bc,gBAAgB;IAClB;IAGF,IAAI,CAACP,OAAOQ,IAAI,EAAE;QAChB,OAAO;IACT;IAEA,MAAMC,WAAWlB,kBAAkBS,OAAOQ,IAAI;IAC9C,MAAME,SAAkC;QAAE,GAAGD,QAAQ;QAAE,GAAGf,IAAI;QAAEiB,IAAIlB;IAAK;IACzE,MAAMmB,YAAYtB,iBAAiB,IAAI,EAAEG,MAAMiB;IAE/C,MAAMd,UAAUK,IAAI,CAClB,IAAIb,WAAW;QACbc,WAAW,IAAI,CAACC,SAAS;QACzBK,MAAMnB,mBAAmB;YACvB,GAAGuB,SAAS;YACZP,IAAIP;YACJQ,IAAIb;QACN;IACF;IAGF,OAAOE,cAAc,QAAS,OAAkBiB;AAClD,EAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { UpdateGlobalVersion } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Same read-merge-write semantics as `updateVersion`. Doesn't cascade
|
|
4
|
+
* `latest` flips for the same reason: Payload owns that contract by issuing
|
|
5
|
+
* paired updates.
|
|
6
|
+
*/
|
|
7
|
+
export declare const updateGlobalVersion: UpdateGlobalVersion;
|
|
8
|
+
//# sourceMappingURL=updateGlobalVersion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateGlobalVersion.d.ts","sourceRoot":"","sources":["../src/updateGlobalVersion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAWlD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,mBAwDjC,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { GetCommand, PutCommand } from '@aws-sdk/lib-dynamodb';
|
|
2
|
+
import { findFirst } from './utilities/findFirst.js';
|
|
3
|
+
import { normalizeForDynamo } from './utilities/normalizeForDynamo.js';
|
|
4
|
+
import { projectVersionRow } from './utilities/resolveSchema.js';
|
|
5
|
+
import { stripInternalKeys } from './utilities/stripInternalKeys.js';
|
|
6
|
+
/**
|
|
7
|
+
* Same read-merge-write semantics as `updateVersion`. Doesn't cascade
|
|
8
|
+
* `latest` flips for the same reason: Payload owns that contract by issuing
|
|
9
|
+
* paired updates.
|
|
10
|
+
*/ export const updateGlobalVersion = async function updateGlobalVersion(args) {
|
|
11
|
+
const docClient = this.docClient;
|
|
12
|
+
if (!docClient) {
|
|
13
|
+
throw new Error('payload-ddb: docClient is not initialized — call connect() first.');
|
|
14
|
+
}
|
|
15
|
+
const partition = this.resolveVersionsPartition(args.global);
|
|
16
|
+
let target = null;
|
|
17
|
+
if (args.id !== undefined && args.id !== null) {
|
|
18
|
+
const result = await docClient.send(new GetCommand({
|
|
19
|
+
TableName: this.tableName,
|
|
20
|
+
Key: {
|
|
21
|
+
pk: partition,
|
|
22
|
+
sk: String(args.id)
|
|
23
|
+
},
|
|
24
|
+
ConsistentRead: true
|
|
25
|
+
}));
|
|
26
|
+
target = result.Item ? stripInternalKeys(result.Item) : null;
|
|
27
|
+
} else if (args.where) {
|
|
28
|
+
target = await findFirst(this, {
|
|
29
|
+
partition,
|
|
30
|
+
where: args.where
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (!target) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const merged = {
|
|
37
|
+
...target,
|
|
38
|
+
...args.versionData,
|
|
39
|
+
id: target['id']
|
|
40
|
+
};
|
|
41
|
+
const projected = projectVersionRow(this, {
|
|
42
|
+
kind: 'global',
|
|
43
|
+
slug: args.global
|
|
44
|
+
}, merged);
|
|
45
|
+
await docClient.send(new PutCommand({
|
|
46
|
+
TableName: this.tableName,
|
|
47
|
+
Item: normalizeForDynamo({
|
|
48
|
+
...projected,
|
|
49
|
+
pk: partition,
|
|
50
|
+
sk: String(projected['id'])
|
|
51
|
+
})
|
|
52
|
+
}));
|
|
53
|
+
if (args.returning === false) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
return projected;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=updateGlobalVersion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/updateGlobalVersion.ts"],"sourcesContent":["import type { UpdateGlobalVersion } from 'payload'\n\nimport { GetCommand, PutCommand } from '@aws-sdk/lib-dynamodb'\n\nimport type { DynamoAdapter } from './types.js'\n\nimport { findFirst } from './utilities/findFirst.js'\nimport { normalizeForDynamo } from './utilities/normalizeForDynamo.js'\nimport { projectVersionRow } from './utilities/resolveSchema.js'\nimport { stripInternalKeys } from './utilities/stripInternalKeys.js'\n\n/**\n * Same read-merge-write semantics as `updateVersion`. Doesn't cascade\n * `latest` flips for the same reason: Payload owns that contract by issuing\n * paired updates.\n */\nexport const updateGlobalVersion: UpdateGlobalVersion = async function updateGlobalVersion(\n this: DynamoAdapter,\n args,\n) {\n const docClient = this.docClient\n if (!docClient) {\n throw new Error('payload-ddb: docClient is not initialized — call connect() first.')\n }\n\n const partition = this.resolveVersionsPartition(args.global)\n\n let target: null | Record<string, unknown> = null\n\n if (args.id !== undefined && args.id !== null) {\n const result = await docClient.send(\n new GetCommand({\n TableName: this.tableName,\n Key: { pk: partition, sk: String(args.id) },\n ConsistentRead: true,\n }),\n )\n target = result.Item ? stripInternalKeys(result.Item) : null\n } else if (args.where) {\n target = await findFirst(this, { partition, where: args.where })\n }\n\n if (!target) {\n return null as never\n }\n\n const merged: Record<string, unknown> = {\n ...target,\n ...args.versionData,\n id: target['id'],\n }\n const projected = projectVersionRow(\n this,\n { kind: 'global', slug: args.global },\n merged,\n )\n\n await docClient.send(\n new PutCommand({\n TableName: this.tableName,\n Item: normalizeForDynamo({\n ...projected,\n pk: partition,\n sk: String(projected['id']),\n }),\n }),\n )\n\n if (args.returning === false) {\n return null as never\n }\n return projected as never\n}\n"],"names":["GetCommand","PutCommand","findFirst","normalizeForDynamo","projectVersionRow","stripInternalKeys","updateGlobalVersion","args","docClient","Error","partition","resolveVersionsPartition","global","target","id","undefined","result","send","TableName","tableName","Key","pk","sk","String","ConsistentRead","Item","where","merged","versionData","projected","kind","slug","returning"],"mappings":"AAEA,SAASA,UAAU,EAAEC,UAAU,QAAQ,wBAAuB;AAI9D,SAASC,SAAS,QAAQ,2BAA0B;AACpD,SAASC,kBAAkB,QAAQ,oCAAmC;AACtE,SAASC,iBAAiB,QAAQ,+BAA8B;AAChE,SAASC,iBAAiB,QAAQ,mCAAkC;AAEpE;;;;CAIC,GACD,OAAO,MAAMC,sBAA2C,eAAeA,oBAErEC,IAAI;IAEJ,MAAMC,YAAY,IAAI,CAACA,SAAS;IAChC,IAAI,CAACA,WAAW;QACd,MAAM,IAAIC,MAAM;IAClB;IAEA,MAAMC,YAAY,IAAI,CAACC,wBAAwB,CAACJ,KAAKK,MAAM;IAE3D,IAAIC,SAAyC;IAE7C,IAAIN,KAAKO,EAAE,KAAKC,aAAaR,KAAKO,EAAE,KAAK,MAAM;QAC7C,MAAME,SAAS,MAAMR,UAAUS,IAAI,CACjC,IAAIjB,WAAW;YACbkB,WAAW,IAAI,CAACC,SAAS;YACzBC,KAAK;gBAAEC,IAAIX;gBAAWY,IAAIC,OAAOhB,KAAKO,EAAE;YAAE;YAC1CU,gBAAgB;QAClB;QAEFX,SAASG,OAAOS,IAAI,GAAGpB,kBAAkBW,OAAOS,IAAI,IAAI;IAC1D,OAAO,IAAIlB,KAAKmB,KAAK,EAAE;QACrBb,SAAS,MAAMX,UAAU,IAAI,EAAE;YAAEQ;YAAWgB,OAAOnB,KAAKmB,KAAK;QAAC;IAChE;IAEA,IAAI,CAACb,QAAQ;QACX,OAAO;IACT;IAEA,MAAMc,SAAkC;QACtC,GAAGd,MAAM;QACT,GAAGN,KAAKqB,WAAW;QACnBd,IAAID,MAAM,CAAC,KAAK;IAClB;IACA,MAAMgB,YAAYzB,kBAChB,IAAI,EACJ;QAAE0B,MAAM;QAAUC,MAAMxB,KAAKK,MAAM;IAAC,GACpCe;IAGF,MAAMnB,UAAUS,IAAI,CAClB,IAAIhB,WAAW;QACbiB,WAAW,IAAI,CAACC,SAAS;QACzBM,MAAMtB,mBAAmB;YACvB,GAAG0B,SAAS;YACZR,IAAIX;YACJY,IAAIC,OAAOM,SAAS,CAAC,KAAK;QAC5B;IACF;IAGF,IAAItB,KAAKyB,SAAS,KAAK,OAAO;QAC5B,OAAO;IACT;IACA,OAAOH;AACT,EAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { UpdateMany } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* v1 strategy: query-and-collect matches, sort, slice to `limit`, then
|
|
4
|
+
* read-merge-write each in parallel. Same merge semantics as `updateOne`:
|
|
5
|
+
* `data` is overlaid on the target and `id` is preserved from the target.
|
|
6
|
+
*
|
|
7
|
+
* `Promise.all` is order-preserving, so the returned array matches the
|
|
8
|
+
* sorted target order. Bulk DynamoDB transact-writes (`TransactWriteItems`,
|
|
9
|
+
* 100-item / 4 MB cap) are the natural next optimization but require the
|
|
10
|
+
* transaction wiring we deliberately stubbed out for now.
|
|
11
|
+
*/
|
|
12
|
+
export declare const updateMany: UpdateMany;
|
|
13
|
+
//# sourceMappingURL=updateMany.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateMany.d.ts","sourceRoot":"","sources":["../src/updateMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAWzC;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,EAAE,UA2CxB,CAAA"}
|