@basemaps/cli 7.16.0 → 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.
Files changed (34) hide show
  1. package/README.md +4 -28
  2. package/build/cli/bin.js +9 -2
  3. package/build/cli/bin.js.map +1 -1
  4. package/build/cli/index.d.ts +245 -4
  5. package/build/cli/index.js +11 -19
  6. package/build/cli/index.js.map +1 -1
  7. package/package.json +6 -27
  8. package/build/cli/__tests__/util.test.d.ts +0 -1
  9. package/build/cli/__tests__/util.test.js +0 -15
  10. package/build/cli/__tests__/util.test.js.map +0 -1
  11. package/build/cli/config/action.bundle.assets.d.ts +0 -14
  12. package/build/cli/config/action.bundle.assets.js +0 -111
  13. package/build/cli/config/action.bundle.assets.js.map +0 -1
  14. package/build/cli/config/action.bundle.d.ts +0 -12
  15. package/build/cli/config/action.bundle.js +0 -76
  16. package/build/cli/config/action.bundle.js.map +0 -1
  17. package/build/cli/config/action.import.d.ts +0 -59
  18. package/build/cli/config/action.import.js +0 -378
  19. package/build/cli/config/action.import.js.map +0 -1
  20. package/build/cli/config/config.diff.d.ts +0 -27
  21. package/build/cli/config/config.diff.js +0 -146
  22. package/build/cli/config/config.diff.js.map +0 -1
  23. package/build/cli/config/config.update.d.ts +0 -24
  24. package/build/cli/config/config.update.js +0 -115
  25. package/build/cli/config/config.update.js.map +0 -1
  26. package/build/cli/folder.d.ts +0 -4
  27. package/build/cli/folder.js +0 -17
  28. package/build/cli/folder.js.map +0 -1
  29. package/build/cli/server/action.serve.d.ts +0 -11
  30. package/build/cli/server/action.serve.js +0 -69
  31. package/build/cli/server/action.serve.js.map +0 -1
  32. package/build/cli/util.d.ts +0 -23
  33. package/build/cli/util.js +0 -136
  34. package/build/cli/util.js.map +0 -1
