prostgles-server 4.2.641 → 4.2.643

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 (91) hide show
  1. package/debug/caught-request-fix-build.log +4 -0
  2. package/debug/caught-request-fix-test-build.log +0 -0
  3. package/debug/caught-request-subscription-failure.log +603 -0
  4. package/debug/caught-validation-build.log +4 -0
  5. package/debug/caught-validation-fix-build.log +4 -0
  6. package/debug/caught-validation-fix-test-build.log +0 -0
  7. package/debug/caught-validation-test-build.log +0 -0
  8. package/debug/client-db-tx-build.log +4 -0
  9. package/debug/client-db-tx-test-server.log +3248 -0
  10. package/debug/client-db-tx-tests-build.log +0 -0
  11. package/debug/client-handler-shape-build.log +4 -0
  12. package/debug/client-handler-shape-test-server.log +544 -0
  13. package/debug/client-handler-shape-tests-build.log +0 -0
  14. package/debug/column-definitions-build.log +4 -0
  15. package/debug/column-definitions-test-server.log +3244 -0
  16. package/debug/column-definitions-tests-build.log +0 -0
  17. package/debug/function-client-db-tx-build.log +4 -0
  18. package/debug/function-client-db-tx-tests-build.log +0 -0
  19. package/debug/schema-types-focused-strict-check.log +0 -0
  20. package/debug/schema-types-strict-check.log +38 -0
  21. package/debug/schema-types-tests-build.log +0 -0
  22. package/debug/security-review-baseline-tests.log +3250 -0
  23. package/debug/security-review-build.log +4 -0
  24. package/debug/security-review-checkfilter-repro.log +545 -0
  25. package/debug/security-review-clientSchemaTypes.spec.ts.backup +553 -0
  26. package/debug/security-review-repro-build.log +0 -0
  27. package/debug/security-review-repro.spec.ts +591 -0
  28. package/debug/security-review-restore-build.log +0 -0
  29. package/debug/security-review-server-tests.log +3254 -0
  30. package/debug/security-review-test-build.log +0 -0
  31. package/debug/test-check-eslint.log +6 -0
  32. package/debug/test-check-lint-baseline.json +1 -0
  33. package/debug/test-check-npm-test.log +789 -0
  34. package/debug/test-check-types.log +8 -0
  35. package/debug/test-config-npm-test.log +223 -0
  36. package/debug/test-config-strict-null-check.log +50 -0
  37. package/debug/test-config-typecheck.log +8 -0
  38. package/debug/tryRunP-test-quick.log +78 -0
  39. package/debug/tryRunP-typecheck.log +42 -0
  40. package/dist/Auth/AuthTypes.d.ts +3 -3
  41. package/dist/Auth/AuthTypes.d.ts.map +1 -1
  42. package/dist/Auth/AuthTypes.js.map +1 -1
  43. package/dist/DboBuilder/DboBuilder.d.ts.map +1 -1
  44. package/dist/DboBuilder/DboBuilder.js +4 -2
  45. package/dist/DboBuilder/DboBuilder.js.map +1 -1
  46. package/dist/DboBuilder/TableHandler/TableHandler.d.ts +1 -1
  47. package/dist/DboBuilder/dboBuilderUtils.d.ts +1 -0
  48. package/dist/DboBuilder/dboBuilderUtils.d.ts.map +1 -1
  49. package/dist/DboBuilder/dboBuilderUtils.js +2 -1
  50. package/dist/DboBuilder/dboBuilderUtils.js.map +1 -1
  51. package/dist/PublishParser/PublishParser.d.ts.map +1 -1
  52. package/dist/PublishParser/PublishParser.js +2 -1
  53. package/dist/PublishParser/PublishParser.js.map +1 -1
  54. package/dist/PublishParser/defineServerFunction.d.ts +2 -0
  55. package/dist/PublishParser/defineServerFunction.d.ts.map +1 -1
  56. package/dist/PublishParser/defineServerFunction.js.map +1 -1
  57. package/dist/PublishParser/getPublishedTableNames.d.ts.map +1 -1
  58. package/dist/PublishParser/getPublishedTableNames.js +2 -1
  59. package/dist/PublishParser/getPublishedTableNames.js.map +1 -1
  60. package/dist/PublishParser/publishTypesAndUtils.d.ts +1 -1
  61. package/dist/PublishParser/publishTypesAndUtils.d.ts.map +1 -1
  62. package/dist/StorageClient/StorageClientTypes.d.ts +5 -4
  63. package/dist/StorageClient/StorageClientTypes.d.ts.map +1 -1
  64. package/dist/TableConfig/TableRowFromColumnDefinitions.d.ts +19 -6
  65. package/dist/TableConfig/TableRowFromColumnDefinitions.d.ts.map +1 -1
  66. package/dist/WebsocketAPI/getClientHandlers.d.ts +5 -0
  67. package/dist/WebsocketAPI/getClientHandlers.d.ts.map +1 -1
  68. package/dist/WebsocketAPI/getClientHandlers.js +33 -14
  69. package/dist/WebsocketAPI/getClientHandlers.js.map +1 -1
  70. package/dist/index.d.ts +1 -0
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +3 -1
  73. package/dist/index.js.map +1 -1
  74. package/dist/runClientRequest.d.ts +2 -1
  75. package/dist/runClientRequest.d.ts.map +1 -1
  76. package/dist/runClientRequest.js +4 -2
  77. package/dist/runClientRequest.js.map +1 -1
  78. package/eslint.config.mjs +21 -1
  79. package/lib/Auth/AuthTypes.ts +3 -2
  80. package/lib/DboBuilder/DboBuilder.ts +7 -2
  81. package/lib/DboBuilder/dboBuilderUtils.ts +2 -0
  82. package/lib/PublishParser/PublishParser.ts +2 -1
  83. package/lib/PublishParser/defineServerFunction.ts +3 -5
  84. package/lib/PublishParser/getPublishedTableNames.ts +2 -1
  85. package/lib/PublishParser/publishTypesAndUtils.ts +1 -1
  86. package/lib/StorageClient/StorageClientTypes.ts +5 -4
  87. package/lib/TableConfig/TableRowFromColumnDefinitions.ts +110 -33
  88. package/lib/WebsocketAPI/getClientHandlers.ts +63 -29
  89. package/lib/index.ts +3 -3
  90. package/lib/runClientRequest.ts +5 -1
  91. package/package.json +5 -3
