/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import type { NlsString, LanguageTranslations, Category, Policy, Translations, ProductJson } from './types.ts'; export function renderADMLString(prefix: string, moduleName: string, nlsString: NlsString, translations?: LanguageTranslations): string { let value: string | undefined; if (translations) { const moduleTranslations = translations[moduleName]; if (moduleTranslations) { value = moduleTranslations[nlsString.nlsKey]; } } if (!value) { value = nlsString.value; } return `${value}`; } export function renderProfileString(_prefix: string, moduleName: string, nlsString: NlsString, translations?: LanguageTranslations): string { let value: string | undefined; if (translations) { const moduleTranslations = translations[moduleName]; if (moduleTranslations) { value = moduleTranslations[nlsString.nlsKey]; } } if (!value) { value = nlsString.value; } return value; } export function renderADMX(regKey: string, versions: string[], categories: Category[], policies: Policy[]) { versions = versions.map(v => v.replace(/\./g, '_')); return ` ${versions.map(v => ``).join(`\n `)} ${categories.map(c => ``).join(`\n `)} ${policies.map(p => p.renderADMX(regKey)).flat().join(`\n `)} `; } export function renderADML(appName: string, versions: string[], categories: Category[], policies: Policy[], translations?: LanguageTranslations) { return ` ${appName} ${versions.map(v => `${appName} >= ${v}`).join(`\n `)} ${categories.map(c => renderADMLString('Category', c.moduleName, c.name, translations)).join(`\n `)} ${policies.map(p => p.renderADMLStrings(translations)).flat().join(`\n `)} ${policies.map(p => p.renderADMLPresentation()).join(`\n `)} `; } export function renderProfileManifest(appName: string, bundleIdentifier: string, _versions: string[], _categories: Category[], policies: Policy[], translations?: LanguageTranslations) { const requiredPayloadFields = ` pfm_default Configure ${appName} pfm_name PayloadDescription pfm_title Payload Description pfm_type string pfm_default ${appName} pfm_name PayloadDisplayName pfm_require always pfm_title Payload Display Name pfm_type string pfm_default ${bundleIdentifier} pfm_name PayloadIdentifier pfm_require always pfm_title Payload Identifier pfm_type string pfm_default ${bundleIdentifier} pfm_name PayloadType pfm_require always pfm_title Payload Type pfm_type string pfm_default pfm_name PayloadUUID pfm_require always pfm_title Payload UUID pfm_type string pfm_default 1 pfm_name PayloadVersion pfm_range_list 1 pfm_require always pfm_title Payload Version pfm_type integer pfm_default Microsoft pfm_name PayloadOrganization pfm_title Payload Organization pfm_type string `; const profileManifestSubkeys = policies.map(policy => { return policy.renderProfileManifest(translations); }).join(''); return ` pfm_app_url https://code.visualstudio.com/ pfm_description ${appName} Managed Settings pfm_documentation_url https://code.visualstudio.com/docs/setup/enterprise pfm_domain ${bundleIdentifier} pfm_format_version 1 pfm_interaction combined pfm_last_modified ${new Date().toISOString().replace(/\.\d+Z$/, 'Z')} pfm_platforms macOS pfm_subkeys ${requiredPayloadFields} ${profileManifestSubkeys} pfm_title ${appName} pfm_unique pfm_version 1 `; } export function renderMacOSPolicy(product: ProductJson, policies: Policy[], translations: Translations) { const appName = product.nameLong; const bundleIdentifier = product.darwinBundleIdentifier; const payloadUUID = product.darwinProfilePayloadUUID; const UUID = product.darwinProfileUUID; const versions = [...new Set(policies.map(p => p.minimumVersion)).values()].sort(); const categories = [...new Set(policies.map(p => p.category))]; const policyEntries = policies.map(policy => policy.renderProfile()) .flat() .map(entry => `\t\t\t\t${entry}`) .join('\n'); return { profile: ` PayloadContent PayloadDisplayName ${appName} PayloadIdentifier ${bundleIdentifier}.${UUID} PayloadType ${bundleIdentifier} PayloadUUID ${UUID} PayloadVersion 1 ${policyEntries} PayloadDescription This profile manages ${appName}. For more information see https://code.visualstudio.com/docs/setup/enterprise PayloadDisplayName ${appName} PayloadIdentifier ${bundleIdentifier} PayloadOrganization Microsoft PayloadType Configuration PayloadUUID ${payloadUUID} PayloadVersion 1 TargetDeviceType 5 `, manifests: [{ languageId: 'en-us', contents: renderProfileManifest(appName, bundleIdentifier, versions, categories, policies) }, ...translations.map(({ languageId, languageTranslations }) => ({ languageId, contents: renderProfileManifest(appName, bundleIdentifier, versions, categories, policies, languageTranslations) })) ] }; } export function renderGP(product: ProductJson, policies: Policy[], translations: Translations) { const appName = product.nameLong; const regKey = product.win32RegValueName; const versions = [...new Set(policies.map(p => p.minimumVersion)).values()].sort(); const categories = [...Object.values(policies.reduce((acc, p) => ({ ...acc, [p.category.name.nlsKey]: p.category }), {}))] as Category[]; return { admx: renderADMX(regKey, versions, categories, policies), adml: [ { languageId: 'en-us', contents: renderADML(appName, versions, categories, policies) }, ...translations.map(({ languageId, languageTranslations }) => ({ languageId, contents: renderADML(appName, versions, categories, policies, languageTranslations) })) ] }; } export function renderJsonPolicies(policies: Policy[]) { const policyObject: { [key: string]: string | number | boolean | object | null } = {}; for (const policy of policies) { policyObject[policy.name] = policy.renderJsonValue(); } return policyObject; }