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.
- package/dist/auth/drivers/ldap.js +5 -2
- package/dist/auth/drivers/oauth2.d.ts +1 -1
- package/dist/auth/drivers/oauth2.js +46 -19
- package/dist/auth/drivers/openid.d.ts +1 -1
- package/dist/auth/drivers/openid.js +34 -17
- package/dist/auth.js +5 -3
- package/dist/cli/commands/database/install.js +2 -4
- package/dist/cli/commands/schema/apply.js +26 -10
- package/dist/controllers/assets.js +0 -27
- package/dist/controllers/auth.js +7 -2
- package/dist/controllers/extensions.js +1 -1
- package/dist/database/{functions/types.d.ts → helpers/date/dialects/mssql.d.ts} +2 -1
- package/dist/database/{functions → helpers/date}/dialects/mssql.js +4 -6
- package/dist/database/{functions → helpers/date}/dialects/mysql.d.ts +2 -4
- package/dist/database/{functions → helpers/date}/dialects/mysql.js +4 -6
- package/dist/database/{functions/dialects/mssql.d.ts → helpers/date/dialects/oracle.d.ts} +2 -4
- package/dist/database/{functions → helpers/date}/dialects/oracle.js +4 -6
- package/dist/database/helpers/date/dialects/postgres.d.ts +12 -0
- package/dist/database/{functions → helpers/date}/dialects/postgres.js +4 -6
- package/dist/database/{functions → helpers/date}/dialects/sqlite.d.ts +3 -4
- package/dist/database/helpers/date/dialects/sqlite.js +35 -0
- package/dist/database/helpers/date/index.d.ts +6 -0
- package/dist/database/helpers/date/index.js +15 -0
- package/dist/database/helpers/date/types.d.ts +13 -0
- package/dist/database/helpers/date/types.js +10 -0
- package/dist/database/helpers/geometry/dialects/mssql.d.ts +14 -0
- package/dist/database/helpers/geometry/dialects/mssql.js +36 -0
- package/dist/database/helpers/geometry/dialects/mysql.d.ts +7 -0
- package/dist/database/helpers/geometry/dialects/mysql.js +16 -0
- package/dist/database/helpers/geometry/dialects/oracle.d.ts +15 -0
- package/dist/database/helpers/geometry/dialects/oracle.js +39 -0
- package/dist/database/helpers/geometry/dialects/postgres.d.ts +10 -0
- package/dist/database/helpers/geometry/dialects/postgres.js +23 -0
- package/dist/database/helpers/geometry/dialects/redshift.d.ts +7 -0
- package/dist/database/helpers/geometry/dialects/redshift.js +16 -0
- package/dist/database/helpers/geometry/dialects/sqlite.d.ts +6 -0
- package/dist/database/helpers/geometry/dialects/sqlite.js +14 -0
- package/dist/database/helpers/geometry/index.d.ts +6 -0
- package/dist/database/helpers/geometry/index.js +15 -0
- package/dist/database/helpers/{geometry.d.ts → geometry/types.d.ts} +3 -7
- package/dist/database/helpers/geometry/types.js +54 -0
- package/dist/database/helpers/index.d.ts +8 -0
- package/dist/database/helpers/index.js +33 -0
- package/dist/database/helpers/types.d.ts +5 -0
- package/dist/database/helpers/types.js +9 -0
- package/dist/database/index.js +6 -6
- package/dist/database/run-ast.js +5 -5
- package/dist/database/seeds/run.js +3 -3
- package/dist/database/system-data/fields/notifications.yaml +1 -0
- package/dist/env.js +1 -0
- package/dist/exceptions/index.d.ts +1 -0
- package/dist/exceptions/index.js +1 -0
- package/dist/exceptions/invalid-token.d.ts +4 -0
- package/dist/exceptions/invalid-token.js +10 -0
- package/dist/extensions.js +17 -2
- package/dist/middleware/sanitize-query.js +1 -1
- package/dist/services/activity.js +7 -2
- package/dist/services/assets.js +14 -0
- package/dist/services/fields.d.ts +2 -0
- package/dist/services/fields.js +57 -26
- package/dist/services/files.d.ts +1 -1
- package/dist/services/files.js +13 -11
- package/dist/services/graphql.js +3 -0
- package/dist/services/items.js +18 -29
- package/dist/services/payload.d.ts +2 -0
- package/dist/services/payload.js +3 -3
- package/dist/utils/apply-query.js +9 -12
- package/dist/utils/apply-snapshot.js +27 -28
- package/dist/utils/get-column.js +2 -2
- package/dist/utils/get-default-index-name.js +2 -2
- package/dist/utils/get-local-type.js +1 -12
- package/dist/utils/sanitize-query.js +1 -12
- package/dist/utils/validate-query.js +1 -1
- package/dist/webhooks.js +16 -24
- package/package.json +15 -15
- package/dist/database/functions/dialects/oracle.d.ts +0 -14
- package/dist/database/functions/dialects/postgres.d.ts +0 -14
- package/dist/database/functions/dialects/sqlite.js +0 -33
- package/dist/database/functions/index.d.ts +0 -3
- package/dist/database/functions/index.js +0 -26
- package/dist/database/functions/types.js +0 -2
- package/dist/database/helpers/date.d.ts +0 -8
- package/dist/database/helpers/date.js +0 -44
- package/dist/database/helpers/geometry.js +0 -189
- package/dist/utils/get-simple-hash.d.ts +0 -5
- package/dist/utils/get-simple-hash.js +0 -15
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
this.knex = knex;
|
|
7
|
-
}
|
|
3
|
+
exports.DateHelperPostgres = void 0;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
class DateHelperPostgres extends types_1.DateHelper {
|
|
8
6
|
year(table, column) {
|
|
9
7
|
return this.knex.raw('EXTRACT(YEAR FROM ??.??)', [table, column]);
|
|
10
8
|
}
|
|
@@ -30,4 +28,4 @@ class HelperPostgres {
|
|
|
30
28
|
return this.knex.raw('EXTRACT(SECOND FROM ??.??)', [table, column]);
|
|
31
29
|
}
|
|
32
30
|
}
|
|
33
|
-
exports.
|
|
31
|
+
exports.DateHelperPostgres = DateHelperPostgres;
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
+
import { DateHelper } from '../types';
|
|
1
2
|
import { Knex } from 'knex';
|
|
2
|
-
|
|
3
|
-
export declare class HelperSQLite implements HelperFn {
|
|
4
|
-
private knex;
|
|
5
|
-
constructor(knex: Knex);
|
|
3
|
+
export declare class DateHelperSQLite extends DateHelper {
|
|
6
4
|
year(table: string, column: string): Knex.Raw;
|
|
7
5
|
month(table: string, column: string): Knex.Raw;
|
|
8
6
|
week(table: string, column: string): Knex.Raw;
|
|
@@ -11,4 +9,5 @@ export declare class HelperSQLite implements HelperFn {
|
|
|
11
9
|
hour(table: string, column: string): Knex.Raw;
|
|
12
10
|
minute(table: string, column: string): Knex.Raw;
|
|
13
11
|
second(table: string, column: string): Knex.Raw;
|
|
12
|
+
parse(date: string): string;
|
|
14
13
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DateHelperSQLite = void 0;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
class DateHelperSQLite extends types_1.DateHelper {
|
|
6
|
+
year(table, column) {
|
|
7
|
+
return this.knex.raw("strftime('%Y', ??.?? / 1000, 'unixepoch')", [table, column]);
|
|
8
|
+
}
|
|
9
|
+
month(table, column) {
|
|
10
|
+
return this.knex.raw("strftime('%m', ??.?? / 1000, 'unixepoch')", [table, column]);
|
|
11
|
+
}
|
|
12
|
+
week(table, column) {
|
|
13
|
+
return this.knex.raw("strftime('%W', ??.?? / 1000, 'unixepoch')", [table, column]);
|
|
14
|
+
}
|
|
15
|
+
day(table, column) {
|
|
16
|
+
return this.knex.raw("strftime('%d', ??.?? / 1000, 'unixepoch')", [table, column]);
|
|
17
|
+
}
|
|
18
|
+
weekday(table, column) {
|
|
19
|
+
return this.knex.raw("strftime('%w', ??.?? / 1000, 'unixepoch')", [table, column]);
|
|
20
|
+
}
|
|
21
|
+
hour(table, column) {
|
|
22
|
+
return this.knex.raw("strftime('%H', ??.?? / 1000, 'unixepoch')", [table, column]);
|
|
23
|
+
}
|
|
24
|
+
minute(table, column) {
|
|
25
|
+
return this.knex.raw("strftime('%M', ??.?? / 1000, 'unixepoch')", [table, column]);
|
|
26
|
+
}
|
|
27
|
+
second(table, column) {
|
|
28
|
+
return this.knex.raw("strftime('%S', ??.?? / 1000, 'unixepoch')", [table, column]);
|
|
29
|
+
}
|
|
30
|
+
parse(date) {
|
|
31
|
+
const newDate = new Date(date);
|
|
32
|
+
return (newDate.getTime() - newDate.getTimezoneOffset() * 60 * 1000).toString();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.DateHelperSQLite = DateHelperSQLite;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { DateHelperPostgres as postgres } from './dialects/postgres';
|
|
2
|
+
export { DateHelperPostgres as redshift } from './dialects/postgres';
|
|
3
|
+
export { DateHelperOracle as oracle } from './dialects/oracle';
|
|
4
|
+
export { DateHelperSQLite as sqlite } from './dialects/sqlite';
|
|
5
|
+
export { DateHelperMySQL as mysql } from './dialects/mysql';
|
|
6
|
+
export { DateHelperMSSQL as mssql } from './dialects/mssql';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mssql = exports.mysql = exports.sqlite = exports.oracle = exports.redshift = exports.postgres = void 0;
|
|
4
|
+
var postgres_1 = require("./dialects/postgres");
|
|
5
|
+
Object.defineProperty(exports, "postgres", { enumerable: true, get: function () { return postgres_1.DateHelperPostgres; } });
|
|
6
|
+
var postgres_2 = require("./dialects/postgres");
|
|
7
|
+
Object.defineProperty(exports, "redshift", { enumerable: true, get: function () { return postgres_2.DateHelperPostgres; } });
|
|
8
|
+
var oracle_1 = require("./dialects/oracle");
|
|
9
|
+
Object.defineProperty(exports, "oracle", { enumerable: true, get: function () { return oracle_1.DateHelperOracle; } });
|
|
10
|
+
var sqlite_1 = require("./dialects/sqlite");
|
|
11
|
+
Object.defineProperty(exports, "sqlite", { enumerable: true, get: function () { return sqlite_1.DateHelperSQLite; } });
|
|
12
|
+
var mysql_1 = require("./dialects/mysql");
|
|
13
|
+
Object.defineProperty(exports, "mysql", { enumerable: true, get: function () { return mysql_1.DateHelperMySQL; } });
|
|
14
|
+
var mssql_1 = require("./dialects/mssql");
|
|
15
|
+
Object.defineProperty(exports, "mssql", { enumerable: true, get: function () { return mssql_1.DateHelperMSSQL; } });
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DatabaseHelper } from '../types';
|
|
2
|
+
import { Knex } from 'knex';
|
|
3
|
+
export declare abstract class DateHelper extends DatabaseHelper {
|
|
4
|
+
abstract year(table: string, column: string): Knex.Raw;
|
|
5
|
+
abstract month(table: string, column: string): Knex.Raw;
|
|
6
|
+
abstract week(table: string, column: string): Knex.Raw;
|
|
7
|
+
abstract day(table: string, column: string): Knex.Raw;
|
|
8
|
+
abstract weekday(table: string, column: string): Knex.Raw;
|
|
9
|
+
abstract hour(table: string, column: string): Knex.Raw;
|
|
10
|
+
abstract minute(table: string, column: string): Knex.Raw;
|
|
11
|
+
abstract second(table: string, column: string): Knex.Raw;
|
|
12
|
+
parse(date: string): string;
|
|
13
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DateHelper = void 0;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
class DateHelper extends types_1.DatabaseHelper {
|
|
6
|
+
parse(date) {
|
|
7
|
+
return date;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.DateHelper = DateHelper;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { GeometryHelper } from '../types';
|
|
2
|
+
import { Field, RawField } from '@directus/shared/types';
|
|
3
|
+
import { GeoJSONGeometry } from 'wellknown';
|
|
4
|
+
import { Knex } from 'knex';
|
|
5
|
+
export declare class GeometryHelperMSSQL extends GeometryHelper {
|
|
6
|
+
isTrue(expression: Knex.Raw): Knex.Raw<any>;
|
|
7
|
+
isFalse(expression: Knex.Raw): Knex.Raw<any>;
|
|
8
|
+
createColumn(table: Knex.CreateTableBuilder, field: RawField | Field): Knex.ColumnBuilder;
|
|
9
|
+
asText(table: string, column: string): Knex.Raw;
|
|
10
|
+
fromText(text: string): Knex.Raw;
|
|
11
|
+
_intersects(key: string, geojson: GeoJSONGeometry): Knex.Raw;
|
|
12
|
+
_intersects_bbox(key: string, geojson: GeoJSONGeometry): Knex.Raw;
|
|
13
|
+
collect(table: string, column: string): Knex.Raw;
|
|
14
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeometryHelperMSSQL = void 0;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
class GeometryHelperMSSQL extends types_1.GeometryHelper {
|
|
6
|
+
isTrue(expression) {
|
|
7
|
+
return expression.wrap(``, ` = 1`);
|
|
8
|
+
}
|
|
9
|
+
isFalse(expression) {
|
|
10
|
+
return expression.wrap(``, ` = 0`);
|
|
11
|
+
}
|
|
12
|
+
createColumn(table, field) {
|
|
13
|
+
if (field.type.split('.')[1]) {
|
|
14
|
+
field.meta.special = [field.type];
|
|
15
|
+
}
|
|
16
|
+
return table.specificType(field.field, 'geometry');
|
|
17
|
+
}
|
|
18
|
+
asText(table, column) {
|
|
19
|
+
return this.knex.raw('??.??.STAsText() as ??', [table, column, column]);
|
|
20
|
+
}
|
|
21
|
+
fromText(text) {
|
|
22
|
+
return this.knex.raw('geometry::STGeomFromText(?, 4326)', text);
|
|
23
|
+
}
|
|
24
|
+
_intersects(key, geojson) {
|
|
25
|
+
const geometry = this.fromGeoJSON(geojson);
|
|
26
|
+
return this.knex.raw('??.STIntersects(?)', [key, geometry]);
|
|
27
|
+
}
|
|
28
|
+
_intersects_bbox(key, geojson) {
|
|
29
|
+
const geometry = this.fromGeoJSON(geojson);
|
|
30
|
+
return this.knex.raw('??.STEnvelope().STIntersects(?.STEnvelope())', [key, geometry]);
|
|
31
|
+
}
|
|
32
|
+
collect(table, column) {
|
|
33
|
+
return this.knex.raw('geometry::CollectionAggregate(??.??).STAsText()', [table, column]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.GeometryHelperMSSQL = GeometryHelperMSSQL;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { GeometryHelper } from '../types';
|
|
2
|
+
import { Knex } from 'knex';
|
|
3
|
+
export declare class GeometryHelperMySQL extends GeometryHelper {
|
|
4
|
+
collect(table: string, column: string): Knex.Raw;
|
|
5
|
+
fromText(text: string): Knex.Raw;
|
|
6
|
+
asGeoJSON(table: string, column: string): Knex.Raw;
|
|
7
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeometryHelperMySQL = void 0;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
class GeometryHelperMySQL extends types_1.GeometryHelper {
|
|
6
|
+
collect(table, column) {
|
|
7
|
+
return this.knex.raw(`concat('geometrycollection(', group_concat(? separator ', '), ')'`, this.asText(table, column));
|
|
8
|
+
}
|
|
9
|
+
fromText(text) {
|
|
10
|
+
return this.knex.raw('st_geomfromtext(?)', text);
|
|
11
|
+
}
|
|
12
|
+
asGeoJSON(table, column) {
|
|
13
|
+
return this.knex.raw('st_asgeojson(??.??) as ??', [table, column, column]);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.GeometryHelperMySQL = GeometryHelperMySQL;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { GeometryHelper } from '../types';
|
|
2
|
+
import { Field, RawField } from '@directus/shared/types';
|
|
3
|
+
import { GeoJSONGeometry } from 'wellknown';
|
|
4
|
+
import { Knex } from 'knex';
|
|
5
|
+
export declare class GeometryHelperOracle extends GeometryHelper {
|
|
6
|
+
isTrue(expression: Knex.Raw): Knex.Raw<any>;
|
|
7
|
+
isFalse(expression: Knex.Raw): Knex.Raw<any>;
|
|
8
|
+
createColumn(table: Knex.CreateTableBuilder, field: RawField | Field): Knex.ColumnBuilder;
|
|
9
|
+
asText(table: string, column: string): Knex.Raw;
|
|
10
|
+
asGeoJSON(table: string, column: string): Knex.Raw;
|
|
11
|
+
fromText(text: string): Knex.Raw;
|
|
12
|
+
_intersects(key: string, geojson: GeoJSONGeometry): Knex.Raw;
|
|
13
|
+
_intersects_bbox(key: string, geojson: GeoJSONGeometry): Knex.Raw;
|
|
14
|
+
collect(table: string, column: string): Knex.Raw;
|
|
15
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeometryHelperOracle = void 0;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
class GeometryHelperOracle extends types_1.GeometryHelper {
|
|
6
|
+
isTrue(expression) {
|
|
7
|
+
return expression.wrap(``, ` = 'TRUE'`);
|
|
8
|
+
}
|
|
9
|
+
isFalse(expression) {
|
|
10
|
+
return expression.wrap(``, ` = 'FALSE'`);
|
|
11
|
+
}
|
|
12
|
+
createColumn(table, field) {
|
|
13
|
+
if (field.type.split('.')[1]) {
|
|
14
|
+
field.meta.special = [field.type];
|
|
15
|
+
}
|
|
16
|
+
return table.specificType(field.field, 'sdo_geometry');
|
|
17
|
+
}
|
|
18
|
+
asText(table, column) {
|
|
19
|
+
return this.knex.raw('sdo_util.to_wktgeometry(??.??) as ??', [table, column, column]);
|
|
20
|
+
}
|
|
21
|
+
asGeoJSON(table, column) {
|
|
22
|
+
return this.knex.raw('sdo_util.to_geojson(??.??) as ??', [table, column, column]);
|
|
23
|
+
}
|
|
24
|
+
fromText(text) {
|
|
25
|
+
return this.knex.raw('sdo_geometry(?, 4326)', text);
|
|
26
|
+
}
|
|
27
|
+
_intersects(key, geojson) {
|
|
28
|
+
const geometry = this.fromGeoJSON(geojson);
|
|
29
|
+
return this.knex.raw(`sdo_overlapbdyintersect(??, ?)`, [key, geometry]);
|
|
30
|
+
}
|
|
31
|
+
_intersects_bbox(key, geojson) {
|
|
32
|
+
const geometry = this.fromGeoJSON(geojson);
|
|
33
|
+
return this.knex.raw(`sdo_overlapbdyintersect(sdo_geom.sdo_mbr(??), sdo_geom.sdo_mbr(?))`, [key, geometry]);
|
|
34
|
+
}
|
|
35
|
+
collect(table, column) {
|
|
36
|
+
return this.knex.raw(`concat('geometrycollection(', listagg(?, ', '), ')'`, this.asText(table, column));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.GeometryHelperOracle = GeometryHelperOracle;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { GeometryHelper } from '../types';
|
|
2
|
+
import { Field, RawField } from '@directus/shared/types';
|
|
3
|
+
import { GeoJSONGeometry } from 'wellknown';
|
|
4
|
+
import { Knex } from 'knex';
|
|
5
|
+
export declare class GeometryHelperPostgres extends GeometryHelper {
|
|
6
|
+
supported(): Promise<boolean>;
|
|
7
|
+
createColumn(table: Knex.CreateTableBuilder, field: RawField | Field): Knex.ColumnBuilder;
|
|
8
|
+
_intersects_bbox(key: string, geojson: GeoJSONGeometry): Knex.Raw;
|
|
9
|
+
asGeoJSON(table: string, column: string): Knex.Raw;
|
|
10
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeometryHelperPostgres = void 0;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
class GeometryHelperPostgres extends types_1.GeometryHelper {
|
|
6
|
+
async supported() {
|
|
7
|
+
const res = await this.knex.select('oid').from('pg_proc').where({ proname: 'postgis_version' });
|
|
8
|
+
return res.length > 0;
|
|
9
|
+
}
|
|
10
|
+
createColumn(table, field) {
|
|
11
|
+
var _a;
|
|
12
|
+
const type = (_a = field.type.split('.')[1]) !== null && _a !== void 0 ? _a : 'geometry';
|
|
13
|
+
return table.specificType(field.field, `geometry(${type}, 4326)`);
|
|
14
|
+
}
|
|
15
|
+
_intersects_bbox(key, geojson) {
|
|
16
|
+
const geometry = this.fromGeoJSON(geojson);
|
|
17
|
+
return this.knex.raw('?? && ?', [key, geometry]);
|
|
18
|
+
}
|
|
19
|
+
asGeoJSON(table, column) {
|
|
20
|
+
return this.knex.raw('st_asgeojson(??.??) as ??', [table, column, column]);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.GeometryHelperPostgres = GeometryHelperPostgres;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { GeometryHelper } from '../types';
|
|
2
|
+
import { Field, RawField } from '@directus/shared/types';
|
|
3
|
+
import { Knex } from 'knex';
|
|
4
|
+
export declare class GeometryHelperRedshift extends GeometryHelper {
|
|
5
|
+
createColumn(table: Knex.CreateTableBuilder, field: RawField | Field): Knex.ColumnBuilder;
|
|
6
|
+
asGeoJSON(table: string, column: string): Knex.Raw;
|
|
7
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeometryHelperRedshift = void 0;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
class GeometryHelperRedshift extends types_1.GeometryHelper {
|
|
6
|
+
createColumn(table, field) {
|
|
7
|
+
if (field.type.split('.')[1]) {
|
|
8
|
+
field.meta.special = [field.type];
|
|
9
|
+
}
|
|
10
|
+
return table.specificType(field.field, 'geometry');
|
|
11
|
+
}
|
|
12
|
+
asGeoJSON(table, column) {
|
|
13
|
+
return this.knex.raw('st_asgeojson(??.??) as ??', [table, column, column]);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.GeometryHelperRedshift = GeometryHelperRedshift;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeometryHelperSQLite = void 0;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
class GeometryHelperSQLite extends types_1.GeometryHelper {
|
|
6
|
+
async supported() {
|
|
7
|
+
const res = await this.knex.select('name').from('pragma_function_list').where({ name: 'spatialite_version' });
|
|
8
|
+
return res.length > 0;
|
|
9
|
+
}
|
|
10
|
+
asGeoJSON(table, column) {
|
|
11
|
+
return this.knex.raw('asgeojson(??.??) as ??', [table, column, column]);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.GeometryHelperSQLite = GeometryHelperSQLite;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { GeometryHelperPostgres as postgres } from './dialects/postgres';
|
|
2
|
+
export { GeometryHelperRedshift as redshift } from './dialects/redshift';
|
|
3
|
+
export { GeometryHelperOracle as oracle } from './dialects/oracle';
|
|
4
|
+
export { GeometryHelperSQLite as sqlite } from './dialects/sqlite';
|
|
5
|
+
export { GeometryHelperMySQL as mysql } from './dialects/mysql';
|
|
6
|
+
export { GeometryHelperMSSQL as mssql } from './dialects/mssql';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mssql = exports.mysql = exports.sqlite = exports.oracle = exports.redshift = exports.postgres = void 0;
|
|
4
|
+
var postgres_1 = require("./dialects/postgres");
|
|
5
|
+
Object.defineProperty(exports, "postgres", { enumerable: true, get: function () { return postgres_1.GeometryHelperPostgres; } });
|
|
6
|
+
var redshift_1 = require("./dialects/redshift");
|
|
7
|
+
Object.defineProperty(exports, "redshift", { enumerable: true, get: function () { return redshift_1.GeometryHelperRedshift; } });
|
|
8
|
+
var oracle_1 = require("./dialects/oracle");
|
|
9
|
+
Object.defineProperty(exports, "oracle", { enumerable: true, get: function () { return oracle_1.GeometryHelperOracle; } });
|
|
10
|
+
var sqlite_1 = require("./dialects/sqlite");
|
|
11
|
+
Object.defineProperty(exports, "sqlite", { enumerable: true, get: function () { return sqlite_1.GeometryHelperSQLite; } });
|
|
12
|
+
var mysql_1 = require("./dialects/mysql");
|
|
13
|
+
Object.defineProperty(exports, "mysql", { enumerable: true, get: function () { return mysql_1.GeometryHelperMySQL; } });
|
|
14
|
+
var mssql_1 = require("./dialects/mssql");
|
|
15
|
+
Object.defineProperty(exports, "mssql", { enumerable: true, get: function () { return mssql_1.GeometryHelperMSSQL; } });
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
+
import { GeoJSONGeometry } from 'wellknown';
|
|
1
2
|
import { Field, RawField } from '@directus/shared/types';
|
|
3
|
+
import { DatabaseHelper } from '../types';
|
|
2
4
|
import { Knex } from 'knex';
|
|
3
|
-
|
|
4
|
-
export declare function getGeometryHelper(database?: Knex): KnexSpatial;
|
|
5
|
-
declare abstract class KnexSpatial {
|
|
6
|
-
protected knex: Knex;
|
|
7
|
-
constructor(knex: Knex);
|
|
5
|
+
export declare abstract class GeometryHelper extends DatabaseHelper {
|
|
8
6
|
supported(): boolean | Promise<boolean>;
|
|
9
7
|
isTrue(expression: Knex.Raw): Knex.Raw<any>;
|
|
10
8
|
isFalse(expression: Knex.Raw): Knex.Raw<any>;
|
|
11
9
|
createColumn(table: Knex.CreateTableBuilder, field: RawField | Field): Knex.ColumnBuilder;
|
|
12
10
|
asText(table: string, column: string): Knex.Raw;
|
|
13
|
-
asGeoJSON?(table: string, column: string): Knex.Raw;
|
|
14
11
|
fromText(text: string): Knex.Raw;
|
|
15
12
|
fromGeoJSON(geojson: GeoJSONGeometry): Knex.Raw;
|
|
16
13
|
_intersects(key: string, geojson: GeoJSONGeometry): Knex.Raw;
|
|
@@ -21,4 +18,3 @@ declare abstract class KnexSpatial {
|
|
|
21
18
|
nintersects_bbox(key: string, geojson: GeoJSONGeometry): Knex.Raw;
|
|
22
19
|
collect(table: string, column: string): Knex.Raw;
|
|
23
20
|
}
|
|
24
|
-
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeometryHelper = void 0;
|
|
4
|
+
const wellknown_1 = require("wellknown");
|
|
5
|
+
const types_1 = require("../types");
|
|
6
|
+
class GeometryHelper extends types_1.DatabaseHelper {
|
|
7
|
+
supported() {
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
isTrue(expression) {
|
|
11
|
+
return expression;
|
|
12
|
+
}
|
|
13
|
+
isFalse(expression) {
|
|
14
|
+
return expression.wrap('NOT ', '');
|
|
15
|
+
}
|
|
16
|
+
createColumn(table, field) {
|
|
17
|
+
var _a;
|
|
18
|
+
const type = (_a = field.type.split('.')[1]) !== null && _a !== void 0 ? _a : 'geometry';
|
|
19
|
+
return table.specificType(field.field, type);
|
|
20
|
+
}
|
|
21
|
+
asText(table, column) {
|
|
22
|
+
return this.knex.raw('st_astext(??.??) as ??', [table, column, column]);
|
|
23
|
+
}
|
|
24
|
+
fromText(text) {
|
|
25
|
+
return this.knex.raw('st_geomfromtext(?, 4326)', text);
|
|
26
|
+
}
|
|
27
|
+
fromGeoJSON(geojson) {
|
|
28
|
+
return this.fromText((0, wellknown_1.stringify)(geojson));
|
|
29
|
+
}
|
|
30
|
+
_intersects(key, geojson) {
|
|
31
|
+
const geometry = this.fromGeoJSON(geojson);
|
|
32
|
+
return this.knex.raw('st_intersects(??, ?)', [key, geometry]);
|
|
33
|
+
}
|
|
34
|
+
intersects(key, geojson) {
|
|
35
|
+
return this.isTrue(this._intersects(key, geojson));
|
|
36
|
+
}
|
|
37
|
+
nintersects(key, geojson) {
|
|
38
|
+
return this.isFalse(this._intersects(key, geojson));
|
|
39
|
+
}
|
|
40
|
+
_intersects_bbox(key, geojson) {
|
|
41
|
+
const geometry = this.fromGeoJSON(geojson);
|
|
42
|
+
return this.knex.raw('st_intersects(??, ?)', [key, geometry]);
|
|
43
|
+
}
|
|
44
|
+
intersects_bbox(key, geojson) {
|
|
45
|
+
return this.isTrue(this._intersects_bbox(key, geojson));
|
|
46
|
+
}
|
|
47
|
+
nintersects_bbox(key, geojson) {
|
|
48
|
+
return this.isFalse(this._intersects_bbox(key, geojson));
|
|
49
|
+
}
|
|
50
|
+
collect(table, column) {
|
|
51
|
+
return this.knex.raw('st_astext(st_collect(??.??))', [table, column]);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.GeometryHelper = GeometryHelper;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
import * as dateHelpers from './date';
|
|
3
|
+
import * as geometryHelpers from './geometry';
|
|
4
|
+
export declare function getHelpers(database: Knex): {
|
|
5
|
+
date: dateHelpers.postgres | dateHelpers.oracle | dateHelpers.sqlite | dateHelpers.mysql | dateHelpers.mssql;
|
|
6
|
+
st: geometryHelpers.postgres | geometryHelpers.redshift | geometryHelpers.oracle | geometryHelpers.sqlite | geometryHelpers.mysql | geometryHelpers.mssql;
|
|
7
|
+
};
|
|
8
|
+
export declare type Helpers = ReturnType<typeof getHelpers>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.getHelpers = void 0;
|
|
23
|
+
const __1 = require("..");
|
|
24
|
+
const dateHelpers = __importStar(require("./date"));
|
|
25
|
+
const geometryHelpers = __importStar(require("./geometry"));
|
|
26
|
+
function getHelpers(database) {
|
|
27
|
+
const client = (0, __1.getDatabaseClient)(database);
|
|
28
|
+
return {
|
|
29
|
+
date: new dateHelpers[client](database),
|
|
30
|
+
st: new geometryHelpers[client](database),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
exports.getHelpers = getHelpers;
|
package/dist/database/index.js
CHANGED
|
@@ -15,7 +15,7 @@ const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
|
15
15
|
const path_1 = __importDefault(require("path"));
|
|
16
16
|
const lodash_1 = require("lodash");
|
|
17
17
|
const util_1 = require("util");
|
|
18
|
-
const
|
|
18
|
+
const helpers_1 = require("./helpers");
|
|
19
19
|
let database = null;
|
|
20
20
|
let inspector = null;
|
|
21
21
|
function getDatabase() {
|
|
@@ -197,11 +197,11 @@ exports.validateMigrations = validateMigrations;
|
|
|
197
197
|
*/
|
|
198
198
|
async function validateDatabaseExtensions() {
|
|
199
199
|
const database = getDatabase();
|
|
200
|
-
const
|
|
201
|
-
const
|
|
202
|
-
const geometrySupport = await
|
|
200
|
+
const client = getDatabaseClient(database);
|
|
201
|
+
const helpers = (0, helpers_1.getHelpers)(database);
|
|
202
|
+
const geometrySupport = await helpers.st.supported();
|
|
203
203
|
if (!geometrySupport) {
|
|
204
|
-
switch (
|
|
204
|
+
switch (client) {
|
|
205
205
|
case 'postgres':
|
|
206
206
|
logger_1.default.warn(`PostGIS isn't installed. Geometry type support will be limited.`);
|
|
207
207
|
break;
|
|
@@ -209,7 +209,7 @@ async function validateDatabaseExtensions() {
|
|
|
209
209
|
logger_1.default.warn(`Spatialite isn't installed. Geometry type support will be limited.`);
|
|
210
210
|
break;
|
|
211
211
|
default:
|
|
212
|
-
logger_1.default.warn(`Geometry type not supported on ${
|
|
212
|
+
logger_1.default.warn(`Geometry type not supported on ${client}`);
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
}
|
package/dist/database/run-ast.js
CHANGED
|
@@ -10,14 +10,14 @@ const apply_query_1 = __importDefault(require("../utils/apply-query"));
|
|
|
10
10
|
const get_column_1 = require("../utils/get-column");
|
|
11
11
|
const strip_function_1 = require("../utils/strip-function");
|
|
12
12
|
const utils_1 = require("@directus/shared/utils");
|
|
13
|
-
const
|
|
14
|
-
const
|
|
13
|
+
const _1 = __importDefault(require("."));
|
|
14
|
+
const helpers_1 = require("../database/helpers");
|
|
15
15
|
/**
|
|
16
16
|
* Execute a given AST using Knex. Returns array of items based on requested AST.
|
|
17
17
|
*/
|
|
18
18
|
async function runAST(originalAST, schema, options) {
|
|
19
19
|
const ast = (0, lodash_1.cloneDeep)(originalAST);
|
|
20
|
-
const knex = (options === null || options === void 0 ? void 0 : options.knex) || (0,
|
|
20
|
+
const knex = (options === null || options === void 0 ? void 0 : options.knex) || (0, _1.default)();
|
|
21
21
|
if (ast.type === 'm2a') {
|
|
22
22
|
const results = {};
|
|
23
23
|
for (const collection of ast.names) {
|
|
@@ -111,7 +111,7 @@ async function parseCurrentLevel(schema, collection, children, query) {
|
|
|
111
111
|
return { fieldNodes, nestedCollectionNodes, primaryKeyField };
|
|
112
112
|
}
|
|
113
113
|
function getColumnPreprocessor(knex, schema, table) {
|
|
114
|
-
const
|
|
114
|
+
const helpers = (0, helpers_1.getHelpers)(knex);
|
|
115
115
|
return function (fieldNode) {
|
|
116
116
|
let field;
|
|
117
117
|
if (fieldNode.type === 'field') {
|
|
@@ -125,7 +125,7 @@ function getColumnPreprocessor(knex, schema, table) {
|
|
|
125
125
|
alias = fieldNode.fieldKey;
|
|
126
126
|
}
|
|
127
127
|
if (field.type.startsWith('geometry')) {
|
|
128
|
-
return
|
|
128
|
+
return helpers.st.asText(table, field.field);
|
|
129
129
|
}
|
|
130
130
|
return (0, get_column_1.getColumn)(knex, table, fieldNode.name, alias);
|
|
131
131
|
};
|
|
@@ -7,8 +7,9 @@ const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
|
7
7
|
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
8
8
|
const lodash_1 = require("lodash");
|
|
9
9
|
const path_1 = __importDefault(require("path"));
|
|
10
|
-
const
|
|
10
|
+
const helpers_1 = require("../helpers");
|
|
11
11
|
async function runSeed(database) {
|
|
12
|
+
const helpers = (0, helpers_1.getHelpers)(database);
|
|
12
13
|
const exists = await database.schema.hasTable('directus_collections');
|
|
13
14
|
if (exists) {
|
|
14
15
|
throw new Error('Database is already installed');
|
|
@@ -38,8 +39,7 @@ async function runSeed(database) {
|
|
|
38
39
|
column = tableBuilder.string(columnName, 255);
|
|
39
40
|
}
|
|
40
41
|
else if ((_a = columnInfo.type) === null || _a === void 0 ? void 0 : _a.startsWith('geometry')) {
|
|
41
|
-
|
|
42
|
-
column = helper.createColumn(tableBuilder, { field: columnName, type: columnInfo.type });
|
|
42
|
+
column = helpers.st.createColumn(tableBuilder, { field: columnName, type: columnInfo.type });
|
|
43
43
|
}
|
|
44
44
|
else {
|
|
45
45
|
// @ts-ignore
|
package/dist/env.js
CHANGED
|
@@ -8,6 +8,7 @@ export * from './invalid-ip';
|
|
|
8
8
|
export * from './invalid-otp';
|
|
9
9
|
export * from './invalid-payload';
|
|
10
10
|
export * from './invalid-query';
|
|
11
|
+
export * from './invalid-token';
|
|
11
12
|
export * from './method-not-allowed';
|
|
12
13
|
export * from './range-not-satisfiable';
|
|
13
14
|
export * from './route-not-found';
|
package/dist/exceptions/index.js
CHANGED
|
@@ -20,6 +20,7 @@ __exportStar(require("./invalid-ip"), exports);
|
|
|
20
20
|
__exportStar(require("./invalid-otp"), exports);
|
|
21
21
|
__exportStar(require("./invalid-payload"), exports);
|
|
22
22
|
__exportStar(require("./invalid-query"), exports);
|
|
23
|
+
__exportStar(require("./invalid-token"), exports);
|
|
23
24
|
__exportStar(require("./method-not-allowed"), exports);
|
|
24
25
|
__exportStar(require("./range-not-satisfiable"), exports);
|
|
25
26
|
__exportStar(require("./route-not-found"), exports);
|