Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 2x 2x 1x 1x | import { schema } from '../lib'; import { detectScrutinyTypes } from './scrutiny'; export function massageSpec(spec: schema.Specification) { detectScrutinyTypes(spec); replaceIncompleteTypes(spec); dropTypelessAttributes(spec); } /** * Fix incomplete type definitions in PropertyTypes * * Some user-defined types are defined to not have any properties, and not * be a collection of other types either. They have no definition at all. * * Add a property object type with empty properties. */ function replaceIncompleteTypes(spec: schema.Specification) { for (const [name, definition] of Object.entries(spec.PropertyTypes)) { Iif (!schema.isRecordType(definition) && !schema.isCollectionProperty(definition) && !schema.isScalarProperty(definition) && !schema.isPrimitiveProperty(definition)) { // eslint-disable-next-line no-console console.log(`[${name}] Incomplete type, adding empty "Properties" field`); (definition as unknown as schema.RecordProperty).Properties = {}; } } } /** * Drop Attributes specified with the different ResourceTypes that have * no type specified. */ function dropTypelessAttributes(spec: schema.Specification) { const resourceTypes = spec.ResourceTypes; Object.values(resourceTypes).forEach((resourceType) => { const attributes = resourceType.Attributes ?? {}; Object.keys(attributes).forEach((attrKey) => { const attrVal = attributes[attrKey]; if (Object.keys(attrVal).length === 0) { delete attributes[attrKey]; } }); }); } /** * Modifies the provided specification so that ``ResourceTypes`` and ``PropertyTypes`` are listed in alphabetical order. * * @param spec an AWS CloudFormation Resource Specification document. * * @returns ``spec``, after having sorted the ``ResourceTypes`` and ``PropertyTypes`` sections alphabetically. */ export function normalize(spec: schema.Specification): schema.Specification { spec.ResourceTypes = normalizeSection(spec.ResourceTypes); Iif (spec.PropertyTypes) { spec.PropertyTypes = normalizeSection(spec.PropertyTypes); } return spec; function normalizeSection<T>(section: { [name: string]: T }): { [name: string]: T } { const result: { [name: string]: T } = {}; for (const key of Object.keys(section).sort()) { result[key] = section[key]; } return result; } } |