@basemaps/config-loader 7.1.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 (35) hide show
  1. package/LICENSE +21 -0
  2. package/build/index.d.ts +2 -0
  3. package/build/index.js +3 -0
  4. package/build/index.js.map +1 -0
  5. package/build/json/__tests__/config.loader.test.d.ts +1 -0
  6. package/build/json/__tests__/config.loader.test.js +105 -0
  7. package/build/json/__tests__/config.loader.test.js.map +1 -0
  8. package/build/json/__tests__/tiff.config.test.d.ts +1 -0
  9. package/build/json/__tests__/tiff.config.test.js +53 -0
  10. package/build/json/__tests__/tiff.config.test.js.map +1 -0
  11. package/build/json/__tests__/tiff.load.test.d.ts +1 -0
  12. package/build/json/__tests__/tiff.load.test.js +143 -0
  13. package/build/json/__tests__/tiff.load.test.js.map +1 -0
  14. package/build/json/imagery.config.cache.d.ts +7 -0
  15. package/build/json/imagery.config.cache.js +45 -0
  16. package/build/json/imagery.config.cache.js.map +1 -0
  17. package/build/json/json.config.d.ts +39 -0
  18. package/build/json/json.config.js +319 -0
  19. package/build/json/json.config.js.map +1 -0
  20. package/build/json/log.d.ts +17 -0
  21. package/build/json/log.js +2 -0
  22. package/build/json/log.js.map +1 -0
  23. package/build/json/parse.provider.d.ts +149 -0
  24. package/build/json/parse.provider.js +31 -0
  25. package/build/json/parse.provider.js.map +1 -0
  26. package/build/json/parse.style.d.ts +30 -0
  27. package/build/json/parse.style.js +13 -0
  28. package/build/json/parse.style.js.map +1 -0
  29. package/build/json/parse.tile.set.d.ts +252 -0
  30. package/build/json/parse.tile.set.js +47 -0
  31. package/build/json/parse.tile.set.js.map +1 -0
  32. package/build/json/tiff.config.d.ts +113 -0
  33. package/build/json/tiff.config.js +430 -0
  34. package/build/json/tiff.config.js.map +1 -0
  35. package/package.json +36 -0
