prostgles-server 4.2.607 → 4.2.609

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 (81) hide show
  1. package/README.md +0 -29
  2. package/dist/Audit/AuditTable.d.ts +5 -4
  3. package/dist/Audit/AuditTable.d.ts.map +1 -1
  4. package/dist/Audit/AuditTable.js +1 -1
  5. package/dist/Audit/AuditTable.js.map +1 -1
  6. package/dist/Audit/AuditTypes.d.ts +5 -0
  7. package/dist/Audit/AuditTypes.d.ts.map +1 -1
  8. package/dist/Audit/getAuditTableConfig.d.ts +1 -6
  9. package/dist/Audit/getAuditTableConfig.d.ts.map +1 -1
  10. package/dist/Audit/getAuditTableConfig.js +21 -29
  11. package/dist/Audit/getAuditTableConfig.js.map +1 -1
  12. package/dist/Audit/getAuditTriggerConfig.d.ts +4 -0
  13. package/dist/Audit/getAuditTriggerConfig.d.ts.map +1 -0
  14. package/dist/Audit/getAuditTriggerConfig.js +47 -0
  15. package/dist/Audit/getAuditTriggerConfig.js.map +1 -0
  16. package/dist/Audit/parseAuditConfig.d.ts +3 -3
  17. package/dist/Audit/parseAuditConfig.d.ts.map +1 -1
  18. package/dist/Audit/parseAuditConfig.js +38 -93
  19. package/dist/Audit/parseAuditConfig.js.map +1 -1
  20. package/dist/DboBuilder/TableHandler/updateFile.d.ts +37 -2
  21. package/dist/DboBuilder/TableHandler/updateFile.d.ts.map +1 -1
  22. package/dist/DboBuilder/ViewHandler/getInfo.d.ts.map +1 -1
  23. package/dist/DboBuilder/ViewHandler/getInfo.js +1 -1
  24. package/dist/DboBuilder/ViewHandler/getInfo.js.map +1 -1
  25. package/dist/DboBuilder/getColumns.d.ts.map +1 -1
  26. package/dist/DboBuilder/getColumns.js +1 -1
  27. package/dist/DboBuilder/getColumns.js.map +1 -1
  28. package/dist/DboBuilder/schema/getTablesForSchemaPostgresSQL.d.ts +2 -2
  29. package/dist/Prostgles.d.ts +1 -2
  30. package/dist/Prostgles.d.ts.map +1 -1
  31. package/dist/Prostgles.js +19 -3
  32. package/dist/Prostgles.js.map +1 -1
  33. package/dist/ProstglesTypes.d.ts +2 -2
  34. package/dist/ProstglesTypes.d.ts.map +1 -1
  35. package/dist/StorageClient/getFileTableConfig.d.ts +2 -4
  36. package/dist/StorageClient/getFileTableConfig.d.ts.map +1 -1
  37. package/dist/StorageClient/getFileTableConfig.js.map +1 -1
  38. package/dist/TableConfig/TableConfigTypes.d.ts +1 -1
  39. package/dist/TableConfig/TableConfigTypes.d.ts.map +1 -1
  40. package/dist/TableConfig/TableRowFromColumnDefinitions.d.ts +12 -0
  41. package/dist/TableConfig/TableRowFromColumnDefinitions.d.ts.map +1 -0
  42. package/dist/TableConfig/TableRowFromColumnDefinitions.js +3 -0
  43. package/dist/TableConfig/TableRowFromColumnDefinitions.js.map +1 -0
  44. package/dist/TableConfig/getTableTriggerQueries.d.ts +2 -2
  45. package/dist/TableConfig/getTableTriggerQueries.d.ts.map +1 -1
  46. package/dist/TableConfig/getTableTriggerQueries.js +8 -14
  47. package/dist/TableConfig/getTableTriggerQueries.js.map +1 -1
  48. package/dist/TableConfig/initTableConfig.d.ts.map +1 -1
  49. package/dist/TableConfig/initTableConfig.js +0 -4
  50. package/dist/TableConfig/initTableConfig.js.map +1 -1
  51. package/dist/TableConfig/managedTriggerNames.d.ts.map +1 -1
  52. package/dist/TableConfig/managedTriggerNames.js +0 -1
  53. package/dist/TableConfig/managedTriggerNames.js.map +1 -1
  54. package/dist/TableConfig/syncTableTriggers.d.ts.map +1 -1
  55. package/dist/TableConfig/syncTableTriggers.js +10 -20
  56. package/dist/TableConfig/syncTableTriggers.js.map +1 -1
  57. package/dist/WebsocketAPI/getClientSchema.d.ts.map +1 -1
  58. package/dist/WebsocketAPI/getClientSchema.js +2 -1
  59. package/dist/WebsocketAPI/getClientSchema.js.map +1 -1
  60. package/dist/initProstgles.d.ts.map +1 -1
  61. package/dist/initProstgles.js +3 -0
  62. package/dist/initProstgles.js.map +1 -1
  63. package/lib/Audit/AuditTable.ts +4 -9
  64. package/lib/Audit/AuditTypes.ts +6 -0
  65. package/lib/Audit/getAuditTableConfig.ts +21 -41
  66. package/lib/Audit/getAuditTriggerConfig.ts +45 -0
  67. package/lib/Audit/parseAuditConfig.ts +44 -131
  68. package/lib/DboBuilder/ViewHandler/getInfo.ts +1 -0
  69. package/lib/DboBuilder/getColumns.ts +1 -0
  70. package/lib/Prostgles.ts +20 -4
  71. package/lib/ProstglesTypes.ts +2 -1
  72. package/lib/StorageClient/getFileTableConfig.ts +2 -13
  73. package/lib/TableConfig/TableConfigTypes.ts +1 -1
  74. package/lib/TableConfig/TableRowFromColumnDefinitions.ts +19 -0
  75. package/lib/TableConfig/getTableTriggerQueries.ts +16 -31
  76. package/lib/TableConfig/initTableConfig.ts +0 -3
  77. package/lib/TableConfig/managedTriggerNames.ts +0 -1
  78. package/lib/TableConfig/syncTableTriggers.ts +19 -33
  79. package/lib/WebsocketAPI/getClientSchema.ts +7 -1
  80. package/lib/initProstgles.ts +2 -0
  81. package/package.json +1 -1
