@opengis/gis 0.2.49 → 0.2.50

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 (150) hide show
  1. package/README.md +5 -5
  2. package/dist/index.css +1 -1
  3. package/dist/index.js +2193 -2184
  4. package/dist/index.umd.cjs +26 -26
  5. package/dist/login-landscape.png +0 -0
  6. package/module/cls.json +6 -6
  7. package/module/gis/card/gis.metadata.table/index.yml +22 -22
  8. package/module/gis/card/gis.metadata.table/main_info.hbs +20 -20
  9. package/module/gis/card/gis.metadata.table/metadata_info.hbs +27 -27
  10. package/module/gis/card/gis.metadata.table/other.hbs +25 -25
  11. package/module/gis/card/gis.rasters.table/index.yml +11 -11
  12. package/module/gis/card/gis.rasters.table/main_info.hbs +27 -27
  13. package/module/gis/card/gis.registers.table/cls.hbs +36 -36
  14. package/module/gis/card/gis.registers.table/columns.hbs +89 -89
  15. package/module/gis/card/gis.registers.table/filters.hbs +80 -80
  16. package/module/gis/card/gis.registers.table/index.yml +23 -23
  17. package/module/gis/card/gis.registers.table/main_info.hbs +35 -35
  18. package/module/gis/card/gis.registers.table/source.hbs +45 -45
  19. package/module/gis/card/gis.services.table/attributes.hbs +91 -91
  20. package/module/gis/card/gis.services.table/filters.hbs +83 -83
  21. package/module/gis/card/gis.services.table/index.yml +25 -25
  22. package/module/gis/card/gis.services.table/main_info.hbs +27 -27
  23. package/module/gis/card/gis.services.table/source.hbs +25 -25
  24. package/module/gis/cls/bool.yes_no.json +12 -12
  25. package/module/gis/cls/encoding.json +14 -14
  26. package/module/gis/cls/geom_type.json +14 -14
  27. package/module/gis/cls/gis.column_type.json +34 -34
  28. package/module/gis/cls/gis.column_view_type.json +26 -26
  29. package/module/gis/cls/gis.filter_type.json +22 -22
  30. package/module/gis/cls/language.json +10 -10
  31. package/module/gis/cls/meta.service_type.json +42 -42
  32. package/module/gis/cls/ogc.service.json +21 -21
  33. package/module/gis/cls/service_type.json +42 -42
  34. package/module/gis/cls/source_type.json +10 -10
  35. package/module/gis/cls/standarts.json +6 -6
  36. package/module/gis/cls/topic_category.json +106 -106
  37. package/module/gis/cls/update_frequency.json +29 -29
  38. package/module/gis/cls/view.json +21 -21
  39. package/module/gis/form/gis.cartocss.form.json +45 -45
  40. package/module/gis/form/gis.group_list.form.json +17 -17
  41. package/module/gis/form/gis.maps.form.json +61 -61
  42. package/module/gis/form/gis.metadata.form.json +240 -240
  43. package/module/gis/form/gis.ogc_service.form.json +45 -45
  44. package/module/gis/form/gis.rasters.form.json +103 -103
  45. package/module/gis/form/gis.registers.form.json +124 -124
  46. package/module/gis/form/gis.registers_column.form.json +84 -84
  47. package/module/gis/form/gis.registers_filter.form.json +65 -65
  48. package/module/gis/form/gis.services.form.json +111 -111
  49. package/module/gis/form/gis.services_attributes.form.json +75 -75
  50. package/module/gis/form/gis.services_filter.form.json +65 -65
  51. package/module/gis/menu.json +43 -43
  52. package/module/gis/select/pg.columns.parent.sql +6 -6
  53. package/module/gis/select/pg.table_name.sql +17 -17
  54. package/module/gis/select/service_id.sql +1 -1
  55. package/module/gis/table/gis.cartocss.table.json +62 -62
  56. package/module/gis/table/gis.group_list.table.json +35 -35
  57. package/module/gis/table/gis.maps.table.json +108 -108
  58. package/module/gis/table/gis.metadata.table.json +70 -70
  59. package/module/gis/table/gis.ogc_service.table.json +98 -98
  60. package/module/gis/table/gis.rasters.table.json +101 -101
  61. package/module/gis/table/gis.registers.table.json +144 -144
  62. package/module/gis/table/gis.services.table.json +121 -121
  63. package/module/gis/table/site.gis.registers.table.json +88 -88
  64. package/module/gis/table/site.gis.services.table.json +106 -106
  65. package/module/gis/templates/ISO19136_2017_gml_template.xml +330 -330
  66. package/module/gis/tokens.yml +5 -5
  67. package/module/test/cls/bp_build_type.json +37 -37
  68. package/module/test/cls/ts.temp_status.json +18 -18
  69. package/module/test/cls/ts.temp_structure.ts_class.json +49 -49
  70. package/module/test/cls/ts.temp_type.json +9 -9
  71. package/module/test/layer/bp.json +59 -59
  72. package/module/test/layer/bp1.yml +33 -33
  73. package/module/test/layer/individual.yml +53 -53
  74. package/module/test/layer/ts.linking_passport.yml +55 -55
  75. package/module/test/layer/ts.temp_structure.yml +50 -50
  76. package/module/test/map/addr.yml +21 -21
  77. package/module/test/map/bp_myo.json +43 -43
  78. package/module/test/map/bpf.json +43 -43
  79. package/module/test/map/main.json +36 -36
  80. package/module/test/map/mbd.json +91 -91
  81. package/module/test/map/ts.json +52 -52
  82. package/module/test/select/address_id.json +2 -2
  83. package/module/test/select/address_id.sql +7 -7
  84. package/module/test/table/data_address.street.table.json +69 -69
  85. package/module/test/table/data_bp_myo.bp.table.json +122 -122
  86. package/package.json +75 -75
  87. package/plugin.js +45 -45
  88. package/server/migrations/maps.sql +30 -30
  89. package/server/migrations/ogc.sql +106 -106
  90. package/server/migrations/rasters.sql +263 -263
  91. package/server/migrations/services.sql +247 -247
  92. package/server/migrations/widgets.sql +20 -20
  93. package/server/plugins/crons.js +21 -21
  94. package/server/plugins/mapnik/funcs/checkRasterFile.js +92 -92
  95. package/server/plugins/mapnik/funcs/mapnik.js +112 -112
  96. package/server/plugins/mapnik/funcs/rootFolder.mjs +8 -8
  97. package/server/plugins/mapnik/map.proto +155 -155
  98. package/server/plugins/vite.js +74 -74
  99. package/server/routes/gis/cartocss/add.cartocss.js +152 -152
  100. package/server/routes/gis/cartocss/get.cartocss.js +12 -12
  101. package/server/routes/gis/dashboard.js +29 -29
  102. package/server/routes/gis/index.mjs +73 -73
  103. package/server/routes/gis/metadata/metadataXML.js +13 -13
  104. package/server/routes/gis/ogc/map.info.point.js +124 -124
  105. package/server/routes/gis/registers/add.registry.js +35 -35
  106. package/server/routes/gis/registers/del.registry.js +14 -14
  107. package/server/routes/gis/registers/funcs/classifiers.js +100 -100
  108. package/server/routes/gis/registers/funcs/columns.js +4 -4
  109. package/server/routes/gis/registers/funcs/content.type.js +9 -9
  110. package/server/routes/gis/registers/funcs/get.info.js +89 -89
  111. package/server/routes/gis/registers/funcs/handleRegistryRequest.js +145 -145
  112. package/server/routes/gis/registers/gis.export.js +148 -148
  113. package/server/routes/gis/registers/gis.registry.js +64 -64
  114. package/server/routes/gis/registers/gis.registry.list.js +59 -59
  115. package/server/routes/gis/registers/insert.columns.js +107 -107
  116. package/server/routes/gis/registers/insert.filters.js +110 -110
  117. package/server/routes/gis/registers/map.registry.js +79 -79
  118. package/server/routes/gis/services/add.service.js +64 -64
  119. package/server/routes/gis/services/del.service.js +12 -12
  120. package/server/routes/gis/services/get.layer.geom.js +27 -27
  121. package/server/routes/gis/services/get.services.col.js +33 -33
  122. package/server/routes/gis/services/get.services.js +84 -84
  123. package/server/routes/gis/services/legend.auto.js +77 -77
  124. package/server/routes/map/controllers/geojson.js +187 -187
  125. package/server/routes/map/controllers/jsonData.js +205 -205
  126. package/server/routes/map/controllers/layerList.js +60 -60
  127. package/server/routes/map/controllers/map.js +123 -123
  128. package/server/routes/map/controllers/mapCatalog.js +72 -72
  129. package/server/routes/map/controllers/mapCatalogAttribute.js +55 -55
  130. package/server/routes/map/controllers/mapFeatures.js +128 -128
  131. package/server/routes/map/controllers/mapFormat.js +83 -83
  132. package/server/routes/map/controllers/mapTiles.js +152 -152
  133. package/server/routes/map/controllers/maps.js +15 -15
  134. package/server/routes/map/controllers/marker_icon.js +43 -43
  135. package/server/routes/map/controllers/vtile.js +172 -172
  136. package/server/routes/map/index.mjs +142 -142
  137. package/server/routes/map/maps/add.map.js +43 -43
  138. package/server/routes/map/maps/del.map.js +18 -18
  139. package/server/routes/map/maps/get.map.js +80 -80
  140. package/server/routes/map/vtile1.js +170 -170
  141. package/server/routes/map/widgets/add.widget.js +38 -38
  142. package/server/routes/map/widgets/del.widget.js +22 -22
  143. package/server/routes/map/widgets/get.widget.js +40 -40
  144. package/server/routes/mapnik/controllers/createXml.js +63 -63
  145. package/server/routes/mapnik/controllers/rtile.js +106 -106
  146. package/server/routes/mapnik/controllers/rtileMBD.js +91 -91
  147. package/server/routes/mapnik/controllers/uploadRaster.js +157 -157
  148. package/server/routes/mapnik/index.js +16 -16
  149. package/server/routes/root.mjs +3 -3
  150. package/utils.js +13 -13
