From 0c4792d1db98612b94431e31a01ed661e600c474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ro=C5=BCek?= Date: Mon, 9 Sep 2019 17:42:05 +0200 Subject: [PATCH] Support lineWidth dump option --- src/dumper.ts | 43 +++++++++++++++++++++++++++++++++++-------- src/index.ts | 2 +- test/dumper.test.ts | 30 ++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 test/dumper.test.ts diff --git a/src/dumper.ts b/src/dumper.ts index b0a3596..85d1ecd 100644 --- a/src/dumper.ts +++ b/src/dumper.ts @@ -1,6 +1,9 @@ 'use strict'; + +import { SchemaDefinition } from "./schema"; + declare function require(n:string):any /*eslint-disable no-use-before-define*/ @@ -110,9 +113,10 @@ function encodeHex(character) { return '\\' + handle + common.repeat('0', length - string.length) + string; } -function State(options) { +function State(options: DumpOptions) { this.schema = options['schema'] || DEFAULT_FULL_SCHEMA; this.indent = Math.max(1, (options['indent'] || 2)); + this.lineWidth = options.lineWidth !== void 0 ? options.lineWidth : 80; this.skipInvalid = options['skipInvalid'] || false; this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']); this.styleMap = compileStyleMap(this.schema, options['styles'] || null); @@ -264,11 +268,13 @@ function writeScalar(state, object, level) { longestLine = 0; indent = state.indent * level; - max = 80; - if (indent < 40) { - max -= indent; - } else { - max = 40; + max = state.lineWidth; + if (isFinite(max)) { + if (indent < 40) { + max -= indent; + } else { + max = 40; + } } for (position = 0; position < object.length; position++) { @@ -431,6 +437,10 @@ function foldLine(line, max) { return line; } + if (!isFinite(max)) { + return line; + } + var foldRe = /[^\s] [^\s]/g, result = '', prevMatch = 0, @@ -817,7 +827,24 @@ function inspectNode(object, objects, duplicatesIndexes) { } } -export function dump(input, options) { +export interface DumpOptions { + /** indentation width to use (in spaces). */ + indent?: number; + /** when true, will not add an indentation level to array elements */ + noArrayIndent?: boolean; + /** do not throw on invalid types (like function in the safe schema) and skip pairs and single values with such types. */ + skipInvalid?: boolean; + /** specifies level of nesting, when to switch from block to flow style for collections. -1 means block style everwhere */ + flowLevel?: number; + /** Each tag may have own set of styles. - "tag" => "style" map. */ + styles?: { [x: string]: any; }; + /** specifies a schema to use. */ + schema?: SchemaDefinition; + /** set max line width. (default: 80) */ + lineWidth?: number; +} + +export function dump(input, options?: DumpOptions) { options = options || {}; var state = new State(options); @@ -830,6 +857,6 @@ export function dump(input, options) { return ''; } -export function safeDump(input, options) { +export function safeDump(input, options?: DumpOptions) { return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); } diff --git a/src/index.ts b/src/index.ts index 3a3beb4..88f550d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,7 @@ */ export {load, loadAll, safeLoad, safeLoadAll, LoadOptions} from './loader'; -export {dump, safeDump} from './dumper'; +export {dump, safeDump, DumpOptions} from './dumper'; import Mark=require("./mark") export import YAMLException = require('./exception'); diff --git a/test/dumper.test.ts b/test/dumper.test.ts new file mode 100644 index 0000000..9c395ac --- /dev/null +++ b/test/dumper.test.ts @@ -0,0 +1,30 @@ +import * as chai from 'chai'; +import { safeDump } from '../src'; +const expect = chai.expect; + +suite('Dumper', () => { + suite('lineWidth dump option', () => { + test('should respect lineWidth for multi-line strings', () => { + const description = `Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae +Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et.`; + + expect(safeDump({ description }, { lineWidth: 100 })).to.equal(`description: >- + Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, + totam rem aperiam, eaque ipsa quae + + Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed + quia non numquam eius modi tempora incidunt ut labore et. +`); + }); + + test('should use literal block-scalar style if lineWidth is Infinity (or very lengthy)', () => { + const description = `Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae +Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et.`; + + expect(safeDump({ description }, { lineWidth: Infinity })).to.equal(`description: |- + Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae + Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et. +`); + }); + }); +});