Skip to content

tctree333/js-yaml-source-map

Repository files navigation

js-yaml sourcemaps

A library for finding YAML source locations after parsing by js-yaml.

Installation

npm install js-yaml-source-map js-yaml

Usage

---
# file: example.yaml
fruits:
  - apple
  - banana
  - orange
people:
  - name: Eric
    age: 26
  - name: Lily
    age: 22
states:
  CA: California
  NY: New York
    capital: Albany
  TX: Texas
import fs from "fs";
import yaml from "js-yaml";
import SourceMap from "js-yaml-source-map";

const data = fs.readFileSync("./example.yaml", "utf8");

const map = new SourceMap();
// pass map.listen() to the listener option
const loaded = yaml.load(data, { listener: map.listen() });

console.log(loaded); // { fruits: [ 'apple', 'banana', 'orange' ], ... }

// different syntaxes supported
console.log(map.lookup("fruits")); // { line: 4, column: 10, position: 42 }
console.log(map.lookup("people.0.age")); // { line: 9, column: 8, position: 95 }
console.log(map.lookup(".people[1].name")); // { line: 10, column: 9, position: 108}
console.log(map.lookup(["states", "NY", "capital"])); // { line: 16, column: 12, position: 188 }

If you're using CommonJS, you'll need to access the default key:

const SourceMap = require("js-yaml-source-map").default;

const map = new SourceMap();

//...

API Reference

SourceMap

Constructor: new SourceMap()

Properties:

  • SourceMap().map: PathMap

Methods:

  • SourceMap().listen(): (event: "open" | "close", state: State) => void
  • SourceMap().lookup(path: string | string[]): SourceLocation | undefined

Types

interface PathMap {
  [path: string]: {
    line: number;
    position: number;
    lineStart: number;
  };
}

interface SourceLocation {
  line: number;
  column: number;
  position: number;
}

Limitations

  • This library does not work with multi-document sources and yaml.loadAll(). Using it with yaml.loadAll() will result in undefined behavior.
  • Using arrays or objects as keys will not work properly, and will result in undefined behavior.