@basemaps/cli-config 8.0.0
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/LICENSE +21 -0
- package/README.md +35 -0
- package/build/__tests__/util.test.d.ts +1 -0
- package/build/__tests__/util.test.js +15 -0
- package/build/__tests__/util.test.js.map +1 -0
- package/build/bin.d.ts +1 -0
- package/build/bin.js +11 -0
- package/build/bin.js.map +1 -0
- package/build/cli/action.bundle.assets.d.ts +17 -0
- package/build/cli/action.bundle.assets.js +97 -0
- package/build/cli/action.bundle.assets.js.map +1 -0
- package/build/cli/action.bundle.d.ts +21 -0
- package/build/cli/action.bundle.js +58 -0
- package/build/cli/action.bundle.js.map +1 -0
- package/build/cli/action.create.config.d.ts +19 -0
- package/build/cli/action.create.config.js +79 -0
- package/build/cli/action.create.config.js.map +1 -0
- package/build/cli/action.import.d.ts +19 -0
- package/build/cli/action.import.js +335 -0
- package/build/cli/action.import.js.map +1 -0
- package/build/cli/config.diff.d.ts +27 -0
- package/build/cli/config.diff.js +146 -0
- package/build/cli/config.diff.js.map +1 -0
- package/build/cli/config.update.d.ts +24 -0
- package/build/cli/config.update.js +115 -0
- package/build/cli/config.update.js.map +1 -0
- package/build/index.d.ts +105 -0
- package/build/index.js +15 -0
- package/build/index.js.map +1 -0
- package/build/util.d.ts +23 -0
- package/build/util.js +136 -0
- package/build/util.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import { ConfigId, ConfigPrefix, ConfigProviderMemory, TileSetType, } from '@basemaps/config';
|
|
2
|
+
import { GoogleTms, Nztm2000QuadTms } from '@basemaps/geo';
|
|
3
|
+
import { Env, fsa, getDefaultConfig, getLogger, getPreviewUrl, logArguments, setDefaultConfig, } from '@basemaps/shared';
|
|
4
|
+
import { CliInfo } from '@basemaps/shared/build/cli/info.js';
|
|
5
|
+
import { command, flag, option, optional, string } from 'cmd-ts';
|
|
6
|
+
import fetch from 'node-fetch';
|
|
7
|
+
import { invalidateCache } from '../util.js';
|
|
8
|
+
import { diffVectorUpdate } from './config.diff.js';
|
|
9
|
+
import { Q, Updater } from './config.update.js';
|
|
10
|
+
const PublicUrlBase = Env.isProduction() ? 'https://basemaps.linz.govt.nz/' : 'https://dev.basemaps.linz.govt.nz/';
|
|
11
|
+
const VectorStyles = ['topographic', 'topolite', 'aerialhybrid']; // Vector styles that we want to review if vector data changes.
|
|
12
|
+
export const ImportCommand = command({
|
|
13
|
+
name: 'import',
|
|
14
|
+
version: CliInfo.version,
|
|
15
|
+
description: 'Given a valid bundle config json, import them into dynamodb',
|
|
16
|
+
args: {
|
|
17
|
+
...logArguments,
|
|
18
|
+
config: option({
|
|
19
|
+
type: string,
|
|
20
|
+
long: 'config',
|
|
21
|
+
description: 'Path of config json, this can be both a local path or s3 location',
|
|
22
|
+
}),
|
|
23
|
+
output: option({
|
|
24
|
+
type: string,
|
|
25
|
+
long: 'output',
|
|
26
|
+
description: 'Output a markdown file with the config changes',
|
|
27
|
+
}),
|
|
28
|
+
target: option({
|
|
29
|
+
type: optional(string),
|
|
30
|
+
long: 'target',
|
|
31
|
+
description: 'Target config file to compare',
|
|
32
|
+
}),
|
|
33
|
+
commit: flag({
|
|
34
|
+
long: 'commit',
|
|
35
|
+
description: 'Actually start the import',
|
|
36
|
+
defaultValue: () => false,
|
|
37
|
+
defaultValueIsSerializable: true,
|
|
38
|
+
}),
|
|
39
|
+
},
|
|
40
|
+
async handler(args) {
|
|
41
|
+
const logger = getLogger(this, args, 'cli-config');
|
|
42
|
+
const commit = args.commit;
|
|
43
|
+
const config = args.config;
|
|
44
|
+
if (config == null)
|
|
45
|
+
throw new Error('Please provide a config json');
|
|
46
|
+
if (commit && !config.startsWith('s3://') && Env.isProduction()) {
|
|
47
|
+
throw new Error('To actually import into dynamo has to use the config file from s3.');
|
|
48
|
+
}
|
|
49
|
+
const configUrl = fsa.toUrl(config);
|
|
50
|
+
const cfg = await getConfig(logger, args.target);
|
|
51
|
+
const HostPrefix = Env.isProduction() ? '' : 'dev.';
|
|
52
|
+
const healthEndpoint = `https://${HostPrefix}basemaps.linz.govt.nz/v1/health`;
|
|
53
|
+
logger.info({ url: healthEndpoint }, 'Import:ValidateHealth');
|
|
54
|
+
if (commit) {
|
|
55
|
+
const res = await fetch(healthEndpoint);
|
|
56
|
+
if (!res.ok)
|
|
57
|
+
throw new Error('Cannot update basemaps is unhealthy');
|
|
58
|
+
}
|
|
59
|
+
logger.info({ config }, 'Import:Load');
|
|
60
|
+
const configJson = await fsa.readJson(configUrl);
|
|
61
|
+
const mem = ConfigProviderMemory.fromJson(configJson);
|
|
62
|
+
mem.createVirtualTileSets();
|
|
63
|
+
logger.info({ config }, 'Import:Start');
|
|
64
|
+
const objectTypes = {};
|
|
65
|
+
for (const config of mem.objects.values()) {
|
|
66
|
+
const objectType = ConfigId.getPrefix(config.id);
|
|
67
|
+
if (objectType) {
|
|
68
|
+
objectTypes[objectType] = (objectTypes[objectType] ?? 0) + 1;
|
|
69
|
+
}
|
|
70
|
+
update(config, cfg, commit);
|
|
71
|
+
}
|
|
72
|
+
await Promise.all(promises);
|
|
73
|
+
logger.info({ objects: mem.objects.size, types: objectTypes }, 'Import:Compare:Done');
|
|
74
|
+
if (commit) {
|
|
75
|
+
const configBundle = {
|
|
76
|
+
id: cfg.ConfigBundle.id(configJson.hash),
|
|
77
|
+
name: cfg.ConfigBundle.id(`config-${configJson.hash}.json`),
|
|
78
|
+
path: config,
|
|
79
|
+
hash: configJson.hash,
|
|
80
|
+
assets: configJson.assets,
|
|
81
|
+
};
|
|
82
|
+
logger.info({ config }, 'Import:ConfigBundle');
|
|
83
|
+
if (cfg.ConfigBundle.isWriteable()) {
|
|
84
|
+
// Insert a cb_hash record for reference
|
|
85
|
+
await cfg.ConfigBundle.put(configBundle);
|
|
86
|
+
// Update the cb_latest record
|
|
87
|
+
configBundle.id = cfg.ConfigBundle.id('latest');
|
|
88
|
+
await cfg.ConfigBundle.put(configBundle);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
logger.error('Import:NotWriteable');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (commit && invalidations.length > 0) {
|
|
95
|
+
// Lots of invalidations just invalidate everything
|
|
96
|
+
if (invalidations.length > 10) {
|
|
97
|
+
await invalidateCache('/*', commit);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
await invalidateCache(invalidations, commit);
|
|
101
|
+
}
|
|
102
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
103
|
+
const res = await fetch(healthEndpoint);
|
|
104
|
+
if (!res.ok)
|
|
105
|
+
throw new Error('Basemaps is unhealthy');
|
|
106
|
+
}
|
|
107
|
+
const output = args.output;
|
|
108
|
+
if (output)
|
|
109
|
+
await outputChange(output, mem, cfg, config);
|
|
110
|
+
if (commit !== true)
|
|
111
|
+
logger.info('DryRun:Done');
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
async function getConfig(logger, target) {
|
|
115
|
+
if (target) {
|
|
116
|
+
logger.info({ config: target }, 'Import:Target:Load');
|
|
117
|
+
const configJson = await fsa.readJson(fsa.toUrl(target));
|
|
118
|
+
const mem = ConfigProviderMemory.fromJson(configJson);
|
|
119
|
+
mem.createVirtualTileSets();
|
|
120
|
+
setDefaultConfig(mem);
|
|
121
|
+
return mem;
|
|
122
|
+
}
|
|
123
|
+
return getDefaultConfig();
|
|
124
|
+
}
|
|
125
|
+
const promises = [];
|
|
126
|
+
/** List of paths to invalidate at the end of the request */
|
|
127
|
+
const invalidations = [];
|
|
128
|
+
/** List of changed config */
|
|
129
|
+
const changes = [];
|
|
130
|
+
/** List of paths to invalidate at the end of the request */
|
|
131
|
+
const backupConfig = new ConfigProviderMemory();
|
|
132
|
+
function update(config, oldConfig, commit) {
|
|
133
|
+
const promise = Q(async () => {
|
|
134
|
+
const updater = new Updater(config, oldConfig, commit);
|
|
135
|
+
const hasChanges = await updater.reconcile();
|
|
136
|
+
if (hasChanges) {
|
|
137
|
+
changes.push(config);
|
|
138
|
+
invalidations.push(updater.invalidatePath());
|
|
139
|
+
const oldData = await updater.getOldData();
|
|
140
|
+
if (oldData != null)
|
|
141
|
+
backupConfig.put(oldData); // No need to backup anything if there is new insert
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
backupConfig.put(config);
|
|
145
|
+
}
|
|
146
|
+
return true;
|
|
147
|
+
});
|
|
148
|
+
promises.push(promise);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* This function compared new config with existing and output a markdown document to highlight the inserts and changes
|
|
152
|
+
* Changes includes
|
|
153
|
+
* - aerial config
|
|
154
|
+
* - vector config
|
|
155
|
+
* - vector style
|
|
156
|
+
* - individual config
|
|
157
|
+
*
|
|
158
|
+
* @param output a string of output markdown location
|
|
159
|
+
* @param mem new config data read from config bundle file
|
|
160
|
+
* @param cfg existing config data
|
|
161
|
+
* @param configPath path of config json
|
|
162
|
+
*/
|
|
163
|
+
async function outputChange(output, mem, cfg, configPath) {
|
|
164
|
+
const md = [];
|
|
165
|
+
// Output for aerial config changes
|
|
166
|
+
const inserts = [];
|
|
167
|
+
const updates = [];
|
|
168
|
+
const aerialId = 'ts_aerial';
|
|
169
|
+
const newData = await mem.TileSet.get(aerialId);
|
|
170
|
+
const oldData = await cfg.TileSet.get(aerialId);
|
|
171
|
+
const aerialLayers = new Set();
|
|
172
|
+
if (newData == null || oldData == null)
|
|
173
|
+
throw new Error('Failed to fetch aerial config data.');
|
|
174
|
+
for (const layer of newData.layers) {
|
|
175
|
+
// if (aerialLayers.has(layer.name)) continue;
|
|
176
|
+
aerialLayers.add(layer.name);
|
|
177
|
+
// There are duplicates layers inside the config this makes it hard to know what has changed
|
|
178
|
+
// so only allow comparisons to one layer at a time
|
|
179
|
+
const index = oldData.layers.findIndex((l) => l.name === layer.name);
|
|
180
|
+
if (index > -1) {
|
|
181
|
+
const [el] = oldData.layers.splice(index, 1);
|
|
182
|
+
await outputUpdatedLayers(mem, layer, el, updates, configPath, true);
|
|
183
|
+
}
|
|
184
|
+
else
|
|
185
|
+
await outputNewLayers(mem, layer, inserts, configPath, true);
|
|
186
|
+
}
|
|
187
|
+
if (inserts.length > 0)
|
|
188
|
+
md.push('# Aerial Imagery Inserts', ...inserts);
|
|
189
|
+
if (updates.length > 0)
|
|
190
|
+
md.push('# Aerial Imagery Updates', ...updates);
|
|
191
|
+
// Some layers were not removed from the old config so they no longer exist in the new config
|
|
192
|
+
if (oldData.layers.length > 0) {
|
|
193
|
+
md.push('# Aerial Imagery Deletes', ...oldData.layers.map((m) => `- ${m.title}`));
|
|
194
|
+
}
|
|
195
|
+
// Output for individual tileset config changes or inserts
|
|
196
|
+
const individualInserts = [];
|
|
197
|
+
const individualUpdates = [];
|
|
198
|
+
for (const config of mem.objects.values()) {
|
|
199
|
+
if (!mem.TileSet.is(config))
|
|
200
|
+
continue;
|
|
201
|
+
if (config.id === 'ts_aerial')
|
|
202
|
+
continue;
|
|
203
|
+
if (aerialLayers.has(config.name))
|
|
204
|
+
continue;
|
|
205
|
+
if (config.type === TileSetType.Vector)
|
|
206
|
+
continue;
|
|
207
|
+
if (config.layers.length > 1)
|
|
208
|
+
continue; // Not an individual layer
|
|
209
|
+
const existing = await cfg.TileSet.get(config.id);
|
|
210
|
+
const layer = config.layers[0];
|
|
211
|
+
if (existing)
|
|
212
|
+
await outputUpdatedLayers(mem, layer, existing.layers[0], individualUpdates, configPath);
|
|
213
|
+
else
|
|
214
|
+
await outputNewLayers(mem, layer, individualInserts, configPath);
|
|
215
|
+
}
|
|
216
|
+
if (individualInserts.length > 0)
|
|
217
|
+
md.push('# Individual Inserts', ...individualInserts);
|
|
218
|
+
if (individualUpdates.length > 0)
|
|
219
|
+
md.push('# Individual Updates', ...individualUpdates);
|
|
220
|
+
// Output for vector config changes
|
|
221
|
+
const vectorUpdate = [];
|
|
222
|
+
const styleUpdate = [];
|
|
223
|
+
for (const change of changes) {
|
|
224
|
+
if (mem.TileSet.is(change) && change.type === TileSetType.Vector) {
|
|
225
|
+
vectorUpdate.push(`## Vector data updates for ${change.id}`);
|
|
226
|
+
const id = ConfigId.unprefix(ConfigPrefix.TileSet, change.id);
|
|
227
|
+
for (const style of VectorStyles) {
|
|
228
|
+
vectorUpdate.push(`* [${style} - ${id}](${PublicUrlBase}?config=${configPath}&i=${id}&s=${style}&debug)\n`);
|
|
229
|
+
}
|
|
230
|
+
const existingTileSet = await cfg.TileSet.get(change.id);
|
|
231
|
+
const featureChanges = await diffVectorUpdate(change, existingTileSet);
|
|
232
|
+
vectorUpdate.push(`## Feature updates for ${change.id}`);
|
|
233
|
+
vectorUpdate.push(...featureChanges);
|
|
234
|
+
}
|
|
235
|
+
if (mem.Style.is(change)) {
|
|
236
|
+
styleUpdate.push(`## Vector Style updated for ${change.id}`);
|
|
237
|
+
const style = ConfigId.unprefix(ConfigPrefix.Style, change.id);
|
|
238
|
+
styleUpdate.push(`* [${style}](${PublicUrlBase}?config=${configPath}&i=topographic&s=${style}&debug)\n`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (styleUpdate.length > 0)
|
|
242
|
+
md.push('# Vector Style Update', ...styleUpdate);
|
|
243
|
+
if (vectorUpdate.length > 0)
|
|
244
|
+
md.push('# Vector Data Update', ...vectorUpdate);
|
|
245
|
+
if (md.length > 0) {
|
|
246
|
+
await fsa.write(fsa.toUrl(output), md.join('\n'));
|
|
247
|
+
}
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* This function prepare for the markdown lines with preview urls for new inserted config layers
|
|
252
|
+
* @param mem new config data read from config bundle file
|
|
253
|
+
* @param layer new config tileset layer
|
|
254
|
+
* @param inserts string array to save all the lines for markdown output
|
|
255
|
+
* @param configPath path of config json
|
|
256
|
+
* @param aerial output preview link for aerial map
|
|
257
|
+
*/
|
|
258
|
+
async function outputNewLayers(mem, layer, inserts, configPath, aerial) {
|
|
259
|
+
inserts.push(`\n### ${layer.name}\n`);
|
|
260
|
+
if (layer[2193]) {
|
|
261
|
+
const urls = await prepareUrl(layer[2193], mem, Nztm2000QuadTms, configPath);
|
|
262
|
+
inserts.push(` - [NZTM2000Quad](${urls.layer})`);
|
|
263
|
+
if (aerial)
|
|
264
|
+
inserts.push(` - [Aerial](${urls.tag})`);
|
|
265
|
+
}
|
|
266
|
+
if (layer[3857]) {
|
|
267
|
+
const urls = await prepareUrl(layer[3857], mem, GoogleTms, configPath);
|
|
268
|
+
inserts.push(` - [WebMercatorQuad](${urls.layer})`);
|
|
269
|
+
if (aerial)
|
|
270
|
+
inserts.push(` - [Aerial](${urls.tag})`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* This function compared new config tileset layer with existing one, then output the markdown lines for updates and preview urls.
|
|
275
|
+
* @param mem new config data read from config bundle file
|
|
276
|
+
* @param layer new config tileset layer
|
|
277
|
+
* @param existing existing config tileset layer
|
|
278
|
+
* @param updates string array to save all the lines for markdown output
|
|
279
|
+
* @param configPath path of config json
|
|
280
|
+
* @param aerial output preview link for aerial map
|
|
281
|
+
*/
|
|
282
|
+
async function outputUpdatedLayers(mem, layer, existing, updates, configPath, aerial) {
|
|
283
|
+
let zoom = undefined;
|
|
284
|
+
if (layer.minZoom !== existing.minZoom || layer.maxZoom !== existing.maxZoom) {
|
|
285
|
+
zoom = ' - Zoom level updated.';
|
|
286
|
+
if (layer.minZoom !== existing.minZoom)
|
|
287
|
+
zoom += ` min zoom ${existing.minZoom} -> ${layer.minZoom}`;
|
|
288
|
+
if (layer.maxZoom !== existing.maxZoom)
|
|
289
|
+
zoom += ` max zoom ${existing.maxZoom} -> ${layer.maxZoom}`;
|
|
290
|
+
}
|
|
291
|
+
const change = [`\n### ${layer.name}\n`];
|
|
292
|
+
if (layer[2193]) {
|
|
293
|
+
if (layer[2193] !== existing[2193]) {
|
|
294
|
+
const urls = await prepareUrl(layer[2193], mem, Nztm2000QuadTms, configPath);
|
|
295
|
+
change.push(`- Layer update [NZTM2000Quad](${urls.layer})`);
|
|
296
|
+
if (aerial)
|
|
297
|
+
updates.push(` - [Aerial](${urls.tag})`);
|
|
298
|
+
}
|
|
299
|
+
if (zoom) {
|
|
300
|
+
const urls = await prepareUrl(layer[2193], mem, Nztm2000QuadTms, configPath);
|
|
301
|
+
zoom += ` [NZTM2000Quad](${urls.tag})`;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (layer[3857]) {
|
|
305
|
+
if (layer[3857] !== existing[3857]) {
|
|
306
|
+
const urls = await prepareUrl(layer[3857], mem, GoogleTms, configPath);
|
|
307
|
+
change.push(`- Layer update [WebMercatorQuad](${urls.layer})`);
|
|
308
|
+
if (aerial)
|
|
309
|
+
updates.push(` - [Aerial](${urls.tag})`);
|
|
310
|
+
}
|
|
311
|
+
if (zoom) {
|
|
312
|
+
const urls = await prepareUrl(layer[3857], mem, GoogleTms, configPath);
|
|
313
|
+
zoom += ` [WebMercatorQuad](${urls.tag})`;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (zoom)
|
|
317
|
+
change.push(`${zoom}\n`);
|
|
318
|
+
if (change.length > 1)
|
|
319
|
+
updates.push(change.join(''));
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Prepare QA urls with center location
|
|
323
|
+
*/
|
|
324
|
+
async function prepareUrl(id, mem, tileMatrix, configPath) {
|
|
325
|
+
const configImagery = await mem.Imagery.get(id);
|
|
326
|
+
if (configImagery == null)
|
|
327
|
+
throw new Error(`Failed to find imagery config from config bundle file. Id: ${id}`);
|
|
328
|
+
const center = getPreviewUrl({ imagery: configImagery });
|
|
329
|
+
const urls = {
|
|
330
|
+
layer: `${PublicUrlBase}?config=${configPath}&i=${center.name}&p=${tileMatrix.identifier}&debug#@${center.location.lat},${center.location.lon},z${center.location.zoom}`,
|
|
331
|
+
tag: `${PublicUrlBase}?config=${configPath}&p=${tileMatrix.identifier}&debug#@${center.location.lat},${center.location.lon},z${center.location.zoom}`,
|
|
332
|
+
};
|
|
333
|
+
return urls;
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=action.import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.import.js","sourceRoot":"","sources":["../../src/cli/action.import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ConfigTileSet } from '@basemaps/config';
|
|
2
|
+
import { StacLink } from '@basemaps/geo';
|
|
3
|
+
import { LogType } from '@basemaps/shared';
|
|
4
|
+
import diff from 'deep-diff';
|
|
5
|
+
export declare const IgnoredProperties: Set<string>;
|
|
6
|
+
interface StacLinkLds extends StacLink {
|
|
7
|
+
'lds:id': string;
|
|
8
|
+
'lds:name': string;
|
|
9
|
+
'lds:feature_count': number;
|
|
10
|
+
'lds:version': string;
|
|
11
|
+
}
|
|
12
|
+
export declare class ConfigDiff {
|
|
13
|
+
static getDiff<T>(changes: diff.Diff<T, T>[]): string;
|
|
14
|
+
static showDiff<T extends {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
}>(type: string, oldData: T, newData: T, logger: LogType): boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Given a old and new lds layer stac item and log the changes
|
|
21
|
+
*/
|
|
22
|
+
export declare function getVectorChanges(newLayer: StacLinkLds | undefined, existingLayer: StacLinkLds | undefined): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* Prepare and create pull request for the aerial tileset config
|
|
25
|
+
*/
|
|
26
|
+
export declare function diffVectorUpdate(tileSet: ConfigTileSet, existingTileSet: ConfigTileSet | null): Promise<string[]>;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { Epsg } from '@basemaps/geo';
|
|
2
|
+
import { fsa } from '@basemaps/shared';
|
|
3
|
+
import c from 'ansi-colors';
|
|
4
|
+
import diff from 'deep-diff';
|
|
5
|
+
export const IgnoredProperties = new Set(['id', 'createdAt', 'updatedAt', 'year', 'resolution']);
|
|
6
|
+
export class ConfigDiff {
|
|
7
|
+
static getDiff(changes) {
|
|
8
|
+
let output = '';
|
|
9
|
+
let isArray = false;
|
|
10
|
+
for (const change of changes) {
|
|
11
|
+
if (change.kind === 'A') {
|
|
12
|
+
if (change.path)
|
|
13
|
+
output += change.path.join();
|
|
14
|
+
output += this.getDiff([change.item]);
|
|
15
|
+
isArray = true; // Stop displaying the array changes for each line.
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
if (isArray)
|
|
19
|
+
continue;
|
|
20
|
+
if (change.kind === 'E') {
|
|
21
|
+
if (change.path)
|
|
22
|
+
output += change.path.join();
|
|
23
|
+
output += c.green('\t+' + JSON.stringify(change.rhs));
|
|
24
|
+
output += c.red('\t-' + JSON.stringify(change.lhs)) + '\n';
|
|
25
|
+
}
|
|
26
|
+
else if (change.kind === 'N') {
|
|
27
|
+
if (change.path)
|
|
28
|
+
output += change.path.join();
|
|
29
|
+
output += c.green('\t+' + JSON.stringify(change.rhs)) + '\n';
|
|
30
|
+
}
|
|
31
|
+
else if (change.kind === 'D') {
|
|
32
|
+
if (change.path)
|
|
33
|
+
output += change.path.join();
|
|
34
|
+
output += c.red('\t-' + JSON.stringify(change.lhs)) + '\n';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return output;
|
|
39
|
+
}
|
|
40
|
+
static showDiff(type, oldData, newData, logger) {
|
|
41
|
+
const changes = diff.diff(oldData, newData, (_path, key) => IgnoredProperties.has(key));
|
|
42
|
+
if (changes) {
|
|
43
|
+
const changeDif = ConfigDiff.getDiff(changes);
|
|
44
|
+
logger.info({ type, record: newData.id, description: newData.name }, 'Changes');
|
|
45
|
+
// eslint-disable-next-line no-console
|
|
46
|
+
console.log(newData.id, newData.name);
|
|
47
|
+
// eslint-disable-next-line no-console
|
|
48
|
+
console.log(changeDif);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Given a old and new lds layer stac item and log the changes
|
|
56
|
+
*/
|
|
57
|
+
export function getVectorChanges(newLayer, existingLayer) {
|
|
58
|
+
// Update Layer
|
|
59
|
+
if (newLayer != null && existingLayer != null) {
|
|
60
|
+
const featureChange = Number(newLayer['lds:feature_count']) - Number(existingLayer['lds:feature_count']);
|
|
61
|
+
if (newLayer['lds:version'] === existingLayer['lds:version']) {
|
|
62
|
+
// Alert if feature changed with no version bump.
|
|
63
|
+
if (featureChange !== 0) {
|
|
64
|
+
return `🟥🟥🟥🟥 Feature Change Detected ${newLayer['lds:name']} - version: ${newLayer['lds:version']} features: ${newLayer['lds:feature_count']} (+${featureChange}) 🟥🟥🟥🟥`;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
if (featureChange >= 0) {
|
|
69
|
+
// Add Features
|
|
70
|
+
return `🟦 ${newLayer['lds:name']} - version: ${newLayer['lds:version']} (from: ${existingLayer['lds:version']}) features: ${newLayer['lds:feature_count']} (+${featureChange})`;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// Remove Features
|
|
74
|
+
return `🟧 ${newLayer['lds:name']} - version: ${newLayer['lds:version']} (from: ${existingLayer['lds:version']}) features: ${newLayer['lds:feature_count']} (-${featureChange})`;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Add new Layer
|
|
78
|
+
if (newLayer != null && existingLayer == null) {
|
|
79
|
+
return `🟩 ${newLayer['lds:name']} - version: ${newLayer['lds:version']} features: ${newLayer['lds:feature_count']}`;
|
|
80
|
+
}
|
|
81
|
+
// Remove Layer
|
|
82
|
+
if (newLayer == null && existingLayer != null) {
|
|
83
|
+
return `🟥 ${existingLayer['lds:name']} features: -${existingLayer['lds:feature_count']}`;
|
|
84
|
+
}
|
|
85
|
+
// No changes detected return null
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Prepare and create pull request for the aerial tileset config
|
|
90
|
+
*/
|
|
91
|
+
export async function diffVectorUpdate(tileSet, existingTileSet) {
|
|
92
|
+
// Vector layer only support for 3857 and only contain on layer inside
|
|
93
|
+
const changes = [];
|
|
94
|
+
const layer = tileSet.layers[0];
|
|
95
|
+
if (layer?.[Epsg.Google.code] == null)
|
|
96
|
+
throw new Error(`Invalid layers in the vector tileSet ${tileSet.id}`);
|
|
97
|
+
const newCollectionPath = new URL('collection.json', layer[Epsg.Google.code]);
|
|
98
|
+
const newCollection = await fsa.readJson(newCollectionPath);
|
|
99
|
+
if (newCollection == null)
|
|
100
|
+
throw new Error(`Failed to get target collection json from ${newCollectionPath.href}.`);
|
|
101
|
+
const ldsLayers = newCollection.links.filter((f) => f.rel === 'lds:layer');
|
|
102
|
+
// Log all the new inserts for new tileset
|
|
103
|
+
if (existingTileSet == null) {
|
|
104
|
+
for (const l of ldsLayers) {
|
|
105
|
+
const change = getVectorChanges(l, undefined);
|
|
106
|
+
if (change != null)
|
|
107
|
+
changes.push(change);
|
|
108
|
+
}
|
|
109
|
+
return changes;
|
|
110
|
+
}
|
|
111
|
+
// Compare the different of existing tileset, we usually only have one layers in the vector tiles, so the loop won't fetch very much
|
|
112
|
+
for (const l of existingTileSet.layers) {
|
|
113
|
+
if (l[Epsg.Google.code] == null)
|
|
114
|
+
continue;
|
|
115
|
+
if (l.name !== layer.name)
|
|
116
|
+
continue;
|
|
117
|
+
const existingCollectionPath = new URL('collection.json', l[Epsg.Google.code]);
|
|
118
|
+
const existingCollection = await fsa.readJson(existingCollectionPath);
|
|
119
|
+
if (existingCollection == null) {
|
|
120
|
+
throw new Error(`Failed to get target collection json from ${existingCollectionPath.href}.`);
|
|
121
|
+
}
|
|
122
|
+
// Prepare existing lds layers as map
|
|
123
|
+
const existingLdsLayers = new Map();
|
|
124
|
+
for (const item of existingCollection.links) {
|
|
125
|
+
if (item.rel === 'lds:layer')
|
|
126
|
+
existingLdsLayers.set(item['lds:id'], item);
|
|
127
|
+
}
|
|
128
|
+
// Find layer updates
|
|
129
|
+
for (const l of ldsLayers) {
|
|
130
|
+
const existingLayer = existingLdsLayers.get(l['lds:id']);
|
|
131
|
+
const change = getVectorChanges(l, existingLayer);
|
|
132
|
+
if (change != null)
|
|
133
|
+
changes.push(change);
|
|
134
|
+
if (existingLayer != null)
|
|
135
|
+
existingLdsLayers.delete(l['lds:id']);
|
|
136
|
+
}
|
|
137
|
+
// Remove the layers that not deleted from existingLdsLayers
|
|
138
|
+
for (const l of existingLdsLayers.values()) {
|
|
139
|
+
const change = getVectorChanges(l, undefined);
|
|
140
|
+
if (change != null)
|
|
141
|
+
changes.push(change);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return changes;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=config.diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.diff.js","sourceRoot":"","sources":["../../src/cli/config.diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BaseConfig, BasemapsConfigObject, BasemapsConfigProvider, ConfigImagery, ConfigPrefix, ConfigProvider, ConfigTileSet, ConfigVectorStyle } from '@basemaps/config';
|
|
2
|
+
import { LogType } from '@basemaps/shared';
|
|
3
|
+
export declare const Q: import("p-limit").LimitFunction;
|
|
4
|
+
export declare class Updater<S extends BaseConfig = BaseConfig> {
|
|
5
|
+
config: S;
|
|
6
|
+
_oldData?: Promise<ConfigImagery | ConfigTileSet | ConfigProvider | ConfigVectorStyle | null>;
|
|
7
|
+
prefix: ConfigPrefix;
|
|
8
|
+
isCommit: boolean;
|
|
9
|
+
logger: LogType;
|
|
10
|
+
cfg: BasemapsConfigProvider;
|
|
11
|
+
/**
|
|
12
|
+
* Class to apply an TileSetConfig source to the tile metadata db
|
|
13
|
+
* @param config a string or TileSetConfig to use
|
|
14
|
+
*/
|
|
15
|
+
constructor(config: S, oldConfig: BasemapsConfigProvider, isCommit: boolean);
|
|
16
|
+
getDB(): BasemapsConfigObject<ConfigTileSet | ConfigImagery | ConfigProvider | ConfigVectorStyle>;
|
|
17
|
+
getConfig(): ConfigTileSet | ConfigImagery | ConfigProvider | ConfigVectorStyle;
|
|
18
|
+
invalidatePath(): string;
|
|
19
|
+
getOldData(): Promise<ConfigImagery | ConfigTileSet | ConfigProvider | ConfigVectorStyle | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Reconcile the differences between the config and the tile metadata DB and update if changed.
|
|
22
|
+
*/
|
|
23
|
+
reconcile(): Promise<boolean>;
|
|
24
|
+
}
|