From 0bc3d9f8b23a452fe92d7d6b4a525a67b048ea8b Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 5 Apr 2023 14:38:22 -0400 Subject: [PATCH] feat: Introduce PlatformSpecific as a new wrapper type for injectables Signed-off-by: Sebastian Malton --- packages/utility-features/utilities/index.ts | 1 + .../src/platform-specific-version.ts | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 packages/utility-features/utilities/src/platform-specific-version.ts diff --git a/packages/utility-features/utilities/index.ts b/packages/utility-features/utilities/index.ts index dc8eacdfdd..b9e2b176b8 100644 --- a/packages/utility-features/utilities/index.ts +++ b/packages/utility-features/utilities/index.ts @@ -29,6 +29,7 @@ export * from "./src/noop"; export * from "./src/object"; export * from "./src/observable-crate"; export * from "./src/on-keyboard-shortcut"; +export * from "./src/platform-specific-version" export * from "./src/prevDefault"; export * from "./src/readableStream"; export * from "./src/readonly"; diff --git a/packages/utility-features/utilities/src/platform-specific-version.ts b/packages/utility-features/utilities/src/platform-specific-version.ts new file mode 100644 index 0000000000..adbc9971cc --- /dev/null +++ b/packages/utility-features/utilities/src/platform-specific-version.ts @@ -0,0 +1,20 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +export interface PlatformSpecific { + instantiate: () => T; + readonly platform: NodeJS.Platform | ""; +} + +export const getPlatformSpecificFor = (targetPlatform: NodeJS.Platform, id: string) => (specificImplementations: PlatformSpecific[]): T => { + const impl = specificImplementations.find(impl => impl.platform === targetPlatform) + ?? specificImplementations.find(impl => impl.platform === ""); + + if (!impl) { + throw new Error(`No platform specific implementation of "${id}" found`); + } + + return impl.instantiate(); +}