@@ -1 +1 @@
1
- {"version":3,"file":"runClientRequest.d.ts","sourceRoot":"","sources":["../lib/runClientRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAK1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,sCAAsC,CAAC;AA8B5E,KAAK,IAAI,GAAG;IACV,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAUF,eAAO,MAAM,gBAAgB,GAC3B,MAAM,SAAS,EACf,kBAAkB,IAAI,EACtB,WAAW,iBAAiB,EAC5B,OAAO,eAAe,GAAG,SAAS,8BAyHnC,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,MAAM,SAAS,EACf,WAAW,iBAAiB;;;;;;;;EAe7B,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,MAAM,SAAS,EACf,iBAAiB,UAAU,EAC3B,WAAW,iBAAiB,iBAsB7B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,MAAM,SAAS,EACf,iBAAiB,UAAU,EAC3B,WAAW,iBAAiB,qBAgD7B,CAAC"}
1
+ {"version":3,"file":"runClientRequest.d.ts","sourceRoot":"","sources":["../lib/runClientRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,sCAAsC,CAAC;AA8B5E,KAAK,IAAI,GAAG;IACV,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAUF,eAAO,MAAM,gBAAgB,GAC3B,MAAM,SAAS,EACf,kBAAkB,IAAI,EACtB,WAAW,iBAAiB,EAC5B,OAAO,eAAe,GAAG,SAAS,EAClC,sBAAsB,iBAAiB,8BA2HxC,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,MAAM,SAAS,EACf,WAAW,iBAAiB;;;;;;;;EAe7B,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,MAAM,SAAS,EACf,iBAAiB,UAAU,EAC3B,WAAW,iBAAiB,iBAsB7B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,MAAM,SAAS,EACf,iBAAiB,UAAU,EAC3B,WAAW,iBAAiB,qBAgD7B,CAAC"}
@@ -29,7 +29,7 @@ const SOCKET_ONLY_COMMANDS = [
29
29
  "sync",
30
30
  "abort",
31
31
  ];
32
- const runClientRequest = async function (nonValidatedArgs, clientReq, scope) {
32
+ const runClientRequest = async function (nonValidatedArgs, clientReq, scope, transactionHandlers) {
33
33
  this.checkNotDestroyed();
34
34
  /* Channel name will only include client-sent params so we ignore table_rules enforced params */
35
35
  if (!this.publishParser || !this.dbo) {
@@ -58,7 +58,9 @@ const runClientRequest = async function (nonValidatedArgs, clientReq, scope) {
58
58
  throw ("The following commands cannot be completed over a non-websocket connection: " +
59
59
  SOCKET_ONLY_COMMANDS.join(", "));
60
60
  }
61
- const tableHandler = this.dboBuilder.dboMap.get(tableName);
61
+ const tableHandler = transactionHandlers ?
62
+ (Object.hasOwn(transactionHandlers, tableName) ? transactionHandlers[tableName] : undefined)
63
+ : this.dboBuilder.dboMap.get(tableName);
62
64
  if (!tableHandler) {
63
65
  throw `tableName ${tableName} is invalid or not allowed`;
64
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runClientRequest.js","sourceRoot":"","sources":["../lib/runClientRequest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runClientRequest.js","sourceRoot":"","sources":["../lib/runClientRequest.ts"],"names":[],"mappings":"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"}
package/eslint.config.mjs CHANGED
@@ -3,7 +3,18 @@ import tseslint from "typescript-eslint";
3
3
 
4
4
  export default tseslint.config(
5
5
  {
6
- ignores: ["node_modules", "dist", "debug", "examples", "**/*.d.ts", "tests", "docs"],
6
+ ignores: [
7
+ "**/node_modules",
8
+ "**/dist",
9
+ "**/debug",
10
+ "examples",
11
+ "**/*.d.ts",
12
+ "docs",
13
+ "tests/**/*.js",
14
+ "tests/DBGeneratedSchema.ts",
15
+ "tests/config_test",
16
+ "tests/server/DEMO_SERVER.ts",
17
+ ],
7
18
  },
8
19
  eslint.configs.recommended,
9
20
  tseslint.configs.recommendedTypeChecked,
@@ -58,4 +69,13 @@ export default tseslint.config(
58
69
  ],
59
70
  },
60
71
  },
72
+ {
73
+ files: ["tests/**/*.ts"],
74
+ languageOptions: {
75
+ parserOptions: {
76
+ projectService: false,
77
+ project: ["./tests/server/tsconfig.json", "./tests/client/tsconfig.json"],
78
+ },
79
+ },
80
+ },
61
81
  );
@@ -21,6 +21,7 @@ import type {
21
21
  FullFilter,
22
22
  IdentityProvider,
23
23
  LocalLoginMode,
24
+ MaybePromise,
24
25
  UserLike,
25
26
  } from "prostgles-types";
26
27
  import type { DBOFullyTyped } from "../DBSchemaBuilder/DBSchemaBuilder";
@@ -210,7 +211,7 @@ export type LoginWithOAuthConfig<S> = {
210
211
  req: ExpressReq;
211
212
  res: ExpressRes;
212
213
  clientInfo: LoginClientInfo;
213
- }) => Promise<
214
+ }) => MaybePromise<
214
215
  AuthResponse.OAuthRegisterSuccess | AuthResponse.OAuthRegisterFailure | AuthResponse.AuthFailure
215
216
  >;
216
217
 
@@ -225,7 +226,7 @@ export type LoginWithOAuthConfig<S> = {
225
226
  req: ExpressReq;
226
227
  res: ExpressRes;
227
228
  clientInfo: LoginClientInfo;
228
- }) => void | Promise<void>;
229
+ }) => void | MaybePromise<void>;
229
230
  };
