core-api: add versioned value types and helpers

Co-authored-by: Juan Lulkin <jmaiz@spotify.com>
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2021-03-08 17:21:38 +01:00
parent 386e7aa007
commit 1f3321fbfc
2 changed files with 80 additions and 0 deletions
@@ -0,0 +1,40 @@
/*
* Copyright 2021 Spotify AB
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { createVersionedValueMap } from './versionedValues';
describe('createVersionedValueMap', () => {
it('should be empty', () => {
const map = createVersionedValueMap({});
// @ts-expect-error
expect(map.atVersion(1 as any)).toBe(undefined);
});
it('should access values by version', () => {
const map = createVersionedValueMap({ 1: 'v1', 2: 'v2' });
expect(map.atVersion(1)).toBe('v1');
expect(map.atVersion(2)).toBe('v2');
// @ts-expect-error
expect(map.atVersion(0)).toBe(undefined);
// @ts-expect-error
expect(map.atVersion(NaN)).toBe(undefined);
// @ts-expect-error
expect(map.atVersion(Infinity)).toBe(undefined);
});
});
@@ -0,0 +1,40 @@
/*
* Copyright 2021 Spotify AB
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* The versioned value interface is a container for a set of values that
* can be looked up by version. It is intended to be used as a container
* for values that can be versioned independently of package versions.
*/
export type VersionedValue<Versions extends { [version: number]: any }> = {
atVersion<Version extends keyof Versions>(
version: Version,
): Versions[Version] | undefined;
};
/**
* Creates a container for a map of versioned values that implements VersionedValue.
*/
export function createVersionedValueMap<
Versions extends { [version: number]: any }
>(versions: Versions): VersionedValue<Versions> {
Object.freeze(versions);
return {
atVersion(version) {
return versions[version];
},
};
}