Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
{
"packages/commitlint-config": "2.0.0",
"packages/prettier-config": "1.0.0",
"packages/prettier-config": "4.1.0",
"packages/eslint-config": "8.0.0",
"packages/eslint-plugin": "0.1.0",
"packages/typescript-config": "2.0.0",
"packages/error-express-handler": "4.0.0",
"packages/express-access-log-middleware": "4.0.0",
"packages/js-logger": "4.0.0",
"packages/express-access-log-middleware": "4.1.0",
"packages/js-logger": "5.0.0",
"packages/read-pkg": "2.0.0",
"packages/openapi-express-viewer": "5.0.0",
"packages/openapi-express-viewer": "4.1.0",
"packages/openapi-helpers": "5.1.0",
"packages/semantic-conventions": "1.0.0",
"packages/tracing": "1.0.0",
"packages/tracing-utils": "1.0.0",
"packages/prometheus": "1.0.0"
"packages/prometheus": "1.0.0",
"packages/vitest-utils": "0.1.0"
}
4 changes: 4 additions & 0 deletions .vscode/project.code-workspace
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,9 @@
"name": "prometheus",
"path": "../packages/prometheus",
},
{
"name": "vitest-utils",
"path": "../packages/vitest-utils",
},
],
}
4 changes: 4 additions & 0 deletions knip.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ const config: KnipConfig = {
ignoreDependencies: ['@protobuf-ts/plugin'],
ignore: ['tests/generated/**'],
},
'packages/vitest-utils': {
...basePackageConfig,
ignoreDependencies: ['jest-extended', 'jest-openapi'],
},
},
tags: ['-lintignore'],
};
Expand Down
6 changes: 6 additions & 0 deletions packages/express-access-log-middleware/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## [4.1.0](https://github.com/MapColonies/infra-packages/compare/express-access-log-middleware-v4.0.0...express-access-log-middleware-v4.1.0) (2026-03-08)

### 🐛 Bug Fixes

