UNPKG

@salesforce/source-deploy-retrieve

Version:

JavaScript library to run Salesforce metadata deploys and retrieves

149 lines 11.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RegistryAccess = void 0; /* * Copyright (c) 2020, salesforce.com, inc. * All rights reserved. * Licensed under the BSD 3-Clause license. * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause */ const core_1 = require("@salesforce/core"); const variants_1 = require("./variants"); const levenshtein_1 = require("./levenshtein"); ; const messages = new core_1.Messages('@salesforce/source-deploy-retrieve', 'sdr', new Map([["md_request_fail", "Metadata API request failed: %s"], ["error_convert_invalid_format", "Invalid conversion format '%s'"], ["error_could_not_infer_type", "%s: Could not infer a metadata type"], ["error_unexpected_child_type", "Unexpected child metadata [%s] found for parent type [%s]"], ["noParent", "Could not find parent type for %s (%s)"], ["error_expected_source_files", "%s: Expected source files for type '%s'"], ["error_failed_convert", "Component conversion failed: %s"], ["error_merge_metadata_target_unsupported", "Merge convert for metadata target format currently unsupported"], ["error_missing_adapter", "Missing adapter '%s' for metadata type '%s'"], ["error_missing_transformer", "Missing transformer '%s' for metadata type '%s'"], ["error_missing_type_definition", "Missing metadata type definition in registry for id '%s'."], ["error_missing_child_type_definition", "Type %s does not have a child type definition %s."], ["noChildTypes", "No child types found in registry for %s (reading %s at %s)"], ["error_no_metadata_xml_ignore", "Metadata xml file %s is forceignored but is required for %s."], ["noSourceIgnore", "%s metadata types require source files, but %s is forceignored."], ["noSourceIgnore.actions", "- Metadata types with content are composed of two files: a content file (ie MyApexClass.cls) and a -meta.xml file (i.e MyApexClass.cls-meta.xml). You must include both files in your .forceignore file. Or try appending \u201C\\*\u201D to your existing .forceignore entry.\n\nSee <https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_exclude_source.htm> for examples"], ["error_path_not_found", "%s: File or folder not found"], ["noContentFound", "SourceComponent %s (metadata type = %s) is missing its content file."], ["noContentFound.actions", ["Ensure the content file exists in the expected location.", "If the content file is in your .forceignore file, ensure the meta-xml file is also ignored to completely exclude it."]], ["error_parsing_xml", "SourceComponent %s (metadata type = %s) does not have an associated metadata xml to parse"], ["error_expected_file_path", "%s: path is to a directory, expected a file"], ["error_expected_directory_path", "%s: path is to a file, expected a directory"], ["error_directory_not_found_or_not_directory", "%s: path is not a directory"], ["error_no_directory_stream", "%s doesn't support readable streams on directories."], ["error_no_source_to_deploy", "No source-backed components present in the package."], ["error_no_components_to_retrieve", "No components in the package to retrieve."], ["error_static_resource_expected_archive_type", "A StaticResource directory must have a content type of application/zip or application/jar - found %s for %s."], ["error_static_resource_missing_resource_file", "A StaticResource must have an associated .resource file, missing %s.resource-meta.xml"], ["error_no_job_id", "The %s operation is missing a job ID. Initialize an operation with an ID, or start a new job."], ["missingApiVersion", "Could not determine an API version to use for the generated manifest. Tried looking for sourceApiVersion in sfdx-project.json, apiVersion from config vars, and the highest apiVersion from the APEX REST endpoint. Using API version 58.0 as a last resort."], ["invalid_xml_parsing", "error parsing %s due to:\\n message: %s\\n line: %s\\n code: %s"], ["zipBufferError", "Zip buffer was not created during conversion"], ["undefinedComponentSet", "Unable to construct a componentSet. Check the logs for more information."], ["replacementsFileNotRead", "The file \"%s\" specified in the \"replacements\" property of sfdx-project.json could not be read."], ["unsupportedBundleType", "Unsupported Bundle Type: %s"], ["filePathGeneratorNoTypeSupport", "Type not supported for filepath generation: %s"], ["missingFolderType", "The registry has %s as is inFolder but it does not have a folderType"], ["tooManyFiles", "Multiple files found for path: %s."], ["cantGetName", "Unable to calculate fullName from path: %s (%s)"], ["missingMetaFileSuffix", "The metadata registry is configured incorrectly for %s. Expected a metaFileSuffix."], ["uniqueIdElementNotInRegistry", "No uniqueIdElement found in registry for %s (reading %s at %s)."], ["uniqueIdElementNotInChild", "The uniqueIdElement %s was not found the child (reading %s at %s)."], ["suggest_type_header", "A metadata type lookup for \"%s\" found the following close matches:"], ["suggest_type_did_you_mean", "-- Did you mean \".%s%s\" instead for the \"%s\" metadata type?"], ["suggest_type_more_suggestions", "Additional suggestions:\nConfirm the file name, extension, and directory names are correct. Validate against the registry at:\n<https://github.com/forcedotcom/source-deploy-retrieve/blob/main/src/registry/metadataRegistry.json>\n\nIf the type is not listed in the registry, check that it has Metadata API support via the Metadata Coverage Report:\n<https://developer.salesforce.com/docs/metadata-coverage>\n\nIf the type is available via Metadata API but not in the registry\n\n- Open an issue <https://github.com/forcedotcom/cli/issues>\n- Add the type via PR. Instructions: <https://github.com/forcedotcom/source-deploy-retrieve/blob/main/contributing/metadata.md>"], ["type_name_suggestions", "Confirm the metadata type name is correct. Validate against the registry at:\n<https://github.com/forcedotcom/source-deploy-retrieve/blob/main/src/registry/metadataRegistry.json>\n\nIf the type is not listed in the registry, check that it has Metadata API support via the Metadata Coverage Report:\n<https://developer.salesforce.com/docs/metadata-coverage>\n\nIf the type is available via Metadata API but not in the registry\n\n- Open an issue <https://github.com/forcedotcom/cli/issues>\n- Add the type via PR. Instructions: <https://github.com/forcedotcom/source-deploy-retrieve/blob/main/contributing/metadata.md>"]])); class RegistryAccess { registry; strictFolderTypes; folderContentTypes; aliasTypes; constructor(registry, projectDir) { this.registry = registry ?? (0, variants_1.getEffectiveRegistry)({ projectDir }); } getRegistry() { return this.registry; } /** * Query a metadata type by its name. * * @param name - Case-insensitive name of the metadata type * @returns The corresponding metadata type object */ getTypeByName(name) { const lower = name.toLowerCase().trim(); if (this.registry.childTypes[lower]) { const parentTypeId = this.registry.childTypes[lower]; const childType = this.registry.types[parentTypeId].children?.types[lower]; if (childType) { return childType; } throw new core_1.SfError(messages.getMessage('error_missing_child_type_definition', [parentTypeId, lower]), 'RegistryError'); } if (!this.registry.types[lower]) { throw core_1.SfError.create({ message: messages.getMessage('error_missing_type_definition', [name]), name: 'RegistryError', actions: (0, levenshtein_1.getTypeSuggestions)(this.registry, lower), }); } const alias = this.registry.types[lower].aliasFor; // redirect via alias return alias ? this.registry.types[alias] : this.registry.types[lower]; } /** * Query a metadata type by its file suffix. * * @param suffix - File suffix of the metadata type * @returns The corresponding metadata type object */ getTypeBySuffix(suffix) { if (this.registry.suffixes[suffix]) { const typeId = this.registry.suffixes[suffix]; return this.getTypeByName(typeId); } } /** * Find similar metadata type matches by its file suffix * * @param suffix - File suffix of the metadata type * @returns An array of similar suffix and metadata type matches */ guessTypeBySuffix(suffix) { const guesses = (0, levenshtein_1.getSuffixGuesses)(Object.keys(this.registry.suffixes), suffix); return guesses.length ? guesses.map((guess) => ({ suffixGuess: guess, metadataTypeGuess: this.getTypeByName(this.registry.suffixes[guess]), })) : undefined; } /** * Searches for the first metadata type in the registry that returns `true` * for the given predicate function. * * Can return undefined if no type matches the predicate. * * @param predicate - Predicate to test types with * @returns The first metadata type object that fulfills the predicate */ findType(predicate) { const firstMatch = Object.values(this.registry.types).find(predicate); return firstMatch?.aliasFor ? this.registry.types[firstMatch.aliasFor] : firstMatch; } /** * Query the types that require a strict parent directory * * @see {@link MetadataType.strictDirectoryName} * * @returns An array of metadata type objects that require strict parent folder names */ getStrictFolderTypes() { if (!this.strictFolderTypes) { this.strictFolderTypes = Object.values(this.registry.strictDirectoryNames).map((typeId) => this.registry.types[typeId]); } return this.strictFolderTypes; } /** * Query for the types that have the folderContentType property defined. * E.g., reportFolder, dashboardFolder, documentFolder, emailFolder * * @see {@link MetadataType.folderContentType} * * @returns An array of metadata type objects that have folder content */ getFolderContentTypes() { if (!this.folderContentTypes) { this.folderContentTypes = Object.values(this.registry.types).filter((type) => type.folderContentType && !type.aliasFor); } return this.folderContentTypes; } /** * Query for the types that have the aliasFor property defined. * E.g., EmailTemplateFolder * * @see {@link MetadataType.aliasFor} * * @returns An array of metadata type objects that have aliasFor */ getAliasTypes() { if (!this.aliasTypes) { this.aliasTypes = Object.values(this.registry.types).filter((type) => type.aliasFor); } return this.aliasTypes; } /** * Return the parent metadata type from the registry for the given child type * * @param childName - Child metadata type name * @returns Parent metadata type object or undefined if no parent exists */ getParentType(childName) { const lower = childName.toLowerCase().trim(); if (this.registry.childTypes[lower]) { const parentTypeId = this.registry.childTypes[lower]; return this.registry.types[parentTypeId]; } } } exports.RegistryAccess = RegistryAccess; //# sourceMappingURL=registryAccess.js.map