@@ -1,18 +1,14 @@
1
1
  import { as } from "pg-promise";
2
- import type { DB } from "../initProstgles";
3
2
  import { asName } from "prostgles-types";
4
- import type { TableConfig } from "./TableConfigTypes";
5
- import {
6
- AUDIT_HISTORY_PROTECTION_PREFIX,
7
- getManagedTriggerName,
8
- isManagedTriggerName,
9
- } from "./managedTriggerNames";
3
+ import type { DB } from "../initProstgles";
4
+ import type { BaseTableDefinition } from "./TableConfigTypes";
5
+ import { getManagedTriggerName, isManagedTriggerName } from "./managedTriggerNames";
10
6
 
11
7
  /** Compare actual definitions so unchanged triggers do not cause schema refreshes. */
12
8
  export const getTableTriggerQueries = async (
13
9
  db: DB,
14
10
  tableIdent: string,
15
- tableConfig: TableConfig[string],
11
+ triggers: BaseTableDefinition["triggers"],
16
12
  ): Promise<string[]> => {
17
13
  const existing = await db.any<{
18
14
  name: string;
@@ -40,9 +36,7 @@ export const getTableTriggerQueries = async (
40
36
  const queries: string[] = [];
41
37
  const desired = new Set<string>();
42
38
  const actionBits = { insert: 4, delete: 8, update: 16, truncate: 32 };
43
- for (const [functionName, trigger] of Object.entries(
44
- tableConfig.triggers ?? {},
45
- )) {
39
+ for (const [functionName, trigger] of Object.entries(triggers ?? {})) {
46
40
  const functionIdent = asName(functionName);
47
41
  let functionAdded = false;
48
42
  for (const action of trigger.actions) {
@@ -52,23 +46,18 @@ export const getTableTriggerQueries = async (
52
46
  const legacyName = `${functionName}_${action}`;
53
47
  if (
54
48
  legacyName !== name &&
55
- existing.some(
56
- (t) => t.name === legacyName && t.function_name === functionName,
57
- )
49
+ existing.some((t) => t.name === legacyName && t.function_name === functionName)
58
50
  ) {
59
51
  queries.push(`DROP TRIGGER ${asName(legacyName)} ON ${tableIdent};`);
60
52
  }
61
53
  const triggerIdent = asName(name);
62
54
  const hasTransitionTables =
63
- trigger.forEach === "statement" &&
64
- trigger.type === "after" &&
65
- action !== "truncate";
66
- const oldTable =
67
- hasTransitionTables && action !== "insert" ? "old_table" : null;
68
- const newTable =
69
- hasTransitionTables && action !== "delete" ? "new_table" : null;
70
- const transitionTables = hasTransitionTables
71
- ? [
55
+ trigger.forEach === "statement" && trigger.type === "after" && action !== "truncate";
56
+ const oldTable = hasTransitionTables && action !== "insert" ? "old_table" : null;
57
+ const newTable = hasTransitionTables && action !== "delete" ? "new_table" : null;
58
+ const transitionTables =
59
+ hasTransitionTables ?
60
+ [
72
61
  "REFERENCING",
73
62
  newTable ? "NEW TABLE AS new_table" : "",
74
63
  oldTable ? "OLD TABLE AS old_table" : "",
@@ -77,11 +66,9 @@ export const getTableTriggerQueries = async (
77
66
  const type =
78
67
  actionBits[action] |
79
68
  (trigger.forEach === "row" ? 1 : 0) |
80
- (trigger.type === "before"
81
- ? 2
82
- : trigger.type === "instead of"
83
- ? 64
84
- : 0);
69
+ (trigger.type === "before" ? 2
70
+ : trigger.type === "instead of" ? 64
71
+ : 0);
85
72
  const previous = existing.find((entry) => entry.name === name);
86
73
  if (
87
74
  previous?.type === type &&
@@ -108,9 +95,7 @@ export const getTableTriggerQueries = async (
108
95
  }
109
96
  for (const trigger of existing) {
110
97
  const managed = isManagedTriggerName(trigger.name);
111
- // History remains append-only even after audit is disabled or moved.
112
- const protectsHistory = trigger.name.startsWith(AUDIT_HISTORY_PROTECTION_PREFIX);
113
- if (managed && !protectsHistory && !desired.has(trigger.name)) {
98
+ if (managed && !desired.has(trigger.name)) {
114
99
  queries.push(`DROP TRIGGER ${asName(trigger.name)} ON ${tableIdent};`);
115
100
  }
116
101
  }
@@ -12,7 +12,6 @@ import { getTableColumnQueries } from "./getTableColumnQueries";
12
12
  import { getIndexesQueries } from "./indexes/getIndexesQueries";
13
13
  import { runMigrations } from "./runMigrations";
14
14
  import type { TableConfigurator } from "./TableConfigurator";
15
- import { syncTableTriggers } from "./syncTableTriggers";
16
15
 
17
16
  export const initTableConfig = async function (this: TableConfigurator) {
18
17
  this.initialising = true;
@@ -282,6 +281,4 @@ export const initTableConfig = async function (this: TableConfigurator) {
282
281
  }
283
282
 
284
283
  await this.prostgles.rebuildDBO();
285
- await syncTableTriggers(this.prostgles);
286
- if (this.prostgles.opts.audit) await this.prostgles.rebuildDBO();
287
284
  };
@@ -4,7 +4,6 @@ import { md5 } from "prostgles-types/dist/md5";
4
4
  // Keep generated names within PostgreSQL's 63-byte identifier limit.
5
5
  export const TABLE_CONFIG_TRIGGER_PREFIX = "prostgles_table_config_";
6
6
  export const AUDIT_TRIGGER_PREFIX = "prostgles_audit_";
7
- // History protection survives removing or changing the audit configuration.
8
7
  export const AUDIT_HISTORY_PROTECTION_PREFIX = AUDIT_TRIGGER_PREFIX + "guard_";
9
8
  export const AUDIT_TRUNCATE_PROTECTION_PREFIX = AUDIT_TRIGGER_PREFIX + "block_";
10
9
  export const AUDIT_WRITER_PREFIX = AUDIT_TRIGGER_PREFIX + "write_";
@@ -1,42 +1,28 @@
1
- import { parseAuditConfig } from "../Audit/parseAuditConfig";
2
1
  import type { Prostgles } from "../Prostgles";
3
2
  import { EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID } from "../PubSubManager/PubSubManagerUtils";
4
3
  import { getTableTriggerQueries } from "./getTableTriggerQueries";
5
4
 
6
5
  /** Applies application and generated audit triggers together, after all tables exist. */
7
6
  export async function syncTableTriggers(prgl: Prostgles) {
8
- const previousAudit = prgl.parsedAuditConfig;
9
- const nextAudit =
10
- prgl.opts.audit || previousAudit ? await parseAuditConfig(prgl) : undefined;
11
- prgl.parsedAuditConfig = nextAudit;
12
- try {
13
- const config = prgl.mergedTableConfig.tableConfig ?? {};
14
- const queries: string[] = [];
15
- for (const name of Object.keys(config)) {
16
- if (!prgl.dboBuilder.tables.some((t) => t.name === name)) {
17
- throw new Error(
18
- `Table config name must exactly match a schema table name: ${name}`,
19
- );
20
- }
7
+ const config = prgl.mergedTableConfig.tableConfig ?? {};
8
+ const queries: string[] = [];
9
+ for (const name of Object.keys(config)) {
10
+ if (!prgl.dboBuilder.tables.some((t) => t.name === name)) {
11
+ throw new Error(`Table config name must exactly match a schema table name: ${name}`);
21
12
  }
22
- for (const table of prgl.dboBuilder.tables) {
23
- queries.push(
24
- ...(await getTableTriggerQueries(
25
- prgl.dbForSchema!,
26
- table.escaped_identifier,
27
- { triggers: config[table.name]?.triggers },
28
- )),
29
- );
30
- }
31
- if (queries.length) {
32
- await prgl.dbForSchema!.tx((tx) =>
33
- tx.none(
34
- `/* ${EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID} */\n${queries.join("\n")}`,
35
- ),
36
- );
37
- }
38
- } catch (error) {
39
- prgl.parsedAuditConfig = previousAudit;
40
- throw error;
13
+ }
14
+ for (const table of prgl.dboBuilder.tables) {
15
+ queries.push(
16
+ ...(await getTableTriggerQueries(
17
+ prgl.dbForSchema!,
18
+ table.escaped_identifier,
19
+ config[table.name]?.triggers,
20
+ )),
21
+ );
22
+ }
23
+ if (queries.length) {
24
+ await prgl.dbForSchema!.tx((tx) =>
25
+ tx.none(`/* ${EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID} */\n${queries.join("\n")}`),
26
+ );
41
27
  }
42
28
  }
@@ -45,11 +45,17 @@ export async function getClientSchema(
45
45
  const { tables: rawTables = [] } = fullSchema ?? {};
46
46
  const { tableSchemaErrors = {} } = fullSchema ?? {};
47
47
  const { modifyClientSchema } = this.opts;
48
+ const resolvedAuditConfig = modifyClientSchema ? this.resolvedAuditConfig : undefined;
48
49
  const tables =
49
50
  modifyClientSchema ?
50
51
  await Promise.all(
51
52
  rawTables.map(async (t) =>
52
- modifyClientSchema(t, this.dboBuilder.dboMap.get(t.name)?.config, userData),
53
+ modifyClientSchema(
54
+ t,
55
+ this.dboBuilder.dboMap.get(t.name)?.config,
56
+ userData,
57
+ resolvedAuditConfig,
58
+ ),
53
59
  ),
54
60
  )
55
61
  : rawTables;
@@ -236,6 +236,8 @@ export const initProstgles = async function (
236
236
  } finally {
237
237
  this.preparingTableConfig = false;
238
238
  }
239
+ await syncTableTriggers(this);
240
+ if (this.opts.audit) await this.rebuildDBO();
239
241
  });
240
242
  await this.tableConfigurator?.setTableOnMounts();
241
243
  // onMount may create additional targets; validate joins against the completed schema.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prostgles-server",
3
- "version": "4.2.607",
3
+ "version": "4.2.609",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",