diff --git a/.gitignore b/.gitignore index 33b21c2..944a0ab 100644 --- a/.gitignore +++ b/.gitignore @@ -25,5 +25,8 @@ jspm_packages/ # Eclipse .project +# Webstorm +.idea + # MacOS folder atttribute tracking -**/.DS_Store \ No newline at end of file +**/.DS_Store diff --git a/compiled/registryPreset.json b/compiled/registryPreset.json new file mode 100644 index 0000000..ef52396 --- /dev/null +++ b/compiled/registryPreset.json @@ -0,0 +1,12 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/registryPresets", + "definitions": { + "registryPresets": { + "type": "array", + "items": { + "type": "string" + } + } + } +} diff --git a/compiled/registryVariants.json b/compiled/registryVariants.json new file mode 100644 index 0000000..6610e50 --- /dev/null +++ b/compiled/registryVariants.json @@ -0,0 +1,235 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/MetadataRegistry", + "definitions": { + "MetadataRegistry": { + "type": "object", + "properties": { + "types": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "directoryName": { + "type": "string" + }, + "suffix": { + "type": "string" + }, + "strictDirectoryName": { + "type": "boolean" + }, + "ignoreParsedFullName": { + "type": "boolean" + }, + "folderContentType": { + "type": "string" + }, + "folderType": { + "type": "string" + }, + "xmlElementName": { + "type": "string" + }, + "uniqueIdElement": { + "type": "string" + }, + "isAddressable": { + "type": "boolean" + }, + "unaddressableWithoutParent": { + "type": "boolean" + }, + "supportsWildcardAndName": { + "type": "boolean" + }, + "supportsPartialDelete": { + "type": "boolean" + }, + "aliasFor": { + "type": "string" + }, + "children": { + "type": "object", + "properties": { + "types": { + "$ref": "#/definitions/alias-1220290513-257-1164-1220290513-0-1228" + }, + "suffixes": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "directories": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "required": ["types", "suffixes"], + "additionalProperties": false + }, + "strategies": { + "type": "object", + "properties": { + "adapter": { + "type": "string", + "enum": [ + "mixedContent", + "matchingContentFile", + "decomposed", + "bundle", + "default" + ] + }, + "transformer": { + "type": "string", + "enum": ["decomposed", "staticResource", "standard"] + }, + "decomposition": { + "type": "string", + "enum": ["topLevel", "folderPerType"] + } + }, + "required": ["adapter"], + "additionalProperties": false + } + }, + "required": ["id", "name", "directoryName"], + "additionalProperties": false + } + }, + "suffixes": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "strictDirectoryNames": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "childTypes": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "required": ["types", "suffixes", "strictDirectoryNames", "childTypes"], + "additionalProperties": false + }, + "alias-1220290513-257-1164-1220290513-0-1228": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "directoryName": { + "type": "string" + }, + "suffix": { + "type": "string" + }, + "strictDirectoryName": { + "type": "boolean" + }, + "ignoreParsedFullName": { + "type": "boolean" + }, + "folderContentType": { + "type": "string" + }, + "folderType": { + "type": "string" + }, + "xmlElementName": { + "type": "string" + }, + "uniqueIdElement": { + "type": "string" + }, + "isAddressable": { + "type": "boolean" + }, + "unaddressableWithoutParent": { + "type": "boolean" + }, + "supportsWildcardAndName": { + "type": "boolean" + }, + "supportsPartialDelete": { + "type": "boolean" + }, + "aliasFor": { + "type": "string" + }, + "children": { + "type": "object", + "properties": { + "types": { + "$ref": "#/definitions/alias-1220290513-257-1164-1220290513-0-1228" + }, + "suffixes": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "directories": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "required": ["types", "suffixes"], + "additionalProperties": false + }, + "strategies": { + "type": "object", + "properties": { + "adapter": { + "type": "string", + "enum": [ + "mixedContent", + "matchingContentFile", + "decomposed", + "bundle", + "default" + ] + }, + "transformer": { + "type": "string", + "enum": ["decomposed", "staticResource", "standard"] + }, + "decomposition": { + "type": "string", + "enum": ["topLevel", "folderPerType"] + } + }, + "required": ["adapter"], + "additionalProperties": false + } + }, + "required": ["id", "name", "directoryName"], + "additionalProperties": false + } + } + } +} diff --git a/examples/sfdx-project/registry-custom-invalid.json b/examples/sfdx-project/registry-custom-invalid.json new file mode 100644 index 0000000..d064505 --- /dev/null +++ b/examples/sfdx-project/registry-custom-invalid.json @@ -0,0 +1,190 @@ +{ + "name": "project-name", + "packageDirectories": [ + { + "path": "force-app", + "default": true + } + ], + "namespace": "", + "sfdcLoginUrl": "https://login.salesforce.com", + "sourceApiVersion": "48.0", + "registryCustomizations": { + "childTypes": { + "applicationvisibility": "permissionset", + "classaccess": "permissionset", + "custommetadatatypeaccess": "permissionset", + "custompermissions": "permissionset", + "customsettingaccess": "permissionset", + "externalcredentialprincipalaccess": "permissionset", + "externaldatasourceaccess": "permissionset", + "fieldpermission": "permissionset", + "flowaccess": "permissionset", + "objectpermission": "permissionset", + "pageaccess": "permissionset", + "recordtypevisibility": "permissionset", + "tabsetting": "permissionset", + "userpermission": "permissionset" + }, + "strictDirectoryNames": { + "permissionsets": "permissionset" + }, + "suffixes": { + "permissionset": "permissionset" + }, + "types": { + "permissionset": { + "children": { + "directories": { + "applicationVisibilities": "applicationvisibility", + "classAccesses": "classaccess", + "customMetadataTypeAccesses": "custommetadatatypeaccess", + "customPermissions": "custompermissions", + "customSettingAccesses": "customsettingaccess", + "externalCredentialPrincipalAccesses": "externalcredentialprincipalaccess", + "externalDataSourceAccesses": "externaldatasourceaccess", + "fieldPermissions": "fieldpermission", + "flowAccesses": "flowaccess", + "objectPermissions": "objectpermission", + "pageAccesses": "pageaccess", + "recordTypeVisibilities": "recordtypevisibility", + "tabSettings": "tabsetting", + "userPermissions": "userpermission" + }, + "suffixes": { + "applicationVisibility": "applicationvisibility", + "classAccess": "classaccess", + "customMetadataTypeAccess": "custommetadatatypeaccess", + "customPermission": "custompermissions", + "customSettingAccess": "customsettingaccess", + "externalCredentialPrincipalAccess": "externalcredentialprincipalaccess", + "externalDataSourceAccess": "externaldatasourceaccess", + "fieldPermission": "fieldpermission", + "flowAccess": "flowaccess", + "objectPermission": "objectpermission", + "pageAccess": "pageaccess", + "recordTypeVisibility": "recordtypevisibility", + "tabSetting": "tabsetting", + "userPermission": "userpermission" + }, + "types": { + "applicationvisibility": { + "directoryName": "applicationVisibilities", + "id": "applicationvisibility", + "isAddressable": false, + "name": "ApplicationVisibility", + "suffix": "applicationVisibility", + "uniqueIdElement": "application" + }, + "classaccess": { + "directoryName": "classAccesses", + "id": "classaccess", + "isAddressable": false, + "name": "ClassAccess", + "suffix": "classAccess", + "uniqueIdElement": "apexClass" + }, + "custommetadatatypeaccess": { + "directoryName": "customMetadataTypeAccesses", + "id": "custommetadatatypeaccess", + "isAddressable": false, + "name": "CustomMetadataTypeAccess", + "suffix": "customMetadataTypeAccess", + "uniqueIdElement": "name" + }, + "custompermissions": { + "directoryName": "customPermissions", + "id": "custompermissions", + "isAddressable": false, + "name": "CustomPermission", + "suffix": "customPermission", + "uniqueIdElement": "name" + }, + "customsettingaccess": { + "directoryName": "customSettingAccesses", + "id": "customsettingaccess", + "isAddressable": false, + "name": "CustomSettingAccess", + "suffix": "customSettingAccess", + "uniqueIdElement": "name" + }, + "externalcredentialprincipalaccess": { + "directoryName": "externalCredentialPrincipalAccesses", + "id": "externalcredentialprincipalaccess", + "isAddressable": false, + "name": "ExternalCredentialPrincipalAccess", + "suffix": "externalCredentialPrincipalAccess", + "uniqueIdElement": "externalCredentialPrincipal" + }, + "externaldatasourceaccess": { + "directoryName": "externalDataSourceAccesses", + "id": "externaldatasourceaccess", + "isAddressable": false, + "name": "ExternalDataSourceAccess", + "suffix": "externalDataSourceAccess", + "uniqueIdElement": "externalDataSource" + }, + "fieldpermission": { + "directoryName": "fieldPermissions", + "id": "fieldpermission", + "isAddressable": false, + "name": "FieldPermission", + "suffix": "fieldPermission", + "uniqueIdElement": "field" + }, + "flowaccess": { + "directoryName": "flowAccesses", + "id": "flowaccess", + "isAddressable": false, + "name": "FlowAccess", + "suffix": "flowAccess", + "uniqueIdElement": "flow" + }, + "objectpermission": { + "directoryName": "objectPermissions", + "id": "objectpermission", + "isAddressable": false, + "name": "ObjectPermission", + "suffix": "objectPermission", + "uniqueIdElement": "object" + }, + "pageaccess": { + "directoryName": "pageAccesses", + "id": "pageaccess", + "isAddressable": false, + "name": "PageAccess", + "suffix": "pageAccess", + "uniqueIdElement": "apexPage" + }, + "recordtypevisibility": { + "directoryName": "recordTypeVisibilities", + "id": "recordtypevisibility", + "isAddressable": false, + "name": "RecordTypeVisibility", + "suffix": "recordTypeVisibility", + "uniqueIdElement": "recordType" + }, + "tabsetting": { + "directoryName": "tabSettings", + "id": "tabsetting", + "isAddressable": false, + "name": "TabSetting", + "suffix": "tabSetting", + "uniqueIdElement": "tab" + }, + "userpermission": { + "directoryName": "userPermissions", + "id": "userpermission", + "isAddressable": false, + "name": "UserPermission", + "suffix": "userPermission" + } + } + }, + "directoryName": "permissionsets", + "strictDirectoryName": true, + "suffix": "permissionset" + } + } + } +} diff --git a/examples/sfdx-project/registry-custom.json b/examples/sfdx-project/registry-custom.json new file mode 100644 index 0000000..445c9bb --- /dev/null +++ b/examples/sfdx-project/registry-custom.json @@ -0,0 +1,197 @@ +{ + "name": "project-name", + "packageDirectories": [ + { + "path": "force-app", + "default": true + } + ], + "namespace": "", + "sfdcLoginUrl": "https://login.salesforce.com", + "sourceApiVersion": "48.0", + "registryCustomizations": { + "childTypes": { + "applicationvisibility": "permissionset", + "classaccess": "permissionset", + "custommetadatatypeaccess": "permissionset", + "custompermissions": "permissionset", + "customsettingaccess": "permissionset", + "externalcredentialprincipalaccess": "permissionset", + "externaldatasourceaccess": "permissionset", + "fieldpermission": "permissionset", + "flowaccess": "permissionset", + "objectpermission": "permissionset", + "pageaccess": "permissionset", + "recordtypevisibility": "permissionset", + "tabsetting": "permissionset", + "userpermission": "permissionset" + }, + "strictDirectoryNames": { + "permissionsets": "permissionset" + }, + "suffixes": { + "permissionset": "permissionset" + }, + "types": { + "permissionset": { + "children": { + "directories": { + "applicationVisibilities": "applicationvisibility", + "classAccesses": "classaccess", + "customMetadataTypeAccesses": "custommetadatatypeaccess", + "customPermissions": "custompermissions", + "customSettingAccesses": "customsettingaccess", + "externalCredentialPrincipalAccesses": "externalcredentialprincipalaccess", + "externalDataSourceAccesses": "externaldatasourceaccess", + "fieldPermissions": "fieldpermission", + "flowAccesses": "flowaccess", + "objectPermissions": "objectpermission", + "pageAccesses": "pageaccess", + "recordTypeVisibilities": "recordtypevisibility", + "tabSettings": "tabsetting", + "userPermissions": "userpermission" + }, + "suffixes": { + "applicationVisibility": "applicationvisibility", + "classAccess": "classaccess", + "customMetadataTypeAccess": "custommetadatatypeaccess", + "customPermission": "custompermissions", + "customSettingAccess": "customsettingaccess", + "externalCredentialPrincipalAccess": "externalcredentialprincipalaccess", + "externalDataSourceAccess": "externaldatasourceaccess", + "fieldPermission": "fieldpermission", + "flowAccess": "flowaccess", + "objectPermission": "objectpermission", + "pageAccess": "pageaccess", + "recordTypeVisibility": "recordtypevisibility", + "tabSetting": "tabsetting", + "userPermission": "userpermission" + }, + "types": { + "applicationvisibility": { + "directoryName": "applicationVisibilities", + "id": "applicationvisibility", + "isAddressable": false, + "name": "ApplicationVisibility", + "suffix": "applicationVisibility", + "uniqueIdElement": "application" + }, + "classaccess": { + "directoryName": "classAccesses", + "id": "classaccess", + "isAddressable": false, + "name": "ClassAccess", + "suffix": "classAccess", + "uniqueIdElement": "apexClass" + }, + "custommetadatatypeaccess": { + "directoryName": "customMetadataTypeAccesses", + "id": "custommetadatatypeaccess", + "isAddressable": false, + "name": "CustomMetadataTypeAccess", + "suffix": "customMetadataTypeAccess", + "uniqueIdElement": "name" + }, + "custompermissions": { + "directoryName": "customPermissions", + "id": "custompermissions", + "isAddressable": false, + "name": "CustomPermission", + "suffix": "customPermission", + "uniqueIdElement": "name" + }, + "customsettingaccess": { + "directoryName": "customSettingAccesses", + "id": "customsettingaccess", + "isAddressable": false, + "name": "CustomSettingAccess", + "suffix": "customSettingAccess", + "uniqueIdElement": "name" + }, + "externalcredentialprincipalaccess": { + "directoryName": "externalCredentialPrincipalAccesses", + "id": "externalcredentialprincipalaccess", + "isAddressable": false, + "name": "ExternalCredentialPrincipalAccess", + "suffix": "externalCredentialPrincipalAccess", + "uniqueIdElement": "externalCredentialPrincipal" + }, + "externaldatasourceaccess": { + "directoryName": "externalDataSourceAccesses", + "id": "externaldatasourceaccess", + "isAddressable": false, + "name": "ExternalDataSourceAccess", + "suffix": "externalDataSourceAccess", + "uniqueIdElement": "externalDataSource" + }, + "fieldpermission": { + "directoryName": "fieldPermissions", + "id": "fieldpermission", + "isAddressable": false, + "name": "FieldPermission", + "suffix": "fieldPermission", + "uniqueIdElement": "field" + }, + "flowaccess": { + "directoryName": "flowAccesses", + "id": "flowaccess", + "isAddressable": false, + "name": "FlowAccess", + "suffix": "flowAccess", + "uniqueIdElement": "flow" + }, + "objectpermission": { + "directoryName": "objectPermissions", + "id": "objectpermission", + "isAddressable": false, + "name": "ObjectPermission", + "suffix": "objectPermission", + "uniqueIdElement": "object" + }, + "pageaccess": { + "directoryName": "pageAccesses", + "id": "pageaccess", + "isAddressable": false, + "name": "PageAccess", + "suffix": "pageAccess", + "uniqueIdElement": "apexPage" + }, + "recordtypevisibility": { + "directoryName": "recordTypeVisibilities", + "id": "recordtypevisibility", + "isAddressable": false, + "name": "RecordTypeVisibility", + "suffix": "recordTypeVisibility", + "uniqueIdElement": "recordType" + }, + "tabsetting": { + "directoryName": "tabSettings", + "id": "tabsetting", + "isAddressable": false, + "name": "TabSetting", + "suffix": "tabSetting", + "uniqueIdElement": "tab" + }, + "userpermission": { + "directoryName": "userPermissions", + "id": "userpermission", + "isAddressable": false, + "name": "UserPermission", + "suffix": "userPermission" + } + } + }, + "directoryName": "permissionsets", + "name": "PermissionSet", + "strategies": { + "adapter": "decomposed", + "decomposition": "folderPerType", + "transformer": "decomposed" + }, + "id": "permissionset", + "strictDirectoryName": true, + "suffix": "permissionset" + } + } + } +} diff --git a/examples/sfdx-project/registry-present-invalid.json b/examples/sfdx-project/registry-present-invalid.json new file mode 100644 index 0000000..40309bf --- /dev/null +++ b/examples/sfdx-project/registry-present-invalid.json @@ -0,0 +1,13 @@ +{ + "name": "project-name", + "packageDirectories": [ + { + "path": "force-app", + "default": true + } + ], + "namespace": "", + "sfdcLoginUrl": "https://login.salesforce.com", + "sourceApiVersion": "48.0", + "registryPresets": "decomposeCustomLabelsBeta" +} diff --git a/examples/sfdx-project/registry-preset.json b/examples/sfdx-project/registry-preset.json new file mode 100644 index 0000000..507428b --- /dev/null +++ b/examples/sfdx-project/registry-preset.json @@ -0,0 +1,15 @@ +{ + "name": "project-name", + "packageDirectories": [ + { + "path": "force-app", + "default": true + } + ], + "namespace": "", + "sfdcLoginUrl": "https://login.salesforce.com", + "sourceApiVersion": "48.0", + "registryPresets": [ + "decomposeCustomLabelsBeta", + "decomposePermissionSetBeta" + ]} diff --git a/sfdx-project.schema.json b/sfdx-project.schema.json index 0fe467a..8863d22 100644 --- a/sfdx-project.schema.json +++ b/sfdx-project.schema.json @@ -206,6 +206,227 @@ } } }, + "registryCustomizations": { + "type": "object", + "properties": { + "types": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "directoryName": { + "type": "string" + }, + "suffix": { + "type": "string" + }, + "strictDirectoryName": { + "type": "boolean" + }, + "ignoreParsedFullName": { + "type": "boolean" + }, + "folderContentType": { + "type": "string" + }, + "folderType": { + "type": "string" + }, + "xmlElementName": { + "type": "string" + }, + "uniqueIdElement": { + "type": "string" + }, + "isAddressable": { + "type": "boolean" + }, + "unaddressableWithoutParent": { + "type": "boolean" + }, + "supportsWildcardAndName": { + "type": "boolean" + }, + "supportsPartialDelete": { + "type": "boolean" + }, + "aliasFor": { + "type": "string" + }, + "children": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "directoryName": { + "type": "string" + }, + "suffix": { + "type": "string" + }, + "strictDirectoryName": { + "type": "boolean" + }, + "ignoreParsedFullName": { + "type": "boolean" + }, + "folderContentType": { + "type": "string" + }, + "folderType": { + "type": "string" + }, + "xmlElementName": { + "type": "string" + }, + "uniqueIdElement": { + "type": "string" + }, + "isAddressable": { + "type": "boolean" + }, + "unaddressableWithoutParent": { + "type": "boolean" + }, + "supportsWildcardAndName": { + "type": "boolean" + }, + "supportsPartialDelete": { + "type": "boolean" + }, + "aliasFor": { + "type": "string" + }, + "strategies": { + "type": "object", + "properties": { + "adapter": { + "type": "string", + "enum": [ + "mixedContent", + "matchingContentFile", + "decomposed", + "bundle", + "default" + ] + }, + "transformer": { + "type": "string", + "enum": [ + "decomposed", + "staticResource", + "standard" + ] + }, + "decomposition": { + "type": "string", + "enum": [ + "topLevel", + "folderPerType" + ] + } + }, + "required": [ + "adapter" + ], + "additionalProperties": false + } + }, + "additionalProperties": true + } + }, + "strategies": { + "type": "object", + "properties": { + "adapter": { + "type": "string", + "enum": [ + "mixedContent", + "matchingContentFile", + "decomposed", + "bundle", + "default" + ] + }, + "transformer": { + "type": "string", + "enum": [ + "decomposed", + "staticResource", + "standard" + ] + }, + "decomposition": { + "type": "string", + "enum": [ + "topLevel", + "folderPerType" + ] + } + }, + "required": [ + "adapter" + ], + "additionalProperties": false + } + }, + "required": [ + "id", + "name", + "directoryName" + ], + "additionalProperties": false + } + }, + "suffixes": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "strictDirectoryNames": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "childTypes": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "required": [ + "types", + "suffixes", + "strictDirectoryNames", + "childTypes" + ], + "additionalProperties": false, + "title": "Fully customizable controls over how metadata types are decomposed", + "description": "Gives full control to the user to specify everything they can for controlling metadata type's decomposition" + }, + "registryPresets": { + "title": "Custom predefined presets for decomposing metadata types", + "description": "filenames from https://github.com/forcedotcom/source-deploy-retrieve/tree/main/src/registry/presets ", + "type": "array", + "items": { + "type": "string" + } + }, "replacements": { "title": "Replacements for metadata that are executed during deployments", "type": "array", diff --git a/src/registryPresets.ts b/src/registryPresets.ts new file mode 100644 index 0000000..c33cb0d --- /dev/null +++ b/src/registryPresets.ts @@ -0,0 +1,2 @@ +// ideally it will be strict to the files in https://github.com/forcedotcom/source-deploy-retrieve/tree/main/src/registry/presets +export type registryPresets = string[]; diff --git a/src/registryVariants.ts b/src/registryVariants.ts new file mode 100644 index 0000000..08cb1b7 --- /dev/null +++ b/src/registryVariants.ts @@ -0,0 +1,53 @@ +export type MetadataRegistry = { + types: TypeIndex; + suffixes: SuffixIndex; + strictDirectoryNames: { + [directoryName: string]: string; + }; + childTypes: { + [childTypeId: string]: string; + }; +}; + +type SuffixIndex = { + [suffix: string]: string; +}; + +type TypeIndex = { + [typeId: string]: { + id: string; + name: string; + directoryName: string; + suffix?: string; + strictDirectoryName?: boolean; + ignoreParsedFullName?: boolean; + folderContentType?: string; + folderType?: string; + xmlElementName?: string; + uniqueIdElement?: string; + isAddressable?: boolean; + unaddressableWithoutParent?: boolean; + supportsWildcardAndName?: boolean; + supportsPartialDelete?: boolean; + aliasFor?: string; + children?: { + types: TypeIndex; + suffixes: SuffixIndex; + directories?: DirectoryIndex; + }; + strategies?: { + adapter: + | "mixedContent" + | "matchingContentFile" + | "decomposed" + | "bundle" + | "default"; + transformer?: "decomposed" | "staticResource" | "standard"; + decomposition?: "topLevel" | "folderPerType"; + }; + }; +}; + +type DirectoryIndex = { + [directoryName: string]: string; +};