@webiny/api-headless-cms-pg-os 6.6.0-alpha.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.
Files changed (157) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/features/HeadlessCmsPgOsFeature.d.ts +9 -0
  4. package/features/HeadlessCmsPgOsFeature.js +40 -0
  5. package/features/HeadlessCmsPgOsFeature.js.map +1 -0
  6. package/features/SyncWriter/BuildSyncRecord.d.ts +22 -0
  7. package/features/SyncWriter/BuildSyncRecord.js +56 -0
  8. package/features/SyncWriter/BuildSyncRecord.js.map +1 -0
  9. package/features/SyncWriter/RemoveEntry.d.ts +11 -0
  10. package/features/SyncWriter/RemoveEntry.js +23 -0
  11. package/features/SyncWriter/RemoveEntry.js.map +1 -0
  12. package/features/SyncWriter/RemoveLatest.d.ts +11 -0
  13. package/features/SyncWriter/RemoveLatest.js +19 -0
  14. package/features/SyncWriter/RemoveLatest.js.map +1 -0
  15. package/features/SyncWriter/RemovePublished.d.ts +11 -0
  16. package/features/SyncWriter/RemovePublished.js +19 -0
  17. package/features/SyncWriter/RemovePublished.js.map +1 -0
  18. package/features/SyncWriter/SyncHelpers.d.ts +26 -0
  19. package/features/SyncWriter/SyncHelpers.js +70 -0
  20. package/features/SyncWriter/SyncHelpers.js.map +1 -0
  21. package/features/SyncWriter/SyncRowQuery.d.ts +22 -0
  22. package/features/SyncWriter/SyncRowQuery.js +22 -0
  23. package/features/SyncWriter/SyncRowQuery.js.map +1 -0
  24. package/features/SyncWriter/WriteEntry.d.ts +14 -0
  25. package/features/SyncWriter/WriteEntry.js +32 -0
  26. package/features/SyncWriter/WriteEntry.js.map +1 -0
  27. package/features/SyncWriter/WriteLatest.d.ts +14 -0
  28. package/features/SyncWriter/WriteLatest.js +26 -0
  29. package/features/SyncWriter/WriteLatest.js.map +1 -0
  30. package/features/SyncWriter/WritePublished.d.ts +14 -0
  31. package/features/SyncWriter/WritePublished.js +26 -0
  32. package/features/SyncWriter/WritePublished.js.map +1 -0
  33. package/features/SyncWriter/abstractions/BuildSyncRecord.d.ts +18 -0
  34. package/features/SyncWriter/abstractions/BuildSyncRecord.js +5 -0
  35. package/features/SyncWriter/abstractions/BuildSyncRecord.js.map +1 -0
  36. package/features/SyncWriter/abstractions/RemoveEntry.d.ts +13 -0
  37. package/features/SyncWriter/abstractions/RemoveEntry.js +5 -0
  38. package/features/SyncWriter/abstractions/RemoveEntry.js.map +1 -0
  39. package/features/SyncWriter/abstractions/RemoveLatest.d.ts +13 -0
  40. package/features/SyncWriter/abstractions/RemoveLatest.js +5 -0
  41. package/features/SyncWriter/abstractions/RemoveLatest.js.map +1 -0
  42. package/features/SyncWriter/abstractions/RemovePublished.d.ts +13 -0
  43. package/features/SyncWriter/abstractions/RemovePublished.js +5 -0
  44. package/features/SyncWriter/abstractions/RemovePublished.js.map +1 -0
  45. package/features/SyncWriter/abstractions/SyncHelpers.d.ts +10 -0
  46. package/features/SyncWriter/abstractions/SyncHelpers.js +5 -0
  47. package/features/SyncWriter/abstractions/SyncHelpers.js.map +1 -0
  48. package/features/SyncWriter/abstractions/SyncRowQuery.d.ts +9 -0
  49. package/features/SyncWriter/abstractions/SyncRowQuery.js +5 -0
  50. package/features/SyncWriter/abstractions/SyncRowQuery.js.map +1 -0
  51. package/features/SyncWriter/abstractions/WriteEntry.d.ts +14 -0
  52. package/features/SyncWriter/abstractions/WriteEntry.js +5 -0
  53. package/features/SyncWriter/abstractions/WriteEntry.js.map +1 -0
  54. package/features/SyncWriter/abstractions/WriteLatest.d.ts +14 -0
  55. package/features/SyncWriter/abstractions/WriteLatest.js +5 -0
  56. package/features/SyncWriter/abstractions/WriteLatest.js.map +1 -0
  57. package/features/SyncWriter/abstractions/WritePublished.d.ts +14 -0
  58. package/features/SyncWriter/abstractions/WritePublished.js +5 -0
  59. package/features/SyncWriter/abstractions/WritePublished.js.map +1 -0
  60. package/features/SyncWriter/feature.d.ts +4 -0
  61. package/features/SyncWriter/feature.js +27 -0
  62. package/features/SyncWriter/feature.js.map +1 -0
  63. package/features/SyncWriter/index.d.ts +9 -0
  64. package/features/SyncWriter/index.js +9 -0
  65. package/features/syncEventHandler/SyncEventHandler.d.ts +15 -0
  66. package/features/syncEventHandler/SyncEventHandler.js +49 -0
  67. package/features/syncEventHandler/SyncEventHandler.js.map +1 -0
  68. package/features/syncEventHandler/abstractions.d.ts +12 -0
  69. package/features/syncEventHandler/abstractions.js +5 -0
  70. package/features/syncEventHandler/abstractions.js.map +1 -0
  71. package/features/syncEventHandler/feature.d.ts +4 -0
  72. package/features/syncEventHandler/feature.js +11 -0
  73. package/features/syncEventHandler/feature.js.map +1 -0
  74. package/features/syncTableManager/SyncTableManager.d.ts +19 -0
  75. package/features/syncTableManager/SyncTableManager.js +61 -0
  76. package/features/syncTableManager/SyncTableManager.js.map +1 -0
  77. package/features/syncTableManager/abstractions.d.ts +9 -0
  78. package/features/syncTableManager/abstractions.js +5 -0
  79. package/features/syncTableManager/abstractions.js.map +1 -0
  80. package/features/syncTableManager/feature.d.ts +4 -0
  81. package/features/syncTableManager/feature.js +11 -0
  82. package/features/syncTableManager/feature.js.map +1 -0
  83. package/index.d.ts +1 -0
  84. package/index.js +1 -0
  85. package/operations/entry/EntrySearchOperations.d.ts +15 -0
  86. package/operations/entry/EntrySearchOperations.js +35 -0
  87. package/operations/entry/EntrySearchOperations.js.map +1 -0
  88. package/operations/entry/PgOsCreateEntry.d.ts +15 -0
  89. package/operations/entry/PgOsCreateEntry.js +27 -0
  90. package/operations/entry/PgOsCreateEntry.js.map +1 -0
  91. package/operations/entry/PgOsCreateEntryRevisionFrom.d.ts +15 -0
  92. package/operations/entry/PgOsCreateEntryRevisionFrom.js +27 -0
  93. package/operations/entry/PgOsCreateEntryRevisionFrom.js.map +1 -0
  94. package/operations/entry/PgOsDeleteEntry.d.ts +17 -0
  95. package/operations/entry/PgOsDeleteEntry.js +33 -0
  96. package/operations/entry/PgOsDeleteEntry.js.map +1 -0
  97. package/operations/entry/PgOsDeleteEntryRevision.d.ts +21 -0
  98. package/operations/entry/PgOsDeleteEntryRevision.js +48 -0
  99. package/operations/entry/PgOsDeleteEntryRevision.js.map +1 -0
  100. package/operations/entry/PgOsDeleteMultipleEntries.d.ts +17 -0
  101. package/operations/entry/PgOsDeleteMultipleEntries.js +36 -0
  102. package/operations/entry/PgOsDeleteMultipleEntries.js.map +1 -0
  103. package/operations/entry/PgOsGetEntry.d.ts +12 -0
  104. package/operations/entry/PgOsGetEntry.js +19 -0
  105. package/operations/entry/PgOsGetEntry.js.map +1 -0
  106. package/operations/entry/PgOsGetUniqueFieldValues.d.ts +12 -0
  107. package/operations/entry/PgOsGetUniqueFieldValues.js +19 -0
  108. package/operations/entry/PgOsGetUniqueFieldValues.js.map +1 -0
  109. package/operations/entry/PgOsListEntries.d.ts +12 -0
  110. package/operations/entry/PgOsListEntries.js +19 -0
  111. package/operations/entry/PgOsListEntries.js.map +1 -0
  112. package/operations/entry/PgOsMoveEntry.d.ts +15 -0
  113. package/operations/entry/PgOsMoveEntry.js +26 -0
  114. package/operations/entry/PgOsMoveEntry.js.map +1 -0
  115. package/operations/entry/PgOsMoveToBin.d.ts +15 -0
  116. package/operations/entry/PgOsMoveToBin.js +26 -0
  117. package/operations/entry/PgOsMoveToBin.js.map +1 -0
  118. package/operations/entry/PgOsPublishEntry.d.ts +17 -0
  119. package/operations/entry/PgOsPublishEntry.js +34 -0
  120. package/operations/entry/PgOsPublishEntry.js.map +1 -0
  121. package/operations/entry/PgOsRestoreFromBin.d.ts +15 -0
  122. package/operations/entry/PgOsRestoreFromBin.js +27 -0
  123. package/operations/entry/PgOsRestoreFromBin.js.map +1 -0
  124. package/operations/entry/PgOsUnpublishEntry.d.ts +19 -0
  125. package/operations/entry/PgOsUnpublishEntry.js +41 -0
  126. package/operations/entry/PgOsUnpublishEntry.js.map +1 -0
  127. package/operations/entry/PgOsUpdateEntry.d.ts +15 -0
  128. package/operations/entry/PgOsUpdateEntry.js +27 -0
  129. package/operations/entry/PgOsUpdateEntry.js.map +1 -0
  130. package/operations/entry/abstractions/EntrySearchOperations.d.ts +10 -0
  131. package/operations/entry/abstractions/EntrySearchOperations.js +5 -0
  132. package/operations/entry/abstractions/EntrySearchOperations.js.map +1 -0
  133. package/operations/entry/feature.d.ts +4 -0
  134. package/operations/entry/feature.js +55 -0
  135. package/operations/entry/feature.js.map +1 -0
  136. package/operations/entry/search/get.d.ts +3 -0
  137. package/operations/entry/search/get.js +14 -0
  138. package/operations/entry/search/get.js.map +1 -0
  139. package/operations/entry/search/getUniqueFieldValues.d.ts +3 -0
  140. package/operations/entry/search/getUniqueFieldValues.js +55 -0
  141. package/operations/entry/search/getUniqueFieldValues.js.map +1 -0
  142. package/operations/entry/search/list.d.ts +3 -0
  143. package/operations/entry/search/list.js +59 -0
  144. package/operations/entry/search/list.js.map +1 -0
  145. package/operations/entry/search/types.d.ts +19 -0
  146. package/operations/entry/search/types.js +0 -0
  147. package/package.json +73 -0
  148. package/testing/createReindexEvents.d.ts +3 -0
  149. package/testing/createReindexEvents.js +14 -0
  150. package/testing/createReindexEvents.js.map +1 -0
  151. package/testing/index.d.ts +2 -0
  152. package/testing/index.js +2 -0
  153. package/testing/simulatePgStream.d.ts +19 -0
  154. package/testing/simulatePgStream.js +51 -0
  155. package/testing/simulatePgStream.js.map +1 -0
  156. package/types.d.ts +17 -0
  157. package/types.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing/createReindexEvents.js","sources":["../../src/testing/createReindexEvents.ts"],"sourcesContent":["import type { Knex } from \"knex\";\nimport type { SyncEvent, ISyncRow } from \"~/types.js\";\n\nexport const createReindexEvents = async (knex: Knex, tableName: string): Promise<SyncEvent[]> => {\n const rows: ISyncRow[] = await knex<ISyncRow>(tableName).select(\"*\");\n\n return rows.map(row => ({\n type: \"INSERT\" as const,\n id: row.id,\n entryId: row.entryId,\n tenant: row.tenant,\n index: row.index,\n data: row.data\n }));\n};\n"],"names":["createReindexEvents","knex","tableName","rows","row"],"mappings":"AAGO,MAAMA,sBAAsB,OAAOC,MAAYC;IAClD,MAAMC,OAAmB,MAAMF,KAAeC,WAAW,MAAM,CAAC;IAEhE,OAAOC,KAAK,GAAG,CAACC,CAAAA,MAAQ;YACpB,MAAM;YACN,IAAIA,IAAI,EAAE;YACV,SAASA,IAAI,OAAO;YACpB,QAAQA,IAAI,MAAM;YAClB,OAAOA,IAAI,KAAK;YAChB,MAAMA,IAAI,IAAI;QAClB;AACJ"}