230
231
 
231
232
  export type SessionUser<
@@ -29,6 +29,7 @@ import {
29
29
  getCanExecute,
30
30
  getConstraints,
31
31
  getSerializedClientErrorFromPGError,
32
+ TX_KEY,
32
33
  } from "./dboBuilderUtils";
33
34
  import { prepareShortestJoinPaths } from "./joins/prepareShortestJoinPaths";
34
35
  import { cacheDBTypes, runSQL } from "./runSql/runSQL";
@@ -304,10 +305,14 @@ export class DboBuilder {
304
305
  });
305
306
 
306
307
  if (this.prostgles.opts.transactions) {
307
- const txKey = "tx";
308
+ if (this.dboMap.has(TX_KEY)) {
309
+ throw new Error(
310
+ `Transaction key ${JSON.stringify(TX_KEY)} clashes with an existing table or view name`,
311
+ );
312
+ }
308
313
 
309
314
  //@ts-ignore
310
- this.dbo[txKey] = <R, TH extends DbTxTableHandlers & Pick<DBHandlerServer, "sql">>(
315
+ this.dbo[TX_KEY] = <R, TH extends DbTxTableHandlers & Pick<DBHandlerServer, "sql">>(
311
316
  cb: TxCB<Promise<R>, TH>,
312
317
  ) => this.getTX(cb);
313
318
  }
@@ -203,3 +203,5 @@ export const withUserRLS = (
203
203
  const queryId = crypto.randomUUID();
204
204
  return [QUERY_ID_PREFIX + queryId, firstQuery, query].filter(Boolean).join("\n");
205
205
  };
206
+
207
+ export const TX_KEY = "tx" as const;
@@ -129,10 +129,11 @@ export class PublishParser {
129
129
  };
130
130
  return unrestrictedCtx;
131
131
  }
