@opengis/gis 0.2.167 → 0.2.169
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/{CardIcon-golqfa-Y.js → CardIcon-xkRDr3_E.js} +1 -1
- package/dist/{EntityTablePage-BhmxePgR.js → EntityTablePage-D1IR5Bmq.js} +1 -1
- package/dist/{ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-BFa27smR.js → ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-BJKIgAkD.js} +1 -1
- package/dist/{HeaderActions.vue_vue_type_script_setup_true_lang-Dp0MjgnU.js → HeaderActions.vue_vue_type_script_setup_true_lang-BU8__ouG.js} +1 -1
- package/dist/{MapSettings-F_DT3xKl.js → MapSettings-DIOlNpt6.js} +1 -1
- package/dist/{RastersTablePage-3rXQ0baG.js → RastersTablePage-OD1VqHP8.js} +1 -1
- package/dist/{cartocss-CN-UrS7V.js → cartocss-BiamDcNB.js} +5 -5
- package/dist/{import-utils-F5ErbNz1.js → import-utils-CvUG1jV0.js} +1 -1
- package/dist/{index-CdB0VXro.js → index-C6W8IkTm.js} +1224 -1221
- package/dist/index.css +1 -1
- package/dist/index.js +1 -1
- package/dist/index.umd.cjs +53 -40
- package/dist/{raster-DWmiWlf7.js → raster-BbIiZGoX.js} +3 -3
- package/dist/{register-D1jLD0hK.js → register-Dt2QoLZ3.js} +3 -3
- package/dist/service-CdUYntMi.js +3472 -0
- package/dist/{vs-datatable-BWItxbtK.js → vs-datatable-BELnJrfM.js} +2 -3
- package/module/gis/card/gis.metadata.table/index.yml +22 -22
- package/module/gis/card/gis.rasters.table/index.yml +11 -11
- package/module/gis/card/gis.registers.table/index.yml +23 -23
- package/module/gis/card/gis.services.table/index.yml +25 -25
- package/module/gis/cls/bool.yes_no.json +12 -12
- package/module/gis/cls/encoding.json +14 -14
- package/module/gis/cls/geom_type.json +14 -14
- package/module/gis/cls/gis.column_type.json +34 -34
- package/module/gis/cls/gis.column_view_type.json +26 -26
- package/module/gis/cls/gis.filter_type.json +22 -22
- package/module/gis/cls/language.json +10 -10
- package/module/gis/cls/meta.service_type.json +42 -42
- package/module/gis/cls/ogc.service.json +21 -21
- package/module/gis/cls/source_type.json +10 -10
- package/module/gis/cls/standarts.json +6 -6
- package/module/gis/cls/topic_category.json +106 -106
- package/module/gis/cls/update_frequency.json +29 -29
- package/module/gis/cls/view.json +21 -21
- package/module/gis/form/feedback.answer.form.json +10 -10
- package/module/gis/form/gis.cartocss.form.json +64 -64
- package/module/gis/form/gis.group_list.form.json +17 -17
- package/module/gis/form/gis.maps.form.json +61 -61
- package/module/gis/form/gis.metadata.form.json +240 -240
- package/module/gis/form/gis.metadata_new.form.json +195 -195
- package/module/gis/form/gis.ogc_service.form.json +51 -51
- package/module/gis/form/gis.rasters.form.json +76 -76
- package/module/gis/form/gis.registers.form.json +124 -124
- package/module/gis/form/gis.registers_column.form.json +84 -84
- package/module/gis/form/gis.registers_filter.form.json +65 -65
- package/module/gis/form/gis.services.form.json +111 -111
- package/module/gis/form/gis.services_attributes.form.json +75 -75
- package/module/gis/form/gis.services_filter.form.json +65 -65
- package/module/gis/menu.json +43 -43
- package/module/gis/select/admin.cls.name.sql +9 -9
- package/module/gis/select/layer_list.sql +7 -7
- package/module/gis/select/layer_list_text.sql +7 -7
- package/module/gis/select/pg.column_name.geometry.sql +12 -12
- package/module/gis/select/pg.columns.parent.sql +6 -6
- package/module/gis/select/pg.table_name.sql +17 -17
- package/module/gis/select/service_id.sql +1 -1
- package/module/gis/select/srid.sql +7 -7
- package/module/gis/table/gis.cartocss.table.json +74 -74
- package/module/gis/table/gis.group_list.table.json +58 -58
- package/module/gis/table/gis.maps.table.json +110 -110
- package/module/gis/table/gis.metadata.table.json +70 -70
- package/module/gis/table/gis.metadata_new.table.json +137 -137
- package/module/gis/table/gis.ogc_service.table.json +100 -100
- package/module/gis/table/gis.rasters.table.json +113 -113
- package/module/gis/table/gis.registers.table.json +143 -143
- package/module/gis/table/gis.services.table.json +120 -120
- package/module/gis/table/site.gis.registers.table.json +88 -88
- package/module/gis/table/site.gis.services.table.json +106 -106
- package/module/gis/templates/ISO19136_2017_gml_template.xml +330 -330
- package/module/gis/tokens.yml +5 -5
- package/module/permissions/form/permissions.users.form.json +151 -151
- package/module/permissions/table/gis.permissions.table.json +97 -97
- package/module/test/map/addr.json +303 -0
- package/module/test/map/{addr.yml → addr1.yml} +3 -1
- package/module/test/select/address.str_id.sql +3 -0
- package/package.json +10 -10
- package/plugin.js +21 -12
- package/server/plugins/mapnik/funcs/checkRasterFile.js +1 -3
- package/server/routes/cartocss/cartocss.route.js +31 -0
- package/server/routes/cartocss/cartocss.route.test.js +79 -0
- package/server/routes/cartocss/cartocss.schema.js +73 -0
- package/server/routes/{gis/cartocss → cartocss/functions}/add.cartocss.js +8 -11
- package/server/routes/{gis/cartocss → cartocss/functions}/get.cartocss.js +11 -13
- package/server/routes/gis/functions/checkXML.js +107 -0
- package/server/routes/gis/functions/dashboard.js +24 -0
- package/server/routes/gis/gis.route.js +26 -0
- package/server/routes/gis/gis.route.test.js +34 -0
- package/server/routes/gis/gis.schema.js +1 -0
- package/server/routes/map/{controllers → functions}/clearTiles.js +9 -8
- package/server/routes/map/{controllers → functions}/geojson.js +43 -43
- package/server/routes/map/{controllers → functions}/gis.convert.js +15 -23
- package/server/routes/map/{controllers → functions}/gis.icon.js +23 -10
- package/server/routes/map/{controllers → functions}/jsonData.js +72 -71
- package/server/routes/map/{controllers → functions}/layerList.js +17 -17
- package/server/routes/map/{controllers → functions}/map.js +8 -9
- package/server/routes/map/{controllers → functions}/mapCatalog.js +7 -7
- package/server/routes/map/functions/mapCatalogAttribute.js +54 -0
- package/server/routes/map/{controllers → functions}/mapFeatures.js +22 -18
- package/server/routes/map/{controllers → functions}/mapFormat.js +25 -28
- package/server/routes/map/{controllers → functions}/mapTiles.js +39 -30
- package/server/routes/map/{controllers → functions}/maps.js +3 -3
- package/server/routes/map/{controllers → functions}/marker_icon.js +1 -1
- package/server/routes/map/{controllers → functions}/parseGeoFile.js +10 -11
- package/server/routes/map/{controllers → functions}/pointHeight.js +3 -7
- package/server/routes/map/{controllers → functions}/vtile.js +5 -3
- package/server/routes/map/{vtile1.js → functions/vtile1.js} +39 -33
- package/server/routes/map/map.route.js +280 -0
- package/server/routes/map/map.route.test.js +503 -0
- package/server/routes/map/map.schema.js +356 -0
- package/server/routes/mapnik/{controllers → functions}/clearTiles.js +26 -29
- package/server/routes/mapnik/{controllers → functions}/createXml.js +17 -20
- package/server/routes/mapnik/{controllers → functions}/createXmlMulti.js +11 -15
- package/server/routes/mapnik/{controllers → functions}/fileSearch.js +6 -9
- package/server/routes/mapnik/functions/fileStat.js +28 -0
- package/server/routes/mapnik/{controllers → functions}/pretile.js +29 -35
- package/server/routes/mapnik/{controllers → functions}/rasterInfo.js +19 -10
- package/server/routes/mapnik/{controllers → functions}/readDir.js +4 -4
- package/server/routes/mapnik/functions/rtile.js +164 -0
- package/server/routes/mapnik/{controllers → functions}/uploadRaster.js +19 -24
- package/server/routes/mapnik/functions/uploadXML.js +27 -0
- package/server/routes/mapnik/mapnik.route.js +102 -0
- package/server/routes/mapnik/mapnik.route.test.js +371 -0
- package/server/routes/mapnik/mapnik.schema.mjs +190 -0
- package/server/routes/mapnik.prefixless/functions/mapnikLogger.js +31 -0
- package/server/routes/{mapnik/controllers → mapnik.prefixless/functions}/mapnikStat.js +7 -5
- package/server/routes/mapnik.prefixless/mapnik.prefixless.route.js +20 -0
- package/server/routes/mapnik.prefixless/mapnik.prefixless.route.test.js +91 -0
- package/server/routes/mapnik.prefixless/mapnik.prefixless.schema.mjs +27 -0
- package/server/routes/maps/functions/add.map.js +42 -0
- package/server/routes/{map/maps → maps/functions}/del.map.js +6 -7
- package/server/routes/{map/maps → maps/functions}/get.map.js +12 -11
- package/server/routes/maps/maps.route.js +58 -0
- package/server/routes/maps/maps.route.test.js +231 -0
- package/server/routes/maps/maps.schema.js +10 -0
- package/server/routes/metadata/functions/editMetadata.js +35 -0
- package/server/routes/metadata/functions/metadataXML.js +19 -0
- package/server/routes/metadata/metadata.route.js +26 -0
- package/server/routes/metadata/metadata.route.test.js +47 -0
- package/server/routes/metadata/metadata.schema.js +53 -0
- package/server/routes/{gis/ogc → ogc/functions}/map.info.point.js +22 -29
- package/server/routes/ogc/ogc.route.js +21 -0
- package/server/routes/ogc/ogc.route.test.js +54 -0
- package/server/routes/ogc/ogc.schema.js +16 -0
- package/server/routes/permissions/functions/catalog.permissions.edit.js +20 -0
- package/server/routes/permissions/functions/catalog.permissions.js +13 -0
- package/server/routes/permissions/{controllers → functions}/gis.catalog.js +10 -10
- package/server/routes/permissions/permissions.route.js +35 -0
- package/server/routes/permissions/permissions.route.test.js +35 -0
- package/server/routes/permissions/permissions.schema.js +44 -0
- package/server/routes/registers/functions/add.registry.js +37 -0
- package/server/routes/{gis/registers/funcs → registers/functions}/classifiers.js +2 -2
- package/server/routes/{gis/registers → registers/functions}/del.registry.js +5 -5
- package/server/routes/{gis/registers/funcs → registers/functions}/get.info.js +9 -5
- package/server/routes/{gis/registers → registers/functions}/gis.export.js +27 -21
- package/server/routes/{gis/registers → registers/functions}/gis.registry.js +22 -15
- package/server/routes/{gis/registers → registers/functions}/gis.registry.list.js +12 -10
- package/server/routes/{gis/registers/funcs → registers/functions}/handleRegistryRequest.js +12 -11
- package/server/routes/registers/registers.route.js +80 -0
- package/server/routes/registers/registers.route.test.js +145 -0
- package/server/routes/registers/registers.schema.js +246 -0
- package/server/routes/{gis/services → services/functions}/add.service.js +14 -16
- package/server/routes/services/functions/create.route.js +93 -0
- package/server/routes/{gis/services → services/functions}/del.service.js +5 -5
- package/server/routes/{gis/services → services/functions}/get.service.users.js +15 -13
- package/server/routes/services/functions/get.services.col.js +34 -0
- package/server/routes/{gis/services → services/functions}/get.services.js +21 -16
- package/server/routes/services/services.route.js +76 -0
- package/server/routes/services/services.route.test.js +168 -0
- package/server/routes/services/services.schema.js +278 -0
- package/server/routes/widgets/functions/add.widget.js +39 -0
- package/server/routes/widgets/functions/del.widget.js +18 -0
- package/server/routes/{map/widgets → widgets/functions}/get.widget.js +12 -11
- package/server/routes/widgets/widgets.route.js +61 -0
- package/server/routes/widgets/widgets.route.test.js +144 -0
- package/server/routes/widgets/widgets.schema.js +25 -0
- package/dist/service-JGNtth-y.js +0 -2593
- package/module/cls.json +0 -7
- package/module/gis/card/gis.metadata.table/main_info.hbs +0 -21
- package/module/gis/card/gis.metadata.table/metadata_info.hbs +0 -28
- package/module/gis/card/gis.metadata.table/other.hbs +0 -26
- package/module/gis/card/gis.rasters.table/main_info.hbs +0 -27
- package/module/gis/card/gis.registers.table/cls.hbs +0 -36
- package/module/gis/card/gis.registers.table/columns.hbs +0 -89
- package/module/gis/card/gis.registers.table/filters.hbs +0 -80
- package/module/gis/card/gis.registers.table/main_info.hbs +0 -35
- package/module/gis/card/gis.registers.table/source.hbs +0 -45
- package/module/gis/card/gis.services.table/attributes.hbs +0 -91
- package/module/gis/card/gis.services.table/filters.hbs +0 -83
- package/module/gis/card/gis.services.table/main_info.hbs +0 -27
- package/module/gis/card/gis.services.table/source.hbs +0 -26
- package/module/test/cls/bp_build_type.json +0 -37
- package/module/test/cls/doc_status.json +0 -32
- package/module/test/cls/ts.temp_status.json +0 -18
- package/module/test/cls/ts.temp_structure.ts_class.json +0 -50
- package/module/test/cls/ts.temp_type.json +0 -10
- package/module/test/layer/bp.json +0 -60
- package/module/test/layer/bp1.yml +0 -33
- package/module/test/layer/individual.yml +0 -54
- package/module/test/layer/ts.linking_passport.yml +0 -56
- package/module/test/layer/ts.temp_structure.yml +0 -51
- package/module/test/map/bp_myo.json +0 -44
- package/module/test/map/bpf.json +0 -44
- package/module/test/map/main.json +0 -39
- package/module/test/map/mbd.json +0 -92
- package/module/test/map/ts.json +0 -53
- package/module/test/select/address_id.json +0 -3
- package/module/test/select/address_id.sql +0 -8
- package/module/test/select/core.user_uid.sql +0 -1
- package/module/test/table/data_address.street.table.json +0 -70
- package/module/test/table/data_bp_myo.bp.table.json +0 -123
- package/server/routes/gis/checkXML.js +0 -117
- package/server/routes/gis/dashboard.js +0 -29
- package/server/routes/gis/index.mjs +0 -92
- package/server/routes/gis/metadata/editMetadata.js +0 -34
- package/server/routes/gis/metadata/metadataXML.js +0 -13
- package/server/routes/gis/registers/add.registry.js +0 -35
- package/server/routes/gis/registers/insert.columns.js +0 -107
- package/server/routes/gis/registers/insert.filters.js +0 -110
- package/server/routes/gis/services/create.route.js +0 -96
- package/server/routes/gis/services/get.services.col.js +0 -33
- package/server/routes/map/controllers/mapCatalogAttribute.js +0 -56
- package/server/routes/map/index.mjs +0 -259
- package/server/routes/map/maps/add.map.js +0 -43
- package/server/routes/map/widgets/add.widget.js +0 -39
- package/server/routes/map/widgets/del.widget.js +0 -23
- package/server/routes/mapnik/controllers/fileStat.js +0 -28
- package/server/routes/mapnik/controllers/mapnikLogger.js +0 -29
- package/server/routes/mapnik/controllers/rtile.js +0 -167
- package/server/routes/mapnik/index.js +0 -40
- package/server/routes/permissions/controllers/catalog.permissions.edit.js +0 -22
- package/server/routes/permissions/controllers/catalog.permissions.js +0 -8
- package/server/routes/permissions/index.mjs +0 -18
- /package/server/routes/map/{controllers/pin → pin}/circle1.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/circle2.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/none.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin1.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin2.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin3.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin4.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin5.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin6.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin7.svg +0 -0
- /package/server/routes/permissions/{controllers/utils → functions}/get.permissions.js +0 -0
- /package/server/routes/{gis/registers/funcs → registers/functions}/columns.js +0 -0
- /package/server/routes/{gis/registers/funcs → registers/functions}/content.type.js +0 -0
- /package/server/routes/{gis/registers → registers/functions}/map.registry.js +0 -0
- /package/server/routes/{gis/services → services/functions}/get.layer.geom.js +0 -0
- /package/server/routes/{gis/services → services/functions}/legend.auto.js +0 -0
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
export const gisConvertSchema = {
|
|
2
|
+
body: {
|
|
3
|
+
type: 'object',
|
|
4
|
+
additionalProperties: false,
|
|
5
|
+
properties: {
|
|
6
|
+
encoding: {
|
|
7
|
+
type: 'string',
|
|
8
|
+
// python is case insensitive and ignores "-"
|
|
9
|
+
enum: ['LATIN-1', 'CP1251', 'UTF-8'],
|
|
10
|
+
},
|
|
11
|
+
// srid: {
|
|
12
|
+
// type: 'number',
|
|
13
|
+
// minimum: 1,
|
|
14
|
+
// },
|
|
15
|
+
file: {
|
|
16
|
+
type: 'string',
|
|
17
|
+
},
|
|
18
|
+
filename: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
},
|
|
21
|
+
filepath: {
|
|
22
|
+
type: 'string',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
anyOf: [
|
|
26
|
+
{ required: ['file', 'filename'] },
|
|
27
|
+
{ required: ['filepath'] },
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export const mapFormatSchema = {
|
|
33
|
+
querystring: {
|
|
34
|
+
type: 'object',
|
|
35
|
+
additionalProperties: false,
|
|
36
|
+
required: ['layer'],
|
|
37
|
+
properties: {
|
|
38
|
+
lat: {
|
|
39
|
+
type: 'number',
|
|
40
|
+
minimum: 1,
|
|
41
|
+
maximum: 90,
|
|
42
|
+
},
|
|
43
|
+
lng: {
|
|
44
|
+
type: 'number',
|
|
45
|
+
minimum: -180,
|
|
46
|
+
maximum: 180,
|
|
47
|
+
},
|
|
48
|
+
radius: {
|
|
49
|
+
type: 'number',
|
|
50
|
+
minimum: 1,
|
|
51
|
+
maximum: 1000,
|
|
52
|
+
},
|
|
53
|
+
layer: {
|
|
54
|
+
type: 'string', pattern: "^([\\d\\w._-]+)$"
|
|
55
|
+
},
|
|
56
|
+
id: {
|
|
57
|
+
type: 'string', pattern: "^([\\d\\w._-]+)$"
|
|
58
|
+
},
|
|
59
|
+
nogeom: {
|
|
60
|
+
type: 'string', enum: ['1', 'true']
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const pointHeightSchema = {
|
|
67
|
+
querystring: {
|
|
68
|
+
type: 'object',
|
|
69
|
+
required: ['lat', 'lng'],
|
|
70
|
+
properties: {
|
|
71
|
+
lat: { type: 'number', minimum: -90, maximum: 90 },
|
|
72
|
+
lng: { type: 'number', minimum: -180, maximum: 180 },
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
response: {
|
|
76
|
+
200: {
|
|
77
|
+
type: 'object',
|
|
78
|
+
properties: {
|
|
79
|
+
lat: { type: 'number' },
|
|
80
|
+
lng: { type: 'number' },
|
|
81
|
+
height: { anyOf: [{ type: 'number' }, { type: 'null' }] },
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const getIconSchema = {
|
|
88
|
+
params: {
|
|
89
|
+
type: 'object',
|
|
90
|
+
required: ['*'],
|
|
91
|
+
properties: {
|
|
92
|
+
'*': { type: 'string' },
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
querystring: {
|
|
96
|
+
type: 'object',
|
|
97
|
+
additionalProperties: false,
|
|
98
|
+
properties: {
|
|
99
|
+
nocache: { type: 'string', enum: ['true', '1'] },
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export const mapTilesSchema = {
|
|
105
|
+
params: {
|
|
106
|
+
type: 'object',
|
|
107
|
+
required: ['slug', 'z', 'x', 'y'],
|
|
108
|
+
properties: {
|
|
109
|
+
slug: {
|
|
110
|
+
type: 'string',
|
|
111
|
+
},
|
|
112
|
+
z: {
|
|
113
|
+
type: 'number',
|
|
114
|
+
},
|
|
115
|
+
y: {
|
|
116
|
+
type: 'number',
|
|
117
|
+
},
|
|
118
|
+
x: {
|
|
119
|
+
type: 'string',
|
|
120
|
+
pattern: '^\\d+\\.(pbf|vmt)$',
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
querystring: {
|
|
125
|
+
type: 'object',
|
|
126
|
+
additionalProperties: false,
|
|
127
|
+
properties: {
|
|
128
|
+
nocache: { type: 'string', enum: ['1'] },
|
|
129
|
+
filter: { type: 'string', /** pattern: "" */ },
|
|
130
|
+
type: { type: 'string', /** enum: [] */ },
|
|
131
|
+
layer: { type: 'string', /** pattern: "" */ },
|
|
132
|
+
layers: { type: 'string', /** pattern: "" */ },
|
|
133
|
+
sql: { type: 'number', minimum: 1, maximum: 4 },
|
|
134
|
+
pointZoom: { type: 'number', minimum: 1, maximum: 25 },
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
export const mapFeaturesPointSchema = {
|
|
140
|
+
params: {
|
|
141
|
+
type: 'object',
|
|
142
|
+
required: ['slug'],
|
|
143
|
+
properties: {
|
|
144
|
+
slug: {
|
|
145
|
+
type: 'string',
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
querystring: {
|
|
150
|
+
type: 'object',
|
|
151
|
+
additionalProperties: false,
|
|
152
|
+
properties: {
|
|
153
|
+
x: { type: 'number', minimum: -180, maximum: 180 }, // longitude
|
|
154
|
+
y: { type: 'number', minimum: -90, maximum: 90 }, // latitude
|
|
155
|
+
sql: { type: 'number', enum: [1] },
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
export const mapFeaturesSchema = {
|
|
160
|
+
params: {
|
|
161
|
+
type: 'object',
|
|
162
|
+
required: ['slug', 'id'],
|
|
163
|
+
properties: {
|
|
164
|
+
slug: {
|
|
165
|
+
type: 'string',
|
|
166
|
+
},
|
|
167
|
+
id: {
|
|
168
|
+
type: 'string', pattern: "^([\\d\\w_.-]+)$"
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
querystring: {
|
|
173
|
+
type: 'object',
|
|
174
|
+
additionalProperties: false,
|
|
175
|
+
properties: {
|
|
176
|
+
sql: { type: 'number', enum: [1] },
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
export const mapCatalogAttributeSchema = {
|
|
182
|
+
params: {
|
|
183
|
+
type: 'object',
|
|
184
|
+
required: ['service', 'attr'],
|
|
185
|
+
properties: {
|
|
186
|
+
service: {
|
|
187
|
+
type: 'string', pattern: "^([\\d\\w_.-]+)$"
|
|
188
|
+
},
|
|
189
|
+
attr: {
|
|
190
|
+
type: 'string', pattern: "^([\\d\\w_.-]+)$"
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
querystring: {
|
|
195
|
+
type: 'object',
|
|
196
|
+
additionalProperties: false,
|
|
197
|
+
properties: {
|
|
198
|
+
cls: { type: 'string', pattern: "^([\\d\\w_.-]+)$" },
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
export const vtileSchema = {
|
|
204
|
+
params: {
|
|
205
|
+
type: 'object',
|
|
206
|
+
properties: {
|
|
207
|
+
layer: {
|
|
208
|
+
type: 'string',
|
|
209
|
+
},
|
|
210
|
+
lang: {
|
|
211
|
+
type: 'string', enum: ['ua']
|
|
212
|
+
},
|
|
213
|
+
z: {
|
|
214
|
+
type: 'number',
|
|
215
|
+
},
|
|
216
|
+
y: {
|
|
217
|
+
type: 'number',
|
|
218
|
+
},
|
|
219
|
+
x: {
|
|
220
|
+
type: 'string',
|
|
221
|
+
pattern: '^\\d+\\.(pbf|vmt)$',
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
querystring: {
|
|
226
|
+
type: 'object',
|
|
227
|
+
additionalProperties: false,
|
|
228
|
+
properties: {
|
|
229
|
+
type: {
|
|
230
|
+
type: 'string', enum: ['point', 'polygon', 'line']
|
|
231
|
+
},
|
|
232
|
+
nocache: {
|
|
233
|
+
type: 'string', enum: ['1', 'true']
|
|
234
|
+
},
|
|
235
|
+
clusterZoom: {
|
|
236
|
+
type: 'number', minimum: 1, maximum: 25
|
|
237
|
+
},
|
|
238
|
+
nottl: {
|
|
239
|
+
type: 'string', enum: ['1', 'true']
|
|
240
|
+
},
|
|
241
|
+
filter: {
|
|
242
|
+
type: 'string'
|
|
243
|
+
},
|
|
244
|
+
all: {
|
|
245
|
+
type: 'string', enum: ['1', 'true']
|
|
246
|
+
},
|
|
247
|
+
sql: {
|
|
248
|
+
type: 'number', enum: [1]
|
|
249
|
+
},
|
|
250
|
+
pointZoom: {
|
|
251
|
+
type: 'number', minimum: 1, maximum: 25
|
|
252
|
+
},
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
export const clearTilesSchema = {
|
|
258
|
+
params: {
|
|
259
|
+
type: 'object',
|
|
260
|
+
properties: {
|
|
261
|
+
id: {
|
|
262
|
+
type: 'string', pattern: '^([\\d\\w]+)$'
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
querystring: {
|
|
267
|
+
type: 'object',
|
|
268
|
+
additionalProperties: false,
|
|
269
|
+
properties: {
|
|
270
|
+
debug: {
|
|
271
|
+
type: 'number', enum: [1]
|
|
272
|
+
},
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
export const mapSchema = {
|
|
278
|
+
params: {
|
|
279
|
+
type: 'object',
|
|
280
|
+
required: ['slug'],
|
|
281
|
+
properties: {
|
|
282
|
+
slug: {
|
|
283
|
+
type: 'string', pattern: "^([\\d\\w_.-]+)$"
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
export const geojsonSchema = {
|
|
290
|
+
params: {
|
|
291
|
+
type: 'object',
|
|
292
|
+
properties: {
|
|
293
|
+
layer: { type: 'string', pattern: "^([\\d\\w,.-_]+)$" },
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
querystring: {
|
|
297
|
+
type: 'object',
|
|
298
|
+
additionalProperties: false,
|
|
299
|
+
properties: {
|
|
300
|
+
sql: { type: 'number', enum: [1, 2] },
|
|
301
|
+
nocache: { type: 'number', enum: [1] },
|
|
302
|
+
srid: { type: 'number', minimum: 1 },
|
|
303
|
+
type: { type: 'string', enum: ['centroid'] },
|
|
304
|
+
extent: { type: 'string', pattern: "^([\\d\\s,.-]+)$" },
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
export const jsonDataSchema = {
|
|
310
|
+
params: {
|
|
311
|
+
type: 'object',
|
|
312
|
+
properties: {
|
|
313
|
+
layer: { type: 'string', pattern: "^([\\d\\w,.-_]+)$" },
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
querystring: {
|
|
317
|
+
type: 'object',
|
|
318
|
+
additionalProperties: false,
|
|
319
|
+
properties: {
|
|
320
|
+
sql: { type: 'number', enum: [1, 2] },
|
|
321
|
+
nocache: { type: 'number', enum: [1] },
|
|
322
|
+
page: { type: 'number', minimum: 1 },
|
|
323
|
+
limit: { type: 'number', minimum: 1, maximum: 1000 },
|
|
324
|
+
// where: { type: 'string' }, // ? possible sql injection
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
export const layerListSchema = {
|
|
329
|
+
querystring: {
|
|
330
|
+
type: 'object',
|
|
331
|
+
additionalProperties: false,
|
|
332
|
+
properties: {
|
|
333
|
+
sql: {
|
|
334
|
+
type: 'number', enum: [1]
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
export const parseGeoFileSchema = {
|
|
341
|
+
body: {
|
|
342
|
+
type: 'object',
|
|
343
|
+
additionalProperties: false,
|
|
344
|
+
required: ['content'],
|
|
345
|
+
properties: {
|
|
346
|
+
content: {
|
|
347
|
+
type: 'string'
|
|
348
|
+
},
|
|
349
|
+
filename: {
|
|
350
|
+
type: 'string'
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
export default null;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
2
|
|
|
3
|
-
import { config,
|
|
3
|
+
import { config, pgClients } from '@opengis/fastify-table/utils.js';
|
|
4
|
+
|
|
5
|
+
import { BadRequestError, NotFoundError, NotImplementedError } from '@opengis/fastify-table/errors.js';
|
|
4
6
|
|
|
5
7
|
import mapnik from '../../../plugins/mapnik/funcs/mapnik.js';
|
|
6
8
|
|
|
@@ -22,26 +24,26 @@ const { ClearTile } = mapnik();
|
|
|
22
24
|
*/
|
|
23
25
|
|
|
24
26
|
export default async function clearTiles({
|
|
25
|
-
|
|
26
|
-
},
|
|
27
|
+
id, debug,
|
|
28
|
+
}, pg = pgClients.client) {
|
|
27
29
|
if (!ClearTile) {
|
|
28
|
-
|
|
30
|
+
throw NotImplementedError('mapnik server address needed');
|
|
29
31
|
}
|
|
30
32
|
|
|
31
|
-
if (!
|
|
32
|
-
|
|
33
|
+
if (!id) {
|
|
34
|
+
throw BadRequestError('not enough params: id');
|
|
33
35
|
}
|
|
34
36
|
|
|
35
|
-
const decodedPath = Buffer.from(
|
|
37
|
+
const decodedPath = Buffer.from(id, 'base64url').toString('utf-8');
|
|
36
38
|
|
|
37
39
|
const raster = pg.pk?.['gis.rasters']
|
|
38
40
|
? await pg.query(`select raster_id, source_path from gis.rasters where raster_id=$1::text union all
|
|
39
|
-
select raster_id, source_path from gis.rasters where source_path=$2::text`, [
|
|
41
|
+
select raster_id, source_path from gis.rasters where source_path=$2::text`, [id, decodedPath]).then(r => r.rows?.[0] || {})
|
|
40
42
|
: {};
|
|
41
43
|
|
|
42
44
|
const carto = pg.pk?.['gis.cartocss']
|
|
43
45
|
? await pg.query(`select cartocss_id, source_path from gis.cartocss where cartocss_id=$1::text union all
|
|
44
|
-
select cartocss_id, source_path from gis.cartocss where source_path=$2::text`, [
|
|
46
|
+
select cartocss_id, source_path from gis.cartocss where source_path=$2::text`, [id, decodedPath]).then(r => r.rows?.[0] || {})
|
|
45
47
|
: {};
|
|
46
48
|
|
|
47
49
|
if (!raster.raster_id && !carto.cartocss_id) {
|
|
@@ -49,7 +51,7 @@ export default async function clearTiles({
|
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
if (!raster.source_path && !carto.cartocss_id) {
|
|
52
|
-
|
|
54
|
+
throw NotFoundError('raster / cartocss not found');
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
const getParams = () => {
|
|
@@ -64,7 +66,7 @@ export default async function clearTiles({
|
|
|
64
66
|
|
|
65
67
|
const { path: relpath, name } = getParams();
|
|
66
68
|
|
|
67
|
-
if (
|
|
69
|
+
if (debug) {
|
|
68
70
|
const md5 = raster.source_path
|
|
69
71
|
? createHash('md5').update(raster.source_path).digest('hex')
|
|
70
72
|
: undefined;
|
|
@@ -81,26 +83,21 @@ export default async function clearTiles({
|
|
|
81
83
|
};
|
|
82
84
|
}
|
|
83
85
|
|
|
84
|
-
try {
|
|
85
|
-
const data = await ClearTile({
|
|
86
|
-
path: relpath, // for rasters only
|
|
87
|
-
name, // for cartocss
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
// if empty directory not found (no tiles rendered yet)
|
|
91
|
-
if (data.result === 'skip') {
|
|
92
|
-
return reply.status(200).send({ message: 'tiles directory not found', code: 200 });
|
|
93
|
-
}
|
|
94
86
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
87
|
+
const data = await ClearTile({
|
|
88
|
+
path: relpath, // for rasters only
|
|
89
|
+
name, // for cartocss
|
|
90
|
+
});
|
|
99
91
|
|
|
100
|
-
|
|
92
|
+
// if empty directory not found (no tiles rendered yet)
|
|
93
|
+
if (data.result === 'skip') {
|
|
94
|
+
return { message: 'tiles directory not found', code: 200 };
|
|
101
95
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
96
|
+
|
|
97
|
+
// if cache deleted or empty directory exists = ok
|
|
98
|
+
if (data.result === 'success') {
|
|
99
|
+
return { message: 'ok', code: 200 };
|
|
105
100
|
}
|
|
101
|
+
|
|
102
|
+
throw new Error(data.err);
|
|
106
103
|
}
|
|
@@ -1,35 +1,34 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
|
|
3
|
-
import { config, pgClients
|
|
3
|
+
import { config, pgClients } from '@opengis/fastify-table/utils.js';
|
|
4
4
|
|
|
5
5
|
import mapnik from '../../../plugins/mapnik/funcs/mapnik.js';
|
|
6
|
+
import { BadRequestError, NotFoundError, NotImplementedError } from '@opengis/fastify-table/errors.js';
|
|
6
7
|
|
|
7
8
|
const { GetRasterStatus, CreateXML } = mapnik();
|
|
8
9
|
|
|
9
10
|
export default async function createXml({
|
|
10
|
-
|
|
11
|
-
},
|
|
11
|
+
id, vrt, debug, nocache, callback = () => { },
|
|
12
|
+
}, pg = pgClients.client) {
|
|
12
13
|
if (!GetRasterStatus || !CreateXML) {
|
|
13
|
-
|
|
14
|
+
throw NotImplementedError('mapnik server address needed');
|
|
14
15
|
}
|
|
15
16
|
|
|
16
|
-
const { id } = params;
|
|
17
|
-
|
|
18
17
|
if (!id) {
|
|
19
|
-
|
|
18
|
+
throw BadRequestError('not enough params: id');
|
|
20
19
|
}
|
|
21
20
|
|
|
22
21
|
const data = pg.pk?.['gis.rasters']
|
|
23
22
|
? await pg.query('select raster_id as id, source_path, srid, raster_zoom from gis.rasters where raster_id=$1::text', [id])
|
|
24
|
-
.then(
|
|
23
|
+
.then(r => r.rows?.[0])
|
|
25
24
|
: null;
|
|
26
25
|
|
|
27
26
|
if (!data?.id) {
|
|
28
|
-
|
|
27
|
+
throw NotFoundError('raster not found')
|
|
29
28
|
}
|
|
30
29
|
|
|
31
30
|
if (!data.source_path) {
|
|
32
|
-
|
|
31
|
+
throw BadRequestError('raster source_path not set');
|
|
33
32
|
}
|
|
34
33
|
|
|
35
34
|
// const relpath = `/map/raster/${data.source_path}`;
|
|
@@ -39,16 +38,14 @@ export default async function createXml({
|
|
|
39
38
|
const uploadStatus = path.extname(data.source_path) ? await GetRasterStatus({ path: relpath }) : {};
|
|
40
39
|
|
|
41
40
|
if (uploadStatus.exists === false) {
|
|
42
|
-
|
|
41
|
+
throw BadRequestError('raster not uploaded');
|
|
43
42
|
}
|
|
44
43
|
|
|
45
44
|
if (uploadStatus.finished === false) {
|
|
46
|
-
|
|
45
|
+
throw BadRequestError('upload not finished');
|
|
47
46
|
}
|
|
48
47
|
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
const proj4 = data.srid && pg.pk?.['public.spatial_ref_sys'] ? await pg.query('select proj4text from public.spatial_ref_sys where srid=$1', [data.srid]).then(el => el.rows?.[0]?.proj4text) : undefined;
|
|
48
|
+
const proj4 = data.srid && pg.pk?.['public.spatial_ref_sys'] ? await pg.query('select proj4text from public.spatial_ref_sys where srid=$1', [data.srid]).then(r => r.rows?.[0]?.proj4text) : undefined;
|
|
52
49
|
|
|
53
50
|
// create at xml/:id with name only, always - by path
|
|
54
51
|
const resp = await CreateXML({
|
|
@@ -57,11 +54,11 @@ export default async function createXml({
|
|
|
57
54
|
previewZoom: data.raster_zoom, // preview<=>detailed, default = 16 if file size > 1GB
|
|
58
55
|
// srid: data.srid, // auto detected if not supplied
|
|
59
56
|
proj4,
|
|
60
|
-
vrt
|
|
61
|
-
debug
|
|
62
|
-
nocache
|
|
57
|
+
vrt, // force vrt even if relpath leads to single raster file
|
|
58
|
+
debug, // stream debug info
|
|
59
|
+
nocache, // recreate if exists
|
|
63
60
|
}, callback);
|
|
64
61
|
|
|
65
|
-
callback('finish',
|
|
66
|
-
return
|
|
62
|
+
callback('finish', true);
|
|
63
|
+
return resp;
|
|
67
64
|
}
|
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
} from '@opengis/fastify-table/utils.js';
|
|
4
4
|
|
|
5
5
|
import checkRasterFile from '../../../plugins/mapnik/funcs/checkRasterFile.js';
|
|
6
|
+
import { NotFoundError, NotImplementedError } from '@opengis/fastify-table/errors.js';
|
|
6
7
|
|
|
7
8
|
// todo: add to kamianske, remove custom api and test
|
|
8
9
|
// addHook('beforeCreateXmlMulti', ({ list = [], id }) => {
|
|
@@ -22,20 +23,14 @@ import checkRasterFile from '../../../plugins/mapnik/funcs/checkRasterFile.js';
|
|
|
22
23
|
// });
|
|
23
24
|
|
|
24
25
|
export default async function createXmlMulti({
|
|
25
|
-
|
|
26
|
-
},
|
|
26
|
+
id, nocache, callback = () => { }
|
|
27
|
+
}, pg = pgClients.client) {
|
|
27
28
|
if (!config.mapnik?.server) {
|
|
28
|
-
|
|
29
|
-
error: 'mapnik grpc service address not set',
|
|
30
|
-
code: 400,
|
|
31
|
-
});
|
|
29
|
+
throw NotImplementedError('mapnik grpc service address not set');
|
|
32
30
|
}
|
|
33
31
|
|
|
34
32
|
if (config.ready?.mapnik !== true) {
|
|
35
|
-
return
|
|
36
|
-
error: 'mapnik grpc service not ready',
|
|
37
|
-
code: 400,
|
|
38
|
-
});
|
|
33
|
+
return NotImplementedError('mapnik grpc service not ready');
|
|
39
34
|
}
|
|
40
35
|
|
|
41
36
|
const list = [{
|
|
@@ -43,18 +38,19 @@ export default async function createXmlMulti({
|
|
|
43
38
|
relpath: 'source_path',
|
|
44
39
|
table: 'gis.rasters',
|
|
45
40
|
srid: 'srid',
|
|
46
|
-
query: `source_path is not null ${
|
|
41
|
+
query: `source_path is not null ${id ? ` and raster_id = $1` : ''}`,
|
|
42
|
+
args: [id].filter(Boolean)
|
|
47
43
|
}];
|
|
48
44
|
|
|
49
|
-
applyHookSync('beforeCreateXmlMulti', { list, id
|
|
45
|
+
applyHookSync('beforeCreateXmlMulti', { list, id });
|
|
50
46
|
|
|
51
47
|
const rows = await Promise.all(list.filter(el => el.id && el.table && el.relpath).map(async el => pg.query(el.q ? `select ${el.id} as id, ${el.relpath} as relpath, '${el.table}' as table from (${el.q})q` : `select ${el.id} as id, ${el.relpath} as relpath, '${el.table}' as table, ${el.srid || ''} as srid from ${el.table} where ${el.query || 'true'}`).then(e => e.rows || []))).then(e => e.flat());
|
|
52
48
|
|
|
53
49
|
if (!rows.length) {
|
|
54
|
-
|
|
50
|
+
throw NotFoundError('empty rows');
|
|
55
51
|
}
|
|
56
52
|
|
|
57
|
-
const results = await checkRasterFile({ rows,
|
|
53
|
+
const results = await checkRasterFile({ rows, callback, nocache });
|
|
58
54
|
|
|
59
55
|
const q = Object.keys(results || {}).filter(key => results[key] && results[key].extent).map(key => {
|
|
60
56
|
const { extent } = results[key];
|
|
@@ -72,5 +68,5 @@ export default async function createXmlMulti({
|
|
|
72
68
|
|
|
73
69
|
if (q.length) await pg.query(q.join(';\n'));
|
|
74
70
|
|
|
75
|
-
return
|
|
71
|
+
return 'all finished';
|
|
76
72
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { config } from '@opengis/fastify-table/utils.js';
|
|
2
2
|
|
|
3
3
|
import mapnik from '../../../plugins/mapnik/funcs/mapnik.js';
|
|
4
|
+
import { BadRequestError, NotImplementedError } from '@opengis/fastify-table/errors.js';
|
|
4
5
|
|
|
5
6
|
const { FileSearch } = mapnik();
|
|
6
7
|
|
|
@@ -8,21 +9,17 @@ const maxLimit = 100;
|
|
|
8
9
|
|
|
9
10
|
// example: GET /api/gis-file-search?dir=raster/dpt&key=Аркуш_5_1_изм_ДПТ_смт_Карнаухівка_А2_modified_k
|
|
10
11
|
export default async function fileSearch({
|
|
11
|
-
|
|
12
|
-
}
|
|
12
|
+
dir, key, period, size, page, limit: queryLimit,
|
|
13
|
+
}) {
|
|
13
14
|
if (!FileSearch) {
|
|
14
|
-
|
|
15
|
+
throw NotImplementedError('mapnik server address needed');
|
|
15
16
|
}
|
|
16
17
|
|
|
17
|
-
const
|
|
18
|
-
dir, key, period, size, page,
|
|
19
|
-
} = query;
|
|
20
|
-
|
|
21
|
-
const limit = Math.min(query.limit || 16, maxLimit);
|
|
18
|
+
const limit = Math.min(queryLimit || 16, maxLimit);
|
|
22
19
|
const offset = page && page > 0 ? (page - 1) * limit : 0;
|
|
23
20
|
|
|
24
21
|
if (!key && !period && !size) {
|
|
25
|
-
|
|
22
|
+
throw BadRequestError('not enough query params: key / period / size');
|
|
26
23
|
}
|
|
27
24
|
|
|
28
25
|
const relpath = `raster/${[config.mapnik?.folder, dir].filter(Boolean).join('/')}`;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { config } from '@opengis/fastify-table/utils.js';
|
|
2
|
+
|
|
3
|
+
import { BadRequestError, NotImplementedError } from '@opengis/fastify-table/errors.js';
|
|
4
|
+
|
|
5
|
+
import mapnik from '../../../plugins/mapnik/funcs/mapnik.js';
|
|
6
|
+
|
|
7
|
+
const { FileStat } = mapnik();
|
|
8
|
+
|
|
9
|
+
// example: GET /api/gis-file-info?path=raster/henplan_osnovne_kreslennia.tif
|
|
10
|
+
export default async function fileStat({
|
|
11
|
+
path: queryPath,
|
|
12
|
+
}) {
|
|
13
|
+
if (!config.mapnik?.server) {
|
|
14
|
+
throw NotImplementedError('mapnik server not configured');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (config.ready?.mapnik !== true) {
|
|
18
|
+
throw NotImplementedError('mapnik server not ready');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (!queryPath) {
|
|
22
|
+
throw BadRequestError('not enough query params: path');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const relpath = `raster/${[config.mapnik?.folder, queryPath].filter(Boolean).join('/')}`;
|
|
26
|
+
const data = await FileStat({ path: relpath });
|
|
27
|
+
return { data };
|
|
28
|
+
}
|