vault/ui/app/utils/openapi-to-attrs.js
hashicorp-copywrite[bot] 0b12cdcfd1
[COMPLIANCE] License changes (#22290)
* Adding explicit MPL license for sub-package.

This directory and its subdirectories (packages) contain files licensed with the MPLv2 `LICENSE` file in this directory and are intentionally licensed separately from the BSL `LICENSE` file at the root of this repository.

* Adding explicit MPL license for sub-package.

This directory and its subdirectories (packages) contain files licensed with the MPLv2 `LICENSE` file in this directory and are intentionally licensed separately from the BSL `LICENSE` file at the root of this repository.

* Updating the license from MPL to Business Source License.

Going forward, this project will be licensed under the Business Source License v1.1. Please see our blog post for more details at https://hashi.co/bsl-blog, FAQ at www.hashicorp.com/licensing-faq, and details of the license at www.hashicorp.com/bsl.

* add missing license headers

* Update copyright file headers to BUS-1.1

* Fix test that expected exact offset on hcl file

---------

Co-authored-by: hashicorp-copywrite[bot] <110428419+hashicorp-copywrite[bot]@users.noreply.github.com>
Co-authored-by: Sarah Thompson <sthompson@hashicorp.com>
Co-authored-by: Brian Kassouf <bkassouf@hashicorp.com>
2023-08-10 18:14:03 -07:00

135 lines
3.4 KiB
JavaScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
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;
};