@opengis/fastify-table 2.0.104 → 2.0.106

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 (41) hide show
  1. package/dist/server/migrations/users.sql +1 -1
  2. package/dist/server/plugins/file/providers/s3/client.d.ts +12 -4
  3. package/dist/server/plugins/file/providers/s3/client.d.ts.map +1 -1
  4. package/dist/server/plugins/file/providers/s3/client.js +21 -15
  5. package/dist/server/plugins/file/providers/s3/funcs/downloadFile.d.ts +1 -1
  6. package/dist/server/plugins/file/providers/s3/funcs/downloadFile.d.ts.map +1 -1
  7. package/dist/server/plugins/file/providers/s3/funcs/downloadFile.js +9 -4
  8. package/dist/server/plugins/file/providers/s3/funcs/fileExists.d.ts +1 -1
  9. package/dist/server/plugins/file/providers/s3/funcs/fileExists.d.ts.map +1 -1
  10. package/dist/server/plugins/file/providers/s3/funcs/fileExists.js +13 -10
  11. package/dist/server/plugins/file/providers/s3/funcs/uploadFile.d.ts +1 -1
  12. package/dist/server/plugins/file/providers/s3/funcs/uploadFile.d.ts.map +1 -1
  13. package/dist/server/plugins/file/providers/s3/funcs/uploadFile.js +4 -4
  14. package/dist/server/plugins/file/providers/s3/funcs/utils/getS3FilePath.d.ts +1 -1
  15. package/dist/server/plugins/file/providers/s3/funcs/utils/getS3FilePath.d.ts.map +1 -1
  16. package/dist/server/plugins/file/providers/s3/funcs/utils/getS3FilePath.js +1 -1
  17. package/dist/server/plugins/file/providers/s3/index.d.ts +1 -1
  18. package/dist/server/plugins/logger/getLogger.d.ts.map +1 -1
  19. package/dist/server/plugins/logger/getLogger.js +4 -2
  20. package/dist/server/plugins/logger/index.d.ts.map +1 -1
  21. package/dist/server/plugins/logger/index.js +27 -0
  22. package/dist/server/plugins/pg/funcs/pool.d.ts.map +1 -1
  23. package/dist/server/plugins/pg/funcs/pool.js +0 -13
  24. package/dist/server/plugins/redis/funcs/getRedis.d.ts +7 -1
  25. package/dist/server/plugins/redis/funcs/getRedis.d.ts.map +1 -1
  26. package/dist/server/plugins/redis/funcs/getRedis.js +19 -4
  27. package/dist/server/plugins/table/funcs/getSelectMeta.d.ts +4 -2
  28. package/dist/server/plugins/table/funcs/getSelectMeta.d.ts.map +1 -1
  29. package/dist/server/plugins/table/funcs/getSelectMeta.js +20 -4
  30. package/dist/server/plugins/table/funcs/metaFormat/getSelectVal.d.ts.map +1 -1
  31. package/dist/server/plugins/table/funcs/metaFormat/getSelectVal.js +8 -1
  32. package/dist/server/routes/table/controllers/suggest.d.ts.map +1 -1
  33. package/dist/server/routes/table/controllers/suggest.js +24 -10
  34. package/dist/server/routes/util/controllers/config.d.ts +2 -0
  35. package/dist/server/routes/util/controllers/config.d.ts.map +1 -0
  36. package/dist/server/routes/util/controllers/config.js +33 -0
  37. package/dist/server/routes/util/index.js +2 -2
  38. package/dist/utils.d.ts +1 -0
  39. package/dist/utils.d.ts.map +1 -1
  40. package/dist/utils.js +1 -0
  41. package/package.json +1 -1
