summaryrefslogtreecommitdiff
path: root/std/encoding/yaml/dumper/dumper_state.ts
diff options
context:
space:
mode:
Diffstat (limited to 'std/encoding/yaml/dumper/dumper_state.ts')
-rw-r--r--std/encoding/yaml/dumper/dumper_state.ts138
1 files changed, 138 insertions, 0 deletions
diff --git a/std/encoding/yaml/dumper/dumper_state.ts b/std/encoding/yaml/dumper/dumper_state.ts
new file mode 100644
index 000000000..30e65f9a7
--- /dev/null
+++ b/std/encoding/yaml/dumper/dumper_state.ts
@@ -0,0 +1,138 @@
+// Ported from js-yaml v3.13.1:
+// https://github.com/nodeca/js-yaml/commit/665aadda42349dcae869f12040d9b10ef18d12da
+// Copyright 2011-2015 by Vitaly Puzrin. All rights reserved. MIT license.
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+
+import { Schema, SchemaDefinition } from "../schema.ts";
+import { State } from "../state.ts";
+import { StyleVariant, Type } from "../type.ts";
+import { ArrayObject, Any } from "../utils.ts";
+
+const _hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function compileStyleMap(
+ schema: Schema,
+ map?: ArrayObject<StyleVariant> | null
+): ArrayObject<StyleVariant> {
+ if (typeof map === "undefined" || map === null) return {};
+
+ let type: Type;
+ const result: ArrayObject<StyleVariant> = {};
+ const keys = Object.keys(map);
+ let tag: string, style: StyleVariant;
+ for (let index = 0, length = keys.length; index < length; index += 1) {
+ tag = keys[index];
+ style = String(map[tag]) as StyleVariant;
+ if (tag.slice(0, 2) === "!!") {
+ tag = `tag:yaml.org,2002:${tag.slice(2)}`;
+ }
+ type = schema.compiledTypeMap.fallback[tag];
+
+ if (
+ type &&
+ typeof type.styleAliases !== "undefined" &&
+ _hasOwnProperty.call(type.styleAliases, style)
+ ) {
+ style = type.styleAliases[style];
+ }
+
+ result[tag] = style;
+ }
+
+ return result;
+}
+
+export interface DumperStateOptions {
+ /** 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?: ArrayObject<StyleVariant> | null;
+ /** specifies a schema to use. */
+ schema?: SchemaDefinition;
+ /**
+ * if true, sort keys when dumping YAML.
+ * If a function, use the function to sort the keys. (default: false)
+ */
+ sortKeys?: boolean | ((a: Any, b: Any) => number);
+ /** set max line width. (default: 80) */
+ lineWidth?: number;
+ /**
+ * if true, don't convert duplicate objects
+ * into references (default: false)
+ */
+ noRefs?: boolean;
+ /**
+ * if true don't try to be compatible with older yaml versions.
+ * Currently: don't quote "yes", "no" and so on,
+ * as required for YAML 1.1 (default: false)
+ */
+ noCompatMode?: boolean;
+ /**
+ * if true flow sequences will be condensed, omitting the
+ * space between `key: value` or `a, b`. Eg. `'[a,b]'` or `{a:{b:c}}`.
+ * Can be useful when using yaml for pretty URL query params
+ * as spaces are %-encoded. (default: false).
+ */
+ condenseFlow?: boolean;
+}
+
+export class DumperState extends State {
+ public indent: number;
+ public noArrayIndent: boolean;
+ public skipInvalid: boolean;
+ public flowLevel: number;
+ public sortKeys: boolean | ((a: Any, b: Any) => number);
+ public lineWidth: number;
+ public noRefs: boolean;
+ public noCompatMode: boolean;
+ public condenseFlow: boolean;
+ public implicitTypes: Type[];
+ public explicitTypes: Type[];
+ public tag: string | null = null;
+ public result = "";
+ public duplicates: Any[] = [];
+ public usedDuplicates: Any[] = []; // changed from null to []
+ public styleMap: ArrayObject<StyleVariant>;
+ public dump: Any;
+
+ constructor({
+ schema,
+ indent = 2,
+ noArrayIndent = false,
+ skipInvalid = false,
+ flowLevel = -1,
+ styles = null,
+ sortKeys = false,
+ lineWidth = 80,
+ noRefs = false,
+ noCompatMode = false,
+ condenseFlow = false
+ }: DumperStateOptions) {
+ super(schema);
+ this.indent = Math.max(1, indent);
+ this.noArrayIndent = noArrayIndent;
+ this.skipInvalid = skipInvalid;
+ this.flowLevel = flowLevel;
+ this.styleMap = compileStyleMap(this.schema as Schema, styles);
+ this.sortKeys = sortKeys;
+ this.lineWidth = lineWidth;
+ this.noRefs = noRefs;
+ this.noCompatMode = noCompatMode;
+ this.condenseFlow = condenseFlow;
+
+ this.implicitTypes = (this.schema as Schema).compiledImplicit;
+ this.explicitTypes = (this.schema as Schema).compiledExplicit;
+ }
+}