From 3f54a09b0163942bd15f673054a71b8b38e5146c Mon Sep 17 00:00:00 2001 From: vitaligi <54726763+vitaligi@users.noreply.github.com> Date: Tue, 17 Mar 2026 21:07:36 +0200 Subject: [PATCH 1/5] feat: additional validations --- config/default.json | 4 ++++ src/common/gdal.ts | 5 ++++- src/common/schemas.ts | 10 ++++++++++ src/info/fileHandlers/gdal.ts | 31 +++++++++++++++++++++++++++---- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/config/default.json b/config/default.json index 29f30fc..390d612 100644 --- a/config/default.json +++ b/config/default.json @@ -34,8 +34,12 @@ "sourceDir": "" }, "application": { + "blockSize": 256, + "compression": "LZW", "defaultGeographicSrsId": 4326, "defaultProjectedSrsId": 3395, + "resolutionDegree": { "min": 0.00000009060870470168063430786, "max": 0.08982 }, + "resolutionMeter": { "min": 0.01, "max": 10000 }, "supportedFormatsMap": { "geotiff": "gtiff" }, diff --git a/src/common/gdal.ts b/src/common/gdal.ts index 6fd62a5..a7fdeb0 100644 --- a/src/common/gdal.ts +++ b/src/common/gdal.ts @@ -3,6 +3,7 @@ import * as gdalAsync from 'gdal-async'; import { z } from 'zod'; import type { InfoResponse } from '@src/info/models/infoManager'; import { EPSG_DATA_RECORDS } from './epsg'; +import { resolutionDegreeSchema, resolutionMeterSchema } from './schemas'; interface PixelInfo { pixelWidth: number; @@ -74,7 +75,9 @@ export const getResolutions = ( throw new Error('Unsupported SRS type'); } - return resolutions; + const response = z.strictObject({ resolutionMeter: resolutionMeterSchema, resolutionDegree: resolutionDegreeSchema }).parse(resolutions); + + return response; }; export const getSrsName = (srsId: number): string => { diff --git a/src/common/schemas.ts b/src/common/schemas.ts index f4a0433..58a115c 100644 --- a/src/common/schemas.ts +++ b/src/common/schemas.ts @@ -4,12 +4,22 @@ import { GEOTIFF_DATA_TYPES } from './constants'; const config = getConfig(); +const blockSize = config.get('application.blockSize') as unknown as number; +const compression = config.get('application.compression') as unknown as string; +const resolutionDegree = config.get('application.resolutionDegree') as unknown as { min: number; max: number }; +const resolutionMeter = config.get('application.resolutionMeter') as unknown as { min: number; max: number }; const supportedSrsIds = config.get('application.supportedSrsIds') as unknown as number[]; // TODO: include application.supportedSrsIds in service schema export const areaOrPointSchema = z.literal(['Area', 'Point']); +export const blockSizeSchema = z.object({ x: z.literal(blockSize), y: z.literal(blockSize) }); +export const compressionSchema = z.literal(compression); +export const layoutSchema = z.literal('COG'); export const noDataValueSchema = z.union([z.number(), z.nan()]).transform((value) => (Number.isNaN(value) ? 'NaN' : value)); +export const overviewsCount = z.number().positive(); export const pixelDataTypesSchema = z.union([z.literal(GEOTIFF_DATA_TYPES)]); // add additional data types to union for each supported format export const pixelSchema = z.number().positive(); +export const resolutionDegreeSchema = z.number().min(resolutionDegree.min).max(resolutionDegree.max); +export const resolutionMeterSchema = z.number().min(resolutionMeter.min).max(resolutionMeter.max); export const srsIdSchema = z.literal(supportedSrsIds); export const srsNameSchema = z.string().min(1); diff --git a/src/info/fileHandlers/gdal.ts b/src/info/fileHandlers/gdal.ts index 05106a9..07b9f26 100644 --- a/src/info/fileHandlers/gdal.ts +++ b/src/info/fileHandlers/gdal.ts @@ -1,14 +1,24 @@ import { access, constants } from 'node:fs/promises'; import { extname, join } from 'node:path'; -import { type Dataset, type Driver, SpatialReference } from 'gdal-async'; -import { inject, injectable } from 'tsyringe'; -import { z } from 'zod'; import { NotFoundError } from '@map-colonies/error-types'; import type { Logger } from '@map-colonies/js-logger'; +import { SpatialReference, type Dataset, type Driver } from 'gdal-async'; +import { inject, injectable } from 'tsyringe'; +import { z } from 'zod'; import type { ConfigType } from '@src/common/config'; import { SERVICES } from '@src/common/constants'; import { GDAL_ASYNC, getPixelInfo, getResolutions, getSrsInfo, type GdalAsync } from '@src/common/gdal'; -import { areaOrPointSchema, noDataValueSchema, pixelDataTypesSchema, srsIdSchema, srsNameSchema } from '@src/common/schemas'; +import { + areaOrPointSchema, + blockSizeSchema, + compressionSchema, + layoutSchema, + noDataValueSchema, + overviewsCount, + pixelDataTypesSchema, + srsIdSchema, + srsNameSchema, +} from '@src/common/schemas'; import type { FileHandler, InfoResponse } from '@src/info/models/infoManager'; @injectable() @@ -63,8 +73,21 @@ export class GDALHandler implements FileHandler { .object({ AREA_OR_POINT: areaOrPointSchema }) .parse(metadata, { error: () => 'Could not extract AREA_OR_POINT metadata' }).AREA_OR_POINT; + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const metadataImageStructure = await dataset.getMetadataAsync('IMAGE_STRUCTURE'); + void z + // eslint-disable-next-line @typescript-eslint/naming-convention + .object({ LAYOUT: layoutSchema, COMPRESSION: compressionSchema }) + .parse(metadataImageStructure, { error: () => 'Could not extract LAYOUT metadata' }).LAYOUT; + const band = await dataset.bands.getAsync(1); // DEMs are mostly single banded + const bandBlockSize = await band.blockSizeAsync; + blockSizeSchema.parse(bandBlockSize); + + const bandOverviewsCount = await band.overviews.countAsync(); + overviewsCount.parse(bandOverviewsCount); + const bandDataType = await band.dataTypeAsync; const dataType = pixelDataTypesSchema.parse(bandDataType, { error: () => 'Unsupported band data type' }); From dd8a9a233d89882a9d7b62cbb6c603c1d03767f7 Mon Sep 17 00:00:00 2001 From: vitaligi <54726763+vitaligi@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:21:25 +0200 Subject: [PATCH 2/5] chore: pr comment restructure config --- config/default.json | 30 ++++++++++++++++-------------- src/common/schemas.ts | 10 +++++----- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/config/default.json b/config/default.json index 390d612..fd1e860 100644 --- a/config/default.json +++ b/config/default.json @@ -34,23 +34,25 @@ "sourceDir": "" }, "application": { - "blockSize": 256, - "compression": "LZW", + "validation": { + "blockSize": 256, + "compression": "LZW", + "resolutionDegree": { "min": 0.00000009060870470168063430786, "max": 0.08982 }, + "resolutionMeter": { "min": 0.01, "max": 10000 }, + "supportedSrsIds": [ + 4326, 32601, 32602, 32603, 32604, 32605, 32606, 32607, 32608, 32609, 32610, 32611, 32612, 32613, 32614, 32615, 32616, 32617, 32618, 32619, + 32620, 32621, 32622, 32623, 32624, 32625, 32626, 32627, 32628, 32629, 32630, 32631, 32632, 32633, 32634, 32635, 32636, 32637, 32638, 32639, + 32640, 32641, 32642, 32643, 32644, 32645, 32646, 32647, 32648, 32649, 32650, 32651, 32652, 32653, 32654, 32655, 32656, 32657, 32658, 32659, + 32660, 32701, 32702, 32703, 32704, 32705, 32706, 32707, 32708, 32709, 32710, 32711, 32712, 32713, 32714, 32715, 32716, 32717, 32718, 32719, + 32720, 32721, 32722, 32723, 32724, 32725, 32726, 32727, 32728, 32729, 32730, 32731, 32732, 32733, 32734, 32735, 32736, 32737, 32738, 32739, + 32740, 32741, 32742, 32743, 32744, 32745, 32746, 32747, 32748, 32749, 32750, 32751, 32752, 32753, 32754, 32755, 32756, 32757, 32758, 32759, + 32760 + ] + }, "defaultGeographicSrsId": 4326, "defaultProjectedSrsId": 3395, - "resolutionDegree": { "min": 0.00000009060870470168063430786, "max": 0.08982 }, - "resolutionMeter": { "min": 0.01, "max": 10000 }, "supportedFormatsMap": { "geotiff": "gtiff" - }, - "supportedSrsIds": [ - 4326, 32601, 32602, 32603, 32604, 32605, 32606, 32607, 32608, 32609, 32610, 32611, 32612, 32613, 32614, 32615, 32616, 32617, 32618, 32619, - 32620, 32621, 32622, 32623, 32624, 32625, 32626, 32627, 32628, 32629, 32630, 32631, 32632, 32633, 32634, 32635, 32636, 32637, 32638, 32639, - 32640, 32641, 32642, 32643, 32644, 32645, 32646, 32647, 32648, 32649, 32650, 32651, 32652, 32653, 32654, 32655, 32656, 32657, 32658, 32659, - 32660, 32701, 32702, 32703, 32704, 32705, 32706, 32707, 32708, 32709, 32710, 32711, 32712, 32713, 32714, 32715, 32716, 32717, 32718, 32719, - 32720, 32721, 32722, 32723, 32724, 32725, 32726, 32727, 32728, 32729, 32730, 32731, 32732, 32733, 32734, 32735, 32736, 32737, 32738, 32739, - 32740, 32741, 32742, 32743, 32744, 32745, 32746, 32747, 32748, 32749, 32750, 32751, 32752, 32753, 32754, 32755, 32756, 32757, 32758, 32759, - 32760 - ] + } } } diff --git a/src/common/schemas.ts b/src/common/schemas.ts index 58a115c..f38c6ff 100644 --- a/src/common/schemas.ts +++ b/src/common/schemas.ts @@ -4,11 +4,11 @@ import { GEOTIFF_DATA_TYPES } from './constants'; const config = getConfig(); -const blockSize = config.get('application.blockSize') as unknown as number; -const compression = config.get('application.compression') as unknown as string; -const resolutionDegree = config.get('application.resolutionDegree') as unknown as { min: number; max: number }; -const resolutionMeter = config.get('application.resolutionMeter') as unknown as { min: number; max: number }; -const supportedSrsIds = config.get('application.supportedSrsIds') as unknown as number[]; // TODO: include application.supportedSrsIds in service schema +const blockSize = config.get('application.validation.blockSize') as unknown as number; +const compression = config.get('application.validation.compression') as unknown as string; +const resolutionDegree = config.get('application.validation.resolutionDegree') as unknown as { min: number; max: number }; +const resolutionMeter = config.get('application.validation.resolutionMeter') as unknown as { min: number; max: number }; +const supportedSrsIds = config.get('application.validation.supportedSrsIds') as unknown as number[]; export const areaOrPointSchema = z.literal(['Area', 'Point']); export const blockSizeSchema = z.object({ x: z.literal(blockSize), y: z.literal(blockSize) }); From 53c38ccdf6775e7969fde23dbf9ff3a71c93ecff Mon Sep 17 00:00:00 2001 From: vitaligi <54726763+vitaligi@users.noreply.github.com> Date: Thu, 19 Mar 2026 23:40:22 +0200 Subject: [PATCH 3/5] build: update to use temp config schema --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4aee7a9..e9b9cab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@map-colonies/openapi-express-viewer": "^5.0.0", "@map-colonies/prometheus": "^1.0.0", "@map-colonies/read-pkg": "^1.0.0", - "@map-colonies/schemas": "^1.17.0", + "@map-colonies/schemas": "https://ghatmpstorage.blob.core.windows.net/npm-packages/schemas-6939db3448a04daf1d79ab5f8ecfadeab67237c8.tgz", "@map-colonies/tracing": "^1.0.0", "@map-colonies/tracing-utils": "^1.0.0", "@opentelemetry/api": "^1.9.0", @@ -2655,9 +2655,9 @@ } }, "node_modules/@map-colonies/schemas": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@map-colonies/schemas/-/schemas-1.17.0.tgz", - "integrity": "sha512-lfp27EkpXM2zlHDHtVNkjScbRZDjcn4HHfYtl8tD2lOPMPoR55wTRBsh5OhUllbLbv7O2+youA1w3Ny+iUlW9w==", + "version": "1.18.0", + "resolved": "https://ghatmpstorage.blob.core.windows.net/npm-packages/schemas-6939db3448a04daf1d79ab5f8ecfadeab67237c8.tgz", + "integrity": "sha512-T1MDhznSLhSxpZhyHUj477vZhYFEnykmaSIP99ns5piO1pOKobOdlpG2Xshu+Tvarsb4dX1xkv2P7kYI7owe+A==", "license": "MIT", "peer": true }, diff --git a/package.json b/package.json index 21639db..b22f8a5 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@map-colonies/openapi-express-viewer": "^5.0.0", "@map-colonies/prometheus": "^1.0.0", "@map-colonies/read-pkg": "^1.0.0", - "@map-colonies/schemas": "^1.17.0", + "@map-colonies/schemas": "https://ghatmpstorage.blob.core.windows.net/npm-packages/schemas-6939db3448a04daf1d79ab5f8ecfadeab67237c8.tgz", "@map-colonies/tracing": "^1.0.0", "@map-colonies/tracing-utils": "^1.0.0", "@opentelemetry/api": "^1.9.0", From 26dc960dc6f5e2ea485c39d5077c2962fcb1f770 Mon Sep 17 00:00:00 2001 From: vitaligi <54726763+vitaligi@users.noreply.github.com> Date: Thu, 19 Mar 2026 23:42:17 +0200 Subject: [PATCH 4/5] feat: use config schema --- config/default.json | 7 ++++++- src/common/config.ts | 6 +++--- src/common/schemas.ts | 10 +++++----- src/info/fileHandlers/gdal.ts | 8 ++++---- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/config/default.json b/config/default.json index fd1e860..33487ec 100644 --- a/config/default.json +++ b/config/default.json @@ -31,7 +31,12 @@ } }, "storageExplorer": { - "sourceDir": "" + "sourceDir": "", + "displayNameDir": "layerSources", + "validFileExtensions": ["tif"] + }, + "jobnik": { + "baseUrl": "http://localhost:3000" }, "application": { "validation": { diff --git a/src/common/config.ts b/src/common/config.ts index 7b1a941..5daa998 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -1,8 +1,8 @@ import { type ConfigInstance, config } from '@map-colonies/config'; -import { commonBoilerplateV2, type commonBoilerplateV2Type } from '@map-colonies/schemas'; +import { demDemGatewayV1, type demDemGatewayV1Type } from '@map-colonies/schemas'; // Choose here the type of the config instance and import this type from the entire application -type ConfigType = ConfigInstance; +type ConfigType = ConfigInstance; let configInstance: ConfigType | undefined; @@ -13,7 +13,7 @@ let configInstance: ConfigType | undefined; */ async function initConfig(offlineMode?: boolean): Promise { configInstance = await config({ - schema: commonBoilerplateV2, + schema: demDemGatewayV1, offlineMode, }); } diff --git a/src/common/schemas.ts b/src/common/schemas.ts index f38c6ff..79bb419 100644 --- a/src/common/schemas.ts +++ b/src/common/schemas.ts @@ -4,11 +4,11 @@ import { GEOTIFF_DATA_TYPES } from './constants'; const config = getConfig(); -const blockSize = config.get('application.validation.blockSize') as unknown as number; -const compression = config.get('application.validation.compression') as unknown as string; -const resolutionDegree = config.get('application.validation.resolutionDegree') as unknown as { min: number; max: number }; -const resolutionMeter = config.get('application.validation.resolutionMeter') as unknown as { min: number; max: number }; -const supportedSrsIds = config.get('application.validation.supportedSrsIds') as unknown as number[]; +const blockSize = config.get('application.validation.blockSize'); +const compression = config.get('application.validation.compression'); +const resolutionDegree = config.get('application.validation.resolutionDegree'); +const resolutionMeter = config.get('application.validation.resolutionMeter'); +const supportedSrsIds = config.get('application.validation.supportedSrsIds'); export const areaOrPointSchema = z.literal(['Area', 'Point']); export const blockSizeSchema = z.object({ x: z.literal(blockSize), y: z.literal(blockSize) }); diff --git a/src/info/fileHandlers/gdal.ts b/src/info/fileHandlers/gdal.ts index 07b9f26..4b05c1d 100644 --- a/src/info/fileHandlers/gdal.ts +++ b/src/info/fileHandlers/gdal.ts @@ -33,10 +33,10 @@ export class GDALHandler implements FileHandler { @inject(SERVICES.LOGGER) private readonly logger: Logger, @inject(GDAL_ASYNC) private readonly gdal: GdalAsync ) { - this.defaultGeographicSrs = SpatialReference.fromEPSG(this.config.get('application.defaultGeographicSrsId') as unknown as number); - this.defaultProjectedSrs = SpatialReference.fromEPSG(this.config.get('application.defaultProjectedSrsId') as unknown as number); - this.supportedFormatsMap = this.config.get('application.supportedFormatsMap') as unknown as Record; - this.sourceDir = this.config.get('storageExplorer.sourceDir') as unknown as string; + this.defaultGeographicSrs = SpatialReference.fromEPSG(this.config.get('application.defaultGeographicSrsId')); + this.defaultProjectedSrs = SpatialReference.fromEPSG(this.config.get('application.defaultProjectedSrsId')); + this.supportedFormatsMap = this.config.get('application.supportedFormatsMap'); + this.sourceDir = this.config.get('storageExplorer.sourceDir'); } public supports(filePath: string): boolean { From 4ce1d8cc18c4c17b8055ba62ab0b7524dd78dd71 Mon Sep 17 00:00:00 2001 From: vitaligi <54726763+vitaligi@users.noreply.github.com> Date: Fri, 20 Mar 2026 00:05:02 +0200 Subject: [PATCH 5/5] chore: sync with boilerplate changes related to otel logging --- package-lock.json | 183 +++++++++--------- package.json | 4 +- src/containerConfig.ts | 2 +- .../anotherResourceName.spec.ts | 2 +- tests/integration/docs/docs.spec.ts | 2 +- .../resourceName/resourceName.spec.ts | 2 +- .../models/resourceNameModel.spec.ts | 4 +- 7 files changed, 103 insertions(+), 96 deletions(-) diff --git a/package-lock.json b/package-lock.json index e9b9cab..9e90944 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,8 +13,8 @@ "@map-colonies/config": "^4.0.1", "@map-colonies/error-express-handler": "^4.0.0", "@map-colonies/error-types": "^1.3.1", - "@map-colonies/express-access-log-middleware": "^4.0.0", - "@map-colonies/js-logger": "^4.0.0", + "@map-colonies/express-access-log-middleware": "^4.1.0", + "@map-colonies/js-logger": "^5.0.0", "@map-colonies/openapi-express-viewer": "^5.0.0", "@map-colonies/prometheus": "^1.0.0", "@map-colonies/read-pkg": "^1.0.0", @@ -2412,9 +2412,9 @@ } }, "node_modules/@map-colonies/express-access-log-middleware": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@map-colonies/express-access-log-middleware/-/express-access-log-middleware-4.0.0.tgz", - "integrity": "sha512-29tnRz5JGRGOMGFjzkqAOuV3rpjIAXkKT7hdHLejFO3vLfDNulpJk1ST0D/uMtX03kOM6/jhscYAvdbVAtKGYQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@map-colonies/express-access-log-middleware/-/express-access-log-middleware-4.1.0.tgz", + "integrity": "sha512-qtuKfNOE9WmEkLD175SI26xO+X8mloxlTE8JrR/gypaqIa8+XdGYNynDKrQK+83t5vMfToMLXhTzmGtT8HgXAg==", "dependencies": { "@opentelemetry/semantic-conventions": "^1.38.0", "http-status-codes": "^2.3.0", @@ -2434,11 +2434,14 @@ } }, "node_modules/@map-colonies/js-logger": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@map-colonies/js-logger/-/js-logger-4.0.0.tgz", - "integrity": "sha512-MjnHPXb5rWYZ7GAqkxn8X/y3AovazTCng5uayq1YoGb90dse5zjt5yfLqULd2WNNmT74ytRM7wlSheD9VjFkKA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@map-colonies/js-logger/-/js-logger-5.0.0.tgz", + "integrity": "sha512-kPEJwJo+bzZprq6Q91+ozJQpP2sPvgjfUF2BMxuXQXXmfY+USU2XcZJdfU4dowV5E275XhFTG9nQT2gJZvdQbg==", "dependencies": { - "@map-colonies/read-pkg": "^1.0.0", + "@map-colonies/read-pkg": "^2.0.0", + "@opentelemetry/resource-detector-container": "^0.8.4", + "@opentelemetry/resources": "^2.6.0", + "@opentelemetry/semantic-conventions": "^1.40.0", "pino": "^10.1.0", "pino-caller": "^4.0.0", "pino-opentelemetry-transport": "^2.0.0", @@ -2448,6 +2451,41 @@ "node": ">=24" } }, + "node_modules/@map-colonies/js-logger/node_modules/@map-colonies/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@map-colonies/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-rMASq2JeRuaWYGqPN68+FwQa4ZSVJBFpttRypUX6RflZK0svZNNCQSWleqz9iJGw5oVDRILNpAb4HRHm/7rszA==", + "dependencies": { + "type-fest": "^5.0.0" + }, + "engines": { + "node": ">=24" + } + }, + "node_modules/@map-colonies/js-logger/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz", + "integrity": "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@map-colonies/js-logger/node_modules/type-fest": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz", + "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@map-colonies/openapi-express-viewer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@map-colonies/openapi-express-viewer/-/openapi-express-viewer-5.0.0.tgz", @@ -2812,22 +2850,6 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@map-colonies/tracing/node_modules/@opentelemetry/core": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.0.tgz", - "integrity": "sha512-ka4H8OM6+DlUhSAZpONu0cPBtPPTQKxbxVzC4CzVx5+K4JnroJVBtDzLAMx4/3CDTJXRvVFhpFjtl4SaiTNoyQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@map-colonies/tracing/node_modules/@opentelemetry/exporter-logs-otlp-grpc": { "version": "0.208.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.208.0.tgz", @@ -4346,22 +4368,6 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@map-colonies/tracing/node_modules/@opentelemetry/resource-detector-container": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.2.tgz", - "integrity": "sha512-8oT0tUO+QS8Tz7u0YQZKoZOpS+LIgS4FnLjWSCPyXPOgKuOeOK5Xe0sd0ulkAGPN4yKr7toNYNVkBeaC/HlmFQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^2.0.0", - "@opentelemetry/resources": "^2.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, "node_modules/@map-colonies/tracing/node_modules/@opentelemetry/resource-detector-gcp": { "version": "0.44.0", "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.44.0.tgz", @@ -4379,22 +4385,6 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@map-colonies/tracing/node_modules/@opentelemetry/resources": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.5.0.tgz", - "integrity": "sha512-F8W52ApePshpoSrfsSk1H2yJn9aKjCrbpQF1M9Qii0GHzbfVeFUB+rc3X4aggyZD8x9Gu3Slua+s6krmq6Dt8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.5.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, "node_modules/@map-colonies/tracing/node_modules/@opentelemetry/sdk-logs": { "version": "0.208.0", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.208.0.tgz", @@ -4936,6 +4926,22 @@ "node": ">=8.0.0" } }, + "node_modules/@opentelemetry/core": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.0.tgz", + "integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, "node_modules/@opentelemetry/instrumentation-openai": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-openai/-/instrumentation-openai-0.7.1.tgz", @@ -5174,6 +5180,38 @@ "node": ">=9.3.0 || >=8.10.0 <9.0.0" } }, + "node_modules/@opentelemetry/resource-detector-container": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.4.tgz", + "integrity": "sha512-kIvGHkMSacp+kb7btTuXbOAIWLyOCO+P/h/8xxaeLcp5ptmHRZ67uEdLAQo61ApdayFB/uqjJ9gY4x2/i/KsoA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.0.tgz", + "integrity": "sha512-D4y/+OGe3JSuYUCBxtH5T9DSAWNcvCb/nQWIga8HNtXTVPQn59j0nTBAgaAXxUVBDl40mG3Tc76b46wPlZaiJQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.6.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, "node_modules/@opentelemetry/semantic-conventions": { "version": "1.34.0", "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.34.0.tgz", @@ -14143,37 +14181,6 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/otlp-logger/node_modules/@opentelemetry/resources": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.5.0.tgz", - "integrity": "sha512-F8W52ApePshpoSrfsSk1H2yJn9aKjCrbpQF1M9Qii0GHzbfVeFUB+rc3X4aggyZD8x9Gu3Slua+s6krmq6Dt8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.5.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/otlp-logger/node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.0.tgz", - "integrity": "sha512-ka4H8OM6+DlUhSAZpONu0cPBtPPTQKxbxVzC4CzVx5+K4JnroJVBtDzLAMx4/3CDTJXRvVFhpFjtl4SaiTNoyQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/otlp-logger/node_modules/@opentelemetry/sdk-logs": { "version": "0.206.0", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.206.0.tgz", diff --git a/package.json b/package.json index b22f8a5..3d711d6 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,8 @@ "@map-colonies/config": "^4.0.1", "@map-colonies/error-express-handler": "^4.0.0", "@map-colonies/error-types": "^1.3.1", - "@map-colonies/express-access-log-middleware": "^4.0.0", - "@map-colonies/js-logger": "^4.0.0", + "@map-colonies/express-access-log-middleware": "^4.1.0", + "@map-colonies/js-logger": "^5.0.0", "@map-colonies/openapi-express-viewer": "^5.0.0", "@map-colonies/prometheus": "^1.0.0", "@map-colonies/read-pkg": "^1.0.0", diff --git a/src/containerConfig.ts b/src/containerConfig.ts index a6e2596..17e2841 100644 --- a/src/containerConfig.ts +++ b/src/containerConfig.ts @@ -23,7 +23,7 @@ export const registerExternalValues = async (options?: RegisterOptions): Promise const loggerConfig = configInstance.get('telemetry.logger'); - const logger = jsLogger({ ...loggerConfig, prettyPrint: loggerConfig.prettyPrint, mixin: getOtelMixin() }); + const logger = await jsLogger({ ...loggerConfig, prettyPrint: loggerConfig.prettyPrint, mixin: getOtelMixin() }); const tracer = trace.getTracer(SERVICE_NAME); const metricsRegistry = new Registry(); diff --git a/tests/integration/anotherResource/anotherResourceName.spec.ts b/tests/integration/anotherResource/anotherResourceName.spec.ts index 4755f83..23ada25 100644 --- a/tests/integration/anotherResource/anotherResourceName.spec.ts +++ b/tests/integration/anotherResource/anotherResourceName.spec.ts @@ -18,7 +18,7 @@ describe('anotherResourceName', function () { beforeEach(async function () { const [app] = await getApp({ override: [ - { token: SERVICES.LOGGER, provider: { useValue: jsLogger({ enabled: false }) } }, + { token: SERVICES.LOGGER, provider: { useValue: await jsLogger({ enabled: false }) } }, { token: SERVICES.TRACER, provider: { useValue: trace.getTracer('testTracer') } }, ], useChild: true, diff --git a/tests/integration/docs/docs.spec.ts b/tests/integration/docs/docs.spec.ts index 95e11b0..dce1eeb 100644 --- a/tests/integration/docs/docs.spec.ts +++ b/tests/integration/docs/docs.spec.ts @@ -17,7 +17,7 @@ describe('docs', function () { beforeEach(async function () { const [app] = await getApp({ override: [ - { token: SERVICES.LOGGER, provider: { useValue: jsLogger({ enabled: false }) } }, + { token: SERVICES.LOGGER, provider: { useValue: await jsLogger({ enabled: false }) } }, { token: SERVICES.TRACER, provider: { useValue: trace.getTracer('testTracer') } }, ], useChild: true, diff --git a/tests/integration/resourceName/resourceName.spec.ts b/tests/integration/resourceName/resourceName.spec.ts index c1548dd..628f854 100644 --- a/tests/integration/resourceName/resourceName.spec.ts +++ b/tests/integration/resourceName/resourceName.spec.ts @@ -18,7 +18,7 @@ describe('resourceName', function () { beforeEach(async function () { const [app] = await getApp({ override: [ - { token: SERVICES.LOGGER, provider: { useValue: jsLogger({ enabled: false }) } }, + { token: SERVICES.LOGGER, provider: { useValue: await jsLogger({ enabled: false }) } }, { token: SERVICES.TRACER, provider: { useValue: trace.getTracer('testTracer') } }, ], useChild: true, diff --git a/tests/unit/resourceName/models/resourceNameModel.spec.ts b/tests/unit/resourceName/models/resourceNameModel.spec.ts index 17ed6f6..d2fce9e 100644 --- a/tests/unit/resourceName/models/resourceNameModel.spec.ts +++ b/tests/unit/resourceName/models/resourceNameModel.spec.ts @@ -5,8 +5,8 @@ import { ResourceNameManager } from '@src/resourceName/models/resourceNameManage let resourceNameManager: ResourceNameManager; describe('ResourceNameManager', () => { - beforeEach(function () { - resourceNameManager = new ResourceNameManager(jsLogger({ enabled: false })); + beforeEach(async function () { + resourceNameManager = new DEMManager(await jsLogger({ enabled: false })); }); describe('#getResource', () => {