directus 9.1.0 → 9.2.1

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 (86) hide show
  1. package/dist/auth/drivers/ldap.js +5 -2
  2. package/dist/auth/drivers/oauth2.d.ts +1 -1
  3. package/dist/auth/drivers/oauth2.js +46 -19
  4. package/dist/auth/drivers/openid.d.ts +1 -1
  5. package/dist/auth/drivers/openid.js +34 -17
  6. package/dist/auth.js +5 -3
  7. package/dist/cli/commands/database/install.js +2 -4
  8. package/dist/cli/commands/schema/apply.js +26 -10
  9. package/dist/controllers/assets.js +0 -27
  10. package/dist/controllers/auth.js +7 -2
  11. package/dist/controllers/extensions.js +1 -1
  12. package/dist/database/{functions/types.d.ts → helpers/date/dialects/mssql.d.ts} +2 -1
  13. package/dist/database/{functions → helpers/date}/dialects/mssql.js +4 -6
  14. package/dist/database/{functions → helpers/date}/dialects/mysql.d.ts +2 -4
  15. package/dist/database/{functions → helpers/date}/dialects/mysql.js +4 -6
  16. package/dist/database/{functions/dialects/mssql.d.ts → helpers/date/dialects/oracle.d.ts} +2 -4
  17. package/dist/database/{functions → helpers/date}/dialects/oracle.js +4 -6
  18. package/dist/database/helpers/date/dialects/postgres.d.ts +12 -0
  19. package/dist/database/{functions → helpers/date}/dialects/postgres.js +4 -6
  20. package/dist/database/{functions → helpers/date}/dialects/sqlite.d.ts +3 -4
  21. package/dist/database/helpers/date/dialects/sqlite.js +35 -0
  22. package/dist/database/helpers/date/index.d.ts +6 -0
  23. package/dist/database/helpers/date/index.js +15 -0
  24. package/dist/database/helpers/date/types.d.ts +13 -0
  25. package/dist/database/helpers/date/types.js +10 -0
  26. package/dist/database/helpers/geometry/dialects/mssql.d.ts +14 -0
  27. package/dist/database/helpers/geometry/dialects/mssql.js +36 -0
  28. package/dist/database/helpers/geometry/dialects/mysql.d.ts +7 -0
  29. package/dist/database/helpers/geometry/dialects/mysql.js +16 -0
  30. package/dist/database/helpers/geometry/dialects/oracle.d.ts +15 -0
  31. package/dist/database/helpers/geometry/dialects/oracle.js +39 -0
  32. package/dist/database/helpers/geometry/dialects/postgres.d.ts +10 -0
  33. package/dist/database/helpers/geometry/dialects/postgres.js +23 -0
  34. package/dist/database/helpers/geometry/dialects/redshift.d.ts +7 -0
  35. package/dist/database/helpers/geometry/dialects/redshift.js +16 -0
  36. package/dist/database/helpers/geometry/dialects/sqlite.d.ts +6 -0
  37. package/dist/database/helpers/geometry/dialects/sqlite.js +14 -0
  38. package/dist/database/helpers/geometry/index.d.ts +6 -0
  39. package/dist/database/helpers/geometry/index.js +15 -0
  40. package/dist/database/helpers/{geometry.d.ts → geometry/types.d.ts} +3 -7
  41. package/dist/database/helpers/geometry/types.js +54 -0
  42. package/dist/database/helpers/index.d.ts +8 -0
  43. package/dist/database/helpers/index.js +33 -0
  44. package/dist/database/helpers/types.d.ts +5 -0
  45. package/dist/database/helpers/types.js +9 -0
  46. package/dist/database/index.js +6 -6
  47. package/dist/database/run-ast.js +5 -5
  48. package/dist/database/seeds/run.js +3 -3
  49. package/dist/database/system-data/fields/notifications.yaml +1 -0
  50. package/dist/env.js +1 -0
  51. package/dist/exceptions/index.d.ts +1 -0
  52. package/dist/exceptions/index.js +1 -0
  53. package/dist/exceptions/invalid-token.d.ts +4 -0
  54. package/dist/exceptions/invalid-token.js +10 -0
  55. package/dist/extensions.js +17 -2
  56. package/dist/middleware/sanitize-query.js +1 -1
  57. package/dist/services/activity.js +7 -2
  58. package/dist/services/assets.js +14 -0
  59. package/dist/services/fields.d.ts +2 -0
  60. package/dist/services/fields.js +57 -26
  61. package/dist/services/files.d.ts +1 -1
  62. package/dist/services/files.js +13 -11
  63. package/dist/services/graphql.js +3 -0
  64. package/dist/services/items.js +18 -29
  65. package/dist/services/payload.d.ts +2 -0
  66. package/dist/services/payload.js +3 -3
  67. package/dist/utils/apply-query.js +9 -12
  68. package/dist/utils/apply-snapshot.js +27 -28
  69. package/dist/utils/get-column.js +2 -2
  70. package/dist/utils/get-default-index-name.js +2 -2
  71. package/dist/utils/get-local-type.js +1 -12
  72. package/dist/utils/sanitize-query.js +1 -12
  73. package/dist/utils/validate-query.js +1 -1
  74. package/dist/webhooks.js +16 -24
  75. package/package.json +15 -15
  76. package/dist/database/functions/dialects/oracle.d.ts +0 -14
  77. package/dist/database/functions/dialects/postgres.d.ts +0 -14
  78. package/dist/database/functions/dialects/sqlite.js +0 -33
  79. package/dist/database/functions/index.d.ts +0 -3
  80. package/dist/database/functions/index.js +0 -26
  81. package/dist/database/functions/types.js +0 -2
  82. package/dist/database/helpers/date.d.ts +0 -8
  83. package/dist/database/helpers/date.js +0 -44
  84. package/dist/database/helpers/geometry.js +0 -189
  85. package/dist/utils/get-simple-hash.d.ts +0 -5
  86. package/dist/utils/get-simple-hash.js +0 -15
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getDefaultIndexName = void 0;
4
- const get_simple_hash_1 = require("./get-simple-hash");
4
+ const utils_1 = require("@directus/shared/utils");
5
5
  /**
6
6
  * Generate an index name for a given collection + fields combination.
7
7
  *
@@ -18,7 +18,7 @@ function getDefaultIndexName(type, collection, fields) {
18
18
  const indexName = (table + '_' + fields.join('_') + '_' + type).toLowerCase();
19
19
  if (indexName.length <= 60)
20
20
  return indexName;
21
- const suffix = `__${(0, get_simple_hash_1.simpleHash)(indexName)}_${type}`;
21
+ const suffix = `__${(0, utils_1.getSimpleHash)(indexName)}_${type}`;
22
22
  const prefix = indexName.substring(0, 60 - suffix.length);
23
23
  return `${prefix}${suffix}`;
24
24
  }
@@ -1,10 +1,5 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const database_1 = require("../database");
7
- const database_2 = __importDefault(require("../database"));
8
3
  const localTypeMap = {
9
4
  // Shared
10
5
  boolean: 'boolean',
@@ -100,8 +95,6 @@ const localTypeMap = {
100
95
  integerfirst: 'integer',
101
96
  };
102
97
  function getLocalType(column, field) {
103
- const database = (0, database_2.default)();
104
- const databaseClient = (0, database_1.getDatabaseClient)(database);
105
98
  if (!column)
106
99
  return 'alias';
107
100
  const dataType = column.data_type.toLowerCase();
@@ -125,13 +118,9 @@ function getLocalType(column, field) {
125
118
  return 'decimal';
126
119
  }
127
120
  /** Handle MS SQL varchar(MAX) (eg TEXT) types */
