From c88b7a65fdfd23ee22bfdf7b9b30e3670c300790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=9C=A8=20Audrey=20=E2=9C=A8?= Date: Fri, 27 Dec 2024 14:08:42 -0500 Subject: [PATCH] tweak vendor organization; add README --- .../src/tools/extension/extension-site.ts | 3 +- libs/common/src/tools/extension/factory.ts | 29 ++++--------- .../src/tools/extension/vendor/README.md | 34 +++++++++++++++ .../common/src/tools/extension/vendor/data.ts | 42 ------------------- .../src/tools/extension/vendor/index.ts | 28 +++++++++++++ .../common/src/tools/extension/vendor/type.ts | 6 +-- 6 files changed, 74 insertions(+), 68 deletions(-) create mode 100644 libs/common/src/tools/extension/vendor/README.md create mode 100644 libs/common/src/tools/extension/vendor/index.ts diff --git a/libs/common/src/tools/extension/extension-site.ts b/libs/common/src/tools/extension/extension-site.ts index e8aba008493..7d4e81d9766 100644 --- a/libs/common/src/tools/extension/extension-site.ts +++ b/libs/common/src/tools/extension/extension-site.ts @@ -1,6 +1,7 @@ import { deepFreeze } from "../util"; -import { ExtensionMetadata, SiteMetadata, VendorId } from "./type"; +import { ExtensionMetadata, SiteMetadata } from "./type"; +import { VendorId } from "./vendor/type"; /** Describes the capabilities of an extension site. * This type is immutable. diff --git a/libs/common/src/tools/extension/factory.ts b/libs/common/src/tools/extension/factory.ts index 03b344ad060..4b10253da3b 100644 --- a/libs/common/src/tools/extension/factory.ts +++ b/libs/common/src/tools/extension/factory.ts @@ -1,37 +1,24 @@ import { DefaultExtensionRegistry } from "./default-extension-registry"; import { Extension } from "./metadata"; -import { ExtensionMetadata } from "./type"; -import { AddyIo, AddyIoExtensions } from "./vendor/addy-io"; -import { DuckDuckGo, DuckDuckGoExtensions } from "./vendor/duck-duck-go"; -import { Fastmail, FastmailExtensions } from "./vendor/fastmail"; -import { ForwardEmail, ForwardEmailExtensions } from "./vendor/forward-email"; -import { Mozilla, MozillaExtensions } from "./vendor/mozilla"; -import { SimpleLogin, SimpleLoginExtensions } from "./vendor/simple-login"; -import { VendorMetadata } from "./vendor/type"; +import { VendorExtensions, Vendors } from "./vendor"; // FIXME: find a better way to build the registry than a hard-coded factory function /** Constructs the extension registry */ export function buildRegistry() { - function registerAll(vendor: VendorMetadata, extensions: ExtensionMetadata[]) { - registry.registerVendor(vendor); - for (const extension of extensions) { - registry.registerExtension(extension); - } - } - const registry = new DefaultExtensionRegistry(); for (const site of Reflect.ownKeys(Extension) as string[]) { registry.registerSite(Extension[site]); } - registerAll(AddyIo, AddyIoExtensions); - registerAll(DuckDuckGo, DuckDuckGoExtensions); - registerAll(Fastmail, FastmailExtensions); - registerAll(ForwardEmail, ForwardEmailExtensions); - registerAll(Mozilla, MozillaExtensions); - registerAll(SimpleLogin, SimpleLoginExtensions); + for (const vendor of Vendors) { + registry.registerVendor(vendor); + } + + for (const extension of VendorExtensions) { + registry.registerExtension(extension); + } return registry; } diff --git a/libs/common/src/tools/extension/vendor/README.md b/libs/common/src/tools/extension/vendor/README.md new file mode 100644 index 00000000000..15dbc2e3c85 --- /dev/null +++ b/libs/common/src/tools/extension/vendor/README.md @@ -0,0 +1,34 @@ +# Vendors + +This folder contains vendor-specific logic that extends the +Bitwarden password manager. + +## Vendor IDs + +A vendor's ID is used to identify and trace the code provided by +a vendor across Bitwarden. There are a few rules that vendor ids +must follow: + +1. They should be human-readable. (No UUIDs.) +2. They may only contain lowercase ASCII characters and numbers. +3. They must retain backwards compatibility with prior versions. + +As such, any given ID may not not match the vendor's present +brand identity. Said branding may be stored in `VendorMetadata.name`. + +## Core files + +There are 4 vendor-independent files in this directory. + +- `data.ts` - core metadata used for system initialization +- `index.ts` - exports vendor metadata +- `README.md` - this file +- `type.ts` - type definitions for vendor metadata + +## Vendor definitions + +Each vendor should have one and only one definition, whose name +MUST match their `VendorId`. The vendor is free to use either a +single file (e.g. `bitwarden.ts`) or a folder containing multiple +files (e.g. `bitwarden/extension.ts`, `bitwarden/forwarder.ts`) to +host their files. diff --git a/libs/common/src/tools/extension/vendor/data.ts b/libs/common/src/tools/extension/vendor/data.ts index 845a0a0b1e7..0d40e2e53d6 100644 --- a/libs/common/src/tools/extension/vendor/data.ts +++ b/libs/common/src/tools/extension/vendor/data.ts @@ -1,7 +1,3 @@ -import { Site } from "../data"; - -import { VendorMetadata } from "./type"; - export const Vendor = Object.freeze({ anonaddy: "anonaddy", duckduckgo: "duckduckgo", @@ -10,41 +6,3 @@ export const Vendor = Object.freeze({ forwardemail: "forwardemail", simplelogin: "simplelogin", } as const); - -export const VendorInfo: Record = { - [Vendor.anonaddy]: { - id: Vendor.anonaddy, - name: "Addy.io", - }, - [Vendor.duckduckgo]: { - id: Vendor.duckduckgo, - name: "DuckDuckGo", - }, - [Vendor.fastmail]: { - id: Vendor.fastmail, - name: "Fastmail", - }, - [Vendor.mozilla]: { - id: Vendor.mozilla, - name: "Mozilla", - }, - [Vendor.forwardemail]: { - id: Vendor.forwardemail, - name: "Forward Email", - }, - [Vendor.simplelogin]: { - id: Vendor.simplelogin, - name: "SimpleLogin", - }, -}; - -export const VendorsByExtension = { - [Site.forwarder]: [ - Vendor.anonaddy, - Vendor.duckduckgo, - Vendor.fastmail, - Vendor.mozilla, - Vendor.forwardemail, - Vendor.simplelogin, - ] as const, -} as const; diff --git a/libs/common/src/tools/extension/vendor/index.ts b/libs/common/src/tools/extension/vendor/index.ts new file mode 100644 index 00000000000..0c2ebdfd4cd --- /dev/null +++ b/libs/common/src/tools/extension/vendor/index.ts @@ -0,0 +1,28 @@ +import { deepFreeze } from "../../util"; + +import { AddyIo, AddyIoExtensions } from "./addy-io"; +import { DuckDuckGo, DuckDuckGoExtensions } from "./duck-duck-go"; +import { Fastmail, FastmailExtensions } from "./fastmail"; +import { ForwardEmail, ForwardEmailExtensions } from "./forward-email"; +import { Mozilla, MozillaExtensions } from "./mozilla"; +import { SimpleLogin, SimpleLoginExtensions } from "./simple-login"; + +export const Vendors = deepFreeze([ + AddyIo, + DuckDuckGo, + Fastmail, + ForwardEmail, + Mozilla, + SimpleLogin, +]); + +export const VendorExtensions = deepFreeze( + [ + AddyIoExtensions, + DuckDuckGoExtensions, + FastmailExtensions, + ForwardEmailExtensions, + MozillaExtensions, + SimpleLoginExtensions, + ].flat(), +); diff --git a/libs/common/src/tools/extension/vendor/type.ts b/libs/common/src/tools/extension/vendor/type.ts index 34c2da172f2..d419364a1e5 100644 --- a/libs/common/src/tools/extension/vendor/type.ts +++ b/libs/common/src/tools/extension/vendor/type.ts @@ -1,9 +1,7 @@ -import { SiteId } from "../type"; - -import { VendorsByExtension } from "./data"; +import { Vendor } from "./data"; /** Identifies a vendor extending bitwarden */ -export type VendorId = (typeof VendorsByExtension)[SiteId][number]; +export type VendorId = keyof typeof Vendor; /** The capabilities and descriptive content for an extension */ export type VendorMetadata = {