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 72 | import type { format as FormatFunc, TransformableInfo } from '../type' import format from '../format' type Format = InstanceType<FormatFunc['Format']> /* * function cascade(formats) * Returns a function that invokes the `._format` function in-order * for the specified set of `formats`. In this manner we say that Formats * are "pipe-like", but not a pure pumpify implementation. Since there is no back * pressure we can remove all of the "readable" plumbing in Node streams. */ function cascade(formats: Format[]): ((info: TransformableInfo) => TransformableInfo) | undefined { if (!formats.every(isValidFormat)) { return } return (info: TransformableInfo) => { let obj = info for (let i = 0; i < formats.length; i++) { const format = formats[i]! const temp = format.transform(obj, format.options) obj = temp } return obj } } /* * function isValidFormat(format) * If the format does not define a `transform` function throw an error * with more detailed usage. */ function isValidFormat(fmt: Format): boolean { if (typeof fmt.transform !== 'function') { throw new TypeError([ 'No transform function found on format. Did you create a format instance?', 'const myFormat = format(formatFn);', 'const instance = myFormat();', ].join('\n')) } return true } /* * function combine (info) * Returns a new instance of the combine Format which combines the specified * formats into a new format. This is similar to a pipe-chain in transform streams. * We choose to combine the prototypes this way because there is no back pressure in * an in-memory transform chain. */ function combine(...formats: Format[]) { const combinedFormat = format(cascade(formats)!) const instance = combinedFormat() Object.defineProperty(instance, 'Format', { value: combinedFormat.Format, }) return instance } // // Export the cascade method for use in cli and other // combined formats that should not be assumed to be // singletons. // export { cascade } export default combine |