@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.
@@ -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
+ }