128
- if (dataType === 'nvarchar(MAX)') {
121
+ if (column.data_type === 'nvarchar' && column.max_length === -1) {
129
122
  return 'text';
130
123
  }
131
- /** Handle Boolean as TINYINT and edgecase MySQL where it still is just tinyint */
132
- if (databaseClient === 'mysql' && dataType === 'tinyint(1)') {
133
- return 'boolean';
134
- }
135
124
  return type !== null && type !== void 0 ? type : 'unknown';
136
125
  }
137
126
  exports.default = getLocalType;
@@ -106,17 +106,6 @@ function sanitizeFilter(rawFilter, accountability) {
106
106
  logger_1.default.warn('Invalid value passed for filter query parameter.');
107
107
  }
108
108
  }
109
- filters = (0, utils_1.deepMap)(filters, (val) => {
110
- try {
111
- const parsed = JSON.parse(val);
112
- if (typeof parsed == 'number' && !Number.isSafeInteger(parsed))
113
- return val;
114
- return parsed;
115
- }
116
- catch {
117
- return val;
118
- }
119
- });
120
109
  return (0, utils_1.parseFilter)(filters, accountability);
121
110
  }
122
111
  function sanitizeLimit(rawLimit) {
@@ -167,7 +156,7 @@ function sanitizeDeep(deep, accountability) {
167
156
  const [parsedKey, parsedValue] = Object.entries(parsedSubQuery)[0];
168
157
  parsedLevel[`_${parsedKey}`] = parsedValue;
169
158
  }
170
- else {
159
+ else if ((0, lodash_1.isPlainObject)(value)) {
171
160
  parse(value, [...path, key]);
172
161
  }
173
162
  }
@@ -100,7 +100,7 @@ function validateFilterPrimitive(value, key) {
100
100
  false) {
101
101
  throw new exceptions_1.InvalidQueryException(`The filter value for "${key}" has to be a string, number, or boolean`);
102
102
  }
103
- if (typeof value === 'number' && Number.isNaN(value)) {
103
+ if (typeof value === 'number' && (Number.isNaN(value) || !Number.isSafeInteger(value))) {
104
104
  throw new exceptions_1.InvalidQueryException(`The filter value for "${key}" is not a valid number`);
105
105
  }
106
106
  if (typeof value === 'string' && value.length === 0) {
package/dist/webhooks.js CHANGED
@@ -8,7 +8,6 @@ const axios_1 = __importDefault(require("axios"));
8
8
  const database_1 = __importDefault(require("./database"));
9
9
  const emitter_1 = __importDefault(require("./emitter"));
10
10
  const logger_1 = __importDefault(require("./logger"));
11
- const lodash_1 = require("lodash");
12
11
  const services_1 = require("./services");
13
12
  const get_schema_1 = require("./utils/get-schema");
14
13
  let registered = [];
@@ -17,20 +16,12 @@ async function register() {
17
16
  const webhookService = new services_1.WebhooksService({ knex: (0, database_1.default)(), schema: await (0, get_schema_1.getSchema)() });
18
17
  const webhooks = await webhookService.readByQuery({ filter: { status: { _eq: 'active' } } });
19
18
  for (const webhook of webhooks) {
20
- if (webhook.actions.includes('*')) {
21
- const event = 'items.*';
22
- const handler = createHandler(webhook);
19
+ for (const action of webhook.actions) {
20
+ const event = `items.${action}`;
21
+ const handler = createHandler(webhook, event);
23
22
  emitter_1.default.onAction(event, handler);
24
23
  registered.push({ event, handler });
25
24
  }
26
- else {
27
- for (const action of webhook.actions) {
28
- const event = `items.${action}`;
29
- const handler = createHandler(webhook);
30
- emitter_1.default.onAction(event, handler);
31
- registered.push({ event, handler });
32
- }
33
- }
34
25
  }
35
26
  }
36
27
  exports.register = register;
@@ -41,19 +32,20 @@ function unregister() {
41
32
  registered = [];
42
33
  }
43
34
  exports.unregister = unregister;
44
- function createHandler(webhook) {
45
- return async (data) => {
46
- if (webhook.collections.includes('*') === false && webhook.collections.includes(data.collection) === false)
35
+ function createHandler(webhook, event) {
36
+ return async (meta, context) => {
37
+ if (webhook.collections.includes(meta.collection) === false)
47
38
  return;
48
- const webhookPayload = (0, lodash_1.pick)(data, [
49
- 'event',
50
- 'accountability.user',
51
- 'accountability.role',
52
- 'collection',
53
- 'item',
54
- 'action',
55
- 'payload',
56
- ]);
39
+ const webhookPayload = {
40
+ event,
41
+ accountability: context.accountability
42
+ ? {
43
+ user: context.accountability.user,
44
+ role: context.accountability.role,
45
+ }
46
+ : null,
47
+ ...meta,
48
+ };
57
49
  try {
58
50
  await (0, axios_1.default)({
59
51
  url: webhook.url,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "directus",
3
- "version": "9.1.0",
3
+ "version": "9.2.1",
4
4
  "license": "GPL-3.0-only",
5
5
  "homepage": "https://github.com/directus/directus#readme",
6
6
  "description": "Directus is a real-time API and App dashboard for managing SQL database content.",
@@ -76,16 +76,16 @@
76
76
  ],
77
77
  "dependencies": {
78
78
  "@aws-sdk/client-ses": "^3.40.0",
79
- "@directus/app": "9.1.0",
80
- "@directus/drive": "9.1.0",
81
- "@directus/drive-azure": "9.1.0",
82
- "@directus/drive-gcs": "9.1.0",
83
- "@directus/drive-s3": "9.1.0",
84
- "@directus/extensions-sdk": "9.1.0",
85
- "@directus/format-title": "9.1.0",
86
- "@directus/schema": "9.1.0",
87
- "@directus/shared": "9.1.0",
88
- "@directus/specs": "9.1.0",
79
+ "@directus/app": "9.2.1",
80
+ "@directus/drive": "9.2.1",
81
+ "@directus/drive-azure": "9.2.1",
82
+ "@directus/drive-gcs": "9.2.1",
83
+ "@directus/drive-s3": "9.2.1",
84
+ "@directus/extensions-sdk": "9.2.1",
85
+ "@directus/format-title": "9.2.1",
86
+ "@directus/schema": "9.2.1",
87
+ "@directus/shared": "9.2.1",
88
+ "@directus/specs": "9.2.1",
89
89
  "@godaddy/terminus": "^4.9.0",
90
90
  "@rollup/plugin-alias": "^3.1.2",
91
91
  "@rollup/plugin-virtual": "^2.0.3",
@@ -122,7 +122,7 @@
122
122
  "jsonwebtoken": "^8.5.1",
123
123
  "keyv": "^4.0.3",
124
124
  "knex": "^0.95.11",
125
- "knex-schema-inspector": "1.6.4",
125
+ "knex-schema-inspector": "1.6.6",
126
126
  "ldapjs": "^2.3.1",
127
127
  "liquidjs": "^9.25.0",
128
128
  "lodash": "^4.17.21",
@@ -146,6 +146,7 @@
146
146
  "rate-limiter-flexible": "^2.2.2",
147
147
  "resolve-cwd": "^3.0.0",
148
148
  "rollup": "^2.52.1",
149
+ "sanitize-html": "^2.6.0",
149
150
  "sharp": "^0.29.0",
150
151
  "stream-json": "^1.7.1",
151
152
  "supertest": "^6.1.6",
@@ -168,7 +169,7 @@
168
169
  "sqlite3": "^5.0.2",
169
170
  "tedious": "^13.0.0"
170
171
  },
171
- "gitHead": "7a1c534b36714a721b9f9df52d51f7f74ef1dada",
172
+ "gitHead": "1d4e9c425c10bcdc5831ae63c1bd03649648eb5e",
172
173
  "devDependencies": {
173
174
  "@types/async": "3.2.10",
174
175
  "@types/atob": "2.1.2",
@@ -198,7 +199,7 @@
198
199
  "@types/nodemailer": "6.4.4",
199
200
  "@types/object-hash": "2.2.1",
200
201
  "@types/qs": "6.9.7",
201
- "@types/sanitize-html": "^2.5.0",
202
+ "@types/sanitize-html": "2.5.0",
202
203
  "@types/sharp": "0.29.4",
203
204
  "@types/stream-json": "1.7.1",
204
205
  "@types/supertest": "2.0.11",
@@ -208,7 +209,6 @@
208
209
  "copyfiles": "2.4.1",
209
210
  "cross-env": "7.0.3",
210
211
  "jest": "27.3.1",
211
- "sanitize-html": "^2.5.3",
212
212
  "ts-jest": "27.0.7",
213
213
  "ts-node-dev": "1.1.8",
214
214
  "typescript": "4.5.2"
@@ -1,14 +0,0 @@
1
- import { Knex } from 'knex';
2
- import { HelperFn } from '../types';
3
- export declare class HelperOracle implements HelperFn {
4
- private knex;
5
- constructor(knex: Knex);
6
- year(table: string, column: string): Knex.Raw;
7
- month(table: string, column: string): Knex.Raw;
8
- week(table: string, column: string): Knex.Raw;
9
- day(table: string, column: string): Knex.Raw;
10
- weekday(table: string, column: string): Knex.Raw;
11
- hour(table: string, column: string): Knex.Raw;
12
- minute(table: string, column: string): Knex.Raw;
13
- second(table: string, column: string): Knex.Raw;
14
- }
@@ -1,14 +0,0 @@
1
- import { Knex } from 'knex';
2
- import { HelperFn } from '../types';
3
- export declare class HelperPostgres implements HelperFn {
4
- private knex;
5
- constructor(knex: Knex);
6
- year(table: string, column: string): Knex.Raw;
7
- month(table: string, column: string): Knex.Raw;
8
- week(table: string, column: string): Knex.Raw;
9
- day(table: string, column: string): Knex.Raw;
10
- weekday(table: string, column: string): Knex.Raw;
11
- hour(table: string, column: string): Knex.Raw;
12
- minute(table: string, column: string): Knex.Raw;
13
- second(table: string, column: string): Knex.Raw;
14
- }
@@ -1,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HelperSQLite = void 0;
4
- class HelperSQLite {
5
- constructor(knex) {
6
- this.knex = knex;
7
- }
8
- year(table, column) {
9
- return this.knex.raw("strftime('%Y', ??.??)", [table, column]);
10
- }
11
- month(table, column) {
12
- return this.knex.raw("strftime('%m', ??.??)", [table, column]);
13
- }
14
- week(table, column) {
15
- return this.knex.raw("strftime('%W', ??.??)", [table, column]);
16
- }
17
- day(table, column) {
18
- return this.knex.raw("strftime('%d', ??.??)", [table, column]);
19
- }
20
- weekday(table, column) {
21
- return this.knex.raw("strftime('%w', ??.??)", [table, column]);
22
- }
23
- hour(table, column) {
24
- return this.knex.raw("strftime('%H', ??.??)", [table, column]);
25
- }
26
- minute(table, column) {
27
- return this.knex.raw("strftime('%M', ??.??)", [table, column]);
28
- }
29
- second(table, column) {
30
- return this.knex.raw("strftime('%S', ??.??)", [table, column]);
31
- }
32
- }
33
- exports.HelperSQLite = HelperSQLite;
@@ -1,3 +0,0 @@
1
- import { Knex } from 'knex';
2
- import { HelperFn } from './types';
3
- export declare function FunctionsHelper(knex: Knex): HelperFn;
@@ -1,26 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FunctionsHelper = void 0;
4
- const postgres_1 = require("./dialects/postgres");
5
- const mysql_1 = require("./dialects/mysql");
6
- const mssql_1 = require("./dialects/mssql");
7
- const sqlite_1 = require("./dialects/sqlite");
8
- const oracle_1 = require("./dialects/oracle");
9
- function FunctionsHelper(knex) {
10
- switch (knex.client.constructor.name) {
11
- case 'Client_MySQL':
12
- return new mysql_1.HelperMySQL(knex);
13
- case 'Client_PG':
14
- return new postgres_1.HelperPostgres(knex);
15
- case 'Client_SQLite3':
16
- return new sqlite_1.HelperSQLite(knex);
17
- case 'Client_Oracledb':
18
- case 'Client_Oracle':
19
- return new oracle_1.HelperOracle(knex);
20
- case 'Client_MSSQL':
21
- return new mssql_1.HelperMSSQL(knex);
22
- default:
23
- throw Error('Unsupported driver used: ' + knex.client.constructor.name);
24
- }
25
- }
26
- exports.FunctionsHelper = FunctionsHelper;
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,8 +0,0 @@
1
- import { Knex } from 'knex';
2
- export declare function getDateHelper(): KnexDate;
3
- declare class KnexDate {
4
- protected knex: Knex;
5
- constructor(knex: Knex);
6
- parseDate(date: string): string;
7
- }
8
- export {};
@@ -1,44 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getDateHelper = void 0;
7
- const __1 = __importDefault(require(".."));
8
- let dateHelper;
9
- function getDateHelper() {
10
- if (!dateHelper) {
11
- const db = (0, __1.default)();
12
- const client = db.client.config.client;
13
- const constructor = {
14
- mysql: KnexDate,
15
- mariadb: KnexDate,
16
- sqlite3: KnexDate_SQLITE,
17
- pg: KnexDate,
18
- postgres: KnexDate,
19
- redshift: KnexDate,
20
- mssql: KnexDate,
21
- oracledb: KnexDate,
22
- }[client];
23
- if (!constructor) {
24
- throw new Error(`Geometry helper not implemented on ${client}.`);
25
- }
26
- dateHelper = new constructor(db);
27
- }
28
- return dateHelper;
29
- }
30
- exports.getDateHelper = getDateHelper;
31
- class KnexDate {
32
- constructor(knex) {
33
- this.knex = knex;
34
- }
35
- parseDate(date) {
36
- return date;
37
- }
38
- }
39
- class KnexDate_SQLITE extends KnexDate {
40
- parseDate(date) {
41
- const newDate = new Date(date);
42
- return (newDate.getTime() - newDate.getTimezoneOffset() * 60 * 1000).toString();
43
- }
44
- }
@@ -1,189 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getGeometryHelper = void 0;
7
- const wellknown_1 = require("wellknown");
8
- const __1 = require("..");
9
- const __2 = __importDefault(require(".."));
10
- let geometryHelper;
11
- function getGeometryHelper(database) {
12
- if (!geometryHelper) {
13
- database = database !== null && database !== void 0 ? database : (0, __2.default)();
14
- const client = (0, __1.getDatabaseClient)(database);
15
- const constructor = {
16
- mysql: KnexSpatial_MySQL,
17
- sqlite: KnexSpatial_SQLite,
18
- postgres: KnexSpatial_PG,
19
- redshift: KnexSpatial_Redshift,
20
- mssql: KnexSpatial_MSSQL,
21
- oracle: KnexSpatial_Oracle,
22
- }[client];
23
- if (!constructor) {
24
- throw new Error(`Geometry helper not implemented on ${client}.`);
25
- }
26
- geometryHelper = new constructor(database);
27
- }
28
- return geometryHelper;
29
- }
30
- exports.getGeometryHelper = getGeometryHelper;
31
- class KnexSpatial {
32
- constructor(knex) {
33
- this.knex = knex;
34
- }
35
- supported() {
36
- return true;
37
- }
38
- isTrue(expression) {
39
- return expression;
40
- }
41
- isFalse(expression) {
42
- return expression.wrap('NOT ', '');
43
- }
44
- createColumn(table, field) {
45
- var _a;
46
- const type = (_a = field.type.split('.')[1]) !== null && _a !== void 0 ? _a : 'geometry';
47
- return table.specificType(field.field, type);
48
- }
49
- asText(table, column) {
50
- return this.knex.raw('st_astext(??.??) as ??', [table, column, column]);
51
- }
52
- asGeoJSON(table, column) {
53
- return this.knex.raw('st_asgeojson(??.??) as ??', [table, column, column]);
54
- }
55
- fromText(text) {
56
- return this.knex.raw('st_geomfromtext(?, 4326)', text);
57
- }
58
- fromGeoJSON(geojson) {
59
- return this.fromText((0, wellknown_1.stringify)(geojson));
60
- }
61
- _intersects(key, geojson) {
62
- const geometry = this.fromGeoJSON(geojson);
63
- return this.knex.raw('st_intersects(??, ?)', [key, geometry]);
64
- }
65
- intersects(key, geojson) {
66
- return this.isTrue(this._intersects(key, geojson));
67
- }
68
- nintersects(key, geojson) {
69
- return this.isFalse(this._intersects(key, geojson));
70
- }
71
- _intersects_bbox(key, geojson) {
72
- const geometry = this.fromGeoJSON(geojson);
73
- return this.knex.raw('st_intersects(??, ?)', [key, geometry]);
74
- }
75
- intersects_bbox(key, geojson) {
76
- return this.isTrue(this._intersects_bbox(key, geojson));
77
- }
78
- nintersects_bbox(key, geojson) {
79
- return this.isFalse(this._intersects_bbox(key, geojson));
80
- }
81
- collect(table, column) {
82
- return this.knex.raw('st_astext(st_collect(??.??))', [table, column]);
83
- }
84
- }
85
- class KnexSpatial_SQLite extends KnexSpatial {
86
- async supported() {
87
- const res = await this.knex.select('name').from('pragma_function_list').where({ name: 'spatialite_version' });
88
- return res.length > 0;
89
- }
90
- asGeoJSON(table, column) {
91
- return this.knex.raw('asgeojson(??.??) as ??', [table, column, column]);
92
- }
93
- }
94
- class KnexSpatial_PG extends KnexSpatial {
95
- async supported() {
96
- const res = await this.knex.select('oid').from('pg_proc').where({ proname: 'postgis_version' });
97
- return res.length > 0;
98
- }
99
- createColumn(table, field) {
100
- var _a;
101
- const type = (_a = field.type.split('.')[1]) !== null && _a !== void 0 ? _a : 'geometry';
102
- return table.specificType(field.field, `geometry(${type}, 4326)`);
103
- }
104
- _intersects_bbox(key, geojson) {
105
- const geometry = this.fromGeoJSON(geojson);
106
- return this.knex.raw('?? && ?', [key, geometry]);
107
- }
108
- }
109
- class KnexSpatial_MySQL extends KnexSpatial {
110
- collect(table, column) {
111
- return this.knex.raw(`concat('geometrycollection(', group_concat(? separator ', '), ')'`, this.asText(table, column));
112
- }
113
- fromText(text) {
114
- return this.knex.raw('st_geomfromtext(?)', text);
115
- }
116
- }
117
- class KnexSpatial_Redshift extends KnexSpatial {
118
- createColumn(table, field) {
119
- if (field.type.split('.')[1]) {
120
- field.meta.special = [field.type];
121
- }
122
- return table.specificType(field.field, 'geometry');
123
- }
124
- }
125
- class KnexSpatial_MSSQL extends KnexSpatial {
126
- isTrue(expression) {
127
- return expression.wrap(``, ` = 1`);
128
- }
129
- isFalse(expression) {
130
- return expression.wrap(``, ` = 0`);
131
- }
132
- createColumn(table, field) {
133
- if (field.type.split('.')[1]) {
134
- field.meta.special = [field.type];
135
- }
136
- return table.specificType(field.field, 'geometry');
137
- }
138
- asText(table, column) {
139
- return this.knex.raw('??.??.STAsText() as ??', [table, column, column]);
140
- }
141
- fromText(text) {
142
- return this.knex.raw('geometry::STGeomFromText(?, 4326)', text);
143
- }
144
- _intersects(key, geojson) {
145
- const geometry = this.fromGeoJSON(geojson);
146
- return this.knex.raw('??.STIntersects(?)', [key, geometry]);
147
- }
148
- _intersects_bbox(key, geojson) {
149
- const geometry = this.fromGeoJSON(geojson);
150
- return this.knex.raw('??.STEnvelope().STIntersects(?.STEnvelope())', [key, geometry]);
151
- }
152
- collect(table, column) {
153
- return this.knex.raw('geometry::CollectionAggregate(??.??).STAsText()', [table, column]);
154
- }
155
- }
156
- class KnexSpatial_Oracle extends KnexSpatial {
157
- isTrue(expression) {
158
- return expression.wrap(``, ` = 'TRUE'`);
159
- }
160
- isFalse(expression) {
161
- return expression.wrap(``, ` = 'FALSE'`);
162
- }
163
- createColumn(table, field) {
164
- if (field.type.split('.')[1]) {
165
- field.meta.special = [field.type];
166
- }
167
- return table.specificType(field.field, 'sdo_geometry');
168
- }
169
- asText(table, column) {
170
- return this.knex.raw('sdo_util.to_wktgeometry(??.??) as ??', [table, column, column]);
171
- }
172
- asGeoJSON(table, column) {
173
- return this.knex.raw('sdo_util.to_geojson(??.??) as ??', [table, column, column]);
174
- }
175
- fromText(text) {
176
- return this.knex.raw('sdo_geometry(?, 4326)', text);
177
- }
178
- _intersects(key, geojson) {
179
- const geometry = this.fromGeoJSON(geojson);
180
- return this.knex.raw(`sdo_overlapbdyintersect(??, ?)`, [key, geometry]);
181
- }
182
- _intersects_bbox(key, geojson) {
183
- const geometry = this.fromGeoJSON(geojson);
184
- return this.knex.raw(`sdo_overlapbdyintersect(sdo_geom.sdo_mbr(??), sdo_geom.sdo_mbr(?))`, [key, geometry]);
185
- }
186
- collect(table, column) {
187
- return this.knex.raw(`concat('geometrycollection(', listagg(?, ', '), ')'`, this.asText(table, column));
188
- }
189
- }
@@ -1,5 +0,0 @@
1
- /**
2
- * Generate a simple short hash for a given string
3
- * This is not cryptographically secure in any way, and has a high chance of collision
4
- */
5
- export declare function simpleHash(str: string): string;
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.simpleHash = void 0;
4
- /**
5
- * Generate a simple short hash for a given string
6
- * This is not cryptographically secure in any way, and has a high chance of collision
7
- */
8
- function simpleHash(str) {
9
- let hash = 0;
10
- for (let i = 0; i < str.length; hash &= hash) {
11
- hash = 31 * hash + str.charCodeAt(i++);
12
- }
13
- return Math.abs(hash).toString(16);
14
- }
15
- exports.simpleHash = simpleHash;