132
- const { clientDb } = await publishParams.getClientDBHandlers(undefined);
132
+ const { clientDb, withClientDbTx } = await publishParams.getClientDBHandlers(undefined);
133
133
  const { clientInfo, clientReq, tables } = publishParams;
134
134
  const restrictedCtx: RestrictedFunctionContext<void, SessionUser, unknown> = {
135
135
  dbo: clientDb,
136
+ withClientDbTx,
136
137
  user,
137
138
  clientInfo,
138
139
  clientReq,
@@ -11,6 +11,7 @@ import type { SessionUser } from "../Auth/AuthTypes";
11
11
  import type { DBOFullyTyped, DBOFullyTypedClient } from "../DBSchemaBuilder/DBSchemaBuilder";
12
12
  import type { DB } from "../initProstgles";
13
13
  import type { PublishParams } from "./publishTypesAndUtils";
14
+ import type { ClientHandlers } from "../WebsocketAPI/getClientHandlers";
14
15
 
15
16
  type FunctionContextBase<S, SUser extends SessionUser, Context> = Pick<
16
17
  PublishParams<S, SUser>,
@@ -30,6 +31,7 @@ export type RestrictedFunctionContext<
30
31
  Context = undefined,
31
32
  > = FunctionContextBase<S, SUser, Context> & {
32
33
  dbo: DBOFullyTypedClient<S>;
34
+ withClientDbTx: ClientHandlers<S>["withClientDbTx"];
33
35
  };
34
36
 
35
37
  export type UnrestrictedFunctionContext<
@@ -55,11 +57,7 @@ export type ServerFunctionDefinition = {
55
57
  };
56
58
 
57
59
  declare const serverFunctionContext: unique symbol;
58
- export type ServerFunctionContextMarker<
59
- S,
60
- SUser extends SessionUser,
61
- Context = undefined,
62
- > = {
60
+ export type ServerFunctionContextMarker<S, SUser extends SessionUser, Context = undefined> = {
63
61
  [serverFunctionContext]?: [S, SUser, [Context] extends [undefined] ? never : Context];
64
62
  };
65
63
 
@@ -2,12 +2,13 @@ import { isObject } from "prostgles-types";
2
2
  import type { PublishParser } from "./PublishParser";
3
3
  import { type PublishObject } from "./PublishParser";
4
4
  import { getFileVersionTableName, isFileVersionTable } from "../StorageClient/fileVersionUtils";
5
+ import { TX_KEY } from "../DboBuilder/dboBuilderUtils";
5
6
 
6
7
  export const getPublishedTableNames = (
7
8
  publishParserInstance: PublishParser,
8
9
  publishObject: PublishObject,
9
10
  ) => {
10
- const txKey = !publishParserInstance.prostgles.opts.transactions ? "" : "tx";
11
+ const txKey = !publishParserInstance.prostgles.opts.transactions ? "" : TX_KEY;
11
12
  if (txKey && txKey in publishObject) {
12
13
  throw new Error(
13
14
  `Transactions key ${JSON.stringify(txKey)} collides with a published table name`,
@@ -127,7 +127,7 @@ export type AfterEachTsTrigger<R, DBX, Context = undefined, InputDataType = R> =
127
127
  localParams: undefined | LocalParams;
128
128
  context: Context;
129
129
  },
130
- ) => Promise<void>;
130
+ ) => MaybePromise<void>;
131
131
  };
132
132
 
133
133
  export type ValidateRowsArgsCommon<R = AnyObject, DBX = DBHandlerServer> = {
@@ -1,3 +1,4 @@
1
+ import type { MaybePromise } from "prostgles-types";
1
2
  import type * as stream from "stream";
2
3
 
3
4
  export type LocalUploadedFileDetails = {
@@ -22,9 +23,9 @@ export type UploadFileOptions = {
22
23
  onProgress?: (bytesUploaded: number) => void;
23
24
  };
24
25
  export type StorageClientBase<T> = {
25
- upload: (file: UploadFileOptions) => Promise<T>;
26
- downloadAsStream: (name: string) => Promise<stream.Readable>;
27
- delete: (fileName: string) => Promise<void>;
26
+ upload: (file: UploadFileOptions) => MaybePromise<T>;
27
+ downloadAsStream: (name: string) => MaybePromise<stream.Readable>;
28
+ delete: (fileName: string) => MaybePromise<void>;
28
29
  };
29
30
  export type LocalStorageClient = StorageClientBase<LocalUploadedFileDetails> & {
30
31
  type: "local";
@@ -32,6 +33,6 @@ export type LocalStorageClient = StorageClientBase<LocalUploadedFileDetails> & {
32
33
  };
33
34
  export type CloudStorageClient = StorageClientBase<CloudUploadedFileDetails> & {
34
35
  type: "cloud";
35
- getSignedUrlForDownload: (fileName: string, expiresInSeconds: number) => Promise<string>;
36
+ getSignedUrlForDownload: (fileName: string, expiresInSeconds: number) => MaybePromise<string>;
36
37
  };
37
38
  export type StorageClient = LocalStorageClient | CloudStorageClient;
@@ -6,44 +6,121 @@ type ColumnDefinition =
6
6
  | { jsonbSchema: JSONB.JSONBSchema; nullable?: boolean };
7
7
 
8
8
  /** Row types for the column definitions used by managed tables. */
9
- export type TableRowFromColumnDefinitions<
10
- T extends Record<string, ColumnDefinition>,
11
- > = Omit<TableRow<T>, GeneratedColumnNames<T>> &
9
+ export type TableRowFromColumnDefinitions<T extends Record<string, ColumnDefinition>> = InsertRow<{
10
+ [K in keyof T]: T[K] extends string ? NormalizeSQL<Uppercase<T[K]>> : T[K];
11
+ }>;
12
+
13
+ type InsertRow<T extends Record<string, ColumnDefinition>> = Omit<
14
+ TableRow<T>,
15
+ GeneratedColumnNames<T>
16
+ > &
12
17
  Partial<Pick<TableRow<T>, GeneratedColumnNames<T>>>;
13
18
 
14
19
  type TableRow<T extends Record<string, ColumnDefinition>> = {
15
- [K in keyof T]: T[K] extends {
16
- jsonbSchema: infer S extends JSONB.JSONBSchema;
17
- }
18
- ? JSONB.GetType<S> | (T[K] extends { nullable: true } ? null : never)
19
- : T[K] extends { enum: readonly (infer V)[] }
20
- ? V | (T[K] extends { nullable: true } ? null : never)
21
- : | ColumnValue<T[K]>
22
- | (T[K] extends
23
- `${string} NOT NULL${string}` | `${string}PRIMARY KEY${string}`
24
- ? never
25
- : null);
20
+ [K in keyof T]: T[K] extends (
21
+ {
22
+ jsonbSchema: infer S extends JSONB.JSONBSchema;
23
+ }
24
+ ) ?
25
+ JSONB.GetType<S> | (T[K] extends { nullable: true } ? null : never)
26
+ : T[K] extends { enum: readonly (infer V)[] } ?
27
+ V | (T[K] extends { nullable: true } ? null : never)
28
+ : | ColumnValue<T[K]>
29
+ | (T[K] extends string ?
30
+ ColumnIsRequired<T[K]> extends true ?
31
+ never
32
+ : null
33
+ : never);
26
34
  };
27
35
 
36
+ type ColumnIsRequired<T extends string> =
37
+ ReadType<T>[0] extends SerialType ? true
38
+ : ` ${Unquoted<T>} ` extends (
39
+
40
+ | `${string} NOT NULL ${string}`
41
+ | `${string} PRIMARY KEY ${string}`
42
+ | `${string} GENERATED ${string} AS IDENTITY ${string}`
43
+ ) ?
44
+ true
45
+ : false;
46
+
28
47
  type GeneratedColumnNames<T extends Record<string, ColumnDefinition>> = {
29
- [K in keyof T]: T[K] extends string
30
- ? T[K] extends
31
- | `${string}DEFAULT${string}`
32
- | `${string}SERIAL${string}`
33
- | `${string}GENERATED${string}AS IDENTITY${string}`
34
- ? K
35
- : never
36
- : never;
48
+ [K in keyof T]: T[K] extends string ?
49
+ ReadType<T[K]>[0] extends SerialType ? K
50
+ : ` ${Unquoted<T[K]>} ` extends (
51
+ `${string} DEFAULT ${string}` | `${string} GENERATED ${string}`
52
+ ) ?
53
+ K
54
+ : never
55
+ : never;
37
56
  }[keyof T];
38
57
 
39
- type ColumnValue<T> = T extends `BYTEA${string}`
40
- ? Buffer
41
- : T extends `JSONB${string}`
42
- ? Record<string, unknown>
43
- : T extends `${"SMALLINT" | "INTEGER" | "SERIAL"}${string}`
44
- ? number
45
- : T extends `${"BIGINT" | "BIGSERIAL" | "NUMERIC" | "DECIMAL"}${string}`
46
- ? string | number
47
- : T extends `${"REAL" | "DOUBLE PRECISION"}${string}`
48
- ? number
49
- : string;
58
+ type SerialType = "SMALLSERIAL" | "SERIAL2" | "SERIAL" | "SERIAL4" | "BIGSERIAL" | "SERIAL8";
59
+
60
+ type ColumnValue<T> =
61
+ T extends string ?
62
+ T extends `DOUBLE PRECISION${infer Rest}` ? ColumnValue<`FLOAT8${Rest}`>
63
+ : ReadType<T> extends [infer Name extends string, infer Rest extends string] ?
64
+ ArrayValue<ScalarValue<Name>, Trim<Rest>>
65
+ : never
66
+ : never;
67
+
68
+ type ScalarValue<T> =
69
+ T extends "BYTEA" ? Buffer
70
+ : T extends "JSON" | "JSONB" ? Record<string, unknown>
71
+ : T extends "BOOL" | "BOOLEAN" ? boolean
72
+ : T extends (
73
+
74
+ | "SMALLINT"
75
+ | "INT2"
76
+ | "INT"
77
+ | "INTEGER"
78
+ | "INT4"
79
+ | "SMALLSERIAL"
80
+ | "SERIAL2"
81
+ | "SERIAL"
82
+ | "SERIAL4"
83
+ | "REAL"
84
+ | "FLOAT"
85
+ | "FLOAT4"
86
+ | "FLOAT8"
87
+ ) ?
88
+ number
89
+ : T extends "BIGINT" | "INT8" | "BIGSERIAL" | "SERIAL8" | "NUMERIC" | "DECIMAL" | "DEC" ?
90
+ string | number
91
+ : string;
92
+
93
+ /** Only consume modifiers/array dimensions immediately following the type. */
94
+ type ArrayValue<Value, Rest extends string> =
95
+ Rest extends `(${string})${infer Tail}` ? ArrayValue<Value, Trim<Tail>>
96
+ : Rest extends `[${string}]${infer Tail}` ? ArrayValue<(Value | null)[], Trim<Tail>>
97
+ : Rest extends "ARRAY" | `ARRAY ${string}` | `ARRAY[${string}` ?
98
+ Rest extends `ARRAY${infer Tail}` ?
99
+ Trim<Tail> extends `[${string}` ?
100
+ ArrayValue<Value, Trim<Tail>>
101
+ : (Value | null)[]
102
+ : never
103
+ : Value;
104
+
105
+ type ReadType<T extends string, Name extends string = ""> =
106
+ T extends `${" " | "(" | "["}${string}` ? [Name, T]
107
+ : T extends `${infer Char}${infer Rest}` ? ReadType<Rest, `${Name}${Char}`>
108
+ : [Name, ""];
109
+
110
+ type Trim<T extends string> =
111
+ T extends ` ${infer Rest}` ? Trim<Rest>
112
+ : T extends `${infer Rest} ` ? Trim<Rest>
113
+ : T;
114
+
115
+ type NormalizeSQL<T extends string> =
116
+ T extends `${infer Start}\n${infer End}` ? NormalizeSQL<`${Start} ${End}`>
117
+ : T extends `${infer Start}\r${infer End}` ? NormalizeSQL<`${Start} ${End}`>
118
+ : T extends `${infer Start}\t${infer End}` ? NormalizeSQL<`${Start} ${End}`>
119
+ : T extends `${infer Start} ${infer End}` ? NormalizeSQL<`${Start} ${End}`>
120
+ : Trim<T>;
121
+
122
+ /** Quoted values and identifiers do not declare defaults or constraints. */
123
+ type Unquoted<T extends string> =
124
+ T extends `${infer Start}'${string}'${infer End}` ? Unquoted<`${Start}${End}`>
125
+ : T extends `${infer Start}"${string}"${infer End}` ? Unquoted<`${Start}${End}`>
126
+ : T;
@@ -1,4 +1,5 @@
1
1
  import {
2
+ getAllowedTableMethods,
2
3
  getKeys,
3
4
  type AnyObject,
4
5
  type ClientSchema,
@@ -8,6 +9,7 @@ import {
8
9
  } from "prostgles-types";
9
10
  import type { AuthClientRequest } from "../Auth/AuthTypes";
10
11
  import type { DBOFullyTypedClient } from "../DBSchemaBuilder/DBSchemaBuilder";
12
+ import type { DbTxTableHandlers } from "../DboBuilder/DboBuilderTypes";
11
13
  import type { Prostgles } from "../Prostgles";
12
14
  import type { ServerFunctionDefinition } from "../PublishParser/defineServerFunction";
13
15
  import type { PermissionScope } from "../PublishParser/publishTypesAndUtils";
@@ -17,6 +19,11 @@ import { getClientSchema } from "./getClientSchema";
17
19
  export type ClientHandlers<S = void> = {
18
20
  clientSql: SQLHandler;
19
21
  clientDb: DBOFullyTypedClient<S>;
22
+ /**
23
+ * Runs permission-checked table operations in a transaction. Requires transactions: true.
24
+ * Caught table request errors also roll back the transaction.
25
+ */
26
+ withClientDbTx: <R>(callback: (clientDb: DBOFullyTypedClient<S>) => R | Promise<R>) => Promise<R>;
20
27
  clientMethods: Record<string, ServerFunctionDefinition>;
21
28
  clientSchema: ClientSchema;
22
29
  };
@@ -27,47 +34,74 @@ export const getClientHandlers = async <S = void>(
27
34
  ): Promise<ClientHandlers<S>> => {
28
35
  prostgles.checkNotDestroyed();
29
36
  const clientSchema =
30
- clientReq.socket?.prostgles?.get(prostgles.appId) ??
37
+ (scope ? undefined : clientReq.socket?.prostgles?.get(prostgles.appId)) ??
31
38
  (await getClientSchema.bind(prostgles)(clientReq, scope));
39
+
32
40
  const sqlHandler: SQLHandler | undefined = ((
33
41
  query: string,
34
42
  params?: unknown,
35
43
  options?: SQLOptions,
36
44
  ) => runClientSqlRequest.bind(prostgles)({ query, params, options }, clientReq)) as SQLHandler;
37
- const tableHandlers = Object.fromEntries(
38
- prostgles.dboBuilder.tablesOrViews!.map((table) => {
39
- const methods = [...tableMethods];
40
- const handlers = Object.fromEntries(
41
- methods.map((command) => {
42
- const method = (param1: unknown, param2: unknown, param3: unknown) =>
43
- runClientRequest.bind(prostgles)(
44
- { command, tableName: table.name, param1, param2, param3 },
45
- clientReq,
46
- scope,
47
- );
48
- return [command, method];
49
- }),
50
- );
51
- return [table.name, handlers];
52
- }),
53
- );
54
45
 
55
- const txNotAllowed: {} = {
56
- tx: () => {
57
- throw new Error("Transactions are not allowed in client handlers");
58
- },
59
- };
46
+ const getTableHandlers = (
47
+ transactionHandlers?: DbTxTableHandlers,
48
+ onRequestError?: (error: unknown) => void,
49
+ ) =>
50
+ Object.fromEntries(
51
+ clientSchema.tableSchema.map((table) => {
52
+ const allowedMethods = getAllowedTableMethods(table);
53
+ const methods = tableMethods.filter((command) => allowedMethods.includes(command));
54
+ const handlers = Object.fromEntries(
55
+ methods.map((command) => {
56
+ const method = (param1: unknown, param2: unknown, param3: unknown) =>
57
+ runClientRequest
58
+ .bind(prostgles)(
59
+ { command, tableName: table.name, param1, param2, param3 },
60
+ clientReq,
61
+ scope,
62
+ transactionHandlers,
63
+ )
64
+ .catch((error: unknown) => {
65
+ onRequestError?.(error);
66
+ throw error;
67
+ });
68
+ return [command, method];
69
+ }),
70
+ );
71
+ return [table.name, handlers];
72
+ }),
73
+ );
74
+
60
75
  const clientSql = ((query: string, params?: AnyObject, options?: SQLOptions) => {
61
76
  if (scope && !scope.allowSql) {
62
- throw new Error("SQL is dissallowed by PermissionScope");
77
+ throw new Error("SQL is disallowed by PermissionScope");
63
78
  }
64
79
 
65
80
  return sqlHandler(query, params, options);
66
81
  }) as SQLHandler;
67
- const clientDb = {
68
- ...tableHandlers,
69
- ...txNotAllowed,
70
- } as DBOFullyTypedClient<S>;
82
+
83
+ const clientDb = getTableHandlers() as unknown as DBOFullyTypedClient<S>;
84
+
85
+ const withClientDbTx: ClientHandlers<S>["withClientDbTx"] = async (callback) => {
86
+ prostgles.checkNotDestroyed();
87
+ if (!prostgles.opts.transactions) {
88
+ throw new Error("Transactions are not enabled");
89
+ }
90
+ return prostgles.dboBuilder.getTX(async (transactionHandlers) => {
91
+ /**
92
+ * runClientRequest throws authorization errors.
93
+ * Prevent cached authorization errors from committing the transaction.
94
+ */
95
+ let failure: { error: unknown } | undefined;
96
+ const result = await callback({
97
+ ...getTableHandlers(transactionHandlers, (error) => {
98
+ failure ??= { error };
99
+ }),
100
+ } as unknown as DBOFullyTypedClient<S>);
101
+ if (failure) throw failure.error;
102
+ return result;
103
+ });
104
+ };
71
105
 
72
106
  const clientMethods: Record<string, ServerFunctionDefinition> = Object.fromEntries(
73
107
  clientSchema.methods.map(({ name, input, description, output }) => {
@@ -81,7 +115,7 @@ export const getClientHandlers = async <S = void>(
81
115
  }),
82
116
  );
83
117
 
84
- return { clientDb, clientSql, clientMethods, clientSchema };
118
+ return { clientDb, clientSql, clientMethods, clientSchema, withClientDbTx };
85
119
  };
86
120
 
87
121
  const tableMethods = getKeys({
package/lib/index.ts CHANGED
@@ -3,6 +3,7 @@ import type { SessionUser } from "./Auth/AuthTypes";
3
3
  import type { InitResult, OnReadyCallbackBasic } from "./initProstgles";
4
4
  import { Prostgles } from "./Prostgles";
5
5
  import type { ProstglesInitOptions } from "./ProstglesTypes";
6
+ export { DB_GENERATED_NAMES } from "./DBSchemaBuilder/constants";
6
7
 
7
8
  function prostgles<
8
9
  S = void,
@@ -22,9 +23,8 @@ export const createProstgles = <
22
23
  SUser extends SessionUser = SessionUser,
23
24
  ClientSchema = S,
24
25
  >() => {
25
- return <Context = undefined>(
26
- params: ProstglesInitOptions<S, SUser, Context>,
27
- ) => prostgles<S, SUser, Context, ClientSchema>(params);
26
+ return <Context = undefined>(params: ProstglesInitOptions<S, SUser, Context>) =>
27
+ prostgles<S, SUser, Context, ClientSchema>(params);
28
28
  };
29
29
  export * from "./PublishParser/defineServerFunction";
30
30
  export * from "./Auth/AuthTypes";
@@ -9,6 +9,7 @@ import {
9
9
  import type { AuthClientRequest } from "./Auth/AuthTypes";
10
10
  import { getSessionUser } from "./Auth/utils/getSessionUser";
11
11
  import type { LocalParams } from "./DboBuilder/DboBuilder";
12
+ import type { DbTxTableHandlers } from "./DboBuilder/DboBuilderTypes";
12
13
  import type { TableHandler as TableHandlerServer } from "./DboBuilder/TableHandler/TableHandler";
13
14
  import { canRunSQL } from "./DboBuilder/runSql/runSQL";
14
15
  import type { Prostgles } from "./Prostgles";
@@ -64,6 +65,7 @@ export const runClientRequest = async function (
64
65
  nonValidatedArgs: Args,
65
66
  clientReq: AuthClientRequest,
66
67
  scope: PermissionScope | undefined,
68
+ transactionHandlers?: DbTxTableHandlers,
67
69
  ) {
68
70
  this.checkNotDestroyed();
69
71
  /* Channel name will only include client-sent params so we ignore table_rules enforced params */
@@ -102,7 +104,9 @@ export const runClientRequest = async function (
102
104
  );
103
105
  }
104
106
 
105
- const tableHandler = this.dboBuilder.dboMap.get(tableName);
107
+ const tableHandler = transactionHandlers ?
108
+ (Object.hasOwn(transactionHandlers, tableName) ? transactionHandlers[tableName] : undefined)
109
+ : this.dboBuilder.dboMap.get(tableName);
106
110
  if (!tableHandler) {
107
111
  throw `tableName ${tableName} is invalid or not allowed`;
108
112
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prostgles-server",
3
- "version": "4.2.641",
3
+ "version": "4.2.643",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -11,8 +11,10 @@
11
11
  "prepare": "npm run build",
12
12
  "start": "tsc --watch",
13
13
  "build": "tsc",
14
- "lint": "eslint . --ext .ts --quiet --fix",
15
- "test:lib": "rm -rf ./node_modules/* && rm -rf ./dist/* && npm i && npm run lint && tsc && node --trace-uncaught --test dist/**/*.spec.js",
14
+ "typecheck": "tsc --noEmit && npm run typecheck:tests",
15
+ "typecheck:tests": "tsc --noEmit -p tests/server && tsc --noEmit -p tests/client",
16
+ "lint": "eslint . --ext .ts --quiet",
17
+ "test:lib": "rm -rf ./node_modules/* && rm -rf ./dist/* && npm i && npm run lint -- --ignore-pattern tests && tsc && node --trace-uncaught --test dist/**/*.spec.js",
16
18
  "test-only": "cd tests/ && ./test.sh",
17
19
  "test-quick": "cd tests/ && ./test.sh -quick",
18
20
  "test": "npm run test:lib && npm run test-only",