@orbit-work/oem-sdk 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audit-brand.js +48 -10
- package/dist/audit-brand.js.map +1 -1
- package/dist/audit.d.ts +101 -0
- package/dist/audit.js +48 -10
- package/dist/audit.js.map +1 -1
- package/dist/{chunk-ZGPZ3ON6.js → chunk-ZOURSTKZ.js} +28 -3
- package/dist/chunk-ZOURSTKZ.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/manifest.d.ts +14 -2
- package/dist/manifest.js +1 -1
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.js +1 -1
- package/package.json +9 -9
- package/schema/orbit-brand.schema.json +27 -3
- package/dist/chunk-ZGPZ3ON6.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { UNIFIED_NEUTRAL_TOKENS, BRAND_ACTION_TOKENS, ds2ContrastRatio } from '@orbit-work/ui/appearance';
|
|
1
|
+
import { UNIFIED_NEUTRAL_TOKENS, BRAND_ACTION_TOKENS, isOrbitworkFontScale, ORBITWORK_FONT_SCALES, ds2ContrastRatio } from '@orbit-work/ui/appearance';
|
|
2
2
|
import { WORKBENCH_SLOT_DECLARATIONS, WORKBENCH_KEYED_SLOT_KEYS } from '@orbit-work/ui/slot/core';
|
|
3
3
|
|
|
4
4
|
// src/manifest.ts
|
|
@@ -13,6 +13,8 @@ var ROOT_KEYS = /* @__PURE__ */ new Set([
|
|
|
13
13
|
"entry",
|
|
14
14
|
"identity",
|
|
15
15
|
"tokens",
|
|
16
|
+
"typography",
|
|
17
|
+
"fontScale",
|
|
16
18
|
"assets",
|
|
17
19
|
"branding",
|
|
18
20
|
"locales",
|
|
@@ -25,6 +27,7 @@ var MODE_KEYS = /* @__PURE__ */ new Set(["light", "dark"]);
|
|
|
25
27
|
var CONTRIBUTES_KEYS = /* @__PURE__ */ new Set(["slots"]);
|
|
26
28
|
var NETWORK_KEYS = /* @__PURE__ */ new Set(["allowedOrigins"]);
|
|
27
29
|
var PERMISSIONS_KEYS = /* @__PURE__ */ new Set(["microphoneUsage"]);
|
|
30
|
+
var TYPOGRAPHY_KEYS = /* @__PURE__ */ new Set(["fontSans", "fontMono"]);
|
|
28
31
|
var BRANDING_KEYS = /* @__PURE__ */ new Set(["productName", "companyName", "claim", "claimNote", "slogan"]);
|
|
29
32
|
var SLOT_COMMON_KEYS = /* @__PURE__ */ new Set(["name"]);
|
|
30
33
|
var BRAND_TOKEN_NAMES = /* @__PURE__ */ new Set([...UNIFIED_NEUTRAL_TOKENS, ...BRAND_ACTION_TOKENS]);
|
|
@@ -325,6 +328,20 @@ function parseTokens(value) {
|
|
|
325
328
|
if (!light && !dark) throw new Error("tokens must define light or dark");
|
|
326
329
|
return { ...light ? { light } : {}, ...dark ? { dark } : {} };
|
|
327
330
|
}
|
|
331
|
+
function parseTypography(value) {
|
|
332
|
+
if (value === void 0) return void 0;
|
|
333
|
+
if (!isRecord(value)) throw new Error("typography must be an object");
|
|
334
|
+
assertKnownKeys(value, TYPOGRAPHY_KEYS, "typography");
|
|
335
|
+
return {
|
|
336
|
+
fontSans: text(value.fontSans, "typography.fontSans", 200),
|
|
337
|
+
fontMono: text(value.fontMono, "typography.fontMono", 200)
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
function parseFontScale(value) {
|
|
341
|
+
if (value === void 0) return void 0;
|
|
342
|
+
if (!isOrbitworkFontScale(value)) throw new Error(`fontScale must be one of ${ORBITWORK_FONT_SCALES.join(", ")}`);
|
|
343
|
+
return value;
|
|
344
|
+
}
|
|
328
345
|
function slotAllowedKeys(kind) {
|
|
329
346
|
return /* @__PURE__ */ new Set([
|
|
330
347
|
...SLOT_COMMON_KEYS,
|
|
@@ -390,6 +407,8 @@ function parseBrandManifest(input, options) {
|
|
|
390
407
|
if ((contributes?.slots.length ?? 0) > 0 && !entry)
|
|
391
408
|
throw new Error("entry is required when contributes.slots is not empty");
|
|
392
409
|
const tokens = parseTokens(input.tokens);
|
|
410
|
+
const typography = parseTypography(input.typography);
|
|
411
|
+
const fontScale = parseFontScale(input.fontScale);
|
|
393
412
|
const locales = parseLocales(input.locales);
|
|
394
413
|
const network = parseNetwork(input.network);
|
|
395
414
|
const identity = parseIdentity(input.identity, id, platform);
|
|
@@ -417,6 +436,8 @@ function parseBrandManifest(input, options) {
|
|
|
417
436
|
...entry ? { entry } : {},
|
|
418
437
|
identity,
|
|
419
438
|
...tokens ? { tokens } : {},
|
|
439
|
+
...typography ? { typography } : {},
|
|
440
|
+
...fontScale ? { fontScale } : {},
|
|
420
441
|
assets: parseAssets(input.assets),
|
|
421
442
|
branding: parseBranding(input.branding),
|
|
422
443
|
...locales ? { locales } : {},
|
|
@@ -521,6 +542,8 @@ function parsePartialBrandManifest(input) {
|
|
|
521
542
|
...entry ? { entry } : {},
|
|
522
543
|
...input.identity !== void 0 ? { identity: parsePartialIdentity(input.identity) } : {},
|
|
523
544
|
...input.tokens !== void 0 ? { tokens: parseTokens(input.tokens) } : {},
|
|
545
|
+
...input.typography !== void 0 ? { typography: parseTypography(input.typography) } : {},
|
|
546
|
+
...input.fontScale !== void 0 ? { fontScale: parseFontScale(input.fontScale) } : {},
|
|
524
547
|
...input.assets !== void 0 ? { assets: parsePartialAssets(input.assets) } : {},
|
|
525
548
|
...input.branding !== void 0 ? { branding: parsePartialBranding(input.branding) } : {},
|
|
526
549
|
...input.locales !== void 0 ? { locales: parseLocales(input.locales) } : {},
|
|
@@ -538,10 +561,12 @@ function manifestToBrandTheme(manifest) {
|
|
|
538
561
|
logo: manifest.assets.logo,
|
|
539
562
|
...manifest.assets.loginKV ? { loginKV: manifest.assets.loginKV } : {},
|
|
540
563
|
modes: manifest.tokens ?? {},
|
|
564
|
+
...manifest.typography ? { typography: manifest.typography } : {},
|
|
565
|
+
...manifest.fontScale ? { fontScale: manifest.fontScale } : {},
|
|
541
566
|
branding: manifest.branding
|
|
542
567
|
};
|
|
543
568
|
}
|
|
544
569
|
|
|
545
570
|
export { BRAND_MANIFEST_SCHEMA, manifestToBrandTheme, parseBrandManifest, parsePartialBrandManifest };
|
|
546
|
-
//# sourceMappingURL=chunk-
|
|
547
|
-
//# sourceMappingURL=chunk-
|
|
571
|
+
//# sourceMappingURL=chunk-ZOURSTKZ.js.map
|
|
572
|
+
//# sourceMappingURL=chunk-ZOURSTKZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/manifest.ts"],"names":[],"mappings":"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","file":"chunk-ZOURSTKZ.js","sourcesContent":["import {\n BRAND_ACTION_TOKENS,\n type BrandTheme,\n type BrandThemeToken,\n type LocalizedBranding,\n type OrbitworkFontScale,\n type TenantBranding,\n UNIFIED_NEUTRAL_TOKENS,\n ds2ContrastRatio,\n isOrbitworkFontScale,\n ORBITWORK_FONT_SCALES,\n} from \"@orbit-work/ui/appearance\"\nimport { type SlotKind, WORKBENCH_KEYED_SLOT_KEYS, WORKBENCH_SLOT_DECLARATIONS } from \"@orbit-work/ui/slot/core\"\n\nexport type BrandSlotName = keyof typeof WORKBENCH_SLOT_DECLARATIONS\n\nexport const BRAND_MANIFEST_SCHEMA = \"@orbit-work/oem-sdk/manifest@1\" as const\n\nexport type BrandIdentity = {\n productName: string\n appId: string\n versionChannel: string\n protocolScheme: string\n /**\n * Optional override for the per-installation user data directory namespace.\n * Managed builds default to the identity appId; workspace packages derive\n * storage from appId and omit this field.\n */\n userDataNamespace?: string\n}\n\n/** Upload-time brand manifest: every field optional, filled fields fully validated. */\nexport type PartialBrandIdentity = { [Key in keyof BrandIdentity]?: BrandIdentity[Key] }\n\nexport type PartialBrandAssets = { [Key in keyof BrandAssets]?: BrandAssets[Key] }\n\nexport type PartialLocalizedBranding = Record<string, Partial<TenantBranding>>\n\nexport type PartialBrandManifest = {\n $schema?: typeof BRAND_MANIFEST_SCHEMA\n id?: string\n /** Installer package description (electron-builder `description`). */\n description?: string\n /** Assistant display name in chat copy; defaults to the branding productName. */\n assistantName?: string\n /** Product homepage packaged into installer metadata. */\n homepage?: string\n /** OS permission prompts overridden by the OEM. */\n permissions?: BrandPermissions\n entry?: string\n identity?: PartialBrandIdentity\n tokens?: BrandManifest[\"tokens\"]\n /** OEM font stacks; user skins and the tenant theme still win at runtime. */\n typography?: BrandTypography\n /** OEM text-size preset; the personal preference and user skins still win. */\n fontScale?: OrbitworkFontScale\n assets?: PartialBrandAssets\n branding?: PartialLocalizedBranding\n locales?: BrandLocaleSources\n network?: BrandNetworkAccess\n contributes?: { slots: SlotContribution[] }\n}\n\nexport type PartialBrandManifestValidationResult =\n | { ok: true; manifest: PartialBrandManifest }\n | { ok: false; error: string }\n\nexport type BrandAssets = {\n appIcon: string\n tray?: string\n logo: string\n /** Optional login key-visual photo (KV board background on the desktop login page). */\n loginKV?: string\n}\n\nexport type BrandLocaleSources = Record<string, string>\n\n/** OEM typography override; both stacks are CSS font-family values. */\nexport type BrandTypography = {\n fontSans: string\n fontMono: string\n}\n\nexport type BrandNetworkAccess = {\n /** Exact production HTTPS origins added to the packaged renderer connect-src. */\n allowedOrigins: string[]\n}\n\nexport type BrandPermissions = {\n /** macOS microphone prompt (Info.plist NSMicrophoneUsageDescription), written in the OEM's own language. */\n microphoneUsage: string\n}\n\ntype SlotNameOfKind<Kind extends SlotKind> = {\n [Name in BrandSlotName]: (typeof WORKBENCH_SLOT_DECLARATIONS)[Name][\"kind\"] extends Kind ? Name : never\n}[BrandSlotName]\n\ntype SlotContributionBase<Name extends BrandSlotName> = {\n name: Name\n}\n\ntype SingleSlotContribution = {\n [Name in SlotNameOfKind<\"single\">]: SlotContributionBase<Name>\n}[SlotNameOfKind<\"single\">]\n\ntype ListSlotContribution = {\n [Name in SlotNameOfKind<\"list\">]: SlotContributionBase<Name> & { id: string; order: number }\n}[SlotNameOfKind<\"list\">]\n\ntype KeyedSlotName = Extract<keyof typeof WORKBENCH_KEYED_SLOT_KEYS, BrandSlotName>\ntype KeyedSlotContribution = {\n [Name in KeyedSlotName]: SlotContributionBase<Name> & {\n key: (typeof WORKBENCH_KEYED_SLOT_KEYS)[Name][number]\n }\n}[KeyedSlotName]\n\nexport type SlotContribution = SingleSlotContribution | ListSlotContribution | KeyedSlotContribution\n\nexport type BrandManifest = {\n $schema: typeof BRAND_MANIFEST_SCHEMA\n id: string\n /** Installer package description (electron-builder `description`). */\n description?: string\n /** Assistant display name in chat copy; defaults to the branding productName. */\n assistantName?: string\n /** Product homepage packaged into installer metadata. */\n homepage?: string\n /** OS permission prompts overridden by the OEM. */\n permissions?: BrandPermissions\n entry?: string\n identity: BrandIdentity\n tokens?: Partial<Record<\"light\" | \"dark\", Partial<Record<BrandThemeToken, string>>>>\n typography?: BrandTypography\n /** OEM text-size preset; the personal font-scale preference and user skins still win. */\n fontScale?: OrbitworkFontScale\n assets: BrandAssets\n branding: LocalizedBranding\n /** Package-relative dictionaries owned by this OEM namespace. en-US is the required fallback. */\n locales?: BrandLocaleSources\n network?: BrandNetworkAccess\n contributes?: {\n slots: SlotContribution[]\n }\n}\n\nexport type BrandManifestParseOptions = {\n /**\n * Platform builds accept manifests resolved from the managed OEM pipeline:\n * every shape/format/safety check stays in force, only the workspace\n * namespacing bindings are relaxed (productName/versionChannel/protocolScheme\n * must equal id, appId must end with .oem.<id>, reserved feed channels).\n */\n platform?: boolean\n}\n\nexport type BrandManifestValidationResult = { ok: true; manifest: BrandManifest } | { ok: false; error: string }\n\nconst ROOT_KEYS = new Set([\n \"$schema\",\n \"id\",\n \"description\",\n \"assistantName\",\n \"homepage\",\n \"permissions\",\n \"entry\",\n \"identity\",\n \"tokens\",\n \"typography\",\n \"fontScale\",\n \"assets\",\n \"branding\",\n \"locales\",\n \"network\",\n \"contributes\",\n])\nconst IDENTITY_KEYS = new Set([\"productName\", \"appId\", \"versionChannel\", \"protocolScheme\", \"userDataNamespace\"])\nconst ASSET_KEYS = new Set([\"appIcon\", \"tray\", \"logo\", \"loginKV\"])\nconst MODE_KEYS = new Set([\"light\", \"dark\"])\nconst CONTRIBUTES_KEYS = new Set([\"slots\"])\nconst NETWORK_KEYS = new Set([\"allowedOrigins\"])\nconst PERMISSIONS_KEYS = new Set([\"microphoneUsage\"])\nconst TYPOGRAPHY_KEYS = new Set([\"fontSans\", \"fontMono\"])\nconst BRANDING_KEYS = new Set([\"productName\", \"companyName\", \"claim\", \"claimNote\", \"slogan\"])\nconst SLOT_COMMON_KEYS = new Set([\"name\"])\nconst BRAND_TOKEN_NAMES = new Set<string>([...UNIFIED_NEUTRAL_TOKENS, ...BRAND_ACTION_TOKENS])\nconst SLOT_DECLARATIONS = WORKBENCH_SLOT_DECLARATIONS as Readonly<Record<string, { kind: SlotKind }>>\nconst HEX = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i\nconst KEBAB_ID = /^[a-z0-9]+(?:-[a-z0-9]+)*$/\nconst APP_ID = /^[a-zA-Z][a-zA-Z0-9]*(?:\\.[a-zA-Z0-9][a-zA-Z0-9-]*){2,}$/\nconst PROTOCOL_SCHEME = /^[a-z][a-z0-9+.-]*$/\nconst SOURCE_ENTRY = /^\\.\\/src\\/.+\\.(?:[cm]?js|[jt]sx?)$/\nconst WINDOWS_DEVICE_NAME = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\..*)?$/i\nconst OFFICIAL_APP_ID = \"ai.orbit.desktop\"\nconst OFFICIAL_PRODUCT_NAMES = new Set([\"orbitwork\"])\nconst RESERVED_VERSION_CHANNELS = new Set([\n \"stable\",\n \"preview\",\n \"uat\",\n \"latest\",\n \"desktop\",\n \"macos\",\n \"windows\",\n \"linux\",\n])\nconst RESERVED_PROTOCOL_SCHEMES = new Set([\n \"about\",\n \"blob\",\n \"chrome\",\n \"chrome-extension\",\n \"data\",\n \"devtools\",\n \"electron\",\n \"file\",\n \"ftp\",\n \"geo\",\n \"http\",\n \"https\",\n \"javascript\",\n \"mailto\",\n \"orbit\",\n \"sms\",\n \"tel\",\n \"urn\",\n \"ws\",\n \"wss\",\n])\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n}\n\nfunction hasUnsafeProductNameCharacter(value: string): boolean {\n return [...value].some((character) => {\n const code = character.charCodeAt(0)\n return code <= 31 || code === 127 || '<>:\"/\\\\|?*'.includes(character)\n })\n}\n\nfunction productNameNamespace(value: string): string {\n return value\n .normalize(\"NFKD\")\n .replace(/\\p{M}+/gu, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n}\n\nfunction assertKnownKeys(value: Record<string, unknown>, allowed: Set<string>, path: string): void {\n const unknown = Object.keys(value).find((key) => !allowed.has(key))\n if (unknown) throw new Error(`${path} contains unsupported field: ${unknown}`)\n}\n\nfunction text(value: unknown, path: string, limit = 100): string {\n if (typeof value !== \"string\" || !value.trim()) throw new Error(`${path} must be a non-empty string`)\n const result = value.trim()\n if (result.length > limit) throw new Error(`${path} exceeds ${limit} characters`)\n return result\n}\n\nfunction canonicalLocale(value: string, path: string): string {\n try {\n const locale = Intl.getCanonicalLocales(value)[0]\n if (!locale || locale !== value) throw new Error()\n return locale\n } catch {\n throw new Error(`${path} must be a canonical BCP 47 locale`)\n }\n}\n\nfunction relativePath(value: unknown, path: string): string {\n const result = text(value, path, 240)\n if (!result.startsWith(\"./\") || result.includes(\"\\\\\") || result.split(\"/\").includes(\"..\")) {\n throw new Error(`${path} must be a package-relative ./ path without traversal`)\n }\n return result\n}\n\nfunction parseIdentity(value: unknown, id: string, platform: boolean): BrandIdentity {\n if (!isRecord(value)) throw new Error(\"identity must be an object\")\n assertKnownKeys(value, IDENTITY_KEYS, \"identity\")\n const productName = text(value.productName, \"identity.productName\", 64)\n const appId = text(value.appId, \"identity.appId\", 160)\n const versionChannel = text(value.versionChannel, \"identity.versionChannel\", 64)\n const protocolScheme = text(value.protocolScheme, \"identity.protocolScheme\", 64)\n if (value.userDataNamespace !== undefined && !KEBAB_ID.test(text(value.userDataNamespace, \"identity.userDataNamespace\", 64))) {\n throw new Error(\"identity.userDataNamespace must be lowercase kebab-case\")\n }\n if (!APP_ID.test(appId)) throw new Error(\"identity.appId must be a reverse-DNS identifier\")\n if (!KEBAB_ID.test(versionChannel)) throw new Error(\"identity.versionChannel must be kebab-case\")\n // Managed platform builds assign the update channel from the frozen build\n // input; reserved feed names and the == id binding only police workspace\n // packages, where collisions would merge OEM feeds.\n if (!platform && RESERVED_VERSION_CHANNELS.has(versionChannel)) {\n throw new Error(`identity.versionChannel is reserved: ${versionChannel}`)\n }\n if (!PROTOCOL_SCHEME.test(protocolScheme)) {\n throw new Error(\"identity.protocolScheme must be a lowercase URI scheme beginning with a letter\")\n }\n if (RESERVED_PROTOCOL_SCHEMES.has(protocolScheme)) {\n throw new Error(`identity.protocolScheme is reserved: ${protocolScheme}`)\n }\n if (\n hasUnsafeProductNameCharacter(productName) ||\n /[. ]$/.test(productName) ||\n productName === \".\" ||\n productName === \"..\" ||\n WINDOWS_DEVICE_NAME.test(productName)\n ) {\n throw new Error(\"identity.productName must be safe for macOS, Windows, Linux, and release artifact paths\")\n }\n if (OFFICIAL_PRODUCT_NAMES.has(productName.toLowerCase())) {\n throw new Error(`identity.productName is reserved for the official application: ${productName}`)\n }\n if (appId === OFFICIAL_APP_ID) {\n throw new Error(`identity.appId is reserved for the official application: ${appId}`)\n }\n if (!platform && productNameNamespace(productName) !== id) {\n throw new Error(\"identity.productName must normalize to manifest id so installation names cannot collide\")\n }\n if (!platform && versionChannel !== id) {\n throw new Error(\"identity.versionChannel must equal manifest id to keep OEM update feeds namespaced\")\n }\n if (!platform && protocolScheme !== id) {\n throw new Error(\"identity.protocolScheme must equal manifest id to keep OEM deep links namespaced\")\n }\n if (!platform && !appId.endsWith(`.oem.${id}`)) {\n throw new Error(\"identity.appId must end with .oem.<manifest id> to isolate installation and user data\")\n }\n return {\n productName,\n appId,\n versionChannel,\n protocolScheme,\n ...(value.userDataNamespace !== undefined ? { userDataNamespace: text(value.userDataNamespace, \"identity.userDataNamespace\", 64) } : {}),\n }\n}\n\nfunction parseAssets(value: unknown): BrandAssets {\n if (!isRecord(value)) throw new Error(\"assets must be an object\")\n assertKnownKeys(value, ASSET_KEYS, \"assets\")\n const tray = value.tray === undefined ? undefined : relativePath(value.tray, \"assets.tray\")\n const loginKV =\n value.loginKV === undefined ? undefined : relativePath(value.loginKV, \"assets.loginKV\")\n return {\n appIcon: relativePath(value.appIcon, \"assets.appIcon\"),\n ...(tray ? { tray } : {}),\n logo: relativePath(value.logo, \"assets.logo\"),\n ...(loginKV ? { loginKV } : {}),\n }\n}\n\nfunction parsePartialAssets(value: unknown): PartialBrandAssets {\n if (!isRecord(value)) throw new Error(\"assets must be an object\")\n assertKnownKeys(value, ASSET_KEYS, \"assets\")\n return {\n ...(value.appIcon !== undefined ? { appIcon: relativePath(value.appIcon, \"assets.appIcon\") } : {}),\n ...(value.logo !== undefined ? { logo: relativePath(value.logo, \"assets.logo\") } : {}),\n ...(value.tray !== undefined ? { tray: relativePath(value.tray, \"assets.tray\") } : {}),\n ...(value.loginKV !== undefined\n ? { loginKV: relativePath(value.loginKV, \"assets.loginKV\") }\n : {}),\n }\n}\n\nfunction parseBrandCopy(value: unknown, path: string): TenantBranding {\n if (!isRecord(value)) throw new Error(`${path} must be an object`)\n assertKnownKeys(value, BRANDING_KEYS, path)\n const result: TenantBranding = {\n productName: text(value.productName, `${path}.productName`, 64),\n companyName: text(value.companyName, `${path}.companyName`, 80),\n }\n for (const [key, limit] of [\n [\"claim\", 40],\n [\"claimNote\", 48],\n [\"slogan\", 68],\n ] as const) {\n if (value[key] !== undefined) result[key] = text(value[key], `${path}.${key}`, limit)\n }\n return result\n}\n\nfunction parseBranding(value: unknown): LocalizedBranding {\n if (!isRecord(value)) throw new Error(\"branding must be a locale map\")\n const result: LocalizedBranding = {}\n for (const [rawLocale, copy] of Object.entries(value)) {\n const locale = canonicalLocale(rawLocale, `branding.${rawLocale}`)\n result[locale] = parseBrandCopy(copy, `branding.${locale}`)\n }\n if (!result[\"en-US\"]) throw new Error(\"branding.en-US is required\")\n return result\n}\n\nfunction parseLocales(value: unknown): BrandLocaleSources | undefined {\n if (value === undefined) return undefined\n if (!isRecord(value)) throw new Error(\"locales must be a locale map\")\n const result: BrandLocaleSources = {}\n for (const [rawLocale, source] of Object.entries(value)) {\n const locale = canonicalLocale(rawLocale, `locales.${rawLocale}`)\n result[locale] = relativePath(source, `locales.${locale}`)\n }\n if (!result[\"en-US\"]) throw new Error(\"locales.en-US is required when locales are declared\")\n return result\n}\n\nfunction isDevelopmentHostname(hostname: string): boolean {\n const lower = hostname.toLowerCase()\n if (lower === \"localhost\" || lower.endsWith(\".localhost\") || lower.endsWith(\".local\")) return true\n if ([\"::1\", \"[::1]\"].includes(lower) || /^(?:fc|fd|fe8|fe9|fea|feb)/.test(lower.replace(/[\\[\\]]/g, \"\"))) {\n return true\n }\n const ipv4 = lower\n .match(/^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/)\n ?.slice(1)\n .map(Number)\n if (ipv4) {\n const [a, b] = ipv4\n if (\n a === 0 ||\n a === 10 ||\n a === 127 ||\n (a === 169 && b === 254) ||\n (a === 172 && b! >= 16 && b! <= 31) ||\n (a === 192 && b === 168)\n ) {\n return true\n }\n }\n return lower\n .split(/[.-]/)\n .some((label) => [\"dev\", \"development\", \"test\", \"testing\", \"stage\", \"staging\", \"uat\"].includes(label))\n}\n\nfunction parseNetwork(value: unknown): BrandNetworkAccess | undefined {\n if (value === undefined) return undefined\n if (!isRecord(value)) throw new Error(\"network must be an object\")\n assertKnownKeys(value, NETWORK_KEYS, \"network\")\n if (!Array.isArray(value.allowedOrigins) || value.allowedOrigins.length === 0) {\n throw new Error(\"network.allowedOrigins must be a non-empty array\")\n }\n const allowedOrigins = value.allowedOrigins.map((raw, index) => {\n const path = `network.allowedOrigins[${index}]`\n const origin = text(raw, path, 240)\n let parsed: URL\n try {\n parsed = new URL(origin)\n } catch {\n throw new Error(`${path} must be an exact HTTPS origin`)\n }\n if (\n parsed.protocol !== \"https:\" ||\n parsed.username ||\n parsed.password ||\n parsed.pathname !== \"/\" ||\n parsed.search ||\n parsed.hash ||\n parsed.origin !== origin\n ) {\n throw new Error(`${path} must be a canonical exact HTTPS origin without credentials, path, query, or fragment`)\n }\n if (isDevelopmentHostname(parsed.hostname)) {\n throw new Error(`${path} must be a production origin, not localhost, private network, dev, test, staging, or UAT`)\n }\n return origin\n })\n if (new Set(allowedOrigins).size !== allowedOrigins.length) {\n throw new Error(\"network.allowedOrigins must not contain duplicates\")\n }\n return { allowedOrigins }\n}\n\nfunction parseHomepage(value: unknown): string {\n const homepage = text(value, \"homepage\", 200)\n let parsed: URL\n try {\n parsed = new URL(homepage)\n } catch {\n throw new Error(\"homepage must be an https URL\")\n }\n if (parsed.protocol !== \"https:\" || !parsed.hostname) {\n throw new Error(\"homepage must be an https URL\")\n }\n return homepage\n}\n\nfunction parsePermissions(value: unknown): BrandPermissions {\n if (!isRecord(value)) throw new Error(\"permissions must be an object\")\n assertKnownKeys(value, PERMISSIONS_KEYS, \"permissions\")\n return { microphoneUsage: text(value.microphoneUsage, \"permissions.microphoneUsage\", 120) }\n}\n\nfunction parseModeTokens(value: unknown, path: string): Partial<Record<BrandThemeToken, string>> { if (!isRecord(value)) throw new Error(`${path} must be an object`)\n const result: Partial<Record<BrandThemeToken, string>> = {}\n for (const [name, raw] of Object.entries(value)) {\n if (!BRAND_TOKEN_NAMES.has(name)) throw new Error(`${path} contains forbidden token: ${name}`)\n if (typeof raw !== \"string\" || !HEX.test(raw)) throw new Error(`${path}.${name} must be a hex color`)\n result[name as BrandThemeToken] = raw.toLowerCase()\n }\n\n const touchedNeutral = UNIFIED_NEUTRAL_TOKENS.some((name) => result[name] !== undefined)\n if (touchedNeutral) {\n const missing = UNIFIED_NEUTRAL_TOKENS.filter((name) => result[name] === undefined)\n if (missing.length) throw new Error(`${path} neutral group is incomplete: ${missing.join(\", \")}`)\n for (const textToken of [\"--ow-text\", \"--ow-text-2\"] as const) {\n for (const surfaceToken of [\"--ow-bg\", \"--ow-surface\", \"--ow-surface-2\"] as const) {\n const ratio = ds2ContrastRatio(result[textToken] as string, result[surfaceToken] as string)\n if (ratio < 4.5) {\n throw new Error(\n `${path} contrast ${textToken} on ${surfaceToken} is ${ratio.toFixed(2)}:1; expected >= 4.5:1`,\n )\n }\n }\n }\n }\n\n const touchedAction = BRAND_ACTION_TOKENS.some((name) => result[name] !== undefined)\n if (touchedAction) {\n const missing = BRAND_ACTION_TOKENS.filter((name) => result[name] === undefined)\n if (missing.length) throw new Error(`${path} action pole group is incomplete: ${missing.join(\", \")}`)\n for (const background of [\"--ow-btn-primary-bg\", \"--ow-btn-primary-hover\", \"--ow-btn-primary-press\"] as const) {\n const ratio = ds2ContrastRatio(result[background] as string, result[\"--ow-btn-primary-fg\"] as string)\n if (ratio < 4.5) {\n throw new Error(\n `${path} contrast --ow-btn-primary-fg on ${background} is ${ratio.toFixed(2)}:1; expected >= 4.5:1`,\n )\n }\n }\n }\n return result\n}\n\nfunction parseTokens(value: unknown): BrandManifest[\"tokens\"] {\n if (value === undefined) return undefined\n if (!isRecord(value)) throw new Error(\"tokens must be an object\")\n assertKnownKeys(value, MODE_KEYS, \"tokens\")\n const light = value.light === undefined ? undefined : parseModeTokens(value.light, \"tokens.light\")\n const dark = value.dark === undefined ? undefined : parseModeTokens(value.dark, \"tokens.dark\")\n if (!light && !dark) throw new Error(\"tokens must define light or dark\")\n return { ...(light ? { light } : {}), ...(dark ? { dark } : {}) }\n}\n\nfunction parseTypography(value: unknown): BrandTypography | undefined {\n if (value === undefined) return undefined\n if (!isRecord(value)) throw new Error(\"typography must be an object\")\n assertKnownKeys(value, TYPOGRAPHY_KEYS, \"typography\")\n return {\n fontSans: text(value.fontSans, \"typography.fontSans\", 200),\n fontMono: text(value.fontMono, \"typography.fontMono\", 200),\n }\n}\n\nfunction parseFontScale(value: unknown): OrbitworkFontScale | undefined {\n if (value === undefined) return undefined\n if (!isOrbitworkFontScale(value)) throw new Error(`fontScale must be one of ${ORBITWORK_FONT_SCALES.join(\", \")}`)\n return value\n}\n\nfunction slotAllowedKeys(kind: SlotKind): Set<string> {\n return new Set([\n ...SLOT_COMMON_KEYS,\n ...(kind === \"list\" ? [\"id\", \"order\"] : []),\n ...(kind === \"keyed\" ? [\"key\"] : []),\n ])\n}\n\nfunction parseSlotContribution(value: unknown, index: number): SlotContribution {\n const path = `contributes.slots[${index}]`\n if (!isRecord(value)) throw new Error(`${path} must be an object`)\n const name = text(value.name, `${path}.name`, 120)\n const declaration = SLOT_DECLARATIONS[name]\n if (!declaration) throw new Error(`${path}.name is not in the host slot whitelist: ${name}`)\n assertKnownKeys(value, slotAllowedKeys(declaration.kind), path)\n const common = { name: name as BrandSlotName }\n if (declaration.kind === \"list\") {\n const id = text(value.id, `${path}.id`, 100)\n if (typeof value.order !== \"number\" || !Number.isFinite(value.order)) {\n throw new Error(`${path}.order must be a finite number`)\n }\n return { ...common, id, order: value.order } as SlotContribution\n }\n if (declaration.kind === \"keyed\") {\n const key = text(value.key, `${path}.key`, 100)\n const allowed = WORKBENCH_KEYED_SLOT_KEYS[name as KeyedSlotName] as readonly string[] | undefined\n if (!allowed?.includes(key)) throw new Error(`${path}.key is not reachable by the host: ${key}`)\n return { ...common, key } as SlotContribution\n }\n return common as SlotContribution\n}\n\nfunction contributionCell(value: SlotContribution): string {\n if (\"id\" in value) return value.id\n if (\"key\" in value) return value.key\n return \"single\"\n}\n\nfunction parseContributes(value: unknown): BrandManifest[\"contributes\"] {\n if (value === undefined) return undefined\n if (!isRecord(value)) throw new Error(\"contributes must be an object\")\n assertKnownKeys(value, CONTRIBUTES_KEYS, \"contributes\")\n if (!Array.isArray(value.slots)) throw new Error(\"contributes.slots must be an array\")\n const slots = value.slots.map(parseSlotContribution)\n const seen = new Set<string>()\n for (const slot of slots) {\n const identity = `${slot.name}\\0${contributionCell(slot)}`\n if (seen.has(identity)) throw new Error(`duplicate slot contribution: ${slot.name} / ${contributionCell(slot)}`)\n seen.add(identity)\n }\n return { slots }\n}\n\nexport function parseBrandManifest(input: unknown, options?: BrandManifestParseOptions): BrandManifestValidationResult {\n try {\n const platform = options?.platform === true\n if (!isRecord(input)) throw new Error(\"brand manifest must be a JSON object\")\n assertKnownKeys(input, ROOT_KEYS, \"manifest\")\n if (input.$schema !== BRAND_MANIFEST_SCHEMA) throw new Error(`$schema must equal ${BRAND_MANIFEST_SCHEMA}`)\n const id = text(input.id, \"id\", 64)\n if (!KEBAB_ID.test(id)) throw new Error(\"id must be lowercase kebab-case\")\n const entry = input.entry === undefined ? undefined : relativePath(input.entry, \"entry\")\n if (entry && !SOURCE_ENTRY.test(entry)) {\n throw new Error(\"entry must point to reviewed source under ./src using .js, .mjs, .jsx, .ts, or .tsx\")\n }\n const contributes = parseContributes(input.contributes)\n if ((contributes?.slots.length ?? 0) > 0 && !entry)\n throw new Error(\"entry is required when contributes.slots is not empty\")\n const tokens = parseTokens(input.tokens)\n const typography = parseTypography(input.typography)\n const fontScale = parseFontScale(input.fontScale)\n const locales = parseLocales(input.locales)\n const network = parseNetwork(input.network)\n const identity = parseIdentity(input.identity, id, platform)\n if (!platform && productNameNamespace(identity.productName) !== id) {\n throw new Error(\"identity.productName must normalize to manifest id so installation names cannot collide\")\n }\n if (!platform && identity.versionChannel !== id) {\n throw new Error(\"identity.versionChannel must equal manifest id to keep OEM update feeds namespaced\")\n }\n if (!platform && identity.protocolScheme !== id) {\n throw new Error(\"identity.protocolScheme must equal manifest id to keep OEM deep links namespaced\")\n }\n if (!platform && !identity.appId.endsWith(`.oem.${id}`)) {\n throw new Error(\"identity.appId must end with .oem.<manifest id> to isolate installation and user data\")\n }\n return {\n ok: true,\n manifest: {\n $schema: BRAND_MANIFEST_SCHEMA,\n id,\n ...(input.description !== undefined ? { description: text(input.description, \"description\", 200) } : {}),\n ...(input.assistantName !== undefined ? { assistantName: text(input.assistantName, \"assistantName\", 48) } : {}),\n ...(input.homepage !== undefined ? { homepage: parseHomepage(input.homepage) } : {}),\n ...(input.permissions !== undefined ? { permissions: parsePermissions(input.permissions) } : {}),\n ...(entry ? { entry } : {}),\n identity,\n ...(tokens ? { tokens } : {}),\n ...(typography ? { typography } : {}),\n ...(fontScale ? { fontScale } : {}),\n assets: parseAssets(input.assets),\n branding: parseBranding(input.branding),\n ...(locales ? { locales } : {}),\n ...(network ? { network } : {}),\n ...(contributes ? { contributes } : {}),\n },\n }\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) }\n }\n}\n\nfunction parsePartialIdentity(value: unknown): PartialBrandIdentity {\n if (!isRecord(value)) throw new Error(\"identity must be an object\")\n assertKnownKeys(value, IDENTITY_KEYS, \"identity\")\n // Filled fields are validated exactly like the strict parser (formats,\n // reserved values), but the id-binding rules are skipped: partial manifests\n // are merged with source defaults before consumption, and the resolved\n // product is re-validated where those bindings apply.\n if (value.userDataNamespace !== undefined && !KEBAB_ID.test(text(value.userDataNamespace, \"identity.userDataNamespace\", 64))) {\n throw new Error(\"identity.userDataNamespace must be lowercase kebab-case\")\n }\n if (value.appId !== undefined) {\n const appId = text(value.appId, \"identity.appId\", 160)\n if (!APP_ID.test(appId)) throw new Error(\"identity.appId must be a reverse-DNS identifier\")\n if (appId === OFFICIAL_APP_ID) {\n throw new Error(`identity.appId is reserved for the official application: ${appId}`)\n }\n }\n if (value.versionChannel !== undefined) {\n const versionChannel = text(value.versionChannel, \"identity.versionChannel\", 64)\n if (!KEBAB_ID.test(versionChannel)) throw new Error(\"identity.versionChannel must be kebab-case\")\n }\n if (value.protocolScheme !== undefined) {\n const protocolScheme = text(value.protocolScheme, \"identity.protocolScheme\", 64)\n if (!PROTOCOL_SCHEME.test(protocolScheme)) {\n throw new Error(\"identity.protocolScheme must be a lowercase URI scheme beginning with a letter\")\n }\n if (RESERVED_PROTOCOL_SCHEMES.has(protocolScheme)) {\n throw new Error(`identity.protocolScheme is reserved: ${protocolScheme}`)\n }\n }\n if (value.productName !== undefined) {\n const productName = text(value.productName, \"identity.productName\", 64)\n if (\n hasUnsafeProductNameCharacter(productName) ||\n /[. ]$/.test(productName) ||\n productName === \".\" ||\n productName === \"..\" ||\n WINDOWS_DEVICE_NAME.test(productName)\n ) {\n throw new Error(\"identity.productName must be safe for macOS, Windows, Linux, and release artifact paths\")\n }\n if (OFFICIAL_PRODUCT_NAMES.has(productName.toLowerCase())) {\n throw new Error(`identity.productName is reserved for the official application: ${productName}`)\n }\n }\n return {\n ...(value.productName !== undefined ? { productName: text(value.productName, \"identity.productName\", 64) } : {}),\n ...(value.appId !== undefined ? { appId: text(value.appId, \"identity.appId\", 160) } : {}),\n ...(value.versionChannel !== undefined ? { versionChannel: text(value.versionChannel, \"identity.versionChannel\", 64) } : {}),\n ...(value.protocolScheme !== undefined ? { protocolScheme: text(value.protocolScheme, \"identity.protocolScheme\", 64) } : {}),\n ...(value.userDataNamespace !== undefined\n ? { userDataNamespace: text(value.userDataNamespace, \"identity.userDataNamespace\", 64) }\n : {}),\n }\n}\n\nfunction parsePartialBranding(value: unknown): PartialLocalizedBranding {\n if (!isRecord(value)) throw new Error(\"branding must be a locale map\")\n const result: PartialLocalizedBranding = {}\n for (const [rawLocale, copy] of Object.entries(value)) {\n const locale = canonicalLocale(rawLocale, `branding.${rawLocale}`)\n if (!isRecord(copy)) throw new Error(`branding.${locale} must be an object`)\n assertKnownKeys(copy, BRANDING_KEYS, `branding.${locale}`)\n const partial: Partial<TenantBranding> = {}\n for (const [key, limit] of [\n [\"productName\", 64],\n [\"companyName\", 80],\n [\"claim\", 40],\n [\"claimNote\", 48],\n [\"slogan\", 68],\n ] as const) {\n if (copy[key] !== undefined) partial[key] = text(copy[key], `branding.${locale}.${key}`, limit)\n }\n result[locale] = partial\n }\n return result\n}\n\n/**\n * Validates an upload-time (partial) brand manifest: omitted fields inherit\n * source defaults at merge time; every filled field is fully validated. The\n * resolved product must still pass `parseBrandManifest` where it is consumed.\n */\nexport function parsePartialBrandManifest(input: unknown): PartialBrandManifestValidationResult {\n try {\n if (!isRecord(input)) throw new Error(\"brand manifest must be a JSON object\")\n assertKnownKeys(input, ROOT_KEYS, \"manifest\")\n if (input.$schema !== undefined && input.$schema !== BRAND_MANIFEST_SCHEMA) {\n throw new Error(`$schema must equal ${BRAND_MANIFEST_SCHEMA}`)\n }\n const entry = input.entry === undefined ? undefined : relativePath(input.entry, \"entry\")\n if (entry && !SOURCE_ENTRY.test(entry)) {\n throw new Error(\"entry must point to reviewed source under ./src using .js, .mjs, .jsx, .ts, or .tsx\")\n }\n const contributes = parseContributes(input.contributes)\n if ((contributes?.slots.length ?? 0) > 0 && !entry)\n throw new Error(\"entry is required when contributes.slots is not empty\")\n if (input.id !== undefined) {\n const id = text(input.id, \"id\", 64)\n if (!KEBAB_ID.test(id)) throw new Error(\"id must be lowercase kebab-case\")\n }\n return {\n ok: true,\n manifest: {\n ...(input.id !== undefined ? { id: text(input.id, \"id\", 64) } : {}),\n ...(input.description !== undefined ? { description: text(input.description, \"description\", 200) } : {}),\n ...(input.assistantName !== undefined ? { assistantName: text(input.assistantName, \"assistantName\", 48) } : {}),\n ...(input.homepage !== undefined ? { homepage: parseHomepage(input.homepage) } : {}),\n ...(input.permissions !== undefined ? { permissions: parsePermissions(input.permissions) } : {}),\n ...(entry ? { entry } : {}),\n ...(input.identity !== undefined ? { identity: parsePartialIdentity(input.identity) } : {}),\n ...(input.tokens !== undefined ? { tokens: parseTokens(input.tokens) } : {}),\n ...(input.typography !== undefined ? { typography: parseTypography(input.typography) } : {}),\n ...(input.fontScale !== undefined ? { fontScale: parseFontScale(input.fontScale) } : {}),\n ...(input.assets !== undefined ? { assets: parsePartialAssets(input.assets) } : {}),\n ...(input.branding !== undefined ? { branding: parsePartialBranding(input.branding) } : {}),\n ...(input.locales !== undefined ? { locales: parseLocales(input.locales) } : {}),\n ...(input.network !== undefined ? { network: parseNetwork(input.network) } : {}),\n ...(contributes ? { contributes } : {}),\n },\n }\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) }\n }\n}\n\nexport function manifestToBrandTheme(manifest: BrandManifest): BrandTheme {\n return {\n id: manifest.id,\n logo: manifest.assets.logo,\n ...(manifest.assets.loginKV ? { loginKV: manifest.assets.loginKV } : {}),\n modes: manifest.tokens ?? {},\n ...(manifest.typography ? { typography: manifest.typography } : {}),\n ...(manifest.fontScale ? { fontScale: manifest.fontScale } : {}),\n branding: manifest.branding,\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { DictionaryValidationResult, LocaleDictionary, TranslationValues, Translator, createTranslator, validateDictionary } from '@orbit-work/ui/locale';
|
|
2
2
|
import { BrandManifest } from './manifest.js';
|
|
3
|
-
export { BRAND_MANIFEST_SCHEMA, BrandAssets, BrandIdentity, BrandLocaleSources, BrandManifestParseOptions, BrandManifestValidationResult, BrandNetworkAccess, BrandPermissions, BrandSlotName, PartialBrandAssets, PartialBrandIdentity, PartialBrandManifest, PartialBrandManifestValidationResult, PartialLocalizedBranding, SlotContribution, manifestToBrandTheme, parseBrandManifest, parsePartialBrandManifest } from './manifest.js';
|
|
3
|
+
export { BRAND_MANIFEST_SCHEMA, BrandAssets, BrandIdentity, BrandLocaleSources, BrandManifestParseOptions, BrandManifestValidationResult, BrandNetworkAccess, BrandPermissions, BrandSlotName, BrandTypography, PartialBrandAssets, PartialBrandIdentity, PartialBrandManifest, PartialBrandManifestValidationResult, PartialLocalizedBranding, SlotContribution, manifestToBrandTheme, parseBrandManifest, parsePartialBrandManifest } from './manifest.js';
|
|
4
4
|
export { BrandTheme, LocalizedBranding, TenantBranding, TenantTheme, UnifiedTheme, UnifiedThemeToken } from '@orbit-work/ui/appearance';
|
|
5
5
|
import { SettingsSectionKey, WorkbenchSlotMap, SlotDecl, SlotKind, SlotRenderer, SlotRenderFunction, SlotChildOf, SlotTranslator, SlotCore } from '@orbit-work/ui/slot/core';
|
|
6
6
|
export { SlotCore, SlotRenderer } from '@orbit-work/ui/slot/core';
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { applyOemEntry, createOemActionHost, createRestrictedOemApi, createTranslator, createUnavailableActionApi, validateDictionary } from './chunk-YMKYAM23.js';
|
|
2
|
-
export { BRAND_MANIFEST_SCHEMA, manifestToBrandTheme, parseBrandManifest, parsePartialBrandManifest } from './chunk-
|
|
2
|
+
export { BRAND_MANIFEST_SCHEMA, manifestToBrandTheme, parseBrandManifest, parsePartialBrandManifest } from './chunk-ZOURSTKZ.js';
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/manifest.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BrandThemeToken, LocalizedBranding, TenantBranding, BrandTheme } from '@orbit-work/ui/appearance';
|
|
1
|
+
import { BrandThemeToken, OrbitworkFontScale, LocalizedBranding, TenantBranding, BrandTheme } from '@orbit-work/ui/appearance';
|
|
2
2
|
import { SlotKind, WORKBENCH_SLOT_DECLARATIONS, WORKBENCH_KEYED_SLOT_KEYS } from '@orbit-work/ui/slot/core';
|
|
3
3
|
|
|
4
4
|
type BrandSlotName = keyof typeof WORKBENCH_SLOT_DECLARATIONS;
|
|
@@ -37,6 +37,10 @@ type PartialBrandManifest = {
|
|
|
37
37
|
entry?: string;
|
|
38
38
|
identity?: PartialBrandIdentity;
|
|
39
39
|
tokens?: BrandManifest["tokens"];
|
|
40
|
+
/** OEM font stacks; user skins and the tenant theme still win at runtime. */
|
|
41
|
+
typography?: BrandTypography;
|
|
42
|
+
/** OEM text-size preset; the personal preference and user skins still win. */
|
|
43
|
+
fontScale?: OrbitworkFontScale;
|
|
40
44
|
assets?: PartialBrandAssets;
|
|
41
45
|
branding?: PartialLocalizedBranding;
|
|
42
46
|
locales?: BrandLocaleSources;
|
|
@@ -60,6 +64,11 @@ type BrandAssets = {
|
|
|
60
64
|
loginKV?: string;
|
|
61
65
|
};
|
|
62
66
|
type BrandLocaleSources = Record<string, string>;
|
|
67
|
+
/** OEM typography override; both stacks are CSS font-family values. */
|
|
68
|
+
type BrandTypography = {
|
|
69
|
+
fontSans: string;
|
|
70
|
+
fontMono: string;
|
|
71
|
+
};
|
|
63
72
|
type BrandNetworkAccess = {
|
|
64
73
|
/** Exact production HTTPS origins added to the packaged renderer connect-src. */
|
|
65
74
|
allowedOrigins: string[];
|
|
@@ -104,6 +113,9 @@ type BrandManifest = {
|
|
|
104
113
|
entry?: string;
|
|
105
114
|
identity: BrandIdentity;
|
|
106
115
|
tokens?: Partial<Record<"light" | "dark", Partial<Record<BrandThemeToken, string>>>>;
|
|
116
|
+
typography?: BrandTypography;
|
|
117
|
+
/** OEM text-size preset; the personal font-scale preference and user skins still win. */
|
|
118
|
+
fontScale?: OrbitworkFontScale;
|
|
107
119
|
assets: BrandAssets;
|
|
108
120
|
branding: LocalizedBranding;
|
|
109
121
|
/** Package-relative dictionaries owned by this OEM namespace. en-US is the required fallback. */
|
|
@@ -138,4 +150,4 @@ declare function parseBrandManifest(input: unknown, options?: BrandManifestParse
|
|
|
138
150
|
declare function parsePartialBrandManifest(input: unknown): PartialBrandManifestValidationResult;
|
|
139
151
|
declare function manifestToBrandTheme(manifest: BrandManifest): BrandTheme;
|
|
140
152
|
|
|
141
|
-
export { BRAND_MANIFEST_SCHEMA, type BrandAssets, type BrandIdentity, type BrandLocaleSources, type BrandManifest, type BrandManifestParseOptions, type BrandManifestValidationResult, type BrandNetworkAccess, type BrandPermissions, type BrandSlotName, type PartialBrandAssets, type PartialBrandIdentity, type PartialBrandManifest, type PartialBrandManifestValidationResult, type PartialLocalizedBranding, type SlotContribution, manifestToBrandTheme, parseBrandManifest, parsePartialBrandManifest };
|
|
153
|
+
export { BRAND_MANIFEST_SCHEMA, type BrandAssets, type BrandIdentity, type BrandLocaleSources, type BrandManifest, type BrandManifestParseOptions, type BrandManifestValidationResult, type BrandNetworkAccess, type BrandPermissions, type BrandSlotName, type BrandTypography, type PartialBrandAssets, type PartialBrandIdentity, type PartialBrandManifest, type PartialBrandManifestValidationResult, type PartialLocalizedBranding, type SlotContribution, manifestToBrandTheme, parseBrandManifest, parsePartialBrandManifest };
|
package/dist/manifest.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { BRAND_MANIFEST_SCHEMA, manifestToBrandTheme, parseBrandManifest, parsePartialBrandManifest } from './chunk-
|
|
1
|
+
export { BRAND_MANIFEST_SCHEMA, manifestToBrandTheme, parseBrandManifest, parsePartialBrandManifest } from './chunk-ZOURSTKZ.js';
|
|
2
2
|
//# sourceMappingURL=manifest.js.map
|
|
3
3
|
//# sourceMappingURL=manifest.js.map
|
package/dist/runtime.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { OemActionApi, OemActionDescriptor, OemActionHandler, OemActionHost, OemActionName, OemActionRegistration, OemActionTranslate, OemEntry, OemRegisterOptions, OemSdkApi, OemSlotApi, OemSlotName, OemSlotProps, OemWorkbenchView, applyOemEntry, createOemActionHost, createRestrictedOemApi, createUnavailableActionApi } from './index.js';
|
|
2
2
|
export { DictionaryValidationResult, LocaleDictionary, TranslationValues, Translator, createTranslator, validateDictionary } from '@orbit-work/ui/locale';
|
|
3
|
-
export { BRAND_MANIFEST_SCHEMA, BrandAssets, BrandIdentity, BrandLocaleSources, BrandManifest, BrandManifestParseOptions, BrandManifestValidationResult, BrandNetworkAccess, BrandPermissions, BrandSlotName, PartialBrandAssets, PartialBrandIdentity, PartialBrandManifest, PartialBrandManifestValidationResult, PartialLocalizedBranding, SlotContribution, manifestToBrandTheme, parseBrandManifest, parsePartialBrandManifest } from './manifest.js';
|
|
3
|
+
export { BRAND_MANIFEST_SCHEMA, BrandAssets, BrandIdentity, BrandLocaleSources, BrandManifest, BrandManifestParseOptions, BrandManifestValidationResult, BrandNetworkAccess, BrandPermissions, BrandSlotName, BrandTypography, PartialBrandAssets, PartialBrandIdentity, PartialBrandManifest, PartialBrandManifestValidationResult, PartialLocalizedBranding, SlotContribution, manifestToBrandTheme, parseBrandManifest, parsePartialBrandManifest } from './manifest.js';
|
|
4
4
|
export { BrandTheme, LocalizedBranding, TenantBranding, TenantTheme, UnifiedTheme, UnifiedThemeToken } from '@orbit-work/ui/appearance';
|
|
5
5
|
export { SlotCore, SlotRenderer } from '@orbit-work/ui/slot/core';
|
package/dist/runtime.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { applyOemEntry, createOemActionHost, createRestrictedOemApi, createTranslator, createUnavailableActionApi, validateDictionary } from './chunk-YMKYAM23.js';
|
|
2
|
-
export { BRAND_MANIFEST_SCHEMA, manifestToBrandTheme, parseBrandManifest, parsePartialBrandManifest } from './chunk-
|
|
2
|
+
export { BRAND_MANIFEST_SCHEMA, manifestToBrandTheme, parseBrandManifest, parsePartialBrandManifest } from './chunk-ZOURSTKZ.js';
|
|
3
3
|
//# sourceMappingURL=runtime.js.map
|
|
4
4
|
//# sourceMappingURL=runtime.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orbit-work/oem-sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Public contracts and build-time audit tools for Orbitwork OEM extensions.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -40,8 +40,14 @@
|
|
|
40
40
|
"dist",
|
|
41
41
|
"schema"
|
|
42
42
|
],
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsup",
|
|
45
|
+
"lint": "biome check ../../packages/oem-sdk/src/",
|
|
46
|
+
"test": "node --test \"src/**/*.test.mjs\"",
|
|
47
|
+
"typecheck": "tsc --noEmit"
|
|
48
|
+
},
|
|
43
49
|
"dependencies": {
|
|
44
|
-
"@orbit-work/ui": "
|
|
50
|
+
"@orbit-work/ui": "workspace:*",
|
|
45
51
|
"es-module-lexer": "^2.3.2",
|
|
46
52
|
"esbuild": "^0.27.7"
|
|
47
53
|
},
|
|
@@ -52,11 +58,5 @@
|
|
|
52
58
|
},
|
|
53
59
|
"engines": {
|
|
54
60
|
"node": ">=20.0.0"
|
|
55
|
-
},
|
|
56
|
-
"scripts": {
|
|
57
|
-
"build": "tsup",
|
|
58
|
-
"lint": "biome check ../../packages/oem-sdk/src/",
|
|
59
|
-
"test": "node --test \"src/**/*.test.mjs\"",
|
|
60
|
-
"typecheck": "tsc --noEmit"
|
|
61
61
|
}
|
|
62
|
-
}
|
|
62
|
+
}
|
|
@@ -89,17 +89,41 @@
|
|
|
89
89
|
"dark": { "$ref": "#/$defs/tokenMode" }
|
|
90
90
|
}
|
|
91
91
|
},
|
|
92
|
+
"typography": {
|
|
93
|
+
"type": "object",
|
|
94
|
+
"additionalProperties": false,
|
|
95
|
+
"required": ["fontSans", "fontMono"],
|
|
96
|
+
"properties": {
|
|
97
|
+
"fontSans": { "allOf": [{ "$ref": "#/$defs/nonEmpty" }, { "maxLength": 200 }] },
|
|
98
|
+
"fontMono": { "allOf": [{ "$ref": "#/$defs/nonEmpty" }, { "maxLength": 200 }] }
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"fontScale": {
|
|
102
|
+
"type": "number",
|
|
103
|
+
"enum": [0.9, 1, 1.1, 1.2],
|
|
104
|
+
"description": "OEM text-size preset; the personal font-scale preference and user skins still win."
|
|
105
|
+
},
|
|
92
106
|
"assets": {
|
|
93
107
|
"type": "object",
|
|
94
108
|
"additionalProperties": false,
|
|
95
109
|
"required": ["appIcon", "logo"],
|
|
96
110
|
"properties": {
|
|
97
|
-
"appIcon": {
|
|
111
|
+
"appIcon": {
|
|
112
|
+
"allOf": [{ "$ref": "#/$defs/packagePath" }],
|
|
113
|
+
"description": "Square PNG or JPEG, at least 1024x1024. The build normalizes it to a 1024x1024 PNG and derives every platform icon and installer size from it."
|
|
114
|
+
},
|
|
98
115
|
"tray": {
|
|
99
116
|
"allOf": [{ "$ref": "#/$defs/packagePath" }],
|
|
100
|
-
"description": "
|
|
117
|
+
"description": "Square PNG or JPEG, at least 44x44. The build normalizes it to a 44x44 PNG (22pt @2x) used on macOS (template), Windows, and Linux. A monochrome transparent glyph is recommended; color art renders as a solid block on macOS."
|
|
118
|
+
},
|
|
119
|
+
"logo": {
|
|
120
|
+
"allOf": [{ "$ref": "#/$defs/packagePath" }],
|
|
121
|
+
"description": "SVG, PNG, WebP, or JPEG. Renderer-only; both transparent and full-bleed backgrounds are accepted."
|
|
101
122
|
},
|
|
102
|
-
"
|
|
123
|
+
"loginKV": {
|
|
124
|
+
"allOf": [{ "$ref": "#/$defs/packagePath" }],
|
|
125
|
+
"description": "Optional login key-visual photo (PNG, JPEG, or WebP) for the desktop login page background."
|
|
126
|
+
}
|
|
103
127
|
}
|
|
104
128
|
},
|
|
105
129
|
"branding": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/manifest.ts"],"names":[],"mappings":"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","file":"chunk-ZGPZ3ON6.js","sourcesContent":["import {\n BRAND_ACTION_TOKENS,\n type BrandTheme,\n type BrandThemeToken,\n type LocalizedBranding,\n type TenantBranding,\n UNIFIED_NEUTRAL_TOKENS,\n ds2ContrastRatio,\n} from \"@orbit-work/ui/appearance\"\nimport { type SlotKind, WORKBENCH_KEYED_SLOT_KEYS, WORKBENCH_SLOT_DECLARATIONS } from \"@orbit-work/ui/slot/core\"\n\nexport type BrandSlotName = keyof typeof WORKBENCH_SLOT_DECLARATIONS\n\nexport const BRAND_MANIFEST_SCHEMA = \"@orbit-work/oem-sdk/manifest@1\" as const\n\nexport type BrandIdentity = {\n productName: string\n appId: string\n versionChannel: string\n protocolScheme: string\n /**\n * Optional override for the per-installation user data directory namespace.\n * Managed builds default to the identity appId; workspace packages derive\n * storage from appId and omit this field.\n */\n userDataNamespace?: string\n}\n\n/** Upload-time brand manifest: every field optional, filled fields fully validated. */\nexport type PartialBrandIdentity = { [Key in keyof BrandIdentity]?: BrandIdentity[Key] }\n\nexport type PartialBrandAssets = { [Key in keyof BrandAssets]?: BrandAssets[Key] }\n\nexport type PartialLocalizedBranding = Record<string, Partial<TenantBranding>>\n\nexport type PartialBrandManifest = {\n $schema?: typeof BRAND_MANIFEST_SCHEMA\n id?: string\n /** Installer package description (electron-builder `description`). */\n description?: string\n /** Assistant display name in chat copy; defaults to the branding productName. */\n assistantName?: string\n /** Product homepage packaged into installer metadata. */\n homepage?: string\n /** OS permission prompts overridden by the OEM. */\n permissions?: BrandPermissions\n entry?: string\n identity?: PartialBrandIdentity\n tokens?: BrandManifest[\"tokens\"]\n assets?: PartialBrandAssets\n branding?: PartialLocalizedBranding\n locales?: BrandLocaleSources\n network?: BrandNetworkAccess\n contributes?: { slots: SlotContribution[] }\n}\n\nexport type PartialBrandManifestValidationResult =\n | { ok: true; manifest: PartialBrandManifest }\n | { ok: false; error: string }\n\nexport type BrandAssets = {\n appIcon: string\n tray?: string\n logo: string\n /** Optional login key-visual photo (KV board background on the desktop login page). */\n loginKV?: string\n}\n\nexport type BrandLocaleSources = Record<string, string>\n\nexport type BrandNetworkAccess = {\n /** Exact production HTTPS origins added to the packaged renderer connect-src. */\n allowedOrigins: string[]\n}\n\nexport type BrandPermissions = {\n /** macOS microphone prompt (Info.plist NSMicrophoneUsageDescription), written in the OEM's own language. */\n microphoneUsage: string\n}\n\ntype SlotNameOfKind<Kind extends SlotKind> = {\n [Name in BrandSlotName]: (typeof WORKBENCH_SLOT_DECLARATIONS)[Name][\"kind\"] extends Kind ? Name : never\n}[BrandSlotName]\n\ntype SlotContributionBase<Name extends BrandSlotName> = {\n name: Name\n}\n\ntype SingleSlotContribution = {\n [Name in SlotNameOfKind<\"single\">]: SlotContributionBase<Name>\n}[SlotNameOfKind<\"single\">]\n\ntype ListSlotContribution = {\n [Name in SlotNameOfKind<\"list\">]: SlotContributionBase<Name> & { id: string; order: number }\n}[SlotNameOfKind<\"list\">]\n\ntype KeyedSlotName = Extract<keyof typeof WORKBENCH_KEYED_SLOT_KEYS, BrandSlotName>\ntype KeyedSlotContribution = {\n [Name in KeyedSlotName]: SlotContributionBase<Name> & {\n key: (typeof WORKBENCH_KEYED_SLOT_KEYS)[Name][number]\n }\n}[KeyedSlotName]\n\nexport type SlotContribution = SingleSlotContribution | ListSlotContribution | KeyedSlotContribution\n\nexport type BrandManifest = {\n $schema: typeof BRAND_MANIFEST_SCHEMA\n id: string\n /** Installer package description (electron-builder `description`). */\n description?: string\n /** Assistant display name in chat copy; defaults to the branding productName. */\n assistantName?: string\n /** Product homepage packaged into installer metadata. */\n homepage?: string\n /** OS permission prompts overridden by the OEM. */\n permissions?: BrandPermissions\n entry?: string\n identity: BrandIdentity\n tokens?: Partial<Record<\"light\" | \"dark\", Partial<Record<BrandThemeToken, string>>>>\n assets: BrandAssets\n branding: LocalizedBranding\n /** Package-relative dictionaries owned by this OEM namespace. en-US is the required fallback. */\n locales?: BrandLocaleSources\n network?: BrandNetworkAccess\n contributes?: {\n slots: SlotContribution[]\n }\n}\n\nexport type BrandManifestParseOptions = {\n /**\n * Platform builds accept manifests resolved from the managed OEM pipeline:\n * every shape/format/safety check stays in force, only the workspace\n * namespacing bindings are relaxed (productName/versionChannel/protocolScheme\n * must equal id, appId must end with .oem.<id>, reserved feed channels).\n */\n platform?: boolean\n}\n\nexport type BrandManifestValidationResult = { ok: true; manifest: BrandManifest } | { ok: false; error: string }\n\nconst ROOT_KEYS = new Set([\n \"$schema\",\n \"id\",\n \"description\",\n \"assistantName\",\n \"homepage\",\n \"permissions\",\n \"entry\",\n \"identity\",\n \"tokens\",\n \"assets\",\n \"branding\",\n \"locales\",\n \"network\",\n \"contributes\",\n])\nconst IDENTITY_KEYS = new Set([\"productName\", \"appId\", \"versionChannel\", \"protocolScheme\", \"userDataNamespace\"])\nconst ASSET_KEYS = new Set([\"appIcon\", \"tray\", \"logo\", \"loginKV\"])\nconst MODE_KEYS = new Set([\"light\", \"dark\"])\nconst CONTRIBUTES_KEYS = new Set([\"slots\"])\nconst NETWORK_KEYS = new Set([\"allowedOrigins\"])\nconst PERMISSIONS_KEYS = new Set([\"microphoneUsage\"])\nconst BRANDING_KEYS = new Set([\"productName\", \"companyName\", \"claim\", \"claimNote\", \"slogan\"])\nconst SLOT_COMMON_KEYS = new Set([\"name\"])\nconst BRAND_TOKEN_NAMES = new Set<string>([...UNIFIED_NEUTRAL_TOKENS, ...BRAND_ACTION_TOKENS])\nconst SLOT_DECLARATIONS = WORKBENCH_SLOT_DECLARATIONS as Readonly<Record<string, { kind: SlotKind }>>\nconst HEX = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i\nconst KEBAB_ID = /^[a-z0-9]+(?:-[a-z0-9]+)*$/\nconst APP_ID = /^[a-zA-Z][a-zA-Z0-9]*(?:\\.[a-zA-Z0-9][a-zA-Z0-9-]*){2,}$/\nconst PROTOCOL_SCHEME = /^[a-z][a-z0-9+.-]*$/\nconst SOURCE_ENTRY = /^\\.\\/src\\/.+\\.(?:[cm]?js|[jt]sx?)$/\nconst WINDOWS_DEVICE_NAME = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\..*)?$/i\nconst OFFICIAL_APP_ID = \"ai.orbit.desktop\"\nconst OFFICIAL_PRODUCT_NAMES = new Set([\"orbitwork\"])\nconst RESERVED_VERSION_CHANNELS = new Set([\n \"stable\",\n \"preview\",\n \"uat\",\n \"latest\",\n \"desktop\",\n \"macos\",\n \"windows\",\n \"linux\",\n])\nconst RESERVED_PROTOCOL_SCHEMES = new Set([\n \"about\",\n \"blob\",\n \"chrome\",\n \"chrome-extension\",\n \"data\",\n \"devtools\",\n \"electron\",\n \"file\",\n \"ftp\",\n \"geo\",\n \"http\",\n \"https\",\n \"javascript\",\n \"mailto\",\n \"orbit\",\n \"sms\",\n \"tel\",\n \"urn\",\n \"ws\",\n \"wss\",\n])\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n}\n\nfunction hasUnsafeProductNameCharacter(value: string): boolean {\n return [...value].some((character) => {\n const code = character.charCodeAt(0)\n return code <= 31 || code === 127 || '<>:\"/\\\\|?*'.includes(character)\n })\n}\n\nfunction productNameNamespace(value: string): string {\n return value\n .normalize(\"NFKD\")\n .replace(/\\p{M}+/gu, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n}\n\nfunction assertKnownKeys(value: Record<string, unknown>, allowed: Set<string>, path: string): void {\n const unknown = Object.keys(value).find((key) => !allowed.has(key))\n if (unknown) throw new Error(`${path} contains unsupported field: ${unknown}`)\n}\n\nfunction text(value: unknown, path: string, limit = 100): string {\n if (typeof value !== \"string\" || !value.trim()) throw new Error(`${path} must be a non-empty string`)\n const result = value.trim()\n if (result.length > limit) throw new Error(`${path} exceeds ${limit} characters`)\n return result\n}\n\nfunction canonicalLocale(value: string, path: string): string {\n try {\n const locale = Intl.getCanonicalLocales(value)[0]\n if (!locale || locale !== value) throw new Error()\n return locale\n } catch {\n throw new Error(`${path} must be a canonical BCP 47 locale`)\n }\n}\n\nfunction relativePath(value: unknown, path: string): string {\n const result = text(value, path, 240)\n if (!result.startsWith(\"./\") || result.includes(\"\\\\\") || result.split(\"/\").includes(\"..\")) {\n throw new Error(`${path} must be a package-relative ./ path without traversal`)\n }\n return result\n}\n\nfunction parseIdentity(value: unknown, id: string, platform: boolean): BrandIdentity {\n if (!isRecord(value)) throw new Error(\"identity must be an object\")\n assertKnownKeys(value, IDENTITY_KEYS, \"identity\")\n const productName = text(value.productName, \"identity.productName\", 64)\n const appId = text(value.appId, \"identity.appId\", 160)\n const versionChannel = text(value.versionChannel, \"identity.versionChannel\", 64)\n const protocolScheme = text(value.protocolScheme, \"identity.protocolScheme\", 64)\n if (value.userDataNamespace !== undefined && !KEBAB_ID.test(text(value.userDataNamespace, \"identity.userDataNamespace\", 64))) {\n throw new Error(\"identity.userDataNamespace must be lowercase kebab-case\")\n }\n if (!APP_ID.test(appId)) throw new Error(\"identity.appId must be a reverse-DNS identifier\")\n if (!KEBAB_ID.test(versionChannel)) throw new Error(\"identity.versionChannel must be kebab-case\")\n // Managed platform builds assign the update channel from the frozen build\n // input; reserved feed names and the == id binding only police workspace\n // packages, where collisions would merge OEM feeds.\n if (!platform && RESERVED_VERSION_CHANNELS.has(versionChannel)) {\n throw new Error(`identity.versionChannel is reserved: ${versionChannel}`)\n }\n if (!PROTOCOL_SCHEME.test(protocolScheme)) {\n throw new Error(\"identity.protocolScheme must be a lowercase URI scheme beginning with a letter\")\n }\n if (RESERVED_PROTOCOL_SCHEMES.has(protocolScheme)) {\n throw new Error(`identity.protocolScheme is reserved: ${protocolScheme}`)\n }\n if (\n hasUnsafeProductNameCharacter(productName) ||\n /[. ]$/.test(productName) ||\n productName === \".\" ||\n productName === \"..\" ||\n WINDOWS_DEVICE_NAME.test(productName)\n ) {\n throw new Error(\"identity.productName must be safe for macOS, Windows, Linux, and release artifact paths\")\n }\n if (OFFICIAL_PRODUCT_NAMES.has(productName.toLowerCase())) {\n throw new Error(`identity.productName is reserved for the official application: ${productName}`)\n }\n if (appId === OFFICIAL_APP_ID) {\n throw new Error(`identity.appId is reserved for the official application: ${appId}`)\n }\n if (!platform && productNameNamespace(productName) !== id) {\n throw new Error(\"identity.productName must normalize to manifest id so installation names cannot collide\")\n }\n if (!platform && versionChannel !== id) {\n throw new Error(\"identity.versionChannel must equal manifest id to keep OEM update feeds namespaced\")\n }\n if (!platform && protocolScheme !== id) {\n throw new Error(\"identity.protocolScheme must equal manifest id to keep OEM deep links namespaced\")\n }\n if (!platform && !appId.endsWith(`.oem.${id}`)) {\n throw new Error(\"identity.appId must end with .oem.<manifest id> to isolate installation and user data\")\n }\n return {\n productName,\n appId,\n versionChannel,\n protocolScheme,\n ...(value.userDataNamespace !== undefined ? { userDataNamespace: text(value.userDataNamespace, \"identity.userDataNamespace\", 64) } : {}),\n }\n}\n\nfunction parseAssets(value: unknown): BrandAssets {\n if (!isRecord(value)) throw new Error(\"assets must be an object\")\n assertKnownKeys(value, ASSET_KEYS, \"assets\")\n const tray = value.tray === undefined ? undefined : relativePath(value.tray, \"assets.tray\")\n const loginKV =\n value.loginKV === undefined ? undefined : relativePath(value.loginKV, \"assets.loginKV\")\n return {\n appIcon: relativePath(value.appIcon, \"assets.appIcon\"),\n ...(tray ? { tray } : {}),\n logo: relativePath(value.logo, \"assets.logo\"),\n ...(loginKV ? { loginKV } : {}),\n }\n}\n\nfunction parsePartialAssets(value: unknown): PartialBrandAssets {\n if (!isRecord(value)) throw new Error(\"assets must be an object\")\n assertKnownKeys(value, ASSET_KEYS, \"assets\")\n return {\n ...(value.appIcon !== undefined ? { appIcon: relativePath(value.appIcon, \"assets.appIcon\") } : {}),\n ...(value.logo !== undefined ? { logo: relativePath(value.logo, \"assets.logo\") } : {}),\n ...(value.tray !== undefined ? { tray: relativePath(value.tray, \"assets.tray\") } : {}),\n ...(value.loginKV !== undefined\n ? { loginKV: relativePath(value.loginKV, \"assets.loginKV\") }\n : {}),\n }\n}\n\nfunction parseBrandCopy(value: unknown, path: string): TenantBranding {\n if (!isRecord(value)) throw new Error(`${path} must be an object`)\n assertKnownKeys(value, BRANDING_KEYS, path)\n const result: TenantBranding = {\n productName: text(value.productName, `${path}.productName`, 64),\n companyName: text(value.companyName, `${path}.companyName`, 80),\n }\n for (const [key, limit] of [\n [\"claim\", 40],\n [\"claimNote\", 48],\n [\"slogan\", 68],\n ] as const) {\n if (value[key] !== undefined) result[key] = text(value[key], `${path}.${key}`, limit)\n }\n return result\n}\n\nfunction parseBranding(value: unknown): LocalizedBranding {\n if (!isRecord(value)) throw new Error(\"branding must be a locale map\")\n const result: LocalizedBranding = {}\n for (const [rawLocale, copy] of Object.entries(value)) {\n const locale = canonicalLocale(rawLocale, `branding.${rawLocale}`)\n result[locale] = parseBrandCopy(copy, `branding.${locale}`)\n }\n if (!result[\"en-US\"]) throw new Error(\"branding.en-US is required\")\n return result\n}\n\nfunction parseLocales(value: unknown): BrandLocaleSources | undefined {\n if (value === undefined) return undefined\n if (!isRecord(value)) throw new Error(\"locales must be a locale map\")\n const result: BrandLocaleSources = {}\n for (const [rawLocale, source] of Object.entries(value)) {\n const locale = canonicalLocale(rawLocale, `locales.${rawLocale}`)\n result[locale] = relativePath(source, `locales.${locale}`)\n }\n if (!result[\"en-US\"]) throw new Error(\"locales.en-US is required when locales are declared\")\n return result\n}\n\nfunction isDevelopmentHostname(hostname: string): boolean {\n const lower = hostname.toLowerCase()\n if (lower === \"localhost\" || lower.endsWith(\".localhost\") || lower.endsWith(\".local\")) return true\n if ([\"::1\", \"[::1]\"].includes(lower) || /^(?:fc|fd|fe8|fe9|fea|feb)/.test(lower.replace(/[\\[\\]]/g, \"\"))) {\n return true\n }\n const ipv4 = lower\n .match(/^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/)\n ?.slice(1)\n .map(Number)\n if (ipv4) {\n const [a, b] = ipv4\n if (\n a === 0 ||\n a === 10 ||\n a === 127 ||\n (a === 169 && b === 254) ||\n (a === 172 && b! >= 16 && b! <= 31) ||\n (a === 192 && b === 168)\n ) {\n return true\n }\n }\n return lower\n .split(/[.-]/)\n .some((label) => [\"dev\", \"development\", \"test\", \"testing\", \"stage\", \"staging\", \"uat\"].includes(label))\n}\n\nfunction parseNetwork(value: unknown): BrandNetworkAccess | undefined {\n if (value === undefined) return undefined\n if (!isRecord(value)) throw new Error(\"network must be an object\")\n assertKnownKeys(value, NETWORK_KEYS, \"network\")\n if (!Array.isArray(value.allowedOrigins) || value.allowedOrigins.length === 0) {\n throw new Error(\"network.allowedOrigins must be a non-empty array\")\n }\n const allowedOrigins = value.allowedOrigins.map((raw, index) => {\n const path = `network.allowedOrigins[${index}]`\n const origin = text(raw, path, 240)\n let parsed: URL\n try {\n parsed = new URL(origin)\n } catch {\n throw new Error(`${path} must be an exact HTTPS origin`)\n }\n if (\n parsed.protocol !== \"https:\" ||\n parsed.username ||\n parsed.password ||\n parsed.pathname !== \"/\" ||\n parsed.search ||\n parsed.hash ||\n parsed.origin !== origin\n ) {\n throw new Error(`${path} must be a canonical exact HTTPS origin without credentials, path, query, or fragment`)\n }\n if (isDevelopmentHostname(parsed.hostname)) {\n throw new Error(`${path} must be a production origin, not localhost, private network, dev, test, staging, or UAT`)\n }\n return origin\n })\n if (new Set(allowedOrigins).size !== allowedOrigins.length) {\n throw new Error(\"network.allowedOrigins must not contain duplicates\")\n }\n return { allowedOrigins }\n}\n\nfunction parseHomepage(value: unknown): string {\n const homepage = text(value, \"homepage\", 200)\n let parsed: URL\n try {\n parsed = new URL(homepage)\n } catch {\n throw new Error(\"homepage must be an https URL\")\n }\n if (parsed.protocol !== \"https:\" || !parsed.hostname) {\n throw new Error(\"homepage must be an https URL\")\n }\n return homepage\n}\n\nfunction parsePermissions(value: unknown): BrandPermissions {\n if (!isRecord(value)) throw new Error(\"permissions must be an object\")\n assertKnownKeys(value, PERMISSIONS_KEYS, \"permissions\")\n return { microphoneUsage: text(value.microphoneUsage, \"permissions.microphoneUsage\", 120) }\n}\n\nfunction parseModeTokens(value: unknown, path: string): Partial<Record<BrandThemeToken, string>> { if (!isRecord(value)) throw new Error(`${path} must be an object`)\n const result: Partial<Record<BrandThemeToken, string>> = {}\n for (const [name, raw] of Object.entries(value)) {\n if (!BRAND_TOKEN_NAMES.has(name)) throw new Error(`${path} contains forbidden token: ${name}`)\n if (typeof raw !== \"string\" || !HEX.test(raw)) throw new Error(`${path}.${name} must be a hex color`)\n result[name as BrandThemeToken] = raw.toLowerCase()\n }\n\n const touchedNeutral = UNIFIED_NEUTRAL_TOKENS.some((name) => result[name] !== undefined)\n if (touchedNeutral) {\n const missing = UNIFIED_NEUTRAL_TOKENS.filter((name) => result[name] === undefined)\n if (missing.length) throw new Error(`${path} neutral group is incomplete: ${missing.join(\", \")}`)\n for (const textToken of [\"--ow-text\", \"--ow-text-2\"] as const) {\n for (const surfaceToken of [\"--ow-bg\", \"--ow-surface\", \"--ow-surface-2\"] as const) {\n const ratio = ds2ContrastRatio(result[textToken] as string, result[surfaceToken] as string)\n if (ratio < 4.5) {\n throw new Error(\n `${path} contrast ${textToken} on ${surfaceToken} is ${ratio.toFixed(2)}:1; expected >= 4.5:1`,\n )\n }\n }\n }\n }\n\n const touchedAction = BRAND_ACTION_TOKENS.some((name) => result[name] !== undefined)\n if (touchedAction) {\n const missing = BRAND_ACTION_TOKENS.filter((name) => result[name] === undefined)\n if (missing.length) throw new Error(`${path} action pole group is incomplete: ${missing.join(\", \")}`)\n for (const background of [\"--ow-btn-primary-bg\", \"--ow-btn-primary-hover\", \"--ow-btn-primary-press\"] as const) {\n const ratio = ds2ContrastRatio(result[background] as string, result[\"--ow-btn-primary-fg\"] as string)\n if (ratio < 4.5) {\n throw new Error(\n `${path} contrast --ow-btn-primary-fg on ${background} is ${ratio.toFixed(2)}:1; expected >= 4.5:1`,\n )\n }\n }\n }\n return result\n}\n\nfunction parseTokens(value: unknown): BrandManifest[\"tokens\"] {\n if (value === undefined) return undefined\n if (!isRecord(value)) throw new Error(\"tokens must be an object\")\n assertKnownKeys(value, MODE_KEYS, \"tokens\")\n const light = value.light === undefined ? undefined : parseModeTokens(value.light, \"tokens.light\")\n const dark = value.dark === undefined ? undefined : parseModeTokens(value.dark, \"tokens.dark\")\n if (!light && !dark) throw new Error(\"tokens must define light or dark\")\n return { ...(light ? { light } : {}), ...(dark ? { dark } : {}) }\n}\n\nfunction slotAllowedKeys(kind: SlotKind): Set<string> {\n return new Set([\n ...SLOT_COMMON_KEYS,\n ...(kind === \"list\" ? [\"id\", \"order\"] : []),\n ...(kind === \"keyed\" ? [\"key\"] : []),\n ])\n}\n\nfunction parseSlotContribution(value: unknown, index: number): SlotContribution {\n const path = `contributes.slots[${index}]`\n if (!isRecord(value)) throw new Error(`${path} must be an object`)\n const name = text(value.name, `${path}.name`, 120)\n const declaration = SLOT_DECLARATIONS[name]\n if (!declaration) throw new Error(`${path}.name is not in the host slot whitelist: ${name}`)\n assertKnownKeys(value, slotAllowedKeys(declaration.kind), path)\n const common = { name: name as BrandSlotName }\n if (declaration.kind === \"list\") {\n const id = text(value.id, `${path}.id`, 100)\n if (typeof value.order !== \"number\" || !Number.isFinite(value.order)) {\n throw new Error(`${path}.order must be a finite number`)\n }\n return { ...common, id, order: value.order } as SlotContribution\n }\n if (declaration.kind === \"keyed\") {\n const key = text(value.key, `${path}.key`, 100)\n const allowed = WORKBENCH_KEYED_SLOT_KEYS[name as KeyedSlotName] as readonly string[] | undefined\n if (!allowed?.includes(key)) throw new Error(`${path}.key is not reachable by the host: ${key}`)\n return { ...common, key } as SlotContribution\n }\n return common as SlotContribution\n}\n\nfunction contributionCell(value: SlotContribution): string {\n if (\"id\" in value) return value.id\n if (\"key\" in value) return value.key\n return \"single\"\n}\n\nfunction parseContributes(value: unknown): BrandManifest[\"contributes\"] {\n if (value === undefined) return undefined\n if (!isRecord(value)) throw new Error(\"contributes must be an object\")\n assertKnownKeys(value, CONTRIBUTES_KEYS, \"contributes\")\n if (!Array.isArray(value.slots)) throw new Error(\"contributes.slots must be an array\")\n const slots = value.slots.map(parseSlotContribution)\n const seen = new Set<string>()\n for (const slot of slots) {\n const identity = `${slot.name}\\0${contributionCell(slot)}`\n if (seen.has(identity)) throw new Error(`duplicate slot contribution: ${slot.name} / ${contributionCell(slot)}`)\n seen.add(identity)\n }\n return { slots }\n}\n\nexport function parseBrandManifest(input: unknown, options?: BrandManifestParseOptions): BrandManifestValidationResult {\n try {\n const platform = options?.platform === true\n if (!isRecord(input)) throw new Error(\"brand manifest must be a JSON object\")\n assertKnownKeys(input, ROOT_KEYS, \"manifest\")\n if (input.$schema !== BRAND_MANIFEST_SCHEMA) throw new Error(`$schema must equal ${BRAND_MANIFEST_SCHEMA}`)\n const id = text(input.id, \"id\", 64)\n if (!KEBAB_ID.test(id)) throw new Error(\"id must be lowercase kebab-case\")\n const entry = input.entry === undefined ? undefined : relativePath(input.entry, \"entry\")\n if (entry && !SOURCE_ENTRY.test(entry)) {\n throw new Error(\"entry must point to reviewed source under ./src using .js, .mjs, .jsx, .ts, or .tsx\")\n }\n const contributes = parseContributes(input.contributes)\n if ((contributes?.slots.length ?? 0) > 0 && !entry)\n throw new Error(\"entry is required when contributes.slots is not empty\")\n const tokens = parseTokens(input.tokens)\n const locales = parseLocales(input.locales)\n const network = parseNetwork(input.network)\n const identity = parseIdentity(input.identity, id, platform)\n if (!platform && productNameNamespace(identity.productName) !== id) {\n throw new Error(\"identity.productName must normalize to manifest id so installation names cannot collide\")\n }\n if (!platform && identity.versionChannel !== id) {\n throw new Error(\"identity.versionChannel must equal manifest id to keep OEM update feeds namespaced\")\n }\n if (!platform && identity.protocolScheme !== id) {\n throw new Error(\"identity.protocolScheme must equal manifest id to keep OEM deep links namespaced\")\n }\n if (!platform && !identity.appId.endsWith(`.oem.${id}`)) {\n throw new Error(\"identity.appId must end with .oem.<manifest id> to isolate installation and user data\")\n }\n return {\n ok: true,\n manifest: {\n $schema: BRAND_MANIFEST_SCHEMA,\n id,\n ...(input.description !== undefined ? { description: text(input.description, \"description\", 200) } : {}),\n ...(input.assistantName !== undefined ? { assistantName: text(input.assistantName, \"assistantName\", 48) } : {}),\n ...(input.homepage !== undefined ? { homepage: parseHomepage(input.homepage) } : {}),\n ...(input.permissions !== undefined ? { permissions: parsePermissions(input.permissions) } : {}),\n ...(entry ? { entry } : {}),\n identity,\n ...(tokens ? { tokens } : {}),\n assets: parseAssets(input.assets),\n branding: parseBranding(input.branding),\n ...(locales ? { locales } : {}),\n ...(network ? { network } : {}),\n ...(contributes ? { contributes } : {}),\n },\n }\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) }\n }\n}\n\nfunction parsePartialIdentity(value: unknown): PartialBrandIdentity {\n if (!isRecord(value)) throw new Error(\"identity must be an object\")\n assertKnownKeys(value, IDENTITY_KEYS, \"identity\")\n // Filled fields are validated exactly like the strict parser (formats,\n // reserved values), but the id-binding rules are skipped: partial manifests\n // are merged with source defaults before consumption, and the resolved\n // product is re-validated where those bindings apply.\n if (value.userDataNamespace !== undefined && !KEBAB_ID.test(text(value.userDataNamespace, \"identity.userDataNamespace\", 64))) {\n throw new Error(\"identity.userDataNamespace must be lowercase kebab-case\")\n }\n if (value.appId !== undefined) {\n const appId = text(value.appId, \"identity.appId\", 160)\n if (!APP_ID.test(appId)) throw new Error(\"identity.appId must be a reverse-DNS identifier\")\n if (appId === OFFICIAL_APP_ID) {\n throw new Error(`identity.appId is reserved for the official application: ${appId}`)\n }\n }\n if (value.versionChannel !== undefined) {\n const versionChannel = text(value.versionChannel, \"identity.versionChannel\", 64)\n if (!KEBAB_ID.test(versionChannel)) throw new Error(\"identity.versionChannel must be kebab-case\")\n }\n if (value.protocolScheme !== undefined) {\n const protocolScheme = text(value.protocolScheme, \"identity.protocolScheme\", 64)\n if (!PROTOCOL_SCHEME.test(protocolScheme)) {\n throw new Error(\"identity.protocolScheme must be a lowercase URI scheme beginning with a letter\")\n }\n if (RESERVED_PROTOCOL_SCHEMES.has(protocolScheme)) {\n throw new Error(`identity.protocolScheme is reserved: ${protocolScheme}`)\n }\n }\n if (value.productName !== undefined) {\n const productName = text(value.productName, \"identity.productName\", 64)\n if (\n hasUnsafeProductNameCharacter(productName) ||\n /[. ]$/.test(productName) ||\n productName === \".\" ||\n productName === \"..\" ||\n WINDOWS_DEVICE_NAME.test(productName)\n ) {\n throw new Error(\"identity.productName must be safe for macOS, Windows, Linux, and release artifact paths\")\n }\n if (OFFICIAL_PRODUCT_NAMES.has(productName.toLowerCase())) {\n throw new Error(`identity.productName is reserved for the official application: ${productName}`)\n }\n }\n return {\n ...(value.productName !== undefined ? { productName: text(value.productName, \"identity.productName\", 64) } : {}),\n ...(value.appId !== undefined ? { appId: text(value.appId, \"identity.appId\", 160) } : {}),\n ...(value.versionChannel !== undefined ? { versionChannel: text(value.versionChannel, \"identity.versionChannel\", 64) } : {}),\n ...(value.protocolScheme !== undefined ? { protocolScheme: text(value.protocolScheme, \"identity.protocolScheme\", 64) } : {}),\n ...(value.userDataNamespace !== undefined\n ? { userDataNamespace: text(value.userDataNamespace, \"identity.userDataNamespace\", 64) }\n : {}),\n }\n}\n\nfunction parsePartialBranding(value: unknown): PartialLocalizedBranding {\n if (!isRecord(value)) throw new Error(\"branding must be a locale map\")\n const result: PartialLocalizedBranding = {}\n for (const [rawLocale, copy] of Object.entries(value)) {\n const locale = canonicalLocale(rawLocale, `branding.${rawLocale}`)\n if (!isRecord(copy)) throw new Error(`branding.${locale} must be an object`)\n assertKnownKeys(copy, BRANDING_KEYS, `branding.${locale}`)\n const partial: Partial<TenantBranding> = {}\n for (const [key, limit] of [\n [\"productName\", 64],\n [\"companyName\", 80],\n [\"claim\", 40],\n [\"claimNote\", 48],\n [\"slogan\", 68],\n ] as const) {\n if (copy[key] !== undefined) partial[key] = text(copy[key], `branding.${locale}.${key}`, limit)\n }\n result[locale] = partial\n }\n return result\n}\n\n/**\n * Validates an upload-time (partial) brand manifest: omitted fields inherit\n * source defaults at merge time; every filled field is fully validated. The\n * resolved product must still pass `parseBrandManifest` where it is consumed.\n */\nexport function parsePartialBrandManifest(input: unknown): PartialBrandManifestValidationResult {\n try {\n if (!isRecord(input)) throw new Error(\"brand manifest must be a JSON object\")\n assertKnownKeys(input, ROOT_KEYS, \"manifest\")\n if (input.$schema !== undefined && input.$schema !== BRAND_MANIFEST_SCHEMA) {\n throw new Error(`$schema must equal ${BRAND_MANIFEST_SCHEMA}`)\n }\n const entry = input.entry === undefined ? undefined : relativePath(input.entry, \"entry\")\n if (entry && !SOURCE_ENTRY.test(entry)) {\n throw new Error(\"entry must point to reviewed source under ./src using .js, .mjs, .jsx, .ts, or .tsx\")\n }\n const contributes = parseContributes(input.contributes)\n if ((contributes?.slots.length ?? 0) > 0 && !entry)\n throw new Error(\"entry is required when contributes.slots is not empty\")\n if (input.id !== undefined) {\n const id = text(input.id, \"id\", 64)\n if (!KEBAB_ID.test(id)) throw new Error(\"id must be lowercase kebab-case\")\n }\n return {\n ok: true,\n manifest: {\n ...(input.id !== undefined ? { id: text(input.id, \"id\", 64) } : {}),\n ...(input.description !== undefined ? { description: text(input.description, \"description\", 200) } : {}),\n ...(input.assistantName !== undefined ? { assistantName: text(input.assistantName, \"assistantName\", 48) } : {}),\n ...(input.homepage !== undefined ? { homepage: parseHomepage(input.homepage) } : {}),\n ...(input.permissions !== undefined ? { permissions: parsePermissions(input.permissions) } : {}),\n ...(entry ? { entry } : {}),\n ...(input.identity !== undefined ? { identity: parsePartialIdentity(input.identity) } : {}),\n ...(input.tokens !== undefined ? { tokens: parseTokens(input.tokens) } : {}),\n ...(input.assets !== undefined ? { assets: parsePartialAssets(input.assets) } : {}),\n ...(input.branding !== undefined ? { branding: parsePartialBranding(input.branding) } : {}),\n ...(input.locales !== undefined ? { locales: parseLocales(input.locales) } : {}),\n ...(input.network !== undefined ? { network: parseNetwork(input.network) } : {}),\n ...(contributes ? { contributes } : {}),\n },\n }\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) }\n }\n}\n\nexport function manifestToBrandTheme(manifest: BrandManifest): BrandTheme {\n return {\n id: manifest.id,\n logo: manifest.assets.logo,\n ...(manifest.assets.loginKV ? { loginKV: manifest.assets.loginKV } : {}),\n modes: manifest.tokens ?? {},\n branding: manifest.branding,\n }\n}\n"]}
|