All files index.js

88.24% Statements 30/34
50% Branches 3/6
80% Functions 4/5
96.77% Lines 30/31

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 641x 1x 1x 1x 1x     2x       2x     1x             4x 4x 4x               4x 4x 4x     4x   4x           4x 4x 4x 4x 4x 4x 4x 4x     4x 4x 2x 2x   4x 4x      
const { spawn } = require('child_process')
const { statSync } = require('fs')
const ExeFile = require('c21e')
const cm = require('cucumber-messages').io.cucumber.messages
const ProtobufMessageStream = require('./ProtobufMessageStream')
 
function fromPaths(paths, options) {
  return new Gherkin(paths, [], options).messageStream()
}
 
function fromSources(sources, options) {
  return new Gherkin([], sources, options).messageStream()
}
 
module.exports = {
  fromPaths,
  fromSources,
}
 
class Gherkin {
  constructor(paths, sources, options) {
    this._paths = paths
    this._sources = sources
    this._options = Object.assign(
      {
        includeSource: true,
        includeGherkinDocument: true,
        includePickles: true,
      },
      options
    )
    let gherkinGoDir = `${__dirname}/../../gherkin-go`
    try {
      statSync(gherkinGoDir)
    } catch (err) {
      // Dev mode - we're in src, not dist/src
      gherkinGoDir = `${__dirname}/../gherkin-go`
    }
    this._exeFile = new ExeFile(
      `${gherkinGoDir}/gherkin-go-{{.OS}}-{{.Arch}}{{.Ext}}`
    )
  }
 
  messageStream() {
    const options = []
    Iif (!this._options.includeSource) options.push('--no-source')
    Iif (!this._options.includeGherkinDocument) options.push('--no-ast')
    Iif (!this._options.includePickles) options.push('--no-pickles')
    const args = options.concat(this._paths)
    const gherkin = spawn(this._exeFile.fileName, args)
    const protobufMessageStream = new ProtobufMessageStream(cm.Wrapper)
    gherkin.on('error', err => {
      protobufMessageStream.emit('error', err)
    })
    gherkin.stdout.pipe(protobufMessageStream)
    for (const source of this._sources) {
      const wrapper = new cm.Wrapper.fromObject({ source })
      gherkin.stdin.write(cm.Wrapper.encodeDelimited(wrapper).finish())
    }
    gherkin.stdin.end()
    return protobufMessageStream
  }
}