* **express-access-log-middleware:** update attribute name from ATTR_URL_FULL to ATTR_URL_PATH ([#152](https://github.com/MapColonies/infra-packages/issues/152)) ([3905090](https://github.com/MapColonies/infra-packages/commit/39050901456ad0cff89256de41e601f7856c23dc))

## [4.0.0](https://github.com/MapColonies/infra-packages/compare/express-access-log-middleware-v3.0.1...express-access-log-middleware-v4.0.0) (2026-01-18)


Expand Down
2 changes: 1 addition & 1 deletion packages/express-access-log-middleware/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@map-colonies/express-access-log-middleware",
"version": "4.0.0",
"version": "4.1.0",
"description": "An access and error logger for express based on pino-http",
"main": "./dist/index.js",
"type": "commonjs",
Expand Down
23 changes: 23 additions & 0 deletions packages/js-logger/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,28 @@
# Changelog

## [5.0.0](https://github.com/MapColonies/infra-packages/compare/js-logger-v4.1.0...js-logger-v5.0.0) (2026-03-08)


### ⚠ BREAKING CHANGES

* **js-logger:** added ability to define k8s resource attributes ([#161](https://github.com/MapColonies/infra-packages/issues/161))

### 🎉 Features

* **js-logger:** added ability to define k8s resource attributes ([#161](https://github.com/MapColonies/infra-packages/issues/161)) ([f48aaa4](https://github.com/MapColonies/infra-packages/commit/f48aaa4522b7987675308a1b3a1f5b692979534d))

## [4.1.0](https://github.com/MapColonies/infra-packages/compare/js-logger-v4.0.0...js-logger-v4.1.0) (2026-03-08)


### 🐛 Bug Fixes

* **js-logger:** removed formatter and added attributes so log parse correctly ([#151](https://github.com/MapColonies/infra-packages/issues/151)) ([482f709](https://github.com/MapColonies/infra-packages/commit/482f709522d604ddbc695e965405a91be05d3bbc))


### 🔧 Miscellaneous Chores

* **js-logger:** release 4.1.0 ([2a8a574](https://github.com/MapColonies/infra-packages/commit/2a8a574992a1cbf7f2b76f990ebfe436afb73ff5))

## [4.0.0](https://github.com/MapColonies/infra-packages/compare/js-logger-v3.0.2...js-logger-v4.0.0) (2026-01-18)


Expand Down
2 changes: 1 addition & 1 deletion packages/js-logger/etc/js-logger.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { Logger } from 'pino';
import { LoggerOptions as LoggerOptions_2 } from 'pino';

// @public
export function jsLogger(options?: LoggerOptions, destination?: string | number): Logger;
export function jsLogger(options?: LoggerOptions, destination?: string | number): Promise<Logger>;

export { Logger }

Expand Down
7 changes: 5 additions & 2 deletions packages/js-logger/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@map-colonies/js-logger",
"version": "4.0.0",
"version": "5.0.0",
"description": "Javascript and typescript logger for MapColonies based on pino",
"main": "./dist/index.js",
"type": "commonjs",
Expand Down Expand Up @@ -51,6 +51,9 @@
"pino": "^10.1.0",
"pino-caller": "^4.0.0",
"pino-opentelemetry-transport": "^2.0.0",
"pino-pretty": "^13.1.2"
"pino-pretty": "^13.1.2",
"@opentelemetry/resources": "^2.6.0",
"@opentelemetry/resource-detector-container": "^0.8.4",
"@opentelemetry/semantic-conventions": "^1.40.0"
}
}
18 changes: 16 additions & 2 deletions packages/js-logger/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ import {
transport as pinoTransport,
type DestinationStream,
} from 'pino';
import { detectResources } from '@opentelemetry/resources';
import { containerDetector } from '@opentelemetry/resource-detector-container';
import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
import { ATTR_K8S_POD_UID } from '@opentelemetry/semantic-conventions/incubating';
import { pinoCaller } from 'pino-caller';
import type { Options } from 'pino-opentelemetry-transport';
import { readPackageJsonSync } from '@map-colonies/read-pkg';
Expand Down Expand Up @@ -84,7 +88,7 @@ const baseOptions: PinoOptions = {
* @returns The configured logger instance.
* @public
*/
export function jsLogger(options?: LoggerOptions, destination: string | number = 1): Logger {
export async function jsLogger(options?: LoggerOptions, destination: string | number = 1): Promise<Logger> {
let transport: TransportSingleOptions = { target: 'pino/file', options: { destination } };

/* istanbul ignore next */
Expand All @@ -96,10 +100,20 @@ export function jsLogger(options?: LoggerOptions, destination: string | number =

if (options?.opentelemetryOptions?.enabled === true) {
const pkg = readPackageJsonSync();

const detectedResources = detectResources({ detectors: [containerDetector] });
await detectedResources.waitForAsyncAttributes?.();

const otelOptions: Options = {
loggerName: 'js-logger',
serviceVersion: PACKAGE_VERSION,
resourceAttributes: { 'service.name': pkg.name, 'service.version': pkg.version, ...options.opentelemetryOptions.resourceAttributes },
resourceAttributes: {
...detectedResources.attributes,
[ATTR_SERVICE_NAME]: pkg.name,
[ATTR_SERVICE_VERSION]: pkg.version,
[ATTR_K8S_POD_UID]: process.env.K8S_POD_UID,
...options.opentelemetryOptions.resourceAttributes,
},
logRecordProcessorOptions: [
{
recordProcessorType: 'simple',
Expand Down
14 changes: 7 additions & 7 deletions packages/js-logger/tests/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ import { jsLogger } from '../src';
import { waitForFileCreation } from './helpers';

describe('jsLogger', function () {
it('should initialize the logger without errors', function () {
const logger = jsLogger();
it('should initialize the logger without errors', async function () {
const logger = await jsLogger();

expect(logger).toBeDefined();
expect(() => logger.info('test')).not.toThrow();
});

it('should support other destinations', async function () {
const logger = jsLogger({}, 'avi.log');
const logger = await jsLogger({}, 'avi.log');

logger.info('avi');

Expand All @@ -24,7 +24,7 @@ describe('jsLogger', function () {
});

it('should support base option', async function () {
const logger = jsLogger({ base: { key: 'value' } }, 'avi-base.log');
const logger = await jsLogger({ base: { key: 'value' } }, 'avi-base.log');

logger.info('avi');

Expand All @@ -38,7 +38,7 @@ describe('jsLogger', function () {
});

it('should include caller information if enabled', async function () {
const logger = jsLogger({ pinoCaller: true }, 'avi-caller.log');
const logger = await jsLogger({ pinoCaller: true }, 'avi-caller.log');

logger.info('avi');

Expand All @@ -51,8 +51,8 @@ describe('jsLogger', function () {
expect(logLine).toHaveProperty('caller');
});

it('should still output logs when opentelemetry is enabled', function () {
const logger = jsLogger({ opentelemetryOptions: { enabled: true } });
it('should still output logs when opentelemetry is enabled', async function () {
const logger = await jsLogger({ opentelemetryOptions: { enabled: true } });

expect(logger).toBeDefined();
expect(() => logger.info('test otel')).not.toThrow();
Expand Down
10 changes: 10 additions & 0 deletions packages/js-logger/turbo.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"$schema": "https://turborepo.com/schema.json",
"extends": ["//"],
"tasks": {
"build": {
"cache": false,
"outputs": ["$TURBO_EXTENDS$", "src/**"]
}
}
}
7 changes: 7 additions & 0 deletions packages/prettier-config/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Changelog

## [4.1.0](https://github.com/MapColonies/infra-packages/compare/prettier-config-v1.0.0...prettier-config-v4.1.0) (2026-04-14)


### 🔧 Miscellaneous Chores

* **js-logger:** release 4.1.0 ([2a8a574](https://github.com/MapColonies/infra-packages/commit/2a8a574992a1cbf7f2b76f990ebfe436afb73ff5))

## [1.0.0](https://github.com/MapColonies/infra-packages/compare/prettier-config-v0.0.1...prettier-config-v1.0.0) (2026-01-18)


Expand Down
2 changes: 1 addition & 1 deletion packages/prettier-config/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@map-colonies/prettier-config",
"version": "1.0.0",
"version": "4.1.0",
"description": "Common prettier configuration for the MapColonies project",
"license": "MIT",
"repository": "github:MapColonies/infra-packages",
Expand Down
111 changes: 111 additions & 0 deletions packages/vitest-utils/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
# vitest-utils

Shared utilities for the Vitest testing framework used across MapColonies packages.

## Install

```sh
npm install --save-dev @map-colonies/vitest-utils
```

Peer dependencies (`vitest`, `jest-openapi`, `jest-extended`) are optional — install only what you use.

## API documentation

Check the autogenerated documentation [here](https://mapcolonies.github.io/infra-packages/modules/_map-colonies_vitest-utils.html).

## Usage

### `reporters`

A pre-configured reporters array for `vitest.config.ts`. Includes `default` and `html` reporters, and automatically adds `github-actions` when running in CI.

```typescript
// vitest.config.ts
import { defineConfig } from 'vitest/config';
import { reporters } from '@map-colonies/vitest-utils';

export default defineConfig({
test: {
reporters,
},
});
```

### `getPathAlias`

Converts `compilerOptions.paths` from a `tsconfig.json` into a Vitest `resolve.alias` map, keeping path aliases in sync between TypeScript and test runs.

```typescript
// vitest.config.ts
import { defineConfig } from 'vitest/config';
import { getPathAlias } from '@map-colonies/vitest-utils';
import tsconfigJson from './tsconfig.json';

export default defineConfig({
resolve: {
alias: getPathAlias(tsconfigJson, __dirname),
},
});
```

### `setupOpenapi`

Patches Vitest's `expect` into the global scope so that `jest-openapi` matchers (e.g. `toSatisfyApiSpec`) work inside Vitest tests. Resets the global after setup to avoid conflicts.

**Recommended**: call it from a Vitest setup file so it runs once for the entire suite.

```typescript
// tests/setup.ts
import { setupOpenapi } from '@map-colonies/vitest-utils';

setupOpenapi('/absolute/path/to/openapi.yaml');
```

```typescript
// vitest.config.ts
import { defineConfig } from 'vitest/config';

export default defineConfig({
test: {
setupFiles: ['./tests/setup.ts'],
},
});
```

Then use the matcher in your tests:

```typescript
it('should satisfy the OpenAPI spec', async function () {
const response = await supertest(app).get('/resource');
expect(response).toSatisfyApiSpec();
});
```

Alternatively, call it inside a `beforeAll` when you need per-suite control:

```typescript
beforeAll(function () {
setupOpenapi('/absolute/path/to/openapi.yaml');
});
```

### `vitest-extended` (side-effect import)

Registers all [jest-extended](https://jest-extended.jestcommunity.dev/) matchers into Vitest's `expect`. Import it once from a setup file.

```typescript
// tests/setup.ts
import '@map-colonies/vitest-utils/extended';
```

```typescript
// vitest.config.ts
import { defineConfig } from 'vitest/config';

export default defineConfig({
test: {
setupFiles: ['./tests/setup.ts'],
},
});
```
4 changes: 4 additions & 0 deletions packages/vitest-utils/api-extractor.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
"extends": "../../api-extractor.json"
}
4 changes: 4 additions & 0 deletions packages/vitest-utils/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import baseConfig from '@map-colonies/eslint-config/ts-base';
import { defineConfig } from 'eslint/config';

export default defineConfig(baseConfig, { ignores: ['vitest.config.ts'] });
24 changes: 24 additions & 0 deletions packages/vitest-utils/etc/vitest-utils.api.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
## API Report File for "@map-colonies/vitest-utils"

> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).

```ts

import type { ViteUserConfig } from 'vitest/config';

// @public
export function getPathAlias(tsconfig: {
compilerOptions: {
paths: Record<string, string[]>;
};
}, rootDir: string): Record<string, string>;

// @public
export const reporters: Exclude<ViteUserConfig['test'], undefined>['reporters'];

// @public
export function setupOpenapi(path: string): void;

// (No @packageDocumentation comment for this package)

```
Loading
Loading