@@ -35,7 +35,7 @@ ALTER TABLE admin.users add CONSTRAINT admin_user_user_rnokpp UNIQUE (user_rnokp
35
35
 
36
36
  -- update admin.users set user_type='regular' where user_type not in ('viewer', 'regular','admin','superadmin');
37
37
  -- ALTER TABLE admin.users add constraint admin_user_type_check CHECK (user_type=any(array['viewer', 'regular','admin','superadmin']));
38
- insert into admin.users (uid,login,password,user_type,enabled)values('viewer','viewer','viewer','viewer', false) on conflict (uid) do update set enabled=excluded.enabled;
38
+ insert into admin.users (uid,login,sur_name,password,user_type,enabled)values('viewer','viewer','viewer','viewer','viewer', false) on conflict (uid) do update set enabled=excluded.enabled, sur_name=excluded.sur_name;
39
39
  -- update admin.users set enabled=true where uid='viewer';
40
40
 
41
41
  COMMENT ON TABLE admin.users IS 'Користувачі';
@@ -1,5 +1,13 @@
1
- declare const _default: {
2
- getS3Client: ({ accessKeyId, secretAccessKey, user, password, endpoint, host, region, }: any) => any;
3
- };
4
- export default _default;
1
+ declare const getS3Client: ({ accessKeyId: accessKeyId1, secretAccessKey: secretAccessKey1, user, password, endpoint: endpoint1, host, region, }?: {
2
+ accessKeyId?: string;
3
+ secretAccessKey?: string;
4
+ user?: string;
5
+ password?: string;
6
+ endpoint?: string;
7
+ host?: string;
8
+ region: string;
9
+ }) => any;
10
+ declare const s3Client: any;
11
+ export { getS3Client, s3Client };
12
+ export default s3Client;
5
13
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../../../server/plugins/file/providers/s3/client.ts"],"names":[],"mappings":";6FAkBG,GAAG;;AAsBN,wBAA+B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../../../server/plugins/file/providers/s3/client.ts"],"names":[],"mappings":"AAQA,QAAA,MAAM,WAAW,GACf,uHAQG;IACD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACE,QA+BpB,CAAC;AAEF,QAAA,MAAM,QAAQ,KAAgB,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAEjC,eAAe,QAAQ,CAAC"}
@@ -1,26 +1,32 @@
1
1
  import { S3Client } from "@aws-sdk/client-s3";
2
2
  import { createHash } from "crypto";
3
- function md5(string) {
4
- return createHash("md5").update(string).digest("hex");
5
- }
3
+ import config from "../.../../../../../../config.js";
6
4
  const CLIENT_CACHE = {};
7
- const getS3Client = ({ accessKeyId, secretAccessKey, user, password, endpoint, host, region = "us-west-2", }) => {
8
- // md5 have a hign chance of collisions consider switching on highload
9
- // if (!accessKeyId || !secretAccessKey || !endpoint) throw new Error('No required params');
10
- const uniqueKey = md5(`${accessKeyId}${secretAccessKey}${endpoint}`);
11
- let client = CLIENT_CACHE[uniqueKey];
12
- if (client)
13
- return client;
14
- client = new S3Client({
5
+ const getS3Client = ({ accessKeyId: accessKeyId1, secretAccessKey: secretAccessKey1, user, password, endpoint: endpoint1, host, region = "us-west-2", } = config.s3 || {}) => {
6
+ const accessKeyId = accessKeyId1 || user;
7
+ const endpoint = endpoint1 || host;
8
+ const secretAccessKey = secretAccessKey1 || password;
9
+ if (!accessKeyId || !secretAccessKey || !endpoint) {
10
+ return null;
11
+ }
12
+ const uniqueKey = createHash("md5")
13
+ .update(`${accessKeyId}${secretAccessKey}${endpoint}`)
14
+ .digest("hex");
15
+ if (CLIENT_CACHE[uniqueKey]) {
16
+ return CLIENT_CACHE[uniqueKey];
17
+ }
18
+ const client = new S3Client({
15
19
  credentials: {
16
- accessKeyId: accessKeyId || user,
17
- secretAccessKey: secretAccessKey || password,
20
+ accessKeyId,
21
+ secretAccessKey,
18
22
  },
19
- endpoint: endpoint || host,
23
+ endpoint,
20
24
  forcePathStyle: true,
21
25
  region,
22
26
  });
23
27
  CLIENT_CACHE[uniqueKey] = client;
24
28
  return client;
25
29
  };
26
- export default { getS3Client };
30
+ const s3Client = getS3Client();
31
+ export { getS3Client, s3Client };
32
+ export default s3Client;
@@ -1,3 +1,3 @@
1
- declare const getFileStream: (s3Settings: Record<string, any>) => (fp: string, options?: Record<string, any>) => Promise<any>;
1
+ declare const getFileStream: (s3Settings?: Record<string, any>) => (fp: string, options?: Record<string, any>) => Promise<any>;
2
2
  export default getFileStream;
3
3
  //# sourceMappingURL=downloadFile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"downloadFile.d.ts","sourceRoot":"","sources":["../../../../../../../server/plugins/file/providers/s3/funcs/downloadFile.ts"],"names":[],"mappings":"AAeA,QAAA,MAAM,aAAa,GAChB,YAAY,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MACzB,IAAI,MAAM,EAAE,UAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,iBAoCnD,CAAC;AAEJ,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"downloadFile.d.ts","sourceRoot":"","sources":["../../../../../../../server/plugins/file/providers/s3/funcs/downloadFile.ts"],"names":[],"mappings":"AAgBA,QAAA,MAAM,aAAa,GAChB,aAAa,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAC1B,IAAI,MAAM,EAAE,UAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,iBA2CnD,CAAC;AAEJ,eAAe,aAAa,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import { GetObjectCommand } from "@aws-sdk/client-s3";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { createReadStream } from "node:fs";
4
- import client from "../client.js";
4
+ import s3Client from "../client.js";
5
+ import config from "../../../../../../config.js";
5
6
  import streamToBuffer from "../../utils/streamToBuffer.js";
6
7
  // if not found on s3 => fs
7
8
  import fsFuncs from "../../fs.js";
@@ -9,11 +10,11 @@ import getPath from "../../../utils/getPath.js";
9
10
  import getS3FilePath from "./utils/getS3FilePath.js";
10
11
  const getFileStream = (s3Settings) => async (fp, options = {}) => {
11
12
  const filepath = getS3FilePath(fp, s3Settings);
12
- const s3Client = client.getS3Client(s3Settings);
13
- const bucketName = s3Settings.containerName;
14
13
  const bucketParams = {
15
- Bucket: bucketName,
14
+ Bucket: (s3Settings || config.s3 || { containerName: "work" })
15
+ .containerName,
16
16
  Key: filepath[0] === "/" ? filepath?.slice(1) : filepath,
17
+ Range: options.Range,
17
18
  };
18
19
  try {
19
20
  const data = await s3Client.send(new GetObjectCommand(bucketParams));
@@ -23,6 +24,10 @@ const getFileStream = (s3Settings) => async (fp, options = {}) => {
23
24
  return data.Body;
24
25
  }
25
26
  catch (err) {
27
+ // disable fs fallback for chunked download from s3
28
+ if (options.fallback === false) {
29
+ return null;
30
+ }
26
31
  const filepath1 = getPath(fp, options);
27
32
  if (!filepath1) {
28
33
  return null;
@@ -1,3 +1,3 @@
1
- declare const getFileMetadata: (s3Settings: any) => (fp: any) => Promise<any>;
1
+ declare const getFileMetadata: (s3Settings?: any) => (fp: any, options?: Record<string, any>) => Promise<any>;
2
2
  export default getFileMetadata;
3
3
  //# sourceMappingURL=fileExists.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileExists.d.ts","sourceRoot":"","sources":["../../../../../../../server/plugins/file/providers/s3/funcs/fileExists.ts"],"names":[],"mappings":"AAYA,QAAA,MAAM,eAAe,GAAI,YAAY,GAAG,MAAY,IAAI,GAAG,iBAiB1D,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"fileExists.d.ts","sourceRoot":"","sources":["../../../../../../../server/plugins/file/providers/s3/funcs/fileExists.ts"],"names":[],"mappings":"AAWA,QAAA,MAAM,eAAe,GAClB,aAAa,GAAG,MACV,IAAI,GAAG,EAAE,UAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,iBAmBhD,CAAC;AAEJ,eAAe,eAAe,CAAC"}
@@ -1,22 +1,25 @@
1
- import { HeadObjectCommand, } from '@aws-sdk/client-s3';
2
- import client from '../client.js';
3
- import getPath from '../../../utils/getPath.js';
4
- import getS3FilePath from './utils/getS3FilePath.js';
1
+ import { HeadObjectCommand } from "@aws-sdk/client-s3";
2
+ import s3Client from "../client.js";
3
+ import config from "../../../../../../config.js";
4
+ import getPath from "../../../utils/getPath.js";
5
+ import getS3FilePath from "./utils/getS3FilePath.js";
5
6
  // if not found on s3 => fs
6
- import isFileExists from '../../../utils/isFileExists.js';
7
- const getFileMetadata = (s3Settings) => async (fp) => {
7
+ import isFileExists from "../../../utils/isFileExists.js";
8
+ const getFileMetadata = (s3Settings) => async (fp, options = {}) => {
8
9
  const filepath = getS3FilePath(fp, s3Settings);
9
- const s3Client = client.getS3Client(s3Settings);
10
- const bucketName = s3Settings.containerName;
11
10
  const bucketParams = {
12
- Bucket: bucketName,
13
- Key: filepath[0] === '/' ? filepath?.slice(1) : filepath,
11
+ Bucket: (s3Settings || config.s3 || { containerName: "work" })
12
+ .containerName,
13
+ Key: filepath[0] === "/" ? filepath?.slice(1) : filepath,
14
14
  };
15
15
  try {
16
16
  const data = await s3Client.send(new HeadObjectCommand(bucketParams));
17
17
  return data;
18
18
  }
19
19
  catch (err) {
20
+ if (options.fallback === false) {
21
+ return false;
22
+ }
20
23
  const filepath1 = getPath(fp);
21
24
  return isFileExists(filepath1);
22
25
  }
@@ -1,3 +1,3 @@
1
- declare const uploadFile: (s3Settings: any) => (fp: any, data: any) => Promise<import("@aws-sdk/client-s3").CompleteMultipartUploadCommandOutput>;
1
+ declare const uploadFile: (s3Settings?: any) => (fp: any, data: any) => Promise<import("@aws-sdk/client-s3").CompleteMultipartUploadCommandOutput>;
2
2
  export default uploadFile;
3
3
  //# sourceMappingURL=uploadFile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"uploadFile.d.ts","sourceRoot":"","sources":["../../../../../../../server/plugins/file/providers/s3/funcs/uploadFile.ts"],"names":[],"mappings":"AAYA,QAAA,MAAM,UAAU,GAAI,YAAY,GAAG,MAAY,IAAI,GAAG,EAAE,MAAM,GAAG,+EAgChE,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"uploadFile.d.ts","sourceRoot":"","sources":["../../../../../../../server/plugins/file/providers/s3/funcs/uploadFile.ts"],"names":[],"mappings":"AAaA,QAAA,MAAM,UAAU,GAAI,aAAa,GAAG,MAAY,IAAI,GAAG,EAAE,MAAM,GAAG,+EA8BjE,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { Upload } from "@aws-sdk/lib-storage";
2
- import client from "../client.js";
2
+ import s3Client from "../client.js";
3
+ import config from "../../../../../../config.js";
3
4
  import getValidData from "../../utils/getValidData.js";
4
5
  import getDataSize from "../../utils/getDataSize.js";
5
6
  import dataTypes from "../../utils/handlers/dataTypes.js";
@@ -11,10 +12,9 @@ const uploadFile = (s3Settings) => async (fp, data) => {
11
12
  const size = await getDataSize({ data });
12
13
  const type = getMimeType(filepath);
13
14
  try {
14
- const s3Client = client.getS3Client(s3Settings);
15
- const bucketName = s3Settings.containerName;
16
15
  const bucketParams = {
17
- Bucket: bucketName,
16
+ Bucket: (s3Settings || config.s3 || { containerName: "work" })
17
+ .containerName,
18
18
  Key: filepath,
19
19
  ContentLength: size,
20
20
  ContentType: type,
@@ -1,3 +1,3 @@
1
- declare function getS3FilePath(fp: any, s3Settings: any): string;
1
+ declare function getS3FilePath(fp: any, s3Settings?: any): string;
2
2
  export default getS3FilePath;
3
3
  //# sourceMappingURL=getS3FilePath.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getS3FilePath.d.ts","sourceRoot":"","sources":["../../../../../../../../server/plugins/file/providers/s3/funcs/utils/getS3FilePath.ts"],"names":[],"mappings":"AAgBA,iBAAS,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,UAQ9C;AAED,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"getS3FilePath.d.ts","sourceRoot":"","sources":["../../../../../../../../server/plugins/file/providers/s3/funcs/utils/getS3FilePath.ts"],"names":[],"mappings":"AAgBA,iBAAS,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,UAAU,MAAY,UAQrD;AAED,eAAe,aAAa,CAAC"}
@@ -7,7 +7,7 @@ function getPath(fp, s3Settings) {
7
7
  }
8
8
  return filepath;
9
9
  }
10
- function getS3FilePath(fp, s3Settings) {
10
+ function getS3FilePath(fp, s3Settings = config.s3) {
11
11
  const filepath = getPath(fp, s3Settings);
12
12
  const unixPath = filepath.replace(/\\/g, "/").split("work/").pop();
13
13
  const prefix = !filepath.includes(config.folder) ? config.folder : "";
@@ -2,6 +2,6 @@ export default function s3Storage(opt: any): {
2
2
  name: string;
3
3
  downloadFile: (fp: string, options?: Record<string, any>) => Promise<any>;
4
4
  uploadFile: (fp: any, data: any) => Promise<import("@aws-sdk/client-s3").CompleteMultipartUploadCommandOutput>;
5
- fileExists: (fp: any) => Promise<any>;
5
+ fileExists: (fp: any, options?: Record<string, any>) => Promise<any>;
6
6
  };
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getLogger.d.ts","sourceRoot":"","sources":["../../../../server/plugins/logger/getLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,UAAU,cAAe,SAAQ,IAAI,CAAC,MAAM;IAC1C,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAClE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5D;AAkDD,QAAA,MAAM,MAAM,EAAE,cAAgD,CAAC;AA4B/D,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"getLogger.d.ts","sourceRoot":"","sources":["../../../../server/plugins/logger/getLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,UAAU,cAAe,SAAQ,IAAI,CAAC,MAAM;IAC1C,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAClE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5D;AAgDD,QAAA,MAAM,MAAM,EAAE,cAAgD,CAAC;AA+B/D,eAAe,MAAM,CAAC"}
@@ -7,7 +7,6 @@ import getHooks from "./getHooks.js";
7
7
  import serializers from "./serializers.js";
8
8
  import timestampWithTimeZone from "./timestampWithTimeZone.js";
9
9
  const isServer = process.argv[2];
10
- const rclient2 = getRedis({ db: 2 });
11
10
  const level = process.env.LOG_LEVEL || "info";
12
11
  console.log(`log level: ${level}`);
13
12
  const targets = [
@@ -49,11 +48,14 @@ if (config.debug) {
49
48
  });
50
49
  }
51
50
  logger.metrics = function metrics(key, val, dbName) {
51
+ const rclient2 = getRedis({ db: 2 });
52
52
  const dbname = dbName || config.pg?.database;
53
53
  if (!dbname && !isServer)
54
54
  return;
55
55
  if (!config.redis)
56
56
  return;
57
- rclient2.hincrby(`${dbname}:system_metrics`, key, val || 1);
57
+ rclient2
58
+ .hincrby(`${dbname}:system_metrics`, key, val || 1)
59
+ .catch((err) => console.warn("logger metrics error", err.toString()));
58
60
  };
59
61
  export default logger;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/plugins/logger/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAM7E,iBAAe,MAAM,CAAC,OAAO,EAAE,eAAe,iBAwC7C;AACD,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/plugins/logger/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAsC7E,iBAAe,MAAM,CAAC,OAAO,EAAE,eAAe,iBAwC7C;AACD,eAAe,MAAM,CAAC"}
@@ -1,6 +1,33 @@
1
1
  import errorMessage from "./errorMessage.js";
2
2
  import logger from "./getLogger.js";
3
3
  import pgClients from "../pg/pgClients.js";
4
+ // avoid process exit with exception on network changes: disconnect from db, internet altogether etc
5
+ process.on("uncaughtException", (err) => {
6
+ if (err.message === "Connection terminated unexpectedly" ||
7
+ err.code === "ECONNRESET") {
8
+ logger.file("pg", { error: err.toString() });
9
+ console.warn("Ignored pg connection drop:", err.toString());
10
+ return;
11
+ }
12
+ throw err; // keep normal behavior
13
+ });
14
+ // avoid process exit with rejection during client connect at process start
15
+ process.on("unhandledRejection", (err) => {
16
+ if ([
17
+ "Client was closed and is not queryable",
18
+ "Connection terminated due to connection timeout",
19
+ ].includes(err.message)) {
20
+ logger.file("pg", { error: err.message });
21
+ console.warn("Ignored pg connection timeout / close:", err.toString());
22
+ return;
23
+ }
24
+ if (err.message === "Connection is closed.") {
25
+ logger.file("redis", { error: err.message });
26
+ console.warn("Ignored redis connection close:", err.toString());
27
+ return;
28
+ }
29
+ throw err;
30
+ });
4
31
  async function plugin(fastify) {
5
32
  fastify.addHook("onResponse", async (req, reply) => {
6
33
  if (reply?.statusCode && reply.statusCode >= 400) {
@@ -1 +1 @@
1
- {"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/pg/funcs/pool.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,CAAC;yBAqB7B,QAAO,GAAQ;AAA/B,wBAsEE"}
1
+ {"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/pg/funcs/pool.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,CAAC;yBAK7B,QAAO,GAAQ;AAA/B,wBAsEE"}
@@ -9,19 +9,6 @@ import config from "../../../../config.js";
9
9
  export const Pools = {};
10
10
  const errored = {};
11
11
  const inited = {};
12
- // avoid process exit with exception on network changes: disconnect from db, internet altogether etc
13
- process.on("uncaughtException", (err) => {
14
- if (err.message === "Connection terminated unexpectedly" ||
15
- err.code === "ECONNRESET") {
16
- logger.file("pg", {
17
- message: "client connection drop",
18
- error: err.toString(),
19
- });
20
- console.warn("Ignored pg connection drop:", err.toString());
21
- return;
22
- }
23
- throw err; // keep normal behavior
24
- });
25
12
  export default (param = {}) => {
26
13
  if (!config.pg)
27
14
  return null;
@@ -1,7 +1,13 @@
1
- declare function getRedis({ db, host, port, }?: {
1
+ declare function getRedis({ db, host, port, closeClient, retryStrategy, enableOfflineQueue, lazyConnect, connectTimeout, maxRetriesPerRequest, }?: {
2
2
  db: number;
3
3
  host?: string;
4
4
  port?: number;
5
+ closeClient?: boolean;
6
+ retryStrategy?: any;
7
+ enableOfflineQueue?: boolean;
8
+ lazyConnect?: boolean;
9
+ connectTimeout?: number;
10
+ maxRetriesPerRequest?: number;
5
11
  }): any;
6
12
  export default getRedis;
7
13
  //# sourceMappingURL=getRedis.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getRedis.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/redis/funcs/getRedis.ts"],"names":[],"mappings":"AAOA,iBAAS,QAAQ,CACf,EACE,EAAE,EACF,IAAI,EACJ,IAAI,GACL,GAAE;IACD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACH,OAsBd;AAED,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"getRedis.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/redis/funcs/getRedis.ts"],"names":[],"mappings":"AAQA,iBAAS,QAAQ,CACf,EACE,EAAE,EACF,IAAI,EACJ,IAAI,EACJ,WAAkB,EAClB,aAAwB,EACxB,kBAAyB,EACzB,WAAkB,EAClB,cAAqB,EACrB,oBAAwB,GACzB,GAAE;IACD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACnB,OAwCd;AAED,eAAe,QAAQ,CAAC"}
@@ -1,9 +1,9 @@
1
- /* eslint-disable no-console */
2
1
  import { Redis } from "ioredis";
3
- // import Redis from 'ioredis';
4
2
  import config from "../../../../config.js";
3
+ import logger from "../../logger/getLogger.js";
5
4
  import redisClients from "./redisClients.js";
6
- function getRedis({ db, host, port, } = { db: 0 }) {
5
+ config.ready = config.ready || {};
6
+ function getRedis({ db, host, port, closeClient = true, retryStrategy = () => { }, enableOfflineQueue = true, lazyConnect = true, connectTimeout = 2000, maxRetriesPerRequest = 0, } = { db: 0 }) {
7
7
  if (!config.redis && !host)
8
8
  return null;
9
9
  const key = host || port ? [host, port, db].join("-") : db;
@@ -16,9 +16,24 @@ function getRedis({ db, host, port, } = { db: 0 }) {
16
16
  host: host || config.redis?.host || "127.0.0.1",
17
17
  port: port || config.redis?.port || 6379, // Redis port
18
18
  family: 4, // 4 (IPv4) or 6 (IPv6)
19
- closeClient: true,
19
+ closeClient,
20
+ retryStrategy,
21
+ enableOfflineQueue,
22
+ lazyConnect,
23
+ connectTimeout,
24
+ maxRetriesPerRequest,
20
25
  };
21
26
  redisClients[key] = new Redis(redisConfig);
27
+ redisClients[key].on("ready", () => {
28
+ config.ready[`redis:${key}`] = true;
29
+ });
30
+ redisClients[key].on("error", (err) => {
31
+ console.warn("Ignored redis error:", err.message);
32
+ logger.file("redis", { error: err.toString() });
33
+ if (err.code === "ETIMEDOUT") {
34
+ // redisClients[key].disconnect();
35
+ }
36
+ });
22
37
  console.log("redis connected", db, host, port);
23
38
  return redisClients[key];
24
39
  }
@@ -1,8 +1,10 @@
1
1
  import type { ExtendedPG } from "../../../types/core.js";
2
- export default function getSelectMeta({ name, pg, nocache, parent, }: {
2
+ export default function getSelectMeta({ name, startsWith, key, nocache, parent, pg, }: {
3
3
  name: string;
4
- pg: ExtendedPG;
4
+ startsWith?: boolean;
5
+ key?: string;
5
6
  nocache?: any;
6
7
  parent?: string;
8
+ pg?: ExtendedPG;
7
9
  }): Promise<any>;
8
10
  //# sourceMappingURL=getSelectMeta.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getSelectMeta.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/table/funcs/getSelectMeta.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAWzD,wBAA8B,aAAa,CAAC,EAC1C,IAAI,EACJ,EAAqB,EACrB,OAAO,EACP,MAAM,GACP,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,UAAU,CAAC;IACf,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,gBAyFA"}
1
+ {"version":3,"file":"getSelectMeta.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/table/funcs/getSelectMeta.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAWzD,wBAA8B,aAAa,CAAC,EAC1C,IAAI,EACJ,UAAU,EACV,GAAG,EACH,OAAO,EACP,MAAM,EACN,EAAqB,GACtB,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,UAAU,CAAC;CACjB,gBA6GA"}
@@ -5,14 +5,21 @@ import pgClients from "../../pg/pgClients.js";
5
5
  import getSelect from "./getSelect.js";
6
6
  const limit = 50;
7
7
  const selectMeta = {};
8
- export default async function getSelectMeta({ name, pg = pgClients.client, nocache, parent, }) {
9
- if (selectMeta[name] && !nocache)
8
+ export default async function getSelectMeta({ name, startsWith, key, nocache, parent, pg = pgClients.client, }) {
9
+ if (selectMeta[name] && !startsWith && !nocache)
10
10
  return selectMeta[name];
11
+ if (selectMeta[name] && startsWith && key && !nocache) {
12
+ const searchQuery = `(${selectMeta[name].searchColumn
13
+ .split(",")
14
+ .map((el) => `left(lower("${el}"),${key.length}) = $1`)
15
+ .join(" or ")})`;
16
+ return { ...selectMeta[name], searchQuery };
17
+ }
11
18
  const cls = await getSelect(name, pg, nocache);
12
19
  const db = typeof cls?.db === "string" ? { database: cls.db } : cls?.db;
13
20
  const pg1 = cls?.db ? getPG(db) : pg;
14
21
  if (!pg1?.pk)
15
- await pg1.init();
22
+ await pg1?.init?.();
16
23
  if (!cls)
17
24
  return null;
18
25
  if (cls.arr)
@@ -52,12 +59,13 @@ export default async function getSelectMeta({ name, pg = pgClients.client, nocac
52
59
  (dataOrigin.fields.find((el) => el.name === "search")
53
60
  ? "search"
54
61
  : dataOrigin1.fields[1].name);
62
+ // by default - search by like %value%
55
63
  const searchQuery = `(${searchColumn
56
64
  .split(",")
57
65
  .map((el) => `lower("${el}") ~ $1 `)
58
66
  .join(" or ")})`;
59
- // console.log(dataOrigin1.fields.map((el) => el.name).join(','));
60
67
  const data = {
68
+ searchColumn,
61
69
  minLength: cls.minLength,
62
70
  limit: cls.limit,
63
71
  type: type.join(","),
@@ -73,5 +81,13 @@ export default async function getSelectMeta({ name, pg = pgClients.client, nocac
73
81
  time: new Date().toISOString(),
74
82
  };
75
83
  selectMeta[name] = data;
84
+ // on demand - search by "start with these characters"
85
+ if (startsWith && key?.length) {
86
+ const searchQuery = `(${selectMeta[name].searchColumn
87
+ .split(",")
88
+ .map((el) => `left(lower("${el}"),${key.length}) = $1`)
89
+ .join(" or ")})`;
90
+ return { ...data, searchQuery };
91
+ }
76
92
  return data;
77
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getSelectVal.d.ts","sourceRoot":"","sources":["../../../../../../server/plugins/table/funcs/metaFormat/getSelectVal.ts"],"names":[],"mappings":"AAaA,wBAA8B,YAAY,CAAC,EACzC,EAAqB,EACrB,IAAI,EACJ,MAAM,EAAE,YAAY,EACpB,EAAU,GACX,EAAE,GAAG,gBAmGL"}
1
+ {"version":3,"file":"getSelectVal.d.ts","sourceRoot":"","sources":["../../../../../../server/plugins/table/funcs/metaFormat/getSelectVal.ts"],"names":[],"mappings":"AAaA,wBAA8B,YAAY,CAAC,EACzC,EAAqB,EACrB,IAAI,EACJ,MAAM,EAAE,YAAY,EACpB,EAAU,GACX,EAAE,GAAG,gBA6GL"}
@@ -32,7 +32,14 @@ export default async function getSelectVal({ pg = pgClients.client, name, values
32
32
  }
33
33
  const id = selectIds[name];
34
34
  // cache
35
- const key = `select:${name}`;
35
+ const table = cls.sql
36
+ ?.toLowerCase?.()
37
+ ?.replace?.(/[\n\r]+/g, " ")
38
+ ?.split?.(" from ")
39
+ ?.filter?.((el) => /^[a-z0-9_]+\.[a-z0-9_]+/.test(el))
40
+ ?.map?.((el) => el.split(/[ )]/)[0])?.[0];
41
+ const crudInc = table && config.redis ? (await rclient.get(`pg:${table}:crud`)) || 0 : 0;
42
+ const key = `select:${name}:${crudInc}`;
36
43
  const cache = values?.length && config.redis && !config.disableCache
37
44
  ? (await rclient.hmget(key, values)).reduce((p, el, i) => ({
38
45
  ...p,
@@ -1 +1 @@
1
- {"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../../../../server/routes/table/controllers/suggest.ts"],"names":[],"mappings":"AAsDA,wBAA8B,OAAO,CAAC,GAAG,EAAE,GAAG,gBAgV7C"}
1
+ {"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../../../../server/routes/table/controllers/suggest.ts"],"names":[],"mappings":"AAoEA,wBAA8B,OAAO,CAAC,GAAG,EAAE,GAAG,gBA6V7C"}
@@ -7,20 +7,22 @@ const headers = {
7
7
  "Access-Control-Allow-Methods": "GET",
8
8
  "Cache-Control": "no-cache",
9
9
  };
10
- async function getTableColumnMeta(tableName, column, filtered, pg) {
11
- if (!tableName || !column) {
10
+ async function getTableColumnMeta({ table, column, filtered, startsWith, key, pg, }) {
11
+ if (!table || !column) {
12
12
  return null;
13
13
  }
14
- const loadTable = await getTemplate("table", tableName);
14
+ const loadTable = await getTemplate("table", table);
15
15
  const { data: clsName } = loadTable?.columns?.find?.((el) => el.name === column) || {};
16
16
  const { arr } = (await getSelect(clsName, pg)) || {};
17
17
  const original = filtered
18
- ? `with c(id,text) as (select ${column} as id, ${column} as text from ${loadTable?.table || tableName} group by ${column}) select id, text from c`
19
- : `with c(id,text) as (select ${column} as id, ${column} as text, count(*) from ${loadTable?.table || tableName} group by ${column} limit ${limit}) select * from c`;
18
+ ? `with c(id,text) as (select ${column} as id, ${column} as text from ${loadTable?.table || table} group by ${column}) select id, text from c`
19
+ : `with c(id,text) as (select ${column} as id, ${column} as text, count(*) from ${loadTable?.table || table} group by ${column} limit ${limit}) select * from c`;
20
20
  return {
21
21
  arr,
22
22
  original,
23
- searchQuery: '(lower("text") ~ $1 )',
23
+ searchQuery: startsWith && key
24
+ ? `(left(lower("text"),${key.length}) = $1 )`
25
+ : '(lower("text") ~ $1 )',
24
26
  pk: "id",
25
27
  };
26
28
  }
@@ -64,12 +66,21 @@ export default async function suggest(req) {
64
66
  return { status: 400, message: "param limit is invalid" };
65
67
  }
66
68
  const meta = tableName && column
67
- ? await getTableColumnMeta(table, column, query?.key || query?.val, pg1)
68
- : await getSelectMeta({
69
+ ? await getTableColumnMeta({
70
+ table,
71
+ column,
72
+ filtered: query?.key || query?.val,
73
+ startsWith: !!query.start,
74
+ key: query.key,
69
75
  pg: pg1,
76
+ })
77
+ : await getSelectMeta({
70
78
  name: selectName,
71
79
  nocache: query?.nocache,
80
+ startsWith: !!query.start,
81
+ key: query.key,
72
82
  parent,
83
+ pg: pg1,
73
84
  });
74
85
  if (meta?.minLength && query.key && query.key.length < meta?.minLength) {
75
86
  return { message: `min length: ${meta.minLength}` };
@@ -183,7 +194,7 @@ export default async function suggest(req) {
183
194
  ? ` ${meta.pk}=any('{${query.val.replace(/'/g, "''")}}')`
184
195
  : "";
185
196
  const where = [search, val, meta.pk ? `${meta.pk} is not null` : null]
186
- .filter((el) => el)
197
+ .filter(Boolean)
187
198
  .join(" and ") || "true";
188
199
  const loadTable = await getTemplate("table", query.token);
189
200
  const tableName1 = hookBody?.table || loadTable?.table || query.token;
@@ -204,7 +215,7 @@ export default async function suggest(req) {
204
215
  return sqlSuggest;
205
216
  }
206
217
  // query
207
- const { rows: dataNew } = await pg.query(sqlSuggest, query.key ? [`${query.key.toLowerCase()}`] : []);
218
+ const { rows: dataNew } = await pg.query(sqlSuggest, query.key ? [query.key.toLowerCase()] : []);
208
219
  // const { rows: dataNew1 } = dataNew.length < limit ? await pg.query(sqlSuggest, query.key ? [`${query.key}`] : []) : {};
209
220
  // const ids = dataNew.map((el) => el.id);
210
221
  const data = dataNew.filter((el) => el.id && el.text);
@@ -223,6 +234,9 @@ export default async function suggest(req) {
223
234
  total: meta.count - 0,
224
235
  mode: type === "cls" ? "array" : "sql",
225
236
  db: meta.db,
237
+ sql: config.local || user?.user_type?.includes?.("admin")
238
+ ? sqlSuggest
239
+ : undefined,
226
240
  data: data.map((el) => ({
227
241
  count: el.count,
228
242
  id: el.id,
@@ -0,0 +1,2 @@
1
+ export default function apiConfig({ user }: any): Promise<any>;
2
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../server/routes/util/controllers/config.ts"],"names":[],"mappings":"AAyBA,wBAA8B,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,gBAOpD"}
@@ -0,0 +1,33 @@
1
+ import config from "../../../../config.js";
2
+ function substringObject(data, substr) {
3
+ if (typeof data === "boolean")
4
+ return data;
5
+ if (!data)
6
+ return "null";
7
+ // array string
8
+ if (typeof data === "string")
9
+ return data.substring(0, substr);
10
+ // array object
11
+ return Object.keys(data).reduce((acc, curr) => {
12
+ if (Array.isArray(data[curr])) {
13
+ return { [curr]: processObject(data[curr], substr) };
14
+ }
15
+ return { ...acc, [curr]: processObject(data[curr], substr) };
16
+ }, {});
17
+ }
18
+ function processObject(obj, substr) {
19
+ // root string
20
+ if (typeof obj === "string")
21
+ return obj.substring(0, substr);
22
+ // root array / object
23
+ return Array.isArray(obj)
24
+ ? obj.map((el) => substringObject(el, substr))
25
+ : substringObject(obj, substr);
26
+ }
27
+ export default async function apiConfig({ user }) {
28
+ if (config.local || (config.debug && user?.user_type?.includes?.("admin"))) {
29
+ return config;
30
+ }
31
+ const reductConfig = processObject(config, 3);
32
+ return reductConfig;
33
+ }
@@ -1,4 +1,4 @@
1
- import config from "../../../config.js";
1
+ import apiConfig from "./controllers/config.js";
2
2
  import nextId from "./controllers/next.id.js";
3
3
  import statusMonitor from "./controllers/status.monitor.js";
4
4
  import userTokens from "./controllers/user.tokens.js";
@@ -12,6 +12,6 @@ function plugin(app, opt = {}) {
12
12
  ...(req.headers || {}),
13
13
  sessionId: req.session?.sessionId,
14
14
  }));
15
- app.get("/config", { config: { role: "admin" } }, () => config);
15
+ app.get("/config", { config: { policy: "L0" /*role: "admin"*/ } }, apiConfig);
16
16
  }
17
17
  export default plugin;
package/dist/utils.d.ts CHANGED
@@ -80,6 +80,7 @@ export { default as getAdminAccess } from "./server/plugins/access/funcs/getAdmi
80
80
  export { default as sendNotification } from "./server/plugins/auth/funcs/sendNotification.js";
81
81
  export { default as addUserNotification } from "./server/plugins/notifications/addNotification.js";
82
82
  export { addUserCls, editUserCls, deleteUserCls, getUserCls, } from "./server/plugins/usercls/index.js";
83
+ export { default as s3Client } from "./server/plugins/file/providers/s3/client.js";
83
84
  declare const _default: null;
84
85
  export default _default;
85
86
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGvE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAGhF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAGvF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,iDAAiD,CAAC;AAC7F,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,iDAAiD,CAAC;AAC7F,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,iDAAiD,CAAC;AAC7F,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,4CAA4C,CAAC;AAGnF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,kDAAkD,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yDAAyD,CAAC;AAClG,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oDAAoD,CAAC;AAC7F,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,+CAA+C,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAGjF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qDAAqD,CAAC;AAChG,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,6CAA6C,CAAC;AAGtF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,2CAA2C,CAAC;AAGhF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAElF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAC1F,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAG5E,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAG5E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAGzE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAEpF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gDAAgD,CAAC;AAEtF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iDAAiD,CAAC;AAExF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAE7E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,gDAAgD,CAAC;AAG5F,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0CAA0C,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AAGhG,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,qDAAqD,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,qDAAqD,CAAC;AAE3F,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iDAAiD,CAAC;AAE5F,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AAE9F,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,mDAAmD,CAAC;AAEnG,OAAO,EACL,UAAU,EACV,WAAW,EACX,aAAa,EACb,UAAU,GACX,MAAM,mCAAmC,CAAC;;AAE3C,wBAAoB"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../utils.ts"],"names":[],"mappings":"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"}
package/dist/utils.js CHANGED
@@ -97,4 +97,5 @@ export { default as getAdminAccess } from "./server/plugins/access/funcs/getAdmi
97
97
  export { default as sendNotification } from "./server/plugins/auth/funcs/sendNotification.js"; // email
98
98
  export { default as addUserNotification } from "./server/plugins/notifications/addNotification.js"; // popup, widget, interface etc.
99
99
  export { addUserCls, editUserCls, deleteUserCls, getUserCls, } from "./server/plugins/usercls/index.js";
100
+ export { default as s3Client } from "./server/plugins/file/providers/s3/client.js";
100
101
  export default null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengis/fastify-table",
3
- "version": "2.0.104",
3
+ "version": "2.0.106",
4
4
  "type": "module",
5
5
  "description": "core-plugins",
6
6
  "keywords": [