/*---------------------------------------------------------------------------------------------
* 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;
}