/** * Copyright (c) HashiCorp, Inc. * SPDX-License-Identifier: MPL-2.0 */ import ArrayProxy from '@ember/array/proxy'; import { typeOf } from '@ember/utils'; import { guidFor } from '@ember/object/internals'; export default ArrayProxy.extend({ fromJSON(json) { if (json && typeOf(json) !== 'object') { throw new Error('Vault expects data to be formatted as an JSON object.'); } const contents = Object.keys(json || []).map((key) => { const obj = { name: key, value: json[key], }; guidFor(obj); return obj; }); this.setObjects( contents.sort((a, b) => { if (a.name === '') { return 1; } if (b.name === '') { return -1; } return a.name.localeCompare(b.name); }) ); return this; }, fromJSONString(jsonString) { return this.fromJSON(JSON.parse(jsonString)); }, toJSON(includeBlanks = false) { return this.reduce((obj, item) => { if (!includeBlanks && item.value === '' && item.name === '') { return obj; } const val = typeof item.value === 'undefined' ? '' : item.value; obj[item.name || ''] = val; return obj; }, {}); }, toJSONString(includeBlanks) { return JSON.stringify(this.toJSON(includeBlanks), null, 2); }, isAdvanced() { return this.any((item) => typeof item.value !== 'string'); }, });