@@ -0,0 +1,2 @@
1
+ export { simulatePgStream } from "./simulatePgStream.js";
2
+ export { createReindexEvents } from "./createReindexEvents.js";
@@ -0,0 +1,2 @@
1
+ export { simulatePgStream } from "./simulatePgStream.js";
2
+ export { createReindexEvents } from "./createReindexEvents.js";
@@ -0,0 +1,19 @@
1
+ import type { Knex } from "knex";
2
+ import type { SyncEvent } from "../types.js";
3
+ export interface SimulatePgStreamParams {
4
+ knex: Knex;
5
+ tableName: string;
6
+ handler: (events: SyncEvent[]) => Promise<void>;
7
+ }
8
+ /**
9
+ * Simulates a PostgreSQL -> OpenSearch sync stream (the PG equivalent of the
10
+ * DynamoDB Streams simulation in `@webiny/project-utils/testing/dynamodb`) by
11
+ * monkey-patching knex's internal `client.query` method.
12
+ *
13
+ * Uses a snapshot-diff approach: capture all rows in the target table before
14
+ * the operation, execute the operation, capture all rows after, then diff the
15
+ * two snapshots to determine which `SyncEvent`s occurred. This is robust
16
+ * against SQL structure changes, since it never has to parse bindings or SQL
17
+ * text to reconstruct row data.
18
+ */
19
+ export declare const simulatePgStream: (params: SimulatePgStreamParams) => void;
@@ -0,0 +1,51 @@
1
+ const toSyncEvent = (row, type)=>({
2
+ type,
3
+ id: row.id,
4
+ entryId: row.entryId,
5
+ tenant: row.tenant,
6
+ index: row.index,
7
+ ..."REMOVE" !== type ? {
8
+ data: row.data
9
+ } : {}
10
+ });
11
+ const simulatePgStream = (params)=>{
12
+ const { knex, tableName, handler } = params;
13
+ const query = ()=>knex(tableName);
14
+ const originalClient = knex.client;
15
+ const originalQuery = originalClient.query.bind(originalClient);
16
+ originalClient.query = async (connection, obj)=>{
17
+ const sql = "string" == typeof obj ? obj : obj?.sql ?? "";
18
+ const isTargetTable = sql.includes(tableName);
19
+ if (!isTargetTable) return originalQuery(connection, obj);
20
+ const upperSql = sql.toUpperCase();
21
+ const isInsert = upperSql.includes("INSERT");
22
+ const isDelete = upperSql.includes("DELETE");
23
+ if (!isInsert && !isDelete) return originalQuery(connection, obj);
24
+ const rowsBefore = await query().select("*");
25
+ const beforeMap = new Map(rowsBefore.map((row)=>[
26
+ row.id,
27
+ row
28
+ ]));
29
+ const result = await originalQuery(connection, obj);
30
+ const rowsAfter = await query().select("*");
31
+ const afterMap = new Map(rowsAfter.map((row)=>[
32
+ row.id,
33
+ row
34
+ ]));
35
+ const events = [];
36
+ if (isInsert) for (const [id, row] of afterMap){
37
+ const before = beforeMap.get(id);
38
+ if (before) {
39
+ if (before.data !== row.data) events.push(toSyncEvent(row, "MODIFY"));
40
+ } else events.push(toSyncEvent(row, "INSERT"));
41
+ }
42
+ if (isDelete) {
43
+ for (const [id, row] of beforeMap)if (!afterMap.has(id)) events.push(toSyncEvent(row, "REMOVE"));
44
+ }
45
+ if (events.length > 0) await handler(events);
46
+ return result;
47
+ };
48
+ };
49
+ export { simulatePgStream };
50
+
51
+ //# sourceMappingURL=simulatePgStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing/simulatePgStream.js","sources":["../../src/testing/simulatePgStream.ts"],"sourcesContent":["import type { Knex } from \"knex\";\nimport type { SyncEvent, ISyncRow, SyncEventType } from \"~/types.js\";\n\nexport interface SimulatePgStreamParams {\n knex: Knex;\n tableName: string;\n handler: (events: SyncEvent[]) => Promise<void>;\n}\n\nconst toSyncEvent = (row: ISyncRow, type: SyncEventType): SyncEvent => ({\n type,\n id: row.id,\n entryId: row.entryId,\n tenant: row.tenant,\n index: row.index,\n ...(type !== \"REMOVE\" ? { data: row.data } : {})\n});\n\n/**\n * Simulates a PostgreSQL -> OpenSearch sync stream (the PG equivalent of the\n * DynamoDB Streams simulation in `@webiny/project-utils/testing/dynamodb`) by\n * monkey-patching knex's internal `client.query` method.\n *\n * Uses a snapshot-diff approach: capture all rows in the target table before\n * the operation, execute the operation, capture all rows after, then diff the\n * two snapshots to determine which `SyncEvent`s occurred. This is robust\n * against SQL structure changes, since it never has to parse bindings or SQL\n * text to reconstruct row data.\n */\nexport const simulatePgStream = (params: SimulatePgStreamParams): void => {\n const { knex, tableName, handler } = params;\n const query = () => knex<ISyncRow>(tableName);\n\n const originalClient = knex.client;\n const originalQuery = originalClient.query.bind(originalClient);\n\n originalClient.query = async (connection: unknown, obj: unknown) => {\n const sql: string = typeof obj === \"string\" ? obj : ((obj as { sql?: string })?.sql ?? \"\");\n const isTargetTable = sql.includes(tableName);\n\n if (!isTargetTable) {\n return originalQuery(connection, obj);\n }\n\n const upperSql = sql.toUpperCase();\n const isInsert = upperSql.includes(\"INSERT\");\n const isDelete = upperSql.includes(\"DELETE\");\n\n if (!isInsert && !isDelete) {\n return originalQuery(connection, obj);\n }\n\n const rowsBefore = await query().select(\"*\");\n const beforeMap = new Map(rowsBefore.map(row => [row.id, row]));\n\n const result = await originalQuery(connection, obj);\n\n const rowsAfter = await query().select(\"*\");\n const afterMap = new Map(rowsAfter.map(row => [row.id, row]));\n\n const events: SyncEvent[] = [];\n\n if (isInsert) {\n for (const [id, row] of afterMap) {\n const before = beforeMap.get(id);\n if (!before) {\n events.push(toSyncEvent(row, \"INSERT\"));\n } else if (before.data !== row.data) {\n events.push(toSyncEvent(row, \"MODIFY\"));\n }\n }\n }\n\n if (isDelete) {\n for (const [id, row] of beforeMap) {\n if (!afterMap.has(id)) {\n events.push(toSyncEvent(row, \"REMOVE\"));\n }\n }\n }\n\n if (events.length > 0) {\n await handler(events);\n }\n\n return result;\n };\n};\n"],"names":["toSyncEvent","row","type","simulatePgStream","params","knex","tableName","handler","query","originalClient","originalQuery","connection","obj","sql","isTargetTable","upperSql","isInsert","isDelete","rowsBefore","beforeMap","Map","result","rowsAfter","afterMap","events","id","before"],"mappings":"AASA,MAAMA,cAAc,CAACC,KAAeC,OAAoC;QACpEA;QACA,IAAID,IAAI,EAAE;QACV,SAASA,IAAI,OAAO;QACpB,QAAQA,IAAI,MAAM;QAClB,OAAOA,IAAI,KAAK;QAChB,GAAIC,AAAS,aAATA,OAAoB;YAAE,MAAMD,IAAI,IAAI;QAAC,IAAI,CAAC,CAAC;IACnD;AAaO,MAAME,mBAAmB,CAACC;IAC7B,MAAM,EAAEC,IAAI,EAAEC,SAAS,EAAEC,OAAO,EAAE,GAAGH;IACrC,MAAMI,QAAQ,IAAMH,KAAeC;IAEnC,MAAMG,iBAAiBJ,KAAK,MAAM;IAClC,MAAMK,gBAAgBD,eAAe,KAAK,CAAC,IAAI,CAACA;IAEhDA,eAAe,KAAK,GAAG,OAAOE,YAAqBC;QAC/C,MAAMC,MAAc,AAAe,YAAf,OAAOD,MAAmBA,MAAQA,KAA0B,OAAO;QACvF,MAAME,gBAAgBD,IAAI,QAAQ,CAACP;QAEnC,IAAI,CAACQ,eACD,OAAOJ,cAAcC,YAAYC;QAGrC,MAAMG,WAAWF,IAAI,WAAW;QAChC,MAAMG,WAAWD,SAAS,QAAQ,CAAC;QACnC,MAAME,WAAWF,SAAS,QAAQ,CAAC;QAEnC,IAAI,CAACC,YAAY,CAACC,UACd,OAAOP,cAAcC,YAAYC;QAGrC,MAAMM,aAAa,MAAMV,QAAQ,MAAM,CAAC;QACxC,MAAMW,YAAY,IAAIC,IAAIF,WAAW,GAAG,CAACjB,CAAAA,MAAO;gBAACA,IAAI,EAAE;gBAAEA;aAAI;QAE7D,MAAMoB,SAAS,MAAMX,cAAcC,YAAYC;QAE/C,MAAMU,YAAY,MAAMd,QAAQ,MAAM,CAAC;QACvC,MAAMe,WAAW,IAAIH,IAAIE,UAAU,GAAG,CAACrB,CAAAA,MAAO;gBAACA,IAAI,EAAE;gBAAEA;aAAI;QAE3D,MAAMuB,SAAsB,EAAE;QAE9B,IAAIR,UACA,KAAK,MAAM,CAACS,IAAIxB,IAAI,IAAIsB,SAAU;YAC9B,MAAMG,SAASP,UAAU,GAAG,CAACM;YAC7B,IAAKC,QAEE;gBAAA,IAAIA,OAAO,IAAI,KAAKzB,IAAI,IAAI,EAC/BuB,OAAO,IAAI,CAACxB,YAAYC,KAAK;YACjC,OAHIuB,OAAO,IAAI,CAACxB,YAAYC,KAAK;QAIrC;QAGJ,IAAIgB,UACA;YAAA,KAAK,MAAM,CAACQ,IAAIxB,IAAI,IAAIkB,UACpB,IAAI,CAACI,SAAS,GAAG,CAACE,KACdD,OAAO,IAAI,CAACxB,YAAYC,KAAK;QAErC;QAGJ,IAAIuB,OAAO,MAAM,GAAG,GAChB,MAAMjB,QAAQiB;QAGlB,OAAOH;IACX;AACJ"}
package/types.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ export interface ISyncRow {
2
+ id: string;
3
+ entryId: string;
4
+ index: string;
5
+ operation: string;
6
+ data: string;
7
+ tenant: string;
8
+ }
9
+ export type SyncEventType = "INSERT" | "MODIFY" | "REMOVE";
10
+ export interface SyncEvent {
11
+ type: SyncEventType;
12
+ id: string;
13
+ entryId: string;
14
+ tenant: string;
15
+ index: string;
16
+ data?: string;
17
+ }
package/types.js ADDED
File without changes