| /** |
| * Copyright (c) HashiCorp, Inc. |
| * SPDX-License-Identifier: MPL-2.0 |
| */ |
| |
| import { attr } from '@ember-data/model'; |
| import { assign } from '@ember/polyfills'; |
| import { camelize, capitalize } from '@ember/string'; |
| |
| export const expandOpenApiProps = function (props) { |
| const attrs = {}; |
| // expand all attributes |
| for (const propName in props) { |
| const prop = props[propName]; |
| let { description, items, type, format, isId, deprecated } = prop; |
| if (deprecated === true) { |
| continue; |
| } |
| let { |
| name, |
| value, |
| group, |
| sensitive, |
| editType, |
| description: displayDescription, |
| } = prop['x-vault-displayAttrs'] || {}; |
| |
| if (type === 'integer') { |
| type = 'number'; |
| } |
| |
| if (displayDescription) { |
| description = displayDescription; |
| } |
| |
| editType = editType || type; |
| |
| if (format === 'seconds') { |
| editType = 'ttl'; |
| } else if (items) { |
| editType = items.type + capitalize(type); |
| } |
| |
| const attrDefn = { |
| editType, |
| helpText: description, |
| possibleValues: prop['enum'], |
| fieldValue: isId ? 'mutableId' : null, |
| fieldGroup: group || 'default', |
| readOnly: isId, |
| defaultValue: value || null, |
| }; |
| |
| if (type === 'object' && !!value) { |
| attrDefn.defaultValue = () => { |
| return value; |
| }; |
| } |
| |
| if (sensitive) { |
| attrDefn.sensitive = true; |
| } |
| |
| // only set a label if we have one from OpenAPI |
| // otherwise the propName will be humanized by the form-field component |
| if (name) { |
| attrDefn.label = name; |
| } |
| |
| // ttls write as a string and read as a number |
| // so setting type on them runs the wrong transform |
| if (editType !== 'ttl' && type !== 'array') { |
| attrDefn.type = type; |
| } |
| |
| // loop to remove empty vals |
| for (const attrProp in attrDefn) { |
| if (attrDefn[attrProp] == null) { |
| delete attrDefn[attrProp]; |
| } |
| } |
| attrs[camelize(propName)] = attrDefn; |
| } |
| return attrs; |
| }; |
| |
| export const combineAttributes = function (oldAttrs, newProps) { |
| const newAttrs = {}; |
| const newFields = []; |
| if (oldAttrs) { |
| oldAttrs.forEach(function (value, name) { |
| if (newProps[name]) { |
| newAttrs[name] = attr(newProps[name].type, assign({}, newProps[name], value.options)); |
| } else { |
| newAttrs[name] = attr(value.type, value.options); |
| } |
| }); |
| } |
| for (const prop in newProps) { |
| if (newAttrs[prop]) { |
| continue; |
| } else { |
| newAttrs[prop] = attr(newProps[prop].type, newProps[prop]); |
| newFields.push(prop); |
| } |
| } |
| return { attrs: newAttrs, newFields }; |
| }; |
| |
| export const combineFields = function (currentFields, newFields, excludedFields) { |
| const otherFields = newFields.filter((field) => { |
| return !currentFields.includes(field) && !excludedFields.includes(field); |
| }); |
| if (otherFields.length) { |
| currentFields = currentFields.concat(otherFields); |
| } |
| return currentFields; |
| }; |
| |
| export const combineFieldGroups = function (currentGroups, newFields, excludedFields) { |
| let allFields = []; |
| for (const group of currentGroups) { |
| const fieldName = Object.keys(group)[0]; |
| allFields = allFields.concat(group[fieldName]); |
| } |
| const otherFields = newFields.filter((field) => { |
| return !allFields.includes(field) && !excludedFields.includes(field); |
| }); |
| if (otherFields.length) { |
| currentGroups[0].default = currentGroups[0].default.concat(otherFields); |
| } |
| |
| return currentGroups; |
| }; |