@@ -1,155 +1,155 @@
1
- syntax = "proto3";
2
-
3
- import "google/protobuf/struct.proto"; // after syntax!
4
-
5
- package map;
6
-
7
- // ----------------------------
8
- // Map Service
9
- // ----------------------------
10
- service MapService {
11
- rpc RenderTile(RenderTileRequest) returns (RenderTileOut);
12
- rpc ClearTile(ClearTileRequest) returns (ClearTileOut);
13
- rpc ReadDir(ReadDirRequest) returns (ReadDirOut);
14
- rpc CreateXML(CreateXMLRequest) returns (stream JobProgress); // streaming XML creation
15
- rpc UploadXML(UploadXMLRequest) returns (UploadXMLOut);
16
- rpc UploadRaster(UploadRasterRequest) returns (UploadRasterOut);
17
- rpc GetRasterStatus(GetRasterStatusRequest) returns (GetStatusOut);
18
- rpc GetStat(GetStatRequest) returns (GetStatOut);
19
- rpc GetRender(GetRenderRequest) returns (GetRenderOut);
20
- rpc GetLogs(GetLogsRequest) returns (GetLogsOut);
21
- }
22
-
23
- // ----------------------------
24
- // Messages for MapService
25
- // ----------------------------
26
- message RenderTileRequest {
27
- string name = 1;
28
- string path = 2;
29
- repeated double bbox = 3; // [minx, miny, maxx, maxy]
30
- int32 width = 4;
31
- int32 height = 5;
32
- string ttl = 6; // "5m", "1h", "1d" or "0"
33
- string debug = 7;
34
- }
35
-
36
- message RenderTileOut {
37
- string base64 = 1;
38
- bool cache = 2;
39
- string err = 3;
40
- string xml_path = 4;
41
- }
42
-
43
- message ClearTileRequest {
44
- string name = 1;
45
- string path = 2;
46
- }
47
-
48
- message ClearTileOut {
49
- string result = 1;
50
- string err = 2;
51
- }
52
-
53
- message ReadDirRequest {
54
- string path = 1;
55
- }
56
-
57
- message FileInfo {
58
- string name = 1;
59
- int64 size = 2;
60
- string date = 3;
61
- }
62
-
63
- message ReadDirOut {
64
- bool exists = 1;
65
- int32 count = 2;
66
- repeated FileInfo files = 3;
67
- }
68
-
69
- message CreateXMLRequest {
70
- string path = 1;
71
- int32 srid = 2;
72
- int32 previewZoom = 3;
73
- repeated string layers = 4;
74
- bool vrt = 5;
75
- string name = 6;
76
- string debug = 7;
77
- string nocache = 8;
78
- }
79
-
80
- message UploadXMLRequest {
81
- string name = 1;
82
- string xml = 2;
83
- string encoding = 3;
84
- }
85
-
86
- message UploadXMLOut {
87
- string status = 1;
88
- string filepath = 2;
89
- }
90
-
91
- message UploadRasterRequest {
92
- string path = 1;
93
- bytes data = 2;
94
- bool chunked = 3;
95
- int64 filesize = 4;
96
- }
97
-
98
- message UploadRasterOut {
99
- string status = 1;
100
- int64 uploaded = 2;
101
- bool finished = 3;
102
- }
103
-
104
- message GetRasterStatusRequest {
105
- string path = 1;
106
- bool md5 = 2;
107
- }
108
-
109
- message GetStatusOut {
110
- bool exists = 1;
111
- string size = 2;
112
- bool finished = 3;
113
- }
114
-
115
- message GetStatRequest {
116
- string period = 1; // "5m", "1h", "1d"
117
- }
118
-
119
- message GetStatOut {
120
- google.protobuf.Struct result = 1; // dynamic json structure, not bound by same value type like with map
121
- }
122
-
123
- message GetRenderRequest {
124
- string name = 1;
125
- string path = 2;
126
- }
127
-
128
- message GetRenderOut {
129
- string result = 1; // serialized object or placeholder
130
- }
131
-
132
- message GetLogsRequest {
133
- string period = 1; // "5m", "1h", "1d"
134
- string type = 2; // optional filter
135
- }
136
-
137
- message GetLogsOut {
138
- repeated string result = 1;
139
- }
140
-
141
- // ----------------------------
142
- // Job Service Messages
143
- // ----------------------------
144
- message JobRequest {
145
- string job_id = 1;
146
- string xml_name = 2;
147
- string xml_path = 3;
148
- repeated string layers = 4;
149
- }
150
-
151
- message JobProgress {
152
- string message = 1;
153
- string error = 2;
154
- bool done = 3;
155
- }
1
+ syntax = "proto3";
2
+
3
+ import "google/protobuf/struct.proto"; // after syntax!
4
+
5
+ package map;
6
+
7
+ // ----------------------------
8
+ // Map Service
9
+ // ----------------------------
10
+ service MapService {
11
+ rpc RenderTile(RenderTileRequest) returns (RenderTileOut);
12
+ rpc ClearTile(ClearTileRequest) returns (ClearTileOut);
13
+ rpc ReadDir(ReadDirRequest) returns (ReadDirOut);
14
+ rpc CreateXML(CreateXMLRequest) returns (stream JobProgress); // streaming XML creation
15
+ rpc UploadXML(UploadXMLRequest) returns (UploadXMLOut);
16
+ rpc UploadRaster(UploadRasterRequest) returns (UploadRasterOut);
17
+ rpc GetRasterStatus(GetRasterStatusRequest) returns (GetStatusOut);
18
+ rpc GetStat(GetStatRequest) returns (GetStatOut);
19
+ rpc GetRender(GetRenderRequest) returns (GetRenderOut);
20
+ rpc GetLogs(GetLogsRequest) returns (GetLogsOut);
21
+ }
22
+
23
+ // ----------------------------
24
+ // Messages for MapService
25
+ // ----------------------------
26
+ message RenderTileRequest {
27
+ string name = 1;
28
+ string path = 2;
29
+ repeated double bbox = 3; // [minx, miny, maxx, maxy]
30
+ int32 width = 4;
31
+ int32 height = 5;
32
+ string ttl = 6; // "5m", "1h", "1d" or "0"
33
+ string debug = 7;
34
+ }
35
+
36
+ message RenderTileOut {
37
+ string base64 = 1;
38
+ bool cache = 2;
39
+ string err = 3;
40
+ string xml_path = 4;
41
+ }
42
+
43
+ message ClearTileRequest {
44
+ string name = 1;
45
+ string path = 2;
46
+ }
47
+
48
+ message ClearTileOut {
49
+ string result = 1;
50
+ string err = 2;
51
+ }
52
+
53
+ message ReadDirRequest {
54
+ string path = 1;
55
+ }
56
+
57
+ message FileInfo {
58
+ string name = 1;
59
+ int64 size = 2;
60
+ string date = 3;
61
+ }
62
+
63
+ message ReadDirOut {
64
+ bool exists = 1;
65
+ int32 count = 2;
66
+ repeated FileInfo files = 3;
67
+ }
68
+
69
+ message CreateXMLRequest {
70
+ string path = 1;
71
+ int32 srid = 2;
72
+ int32 previewZoom = 3;
73
+ repeated string layers = 4;
74
+ bool vrt = 5;
75
+ string name = 6;
76
+ string debug = 7;
77
+ string nocache = 8;
78
+ }
79
+
80
+ message UploadXMLRequest {
81
+ string name = 1;
82
+ string xml = 2;
83
+ string encoding = 3;
84
+ }
85
+
86
+ message UploadXMLOut {
87
+ string status = 1;
88
+ string filepath = 2;
89
+ }
90
+
91
+ message UploadRasterRequest {
92
+ string path = 1;
93
+ bytes data = 2;
94
+ bool chunked = 3;
95
+ int64 filesize = 4;
96
+ }
97
+
98
+ message UploadRasterOut {
99
+ string status = 1;
100
+ int64 uploaded = 2;
101
+ bool finished = 3;
102
+ }
103
+
104
+ message GetRasterStatusRequest {
105
+ string path = 1;
106
+ bool md5 = 2;
107
+ }
108
+
109
+ message GetStatusOut {
110
+ bool exists = 1;
111
+ string size = 2;
112
+ bool finished = 3;
113
+ }
114
+
115
+ message GetStatRequest {
116
+ string period = 1; // "5m", "1h", "1d"
117
+ }
118
+
119
+ message GetStatOut {
120
+ google.protobuf.Struct result = 1; // dynamic json structure, not bound by same value type like with map
121
+ }
122
+
123
+ message GetRenderRequest {
124
+ string name = 1;
125
+ string path = 2;
126
+ }
127
+
128
+ message GetRenderOut {
129
+ string result = 1; // serialized object or placeholder
130
+ }
131
+
132
+ message GetLogsRequest {
133
+ string period = 1; // "5m", "1h", "1d"
134
+ string type = 2; // optional filter
135
+ }
136
+
137
+ message GetLogsOut {
138
+ repeated string result = 1;
139
+ }
140
+
141
+ // ----------------------------
142
+ // Job Service Messages
143
+ // ----------------------------
144
+ message JobRequest {
145
+ string job_id = 1;
146
+ string xml_name = 2;
147
+ string xml_path = 3;
148
+ repeated string layers = 4;
149
+ }
150
+
151
+ message JobProgress {
152
+ string message = 1;
153
+ string error = 2;
154
+ bool done = 3;
155
+ }
@@ -1,74 +1,74 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { createServer } from 'vite';
4
-
5
- import { config } from '@opengis/fastify-table/utils.js';
6
-
7
- const isProduction = process.env.NODE_ENV === 'production' || config.production;
8
-
9
- console.log({ isProduction });
10
-
11
- async function plugin(fastify, opts) {
12
- const viteServer = !isProduction ? await createServer({
13
- root: 'admin',
14
- server: {
15
- middlewareMode: true,
16
- },
17
- }) : null;
18
-
19
- if (!isProduction) {
20
- const dir1 = process.cwd();
21
- viteServer.watcher.add(dir1);
22
- viteServer.watcher.on('all', (d, t) => {
23
- if (!t.includes('module')) return;
24
- console.log(d, t);
25
- viteServer.ws.send({ type: 'full-reload' });
26
- });
27
-
28
- // this is middleware for vite's dev server
29
- fastify.addHook('onRequest', async (req, reply) => {
30
- const { user } = req.session?.passport || {};
31
- // console.log(req.url);
32
-
33
- const next = () => new Promise((resolve) => {
34
- viteServer.middlewares(req.raw, reply.raw, () => resolve());
35
- });
36
-
37
- await next();
38
- });
39
- }
40
-
41
- async function staticFile(req, reply) {
42
- const assetsDir = 'admin/dist';
43
-
44
- const filePathDist = path.join(assetsDir, req.url.replace('/public/', '/'));
45
- const filePathAssets = path.join('assets', req.url.replace('/assets', ''));
46
-
47
- const filePath = fs.existsSync(filePathDist) ? filePathDist : filePathAssets; // check dist or assets
48
- const ext = path.extname(filePath);
49
-
50
- if (!fs.existsSync(filePath)) return { status: 404, message: 'not found' };
51
- const mime = {
52
- '.js': 'text/javascript', '.css': 'text/css', '.woff2': 'application/font-woff', '.png': 'image/png', '.svg': 'image/svg+xml', '.jpg': 'image/jpg',
53
- }[ext];
54
- reply.headers({ 'Cache-control': 'max-age=3600, public', 'Content-Encoding': 'identity' });
55
-
56
- const stream = fs.createReadStream(filePath);
57
- return mime ? reply.type(mime).send(stream) : stream;
58
- }
59
- fastify.get('/assets/*', staticFile);
60
- fastify.get('/public/*', staticFile);
61
-
62
- fastify.get('*', async (req, reply) => {
63
- const { user } = req.session?.passport || {};
64
- // console.log(req.url);
65
- if (!user && req.url !== '/login') {
66
- return reply.redirect('/login');
67
- }
68
- if (!isProduction) return null; // admin vite
69
- const stream = fs.createReadStream('admin/dist/index.html');
70
- return reply.type('text/html').send(stream);
71
- });
72
- }
73
-
74
- export default plugin;
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createServer } from 'vite';
4
+
5
+ import { config } from '@opengis/fastify-table/utils.js';
6
+
7
+ const isProduction = process.env.NODE_ENV === 'production' || config.production;
8
+
9
+ console.log({ isProduction });
10
+
11
+ async function plugin(fastify, opts) {
12
+ const viteServer = !isProduction ? await createServer({
13
+ root: 'admin',
14
+ server: {
15
+ middlewareMode: true,
16
+ },
17
+ }) : null;
18
+
19
+ if (!isProduction) {
20
+ const dir1 = process.cwd();
21
+ viteServer.watcher.add(dir1);
22
+ viteServer.watcher.on('all', (d, t) => {
23
+ if (!t.includes('module')) return;
24
+ console.log(d, t);
25
+ viteServer.ws.send({ type: 'full-reload' });
26
+ });
27
+
28
+ // this is middleware for vite's dev server
29
+ fastify.addHook('onRequest', async (req, reply) => {
30
+ const { user } = req.session?.passport || {};
31
+ // console.log(req.url);
32
+
33
+ const next = () => new Promise((resolve) => {
34
+ viteServer.middlewares(req.raw, reply.raw, () => resolve());
35
+ });
36
+
37
+ await next();
38
+ });
39
+ }
40
+
41
+ async function staticFile(req, reply) {
42
+ const assetsDir = 'admin/dist';
43
+
44
+ const filePathDist = path.join(assetsDir, req.url.replace('/public/', '/'));
45
+ const filePathAssets = path.join('assets', req.url.replace('/assets', ''));
46
+
47
+ const filePath = fs.existsSync(filePathDist) ? filePathDist : filePathAssets; // check dist or assets
48
+ const ext = path.extname(filePath);
49
+
50
+ if (!fs.existsSync(filePath)) return { status: 404, message: 'not found' };
51
+ const mime = {
52
+ '.js': 'text/javascript', '.css': 'text/css', '.woff2': 'application/font-woff', '.png': 'image/png', '.svg': 'image/svg+xml', '.jpg': 'image/jpg',
53
+ }[ext];
54
+ reply.headers({ 'Cache-control': 'max-age=3600, public', 'Content-Encoding': 'identity' });
55
+
56
+ const stream = fs.createReadStream(filePath);
57
+ return mime ? reply.type(mime).send(stream) : stream;
58
+ }
59
+ fastify.get('/assets/*', staticFile);
60
+ fastify.get('/public/*', staticFile);
61
+
62
+ fastify.get('*', async (req, reply) => {
63
+ const { user } = req.session?.passport || {};
64
+ // console.log(req.url);
65
+ if (!user && req.url !== '/login') {
66
+ return reply.redirect('/login');
67
+ }
68
+ if (!isProduction) return null; // admin vite
69
+ const stream = fs.createReadStream('admin/dist/index.html');
70
+ return reply.type('text/html').send(stream);
71
+ });
72
+ }
73
+
74
+ export default plugin;