@@ -1,59 +0,0 @@
1
- import { BaseConfig, BasemapsConfigProvider, ConfigLayer, ConfigProviderMemory } from '@basemaps/config';
2
- import { TileMatrixSet } from '@basemaps/geo';
3
- import { LogType } from '@basemaps/shared';
4
- import { CommandLineAction } from '@rushstack/ts-command-line';
5
- export declare class CommandImport extends CommandLineAction {
6
- private config;
7
- private output;
8
- private commit;
9
- private target;
10
- promises: Promise<boolean>[];
11
- /** List of paths to invalidate at the end of the request */
12
- invalidations: string[];
13
- /** List of changed config */
14
- changes: BaseConfig[];
15
- /** List of paths to invalidate at the end of the request */
16
- backupConfig: ConfigProviderMemory;
17
- constructor();
18
- protected onDefineParameters(): void;
19
- getConfig(logger: LogType): Promise<BasemapsConfigProvider>;
20
- onExecute(): Promise<void>;
21
- update(config: BaseConfig, oldConfig: BasemapsConfigProvider, commit: boolean): void;
22
- /**
23
- * This function prepare for the markdown lines with preview urls for new inserted config layers
24
- * @param mem new config data read from config bundle file
25
- * @param layer new config tileset layer
26
- * @param inserts string array to save all the lines for markdown output
27
- * @param aerial output preview link for aerial map
28
- */
29
- outputNewLayers(mem: ConfigProviderMemory, layer: ConfigLayer, inserts: string[], aerial?: boolean): Promise<void>;
30
- /**
31
- * This function compared new config tileset layer with existing one, then output the markdown lines for updates and preview urls.
32
- * @param mem new config data read from config bundle file
33
- * @param layer new config tileset layer
34
- * @param existing existing config tileset layer
35
- * @param updates string array to save all the lines for markdown output
36
- * @param aerial output preview link for aerial map
37
- */
38
- outputUpdatedLayers(mem: ConfigProviderMemory, layer: ConfigLayer, existing: ConfigLayer, updates: string[], aerial?: boolean): Promise<void>;
39
- /**
40
- * This function compared new config with existing and output a markdown document to highlight the inserts and changes
41
- * Changes includes
42
- * - aerial config
43
- * - vector config
44
- * - vector style
45
- * - individual config
46
- *
47
- * @param output a string of output markdown location
48
- * @param mem new config data read from config bundle file
49
- * @param cfg existing config data
50
- */
51
- outputChange(output: string, mem: ConfigProviderMemory, cfg: BasemapsConfigProvider): Promise<void>;
52
- /**
53
- * Prepare QA urls with center location
54
- */
55
- prepareUrl(id: string, mem: BasemapsConfigProvider, tileMatrix: TileMatrixSet): Promise<{
56
- layer: string;
57
- tag: string;
58
- }>;
59
- }
@@ -1,378 +0,0 @@
1
- import { ConfigId, ConfigPrefix, ConfigProviderMemory, TileSetType, } from '@basemaps/config';
2
- import { GoogleTms, Nztm2000QuadTms } from '@basemaps/geo';
3
- import { Env, fsa, getDefaultConfig, getPreviewUrl, LogConfig, setDefaultConfig } from '@basemaps/shared';
4
- import { CommandLineAction } from '@rushstack/ts-command-line';
5
- import fetch from 'node-fetch';
6
- import { invalidateCache } from '../util.js';
7
- import { diffVectorUpdate } from './config.diff.js';
8
- import { Q, Updater } from './config.update.js';
9
- const PublicUrlBase = Env.isProduction() ? 'https://basemaps.linz.govt.nz/' : 'https://dev.basemaps.linz.govt.nz/';
10
- const VectorStyles = ['topographic', 'topolite', 'aerialhybrid']; // Vector styles that we want to review if vector data changes.
11
- export class CommandImport extends CommandLineAction {
12
- constructor() {
13
- super({
14
- actionName: 'import',
15
- summary: 'import a config json into dynamodb',
16
- documentation: 'Given a valid bundle config json and import them into dynamodb',
17
- });
18
- Object.defineProperty(this, "config", {
19
- enumerable: true,
20
- configurable: true,
21
- writable: true,
22
- value: void 0
23
- });
24
- Object.defineProperty(this, "output", {
25
- enumerable: true,
26
- configurable: true,
27
- writable: true,
28
- value: void 0
29
- });
30
- Object.defineProperty(this, "commit", {
31
- enumerable: true,
32
- configurable: true,
33
- writable: true,
34
- value: void 0
35
- });
36
- Object.defineProperty(this, "target", {
37
- enumerable: true,
38
- configurable: true,
39
- writable: true,
40
- value: void 0
41
- });
42
- Object.defineProperty(this, "promises", {
43
- enumerable: true,
44
- configurable: true,
45
- writable: true,
46
- value: []
47
- });
48
- /** List of paths to invalidate at the end of the request */
49
- Object.defineProperty(this, "invalidations", {
50
- enumerable: true,
51
- configurable: true,
52
- writable: true,
53
- value: []
54
- });
55
- /** List of changed config */
56
- Object.defineProperty(this, "changes", {
57
- enumerable: true,
58
- configurable: true,
59
- writable: true,
60
- value: []
61
- });
62
- /** List of paths to invalidate at the end of the request */
63
- Object.defineProperty(this, "backupConfig", {
64
- enumerable: true,
65
- configurable: true,
66
- writable: true,
67
- value: new ConfigProviderMemory()
68
- });
69
- }
70
- onDefineParameters() {
71
- this.config = this.defineStringParameter({
72
- argumentName: 'CONFIG',
73
- parameterLongName: '--config',
74
- description: 'Path of config json, this can be both a local path or s3 location',
75
- required: true,
76
- });
77
- this.output = this.defineStringParameter({
78
- argumentName: 'OUTPUT',
79
- parameterLongName: '--output',
80
- description: 'Output a markdown file with the config changes',
81
- });
82
- this.target = this.defineStringParameter({
83
- argumentName: 'TARGET',
84
- parameterLongName: '--target',
85
- description: 'Target config file to compare',
86
- });
87
- this.commit = this.defineFlagParameter({
88
- parameterLongName: '--commit',
89
- description: 'Actually start the import',
90
- required: false,
91
- });
92
- }
93
- async getConfig(logger) {
94
- if (this.target.value) {
95
- logger.info({ config: this.target.value }, 'Import:Target:Load');
96
- const configJson = await fsa.readJson(fsa.toUrl(this.target.value));
97
- const mem = ConfigProviderMemory.fromJson(configJson);
98
- mem.createVirtualTileSets();
99
- setDefaultConfig(mem);
100
- return mem;
101
- }
102
- return getDefaultConfig();
103
- }
104
- async onExecute() {
105
- const logger = LogConfig.get();
106
- const commit = this.commit.value ?? false;
107
- const config = this.config.value;
108
- if (config == null)
109
- throw new Error('Please provide a config json');
110
- if (commit && !config.startsWith('s3://') && Env.isProduction()) {
111
- throw new Error('To actually import into dynamo has to use the config file from s3.');
112
- }
113
- const configUrl = fsa.toUrl(config);
114
- const cfg = await this.getConfig(logger);
115
- const HostPrefix = Env.isProduction() ? '' : 'dev.';
116
- const healthEndpoint = `https://${HostPrefix}basemaps.linz.govt.nz/v1/health`;
117
- logger.info({ url: healthEndpoint }, 'Import:ValidateHealth');
118
- if (commit) {
119
- const res = await fetch(healthEndpoint);
120
- if (!res.ok)
121
- throw new Error('Cannot update basemaps is unhealthy');
122
- }
123
- logger.info({ config }, 'Import:Load');
124
- const configJson = await fsa.readJson(configUrl);
125
- const mem = ConfigProviderMemory.fromJson(configJson);
126
- mem.createVirtualTileSets();
127
- logger.info({ config }, 'Import:Start');
128
- const objectTypes = {};
129
- for (const config of mem.objects.values()) {
130
- const objectType = ConfigId.getPrefix(config.id);
131
- if (objectType) {
132
- objectTypes[objectType] = (objectTypes[objectType] ?? 0) + 1;
133
- }
134
- this.update(config, cfg, commit);
135
- }
136
- await Promise.all(this.promises);
137
- logger.info({ objects: mem.objects.size, types: objectTypes }, 'Import:Compare:Done');
138
- if (commit) {
139
- const configBundle = {
140
- id: cfg.ConfigBundle.id(configJson.hash),
141
- name: cfg.ConfigBundle.id(`config-${configJson.hash}.json`),
142
- path: config,
143
- hash: configJson.hash,
144
- assets: configJson.assets,
145
- };
146
- logger.info({ config }, 'Import:ConfigBundle');
147
- if (cfg.ConfigBundle.isWriteable()) {
148
- // Insert a cb_hash record for reference
149
- await cfg.ConfigBundle.put(configBundle);
150
- // Update the cb_latest record
151
- configBundle.id = cfg.ConfigBundle.id('latest');
152
- await cfg.ConfigBundle.put(configBundle);
153
- }
154
- else {
155
- logger.error('Import:NotWriteable');
156
- }
157
- }
158
- if (commit && this.invalidations.length > 0) {
159
- // Lots of invalidations just invalidate everything
160
- if (this.invalidations.length > 10) {
161
- await invalidateCache('/*', commit);
162
- }
163
- else {
164
- await invalidateCache(this.invalidations, commit);
165
- }
166
- await new Promise((resolve) => setTimeout(resolve, 1000));
167
- const res = await fetch(healthEndpoint);
168
- if (!res.ok)
169
- throw new Error('Basemaps is unhealthy');
170
- }
171
- const output = this.output.value;
172
- if (output)
173
- await this.outputChange(output, mem, cfg);
174
- if (commit !== true)
175
- logger.info('DryRun:Done');
176
- }
177
- update(config, oldConfig, commit) {
178
- const promise = Q(async () => {
179
- const updater = new Updater(config, oldConfig, commit);
180
- const hasChanges = await updater.reconcile();
181
- if (hasChanges) {
182
- this.changes.push(config);
183
- this.invalidations.push(updater.invalidatePath());
184
- const oldData = await updater.getOldData();
185
- if (oldData != null)
186
- this.backupConfig.put(oldData); // No need to backup anything if there is new insert
187
- }
188
- else {
189
- this.backupConfig.put(config);
190
- }
191
- return true;
192
- });
193
- this.promises.push(promise);
194
- }
195
- /**
196
- * This function prepare for the markdown lines with preview urls for new inserted config layers
197
- * @param mem new config data read from config bundle file
198
- * @param layer new config tileset layer
199
- * @param inserts string array to save all the lines for markdown output
200
- * @param aerial output preview link for aerial map
201
- */
202
- async outputNewLayers(mem, layer, inserts, aerial) {
203
- inserts.push(`\n### ${layer.name}\n`);
204
- if (layer[2193]) {
205
- const urls = await this.prepareUrl(layer[2193], mem, Nztm2000QuadTms);
206
- inserts.push(` - [NZTM2000Quad](${urls.layer})`);
207
- if (aerial)
208
- inserts.push(` - [Aerial](${urls.tag})`);
209
- }
210
- if (layer[3857]) {
211
- const urls = await this.prepareUrl(layer[3857], mem, GoogleTms);
212
- inserts.push(` - [WebMercatorQuad](${urls.layer})`);
213
- if (aerial)
214
- inserts.push(` - [Aerial](${urls.tag})`);
215
- }
216
- }
217
- /**
218
- * This function compared new config tileset layer with existing one, then output the markdown lines for updates and preview urls.
219
- * @param mem new config data read from config bundle file
220
- * @param layer new config tileset layer
221
- * @param existing existing config tileset layer
222
- * @param updates string array to save all the lines for markdown output
223
- * @param aerial output preview link for aerial map
224
- */
225
- async outputUpdatedLayers(mem, layer, existing, updates, aerial) {
226
- let zoom = undefined;
227
- if (layer.minZoom !== existing.minZoom || layer.maxZoom !== existing.maxZoom) {
228
- zoom = ' - Zoom level updated.';
229
- if (layer.minZoom !== existing.minZoom)
230
- zoom += ` min zoom ${existing.minZoom} -> ${layer.minZoom}`;
231
- if (layer.maxZoom !== existing.maxZoom)
232
- zoom += ` max zoom ${existing.maxZoom} -> ${layer.maxZoom}`;
233
- }
234
- const change = [`\n### ${layer.name}\n`];
235
- if (layer[2193]) {
236
- if (layer[2193] !== existing[2193]) {
237
- const urls = await this.prepareUrl(layer[2193], mem, Nztm2000QuadTms);
238
- change.push(`- Layer update [NZTM2000Quad](${urls.layer})`);
239
- if (aerial)
240
- updates.push(` - [Aerial](${urls.tag})`);
241
- }
242
- if (zoom) {
243
- const urls = await this.prepareUrl(layer[2193], mem, Nztm2000QuadTms);
244
- zoom += ` [NZTM2000Quad](${urls.tag})`;
245
- }
246
- }
247
- if (layer[3857]) {
248
- if (layer[3857] !== existing[3857]) {
249
- const urls = await this.prepareUrl(layer[3857], mem, GoogleTms);
250
- change.push(`- Layer update [WebMercatorQuad](${urls.layer})`);
251
- if (aerial)
252
- updates.push(` - [Aerial](${urls.tag})`);
253
- }
254
- if (zoom) {
255
- const urls = await this.prepareUrl(layer[3857], mem, GoogleTms);
256
- zoom += ` [WebMercatorQuad](${urls.tag})`;
257
- }
258
- }
259
- if (zoom)
260
- change.push(`${zoom}\n`);
261
- if (change.length > 1)
262
- updates.push(change.join(''));
263
- }
264
- /**
265
- * This function compared new config with existing and output a markdown document to highlight the inserts and changes
266
- * Changes includes
267
- * - aerial config
268
- * - vector config
269
- * - vector style
270
- * - individual config
271
- *
272
- * @param output a string of output markdown location
273
- * @param mem new config data read from config bundle file
274
- * @param cfg existing config data
275
- */
276
- async outputChange(output, mem, cfg) {
277
- const md = [];
278
- // Output for aerial config changes
279
- const inserts = [];
280
- const updates = [];
281
- const aerialId = 'ts_aerial';
282
- const newData = await mem.TileSet.get(aerialId);
283
- const oldData = await cfg.TileSet.get(aerialId);
284
- const aerialLayers = new Set();
285
- if (newData == null || oldData == null)
286
- throw new Error('Failed to fetch aerial config data.');
287
- for (const layer of newData.layers) {
288
- // if (aerialLayers.has(layer.name)) continue;
289
- aerialLayers.add(layer.name);
290
- // There are duplicates layers inside the config this makes it hard to know what has changed
291
- // so only allow comparisons to one layer at a time
292
- const index = oldData.layers.findIndex((l) => l.name === layer.name);
293
- if (index > -1) {
294
- const [el] = oldData.layers.splice(index, 1);
295
- await this.outputUpdatedLayers(mem, layer, el, updates, true);
296
- }
297
- else
298
- await this.outputNewLayers(mem, layer, inserts, true);
299
- }
300
- if (inserts.length > 0)
301
- md.push('# Aerial Imagery Inserts', ...inserts);
302
- if (updates.length > 0)
303
- md.push('# Aerial Imagery Updates', ...updates);
304
- // Some layers were not removed from the old config so they no longer exist in the new config
305
- if (oldData.layers.length > 0) {
306
- md.push('# Aerial Imagery Deletes', ...oldData.layers.map((m) => `- ${m.title}`));
307
- }
308
- // Output for individual tileset config changes or inserts
309
- const individualInserts = [];
310
- const individualUpdates = [];
311
- for (const config of mem.objects.values()) {
312
- if (!mem.TileSet.is(config))
313
- continue;
314
- if (config.id === 'ts_aerial')
315
- continue;
316
- if (aerialLayers.has(config.name))
317
- continue;
318
- if (config.type === TileSetType.Vector)
319
- continue;
320
- if (config.layers.length > 1)
321
- continue; // Not an individual layer
322
- const existing = await cfg.TileSet.get(config.id);
323
- const layer = config.layers[0];
324
- if (existing)
325
- await this.outputUpdatedLayers(mem, layer, existing.layers[0], individualUpdates);
326
- else
327
- await this.outputNewLayers(mem, layer, individualInserts);
328
- }
329
- if (individualInserts.length > 0)
330
- md.push('# Individual Inserts', ...individualInserts);
331
- if (individualUpdates.length > 0)
332
- md.push('# Individual Updates', ...individualUpdates);
333
- // Output for vector config changes
334
- const vectorUpdate = [];
335
- const styleUpdate = [];
336
- for (const change of this.changes) {
337
- if (mem.TileSet.is(change) && change.type === TileSetType.Vector) {
338
- vectorUpdate.push(`## Vector data updates for ${change.id}`);
339
- const id = ConfigId.unprefix(ConfigPrefix.TileSet, change.id);
340
- for (const style of VectorStyles) {
341
- vectorUpdate.push(`* [${style} - ${id}](${PublicUrlBase}?config=${this.config.value}&i=${id}&s=${style}&debug)\n`);
342
- }
343
- const existingTileSet = await cfg.TileSet.get(change.id);
344
- const featureChanges = await diffVectorUpdate(change, existingTileSet);
345
- vectorUpdate.push(`## Feature updates for ${change.id}`);
346
- vectorUpdate.push(...featureChanges);
347
- }
348
- if (mem.Style.is(change)) {
349
- styleUpdate.push(`## Vector Style updated for ${change.id}`);
350
- const style = ConfigId.unprefix(ConfigPrefix.Style, change.id);
351
- styleUpdate.push(`* [${style}](${PublicUrlBase}?config=${this.config.value}&i=topographic&s=${style}&debug)\n`);
352
- }
353
- }
354
- if (styleUpdate.length > 0)
355
- md.push('# Vector Style Update', ...styleUpdate);
356
- if (vectorUpdate.length > 0)
357
- md.push('# Vector Data Update', ...vectorUpdate);
358
- if (md.length > 0) {
359
- await fsa.write(fsa.toUrl(output), md.join('\n'));
360
- }
361
- return;
362
- }
363
- /**
364
- * Prepare QA urls with center location
365
- */
366
- async prepareUrl(id, mem, tileMatrix) {
367
- const configImagery = await mem.Imagery.get(id);
368
- if (configImagery == null)
369
- throw new Error(`Failed to find imagery config from config bundle file. Id: ${id}`);
370
- const center = getPreviewUrl({ imagery: configImagery });
371
- const urls = {
372
- layer: `${PublicUrlBase}?config=${this.config.value}&i=${center.name}&p=${tileMatrix.identifier}&debug#@${center.location.lat},${center.location.lon},z${center.location.zoom}`,
373
- tag: `${PublicUrlBase}?config=${this.config.value}&p=${tileMatrix.identifier}&debug#@${center.location.lat},${center.location.lon},z${center.location.zoom}`,
374
- };
375
- return urls;
376
- }
377
- }
378
- //# sourceMappingURL=action.import.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"action.import.js","sourceRoot":"","sources":["../../../src/cli/config/action.import.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
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 {};
@@ -1,146 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.diff.js","sourceRoot":"","sources":["../../../src/cli/config/config.diff.ts"],"names":[],"mappings":"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"}