@@ -0,0 +1,252 @@
1
+ import { TileSetType } from '@basemaps/config';
2
+ import { z } from 'zod';
3
+ export declare function validateColor(str: string): boolean;
4
+ export declare const ImageryConfigDefaults: {
5
+ minZoom: number;
6
+ maxZoom: number;
7
+ };
8
+ declare const zLayerConfig: z.ZodEffects<z.ZodObject<{
9
+ name: z.ZodString;
10
+ title: z.ZodString;
11
+ category: z.ZodOptional<z.ZodString>;
12
+ 2193: z.ZodOptional<z.ZodString>;
13
+ 3857: z.ZodOptional<z.ZodString>;
14
+ minZoom: z.ZodOptional<z.ZodEffects<z.ZodNumber, number, number>>;
15
+ maxZoom: z.ZodOptional<z.ZodEffects<z.ZodNumber, number, number>>;
16
+ }, "strip", z.ZodTypeAny, {
17
+ title: string;
18
+ name: string;
19
+ category?: string | undefined;
20
+ 2193?: string | undefined;
21
+ 3857?: string | undefined;
22
+ minZoom?: number | undefined;
23
+ maxZoom?: number | undefined;
24
+ }, {
25
+ title: string;
26
+ name: string;
27
+ category?: string | undefined;
28
+ 2193?: string | undefined;
29
+ 3857?: string | undefined;
30
+ minZoom?: number | undefined;
31
+ maxZoom?: number | undefined;
32
+ }>, {
33
+ title: string;
34
+ name: string;
35
+ category?: string | undefined;
36
+ 2193?: string | undefined;
37
+ 3857?: string | undefined;
38
+ minZoom?: number | undefined;
39
+ maxZoom?: number | undefined;
40
+ }, {
41
+ title: string;
42
+ name: string;
43
+ category?: string | undefined;
44
+ 2193?: string | undefined;
45
+ 3857?: string | undefined;
46
+ minZoom?: number | undefined;
47
+ maxZoom?: number | undefined;
48
+ }>;
49
+ export declare const zTileSetConfig: z.ZodObject<{
50
+ type: z.ZodNativeEnum<typeof TileSetType>;
51
+ id: z.ZodString;
52
+ title: z.ZodString;
53
+ category: z.ZodOptional<z.ZodString>;
54
+ description: z.ZodOptional<z.ZodString>;
55
+ background: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
56
+ layers: z.ZodArray<z.ZodEffects<z.ZodObject<{
57
+ name: z.ZodString;
58
+ title: z.ZodString;
59
+ category: z.ZodOptional<z.ZodString>;
60
+ 2193: z.ZodOptional<z.ZodString>;
61
+ 3857: z.ZodOptional<z.ZodString>;
62
+ minZoom: z.ZodOptional<z.ZodEffects<z.ZodNumber, number, number>>;
63
+ maxZoom: z.ZodOptional<z.ZodEffects<z.ZodNumber, number, number>>;
64
+ }, "strip", z.ZodTypeAny, {
65
+ title: string;
66
+ name: string;
67
+ category?: string | undefined;
68
+ 2193?: string | undefined;
69
+ 3857?: string | undefined;
70
+ minZoom?: number | undefined;
71
+ maxZoom?: number | undefined;
72
+ }, {
73
+ title: string;
74
+ name: string;
75
+ category?: string | undefined;
76
+ 2193?: string | undefined;
77
+ 3857?: string | undefined;
78
+ minZoom?: number | undefined;
79
+ maxZoom?: number | undefined;
80
+ }>, {
81
+ title: string;
82
+ name: string;
83
+ category?: string | undefined;
84
+ 2193?: string | undefined;
85
+ 3857?: string | undefined;
86
+ minZoom?: number | undefined;
87
+ maxZoom?: number | undefined;
88
+ }, {
89
+ title: string;
90
+ name: string;
91
+ category?: string | undefined;
92
+ 2193?: string | undefined;
93
+ 3857?: string | undefined;
94
+ minZoom?: number | undefined;
95
+ maxZoom?: number | undefined;
96
+ }>, "many">;
97
+ minZoom: z.ZodOptional<z.ZodEffects<z.ZodNumber, number, number>>;
98
+ maxZoom: z.ZodOptional<z.ZodEffects<z.ZodNumber, number, number>>;
99
+ format: z.ZodOptional<z.ZodString>;
100
+ outputs: z.ZodOptional<z.ZodArray<z.ZodObject<{
101
+ title: z.ZodString;
102
+ name: z.ZodString;
103
+ pipeline: z.ZodOptional<z.ZodArray<z.ZodObject<{
104
+ type: z.ZodString;
105
+ }, "strip", z.ZodTypeAny, {
106
+ type: string;
107
+ }, {
108
+ type: string;
109
+ }>, "many">>;
110
+ format: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodLiteral<"webp">, z.ZodLiteral<"png">, z.ZodLiteral<"jpeg">, z.ZodLiteral<"avif">]>, "many">>;
111
+ background: z.ZodOptional<z.ZodObject<{
112
+ r: z.ZodNumber;
113
+ g: z.ZodNumber;
114
+ b: z.ZodNumber;
115
+ alpha: z.ZodNumber;
116
+ }, "strip", z.ZodTypeAny, {
117
+ r: number;
118
+ g: number;
119
+ b: number;
120
+ alpha: number;
121
+ }, {
122
+ r: number;
123
+ g: number;
124
+ b: number;
125
+ alpha: number;
126
+ }>>;
127
+ resizeKernel: z.ZodOptional<z.ZodObject<{
128
+ in: z.ZodUnion<[z.ZodLiteral<"nearest">, z.ZodLiteral<"lanczos3">, z.ZodLiteral<"lanczos2">]>;
129
+ out: z.ZodUnion<[z.ZodLiteral<"nearest">, z.ZodLiteral<"lanczos3">, z.ZodLiteral<"lanczos2">]>;
130
+ }, "strip", z.ZodTypeAny, {
131
+ in: "nearest" | "lanczos3" | "lanczos2";
132
+ out: "nearest" | "lanczos3" | "lanczos2";
133
+ }, {
134
+ in: "nearest" | "lanczos3" | "lanczos2";
135
+ out: "nearest" | "lanczos3" | "lanczos2";
136
+ }>>;
137
+ }, "strip", z.ZodTypeAny, {
138
+ name: string;
139
+ title: string;
140
+ pipeline?: {
141
+ type: string;
142
+ }[] | undefined;
143
+ format?: ("webp" | "png" | "jpeg" | "avif")[] | undefined;
144
+ background?: {
145
+ r: number;
146
+ g: number;
147
+ b: number;
148
+ alpha: number;
149
+ } | undefined;
150
+ resizeKernel?: {
151
+ in: "nearest" | "lanczos3" | "lanczos2";
152
+ out: "nearest" | "lanczos3" | "lanczos2";
153
+ } | undefined;
154
+ }, {
155
+ name: string;
156
+ title: string;
157
+ pipeline?: {
158
+ type: string;
159
+ }[] | undefined;
160
+ format?: ("webp" | "png" | "jpeg" | "avif")[] | undefined;
161
+ background?: {
162
+ r: number;
163
+ g: number;
164
+ b: number;
165
+ alpha: number;
166
+ } | undefined;
167
+ resizeKernel?: {
168
+ in: "nearest" | "lanczos3" | "lanczos2";
169
+ out: "nearest" | "lanczos3" | "lanczos2";
170
+ } | undefined;
171
+ }>, "many">>;
172
+ }, "strip", z.ZodTypeAny, {
173
+ title: string;
174
+ type: TileSetType;
175
+ id: string;
176
+ layers: {
177
+ title: string;
178
+ name: string;
179
+ category?: string | undefined;
180
+ 2193?: string | undefined;
181
+ 3857?: string | undefined;
182
+ minZoom?: number | undefined;
183
+ maxZoom?: number | undefined;
184
+ }[];
185
+ category?: string | undefined;
186
+ description?: string | undefined;
187
+ background?: string | undefined;
188
+ minZoom?: number | undefined;
189
+ maxZoom?: number | undefined;
190
+ format?: string | undefined;
191
+ outputs?: {
192
+ name: string;
193
+ title: string;
194
+ pipeline?: {
195
+ type: string;
196
+ }[] | undefined;
197
+ format?: ("webp" | "png" | "jpeg" | "avif")[] | undefined;
198
+ background?: {
199
+ r: number;
200
+ g: number;
201
+ b: number;
202
+ alpha: number;
203
+ } | undefined;
204
+ resizeKernel?: {
205
+ in: "nearest" | "lanczos3" | "lanczos2";
206
+ out: "nearest" | "lanczos3" | "lanczos2";
207
+ } | undefined;
208
+ }[] | undefined;
209
+ }, {
210
+ title: string;
211
+ type: TileSetType;
212
+ id: string;
213
+ layers: {
214
+ title: string;
215
+ name: string;
216
+ category?: string | undefined;
217
+ 2193?: string | undefined;
218
+ 3857?: string | undefined;
219
+ minZoom?: number | undefined;
220
+ maxZoom?: number | undefined;
221
+ }[];
222
+ category?: string | undefined;
223
+ description?: string | undefined;
224
+ background?: string | undefined;
225
+ minZoom?: number | undefined;
226
+ maxZoom?: number | undefined;
227
+ format?: string | undefined;
228
+ outputs?: {
229
+ name: string;
230
+ title: string;
231
+ pipeline?: {
232
+ type: string;
233
+ }[] | undefined;
234
+ format?: ("webp" | "png" | "jpeg" | "avif")[] | undefined;
235
+ background?: {
236
+ r: number;
237
+ g: number;
238
+ b: number;
239
+ alpha: number;
240
+ } | undefined;
241
+ resizeKernel?: {
242
+ in: "nearest" | "lanczos3" | "lanczos2";
243
+ out: "nearest" | "lanczos3" | "lanczos2";
244
+ } | undefined;
245
+ }[] | undefined;
246
+ }>;
247
+ export type TileSetConfigSchemaLayer = z.infer<typeof zLayerConfig>;
248
+ /**
249
+ * The Configuration for all the imagery in a TileSet
250
+ */
251
+ export type TileSetConfigSchema = z.infer<typeof zTileSetConfig>;
252
+ export {};
@@ -0,0 +1,47 @@
1
+ import { ConfigTileSetOutputParser, parseRgba, TileSetType } from '@basemaps/config';
2
+ import { z } from 'zod';
3
+ export function validateColor(str) {
4
+ try {
5
+ parseRgba(str);
6
+ return true;
7
+ }
8
+ catch (err) {
9
+ return false;
10
+ }
11
+ }
12
+ const zBackground = z.string().refine(validateColor, { message: 'Invalid hex color' });
13
+ export const ImageryConfigDefaults = {
14
+ minZoom: 0,
15
+ maxZoom: 32,
16
+ };
17
+ const zZoom = z.number().refine((val) => val >= ImageryConfigDefaults.minZoom && val <= ImageryConfigDefaults.maxZoom, {
18
+ message: `must be between ${ImageryConfigDefaults.minZoom} and ${ImageryConfigDefaults.maxZoom}`,
19
+ });
20
+ const zLayerConfig = z
21
+ .object({
22
+ name: z.string(),
23
+ title: z.string(),
24
+ category: z.string().optional(),
25
+ 2193: z.string().optional(),
26
+ 3857: z.string().optional(),
27
+ minZoom: zZoom.optional(),
28
+ maxZoom: zZoom.optional(),
29
+ })
30
+ .refine(({ minZoom, maxZoom }) => (minZoom ? minZoom : ImageryConfigDefaults.minZoom) <= (maxZoom ? maxZoom : ImageryConfigDefaults.maxZoom), {
31
+ message: 'minZoom may no be greater than maxZoom',
32
+ path: ['minZoom'],
33
+ });
34
+ export const zTileSetConfig = z.object({
35
+ type: z.nativeEnum(TileSetType),
36
+ id: z.string(),
37
+ title: z.string(),
38
+ category: z.string().optional(),
39
+ description: z.string().optional(),
40
+ background: zBackground.optional(),
41
+ layers: z.array(zLayerConfig),
42
+ minZoom: zZoom.optional(),
43
+ maxZoom: zZoom.optional(),
44
+ format: z.string().optional(),
45
+ outputs: z.array(ConfigTileSetOutputParser).optional(),
46
+ });
47
+ //# sourceMappingURL=parse.tile.set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.tile.set.js","sourceRoot":"","sources":["../../src/json/parse.tile.set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,SAAS,CAAC,GAAG,CAAC,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;AAEvF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,qBAAqB,CAAC,OAAO,IAAI,GAAG,IAAI,qBAAqB,CAAC,OAAO,EAAE;IACrH,OAAO,EAAE,mBAAmB,qBAAqB,CAAC,OAAO,QAAQ,qBAAqB,CAAC,OAAO,EAAE;CACjG,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC;KACnB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE;IACzB,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE;CAC1B,CAAC;KACD,MAAM,CACL,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CACvB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAC5G;IACE,OAAO,EAAE,wCAAwC;IACjD,IAAI,EAAE,CAAC,SAAS,CAAC;CAClB,CACF,CAAC;AAEJ,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC;IAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,UAAU,EAAE,WAAW,CAAC,QAAQ,EAAE;IAClC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE;IACzB,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,QAAQ,EAAE;CACvD,CAAC,CAAC"}
@@ -0,0 +1,113 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { ConfigImagery, ConfigProviderMemory, ConfigTileSetRaster, ImageryBandType } from '@basemaps/config';
3
+ import { BoundingBox, NamedBounds } from '@basemaps/geo';
4
+ import { Tiff } from '@basemaps/shared';
5
+ import { LimitFunction } from 'p-limit';
6
+ import { StacCollection } from 'stac-ts';
7
+ import { LogType } from './log.js';
8
+ /** Summary of a collection of tiffs */
9
+ interface TiffSummary {
10
+ /** List of tiffs and their extents */
11
+ files: NamedBounds[];
12
+ /** Overall bounding box */
13
+ bounds: BoundingBox;
14
+ /** EpsgCode for the tiffs */
15
+ projection: number;
16
+ /** Ground sample distance, number of meters per pixel */
17
+ gsd: number;
18
+ /** no data value if present */
19
+ noData?: number;
20
+ /** STAC collection if it was found with the imagery */
21
+ collection?: StacCollection;
22
+ /** URL to the base of the imagery */
23
+ url: URL;
24
+ bands?: ImageryBandType[];
25
+ }
26
+ export type ConfigImageryTiff = ConfigImagery & TiffSummary;
27
+ /**
28
+ * Attempt to read a stac collection.json from the target path if it exists or return null if anything goes wrong.
29
+ */
30
+ export declare function loadStacFromURL(target: URL): Promise<StacCollection | null>;
31
+ /**
32
+ * Guess a better imagery name from a target URL
33
+ *
34
+ * A lot of our source paths include the type of imagery eg "rgb", "rgbi" or "dem_1m",
35
+ * these names are not super helpful and often there are better names further up the pathname
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * getImageryName('s3://linz-imagery/auckland/auckland_sn5600_1979_0.375m/2193/rgb/')
40
+ * // auckland_sn5600_1979_0.375m
41
+ * ```
42
+ *
43
+ * The list of paths ignored are from
44
+ *
45
+ * @see {IgnoredTitles}
46
+ *
47
+ * For common imagery paths see:
48
+ *
49
+ * @see {@link https://github.com/linz/imagery}
50
+ * @see {@link https://github.com/linz/elevation}
51
+ */
52
+ export declare function getImageryName(target: URL): string;
53
+ export declare function loadTiffsFromPaths(sourceFiles: URL[], Q: LimitFunction): Promise<Tiff[]>;
54
+ /**
55
+ * Attempt to load all imagery inside of a path and create a configuration from it
56
+ *
57
+ * @param target path that contains the imagery
58
+ * @param Q limit the number of requests per second to the imagery
59
+ * @param configCache optional location to cache the configuration objects
60
+ *
61
+ * @returns Imagery configuration generated from the path
62
+ */
63
+ export declare function initImageryFromTiffUrl(target: URL, Q: LimitFunction, configCache?: URL, log?: LogType): Promise<ConfigImageryTiff>;
64
+ /**
65
+ * Create configuration from a folder full of tiffs or a folder of folders of tiffs
66
+ *
67
+ * Given the following folder structure
68
+ *
69
+ * ```typescript
70
+ * "/imagery/invercargill_2022_0.05m/*.tiff"
71
+ * "/imagery/wellington_2022_0.05/*.tiff"
72
+ * ```
73
+ *
74
+ * A. A single imagery datasets
75
+ *
76
+ * ```typescript
77
+ * target = ["/imagery/invercargill_2022_0.05m/"]
78
+ * ```
79
+ *
80
+ * will load all tiffs from the resulting folder into a single tile set `aerial`
81
+ *
82
+ * B: A tree of imagery datasets
83
+ *
84
+ * ```typescript
85
+ * target = ["/imagery/invercargill_2022_0.05m/*.tiff", "/imagery/wellington_2022_0.05/*.tiff"]
86
+ * ```
87
+ *
88
+ * will load all tiffs from all folders targets into a single tile set "aerial",
89
+ * then load each folder into their own tile set.
90
+ *
91
+ * The rendering order will be the order of the target locations
92
+ *
93
+ * tile sets: aerial, wellington_2022_0.05, invercargill_2022_0.05m
94
+ *
95
+ * @param provider where to store all the configuration generated
96
+ * @param targets the target location
97
+ * @param concurrency number of tiff files to load at a time
98
+ * @returns
99
+ */
100
+ export declare function initConfigFromUrls(provider: ConfigProviderMemory, targets: URL[], concurrency?: number, configCache?: URL, log?: LogType): Promise<{
101
+ tileSet: ConfigTileSetRaster;
102
+ tileSets: ConfigTileSetRaster[];
103
+ imagery: ConfigImageryTiff[];
104
+ }>;
105
+ /**
106
+ * Attempt to guess if this configuration contains RGB or RGBA imagery
107
+ * by validating the image is either 3 or 4 band uint8
108
+ *
109
+ * @param img Imagery to check
110
+ * @returns true if imagery looks like rgb(a), false otherwise
111
+ */
112
+ export declare function isRgbOrRgba(img: ConfigImagery): boolean;
113
+ export {};