├── .gitignore ├── .travis.yml ├── README.md ├── lib ├── command.ts ├── cue.ts ├── cuesheet.ts ├── tsconfig.json └── types.ts ├── package-lock.json ├── package.json ├── test ├── cue │ ├── Frank Boeijen - Palermo - CD1.eac.cue │ ├── Frank Boeijen Groep - Welkom In Utopia.eac.cue │ ├── Michael Kiwanuka - Love And Hate.cue │ ├── Paco de Lucía - Fuente y Caudal.eac.cue │ ├── Putumayo Presents - Yoga Lounge.xld.cue │ ├── Putumayo Presents Arabic Beat.cue │ ├── Putumayo Presents Café Del Mundo.cue │ ├── Schiller - Day and Night.cue │ ├── Schiller - Zeitreise - Das Beste Von Schiller 1.cue │ ├── sample-win.cue │ └── sample.cue └── test.js ├── tsconfig.json └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "10" 4 | - "11" 5 | - "12" 6 | - "14" 7 | install: 8 | - yarn install 9 | script: 10 | - yarn run lint 11 | - yarn run compile 12 | - yarn run test 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | About 2 | ======= 3 | cue-parser is a cue-sheet parser library written for nodejs. 4 | 5 | Most of the code is inspired by [cue-go](https://github.com/vchimishuk/cue-go) 6 | 7 | [![Build Status](https://travis-ci.org/justlaputa/cue-parser.png)](https://travis-ci.org/justlaputa/cue-parser) 8 | [![NPM version](https://img.shields.io/npm/v/cue-parser.svg)](https://npmjs.org/package/cue-parser) 9 | [![npm downloads](http://img.shields.io/npm/dm/cue-parser.svg)](https://npmcharts.com/compare/cue-parser,cuefileparser,cue-parser-plus?start=1500&interval=30) 10 | [![Dependencies](https://david-dm.org/justlaputa/cue-parser.svg)](https://david-dm.org/justlaputa/cue-parser)\ 11 | [![Total alerts](https://img.shields.io/lgtm/alerts/g/justlaputa/cue-parser.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/justlaputa/cue-parser/alerts/) 12 | [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/justlaputa/cue-parser.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/justlaputa/cue-parser/context:javascript) 13 | 14 | How to use 15 | ======= 16 | Add cue-parser as a dependency to your project using npm: 17 | 18 | ```shell 19 | npm install cue-parser 20 | ``` 21 | 22 | or yarn: 23 | 24 | ```shell 25 | yarn add cue-parser 26 | ``` 27 | 28 | Use it in your node source code 29 | 30 | ```javascript 31 | const parser = require('cue-parser'); 32 | 33 | const cuesheet = parser.parse('filename.cue'); 34 | 35 | console.log(cuesheet.performer); 36 | console.log(cuesheet.files); 37 | console.log(cuesheet.files[0].tracks); 38 | ``` 39 | 40 | References 41 | ========== 42 | 43 | - [Cue sheet format kodi.wiki](http://kodi.wiki/view/Cue_sheets) 44 | - [Cue sheet format from wiki.hydrogenaud.io](http://wiki.hydrogenaud.io/index.php?title=Cue_sheet) 45 | -------------------------------------------------------------------------------- /lib/command.ts: -------------------------------------------------------------------------------- 1 | export interface ICommand { 2 | command: string; 3 | params: string[]; 4 | } 5 | 6 | /** 7 | * parse one line of cue sheet, and return COMMAND 8 | * and all parameters 9 | */ 10 | export function parseCommand(line: string): ICommand { 11 | const matcher = /^([A-Z]+)\s+(.*)$/; 12 | let result; 13 | 14 | line = line.trim(); 15 | 16 | result = line.match(matcher); 17 | 18 | if (!result) { 19 | throw new Error('Not a command: ' + line); 20 | } 21 | 22 | const command = result[1]; 23 | 24 | if (!command) { 25 | throw new Error('Can not parse command from ' + line); 26 | } 27 | 28 | const params = parseParams(result[2]); 29 | if (!params) { 30 | throw new Error('Can not parse parameters from ' + line); 31 | } 32 | 33 | return { 34 | command, 35 | params 36 | }; 37 | } 38 | 39 | function parseParams(lineString: string): string[] { 40 | let params: string[] = []; 41 | 42 | if (lineString[0] === '"') { 43 | const quoteIndex = lineString.indexOf('"', 1); 44 | params.push(lineString.substring(1, quoteIndex)); 45 | lineString = lineString.substring(quoteIndex + 1).trim(); 46 | } 47 | 48 | if (lineString !== '') { 49 | params = params.concat(lineString.split(' ')); 50 | } 51 | 52 | return params; 53 | } 54 | -------------------------------------------------------------------------------- /lib/cue.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Main library 3 | */ 4 | import * as fs from 'fs'; 5 | import * as chardet from 'chardet'; 6 | import { parseCommand } from './command'; 7 | import { CueSheet, Index, Time } from './cuesheet'; 8 | import { ICueSheet, ITime } from "./types"; 9 | 10 | type parserFunction = (params: string[], cuesheet: CueSheet) => void; 11 | 12 | const commandMap: { [command: string]: parserFunction; } = { 13 | CATALOG: parseCatalog, 14 | CDTEXTFILE: parseCdTextFile, 15 | FILE: parseFile, 16 | FLAGS: parseFlags, 17 | INDEX: parseIndex, 18 | ISRC: parseIsrc, 19 | PERFORMER: parsePerformer, 20 | POSTGAP: parsePostgap, 21 | PREGAP: parsePregap, 22 | REM: parseRem, 23 | SONGWRITER: parseSongWriter, 24 | TITLE: parseTitle, 25 | TRACK: parseTrack 26 | }; 27 | 28 | /** 29 | * Parse function 30 | * @param filename Filename path to cue-sheet to be parsed 31 | * @return CUE-sheet information object 32 | */ 33 | export function parse(filename: string): ICueSheet { 34 | const cuesheet = new CueSheet(); 35 | 36 | if (!filename) { 37 | console.log('no file name specified for parse'); 38 | return; 39 | } 40 | 41 | if (!fs.existsSync(filename)) { 42 | throw new Error('file ' + filename + ' does not exist'); 43 | } 44 | 45 | cuesheet.encoding = chardet.detect(fs.readFileSync(filename)); 46 | let encoding: BufferEncoding = 'utf8'; 47 | 48 | if (cuesheet.encoding.startsWith('ISO-8859-')) { 49 | encoding = 'binary'; 50 | } else if (cuesheet.encoding.toUpperCase() === 'UTF-16 LE') { 51 | encoding = 'utf16le'; 52 | } 53 | 54 | const lines = (fs.readFileSync(filename, {encoding, flag: 'r'}) as any) 55 | .replace(/\r\n/, '\n').split('\n'); 56 | 57 | lines.forEach(line => { 58 | if (!line.match(/^\s*$/)) { 59 | const lineParser = parseCommand(line); 60 | commandMap[lineParser.command](lineParser.params, cuesheet); 61 | } 62 | }); 63 | 64 | if (!cuesheet.files[cuesheet.files.length - 1].name) { 65 | cuesheet.files.pop(); 66 | } 67 | 68 | return cuesheet; 69 | } 70 | 71 | function parseCatalog(params: string[], cuesheet: CueSheet) { 72 | cuesheet.catalog = params[0]; 73 | } 74 | 75 | function parseCdTextFile(params, cuesheet) { 76 | cuesheet.cdTextFile = params[0]; 77 | } 78 | 79 | function parseFile(params: string[], cuesheet: CueSheet) { 80 | let file = cuesheet.getCurrentFile(); 81 | 82 | if (!file || file.name) { 83 | file = cuesheet.newFile(); 84 | } 85 | 86 | file.name = params[0]; 87 | file.type = params[1]; 88 | } 89 | 90 | function parseFlags(params: string[], cueSheet: CueSheet) { 91 | const track = cueSheet.getCurrentTrack(); 92 | 93 | if (!track) { 94 | throw new Error('No track for adding flag: ' + params); 95 | } 96 | 97 | track.flags = params.slice(0); 98 | } 99 | 100 | function parseIndex(params: string[], cueSheet: CueSheet) { 101 | const _number = parseInt(params[0], 10); 102 | const time = parseTime(params[1]); 103 | const track = cueSheet.getCurrentTrack(); 104 | 105 | if (!track) { 106 | throw new Error('No track found for index ' + params); 107 | } 108 | 109 | if (track.postgap) { 110 | throw new Error('POSTGAP should be after all indexes'); 111 | } 112 | 113 | if (_number < 0 || _number > 99) { 114 | throw new Error(`Index number must between 0 and 99: ${_number}`); 115 | } 116 | 117 | if (_number === 1) { 118 | // Assign track to current file 119 | const file = cueSheet.getCurrentFile(); 120 | if (!file.tracks) { 121 | file.tracks = []; 122 | } 123 | file.tracks.push(track); 124 | } 125 | 126 | if (!track.indexes) { 127 | if (_number > 2) { 128 | throw new Error(`Invalid index number ${_number}, First index number must be 0 or 1`); 129 | } 130 | track.indexes = []; 131 | } else { 132 | if (_number !== track.indexes[track.indexes.length - 1].number + 1) { 133 | throw new Error(`Invalid index number: ${_number}, it should follow the last sequence`); 134 | } 135 | } 136 | 137 | track.indexes.push(new Index(_number, time)); 138 | } 139 | 140 | function parseIsrc(params, cueSheet: CueSheet) { 141 | const track = cueSheet.getCurrentTrack(); 142 | 143 | if (!track) { 144 | throw new Error('No track for adding isrc: ' + params); 145 | } 146 | 147 | track.isrc = params[0]; 148 | } 149 | 150 | function parsePerformer(params, cueSheet: CueSheet) { 151 | const track = cueSheet.getCurrentTrack(); 152 | 153 | if (!track) { 154 | cueSheet.performer = params[0]; 155 | } else { 156 | track.performer = params[0]; 157 | } 158 | } 159 | 160 | function parsePostgap(params, cueSheet: CueSheet) { 161 | const track = cueSheet.getCurrentTrack(); 162 | 163 | if (!track) { 164 | throw new Error('POSTGAP can only used in TRACK'); 165 | } 166 | 167 | if (track.postgap) { 168 | throw new Error('only one POSTGAP is allowed for a track'); 169 | } 170 | 171 | track.postgap = parseTime(params[0]); 172 | } 173 | 174 | function parsePregap(params, cueSheet: CueSheet) { 175 | const track = cueSheet.getCurrentTrack(); 176 | 177 | if (!track) { 178 | throw new Error('PREGAP can only used in TRACK'); 179 | } 180 | 181 | if (track.pregap) { 182 | throw new Error('only one PREGAP is allowed for a track'); 183 | } 184 | 185 | if (track.indexes && track.indexes.length > 0) { 186 | throw new Error('PREGAP should be before any INDEX'); 187 | } 188 | 189 | track.pregap = parseTime(params[0]); 190 | } 191 | 192 | function parseRem(params, cueSheet: CueSheet) { 193 | if (!cueSheet.rem) { 194 | cueSheet.rem = []; 195 | } 196 | 197 | cueSheet.rem.push(params.join(' ')); 198 | } 199 | 200 | function parseSongWriter(params, cueSheet: CueSheet) { 201 | const track = cueSheet.getCurrentTrack(); 202 | 203 | if (!track) { 204 | cueSheet.songWriter = params[0]; 205 | } else { 206 | track.songWriter = params[0]; 207 | } 208 | } 209 | 210 | function parseTitle(params, cueSheet: CueSheet) { 211 | const track = cueSheet.getCurrentTrack(); 212 | 213 | if (!track) { 214 | cueSheet.title = params[0]; 215 | } else { 216 | track.title = params[0]; 217 | } 218 | } 219 | 220 | function parseTrack(params, cuesheet: CueSheet) { 221 | const _number = parseInt(params[0], 10); 222 | cuesheet.newTrack(_number, params[1]); 223 | } 224 | 225 | function parseTime(timeSting): ITime { 226 | const timePattern = /^(\d{2,}):(\d{2}):(\d{2})$/; 227 | const parts = timeSting.match(timePattern); 228 | 229 | if (!parts) { 230 | throw new Error(`Invalid time format: ${timeSting}`); 231 | } 232 | 233 | const time = new Time(); 234 | time.min = parseInt(parts[1], 10); 235 | time.sec = parseInt(parts[2], 10); 236 | time.frame = parseInt(parts[3], 10); 237 | 238 | if (time.sec > 59) { 239 | throw new Error(`Time second should be less than 60: ${timeSting}`); 240 | } 241 | 242 | if (time.frame > 74) { 243 | throw new Error(`Time frame should be less than 75: ${timeSting}`); 244 | } 245 | 246 | return time; 247 | } 248 | -------------------------------------------------------------------------------- /lib/cuesheet.ts: -------------------------------------------------------------------------------- 1 | import { ITime, ICueSheet, IFile, ITrack } from "./types"; 2 | 3 | export class Track implements ITrack { 4 | 5 | public title: string = null; 6 | public flags: string[] = null; 7 | public isrc: string = null; 8 | public performer: string = null; 9 | public songWriter: string = null; 10 | public pregap: ITime = null; 11 | public postgap: ITime = null; 12 | public indexes: Index[] = null; 13 | public number: number; 14 | 15 | constructor(_number: number, public type: string = null) { 16 | this.number = _number; 17 | } 18 | } 19 | 20 | export class File implements IFile { 21 | 22 | public name: string = null; 23 | public type: string = null; 24 | public tracks: Track[] = null; 25 | } 26 | 27 | export class Index { 28 | 29 | public number: number; 30 | 31 | constructor(_number: number = null, public time: Time = null) { 32 | this.number = _number; 33 | } 34 | } 35 | 36 | export class Time { 37 | 38 | constructor(public min: number = 0, public sec = 0, public frame = 0) { 39 | } 40 | } 41 | 42 | export class CueSheet implements ICueSheet { 43 | 44 | public catalog: string = null; 45 | public cdTextFile: string = null; 46 | public files: File[] = null; 47 | public performer: string = null; 48 | public songWriter: string = null; 49 | public title: string = null; 50 | public rem: string[] = null; 51 | public encoding: string; 52 | 53 | private track: Track; 54 | 55 | public getCurrentFile(): File { 56 | if (this.files && this.files.length > 0) { 57 | return this.files[this.files.length - 1]; 58 | } else { 59 | return null; 60 | } 61 | } 62 | 63 | public getCurrentTrack(): Track { 64 | return this.track; 65 | } 66 | 67 | public newFile(): File { 68 | if (!this.files) { 69 | this.files = []; 70 | } 71 | 72 | const file = new File(); 73 | this.files.push(file); 74 | 75 | return file; 76 | } 77 | 78 | public newTrack(_number: number, type: string): CueSheet { 79 | 80 | this.track = new Track(_number, type); 81 | return this; 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /lib/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "sourceMap": true, 5 | "declaration": true 6 | } 7 | } 8 | 9 | -------------------------------------------------------------------------------- /lib/types.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * TypeScript interfaces in it's own file, so it can be imported as a sub-module 3 | */ 4 | 5 | import {Index} from "./cuesheet"; 6 | 7 | export interface ITime { 8 | min: number; 9 | sec: number; 10 | frame: number; 11 | } 12 | 13 | export interface ITrack { 14 | title?: string; 15 | flags?: string[]; 16 | isrc?: string; 17 | performer?: string; 18 | songWriter?: string; 19 | pregap?: ITime; 20 | postgap?: ITime; 21 | indexes?: Index[]; 22 | number?: number; 23 | } 24 | 25 | export interface IFile { 26 | name?: string; 27 | type?: string; 28 | tracks?: ITrack[]; 29 | } 30 | 31 | export interface ICueSheet { 32 | catalog?: string; 33 | cdTextFile?: string; 34 | files?: IFile[]; 35 | performer?: string; 36 | songWriter?: string; 37 | title?: string; 38 | rem?: string[]; 39 | encoding?: string; 40 | } 41 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cue-parser", 3 | "version": "0.3.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.10.4", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 19 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.10.4", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 25 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.10.4", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | } 32 | }, 33 | "@types/color-name": { 34 | "version": "1.1.1", 35 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 36 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 37 | "dev": true 38 | }, 39 | "@types/node": { 40 | "version": "14.11.8", 41 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.8.tgz", 42 | "integrity": "sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw==", 43 | "dev": true 44 | }, 45 | "ansi-colors": { 46 | "version": "4.1.1", 47 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 48 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 49 | "dev": true 50 | }, 51 | "ansi-regex": { 52 | "version": "3.0.0", 53 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 54 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 55 | "dev": true 56 | }, 57 | "ansi-styles": { 58 | "version": "3.2.1", 59 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 60 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 61 | "dev": true, 62 | "requires": { 63 | "color-convert": "^1.9.0" 64 | } 65 | }, 66 | "anymatch": { 67 | "version": "3.1.1", 68 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 69 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 70 | "dev": true, 71 | "requires": { 72 | "normalize-path": "^3.0.0", 73 | "picomatch": "^2.0.4" 74 | } 75 | }, 76 | "argparse": { 77 | "version": "1.0.10", 78 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 79 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 80 | "dev": true, 81 | "requires": { 82 | "sprintf-js": "~1.0.2" 83 | } 84 | }, 85 | "array.prototype.map": { 86 | "version": "1.0.2", 87 | "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", 88 | "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", 89 | "dev": true, 90 | "requires": { 91 | "define-properties": "^1.1.3", 92 | "es-abstract": "^1.17.0-next.1", 93 | "es-array-method-boxes-properly": "^1.0.0", 94 | "is-string": "^1.0.4" 95 | } 96 | }, 97 | "balanced-match": { 98 | "version": "1.0.0", 99 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 100 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 101 | "dev": true 102 | }, 103 | "binary-extensions": { 104 | "version": "2.1.0", 105 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", 106 | "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", 107 | "dev": true 108 | }, 109 | "brace-expansion": { 110 | "version": "1.1.11", 111 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 112 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 113 | "dev": true, 114 | "requires": { 115 | "balanced-match": "^1.0.0", 116 | "concat-map": "0.0.1" 117 | } 118 | }, 119 | "braces": { 120 | "version": "3.0.2", 121 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 122 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 123 | "dev": true, 124 | "requires": { 125 | "fill-range": "^7.0.1" 126 | } 127 | }, 128 | "browser-stdout": { 129 | "version": "1.3.1", 130 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 131 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 132 | "dev": true 133 | }, 134 | "builtin-modules": { 135 | "version": "1.1.1", 136 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 137 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 138 | "dev": true 139 | }, 140 | "camelcase": { 141 | "version": "5.3.1", 142 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 143 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 144 | "dev": true 145 | }, 146 | "chalk": { 147 | "version": "2.4.2", 148 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 149 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 150 | "dev": true, 151 | "requires": { 152 | "ansi-styles": "^3.2.1", 153 | "escape-string-regexp": "^1.0.5", 154 | "supports-color": "^5.3.0" 155 | }, 156 | "dependencies": { 157 | "supports-color": { 158 | "version": "5.5.0", 159 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 160 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 161 | "dev": true, 162 | "requires": { 163 | "has-flag": "^3.0.0" 164 | } 165 | } 166 | } 167 | }, 168 | "chardet": { 169 | "version": "1.3.0", 170 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.3.0.tgz", 171 | "integrity": "sha512-cyTQGGptIjIT+CMGT5J/0l9c6Fb+565GCFjjeUTKxUO7w3oR+FcNCMEKTn5xtVKaLFmladN7QF68IiQsv5Fbdw==" 172 | }, 173 | "chokidar": { 174 | "version": "3.4.2", 175 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", 176 | "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", 177 | "dev": true, 178 | "requires": { 179 | "anymatch": "~3.1.1", 180 | "braces": "~3.0.2", 181 | "fsevents": "~2.1.2", 182 | "glob-parent": "~5.1.0", 183 | "is-binary-path": "~2.1.0", 184 | "is-glob": "~4.0.1", 185 | "normalize-path": "~3.0.0", 186 | "readdirp": "~3.4.0" 187 | } 188 | }, 189 | "cliui": { 190 | "version": "5.0.0", 191 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 192 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 193 | "dev": true, 194 | "requires": { 195 | "string-width": "^3.1.0", 196 | "strip-ansi": "^5.2.0", 197 | "wrap-ansi": "^5.1.0" 198 | }, 199 | "dependencies": { 200 | "ansi-regex": { 201 | "version": "4.1.0", 202 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 203 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 204 | "dev": true 205 | }, 206 | "string-width": { 207 | "version": "3.1.0", 208 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 209 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 210 | "dev": true, 211 | "requires": { 212 | "emoji-regex": "^7.0.1", 213 | "is-fullwidth-code-point": "^2.0.0", 214 | "strip-ansi": "^5.1.0" 215 | } 216 | }, 217 | "strip-ansi": { 218 | "version": "5.2.0", 219 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 220 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 221 | "dev": true, 222 | "requires": { 223 | "ansi-regex": "^4.1.0" 224 | } 225 | } 226 | } 227 | }, 228 | "color-convert": { 229 | "version": "1.9.3", 230 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 231 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 232 | "dev": true, 233 | "requires": { 234 | "color-name": "1.1.3" 235 | } 236 | }, 237 | "color-name": { 238 | "version": "1.1.3", 239 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 240 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 241 | "dev": true 242 | }, 243 | "commander": { 244 | "version": "2.20.3", 245 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 246 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 247 | "dev": true 248 | }, 249 | "concat-map": { 250 | "version": "0.0.1", 251 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 252 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 253 | "dev": true 254 | }, 255 | "debug": { 256 | "version": "4.1.1", 257 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 258 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 259 | "dev": true, 260 | "requires": { 261 | "ms": "^2.1.1" 262 | } 263 | }, 264 | "decamelize": { 265 | "version": "1.2.0", 266 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 267 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 268 | "dev": true 269 | }, 270 | "define-properties": { 271 | "version": "1.1.3", 272 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 273 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 274 | "dev": true, 275 | "requires": { 276 | "object-keys": "^1.0.12" 277 | } 278 | }, 279 | "diff": { 280 | "version": "4.0.2", 281 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 282 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 283 | "dev": true 284 | }, 285 | "emoji-regex": { 286 | "version": "7.0.3", 287 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 288 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 289 | "dev": true 290 | }, 291 | "es-abstract": { 292 | "version": "1.17.6", 293 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", 294 | "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", 295 | "dev": true, 296 | "requires": { 297 | "es-to-primitive": "^1.2.1", 298 | "function-bind": "^1.1.1", 299 | "has": "^1.0.3", 300 | "has-symbols": "^1.0.1", 301 | "is-callable": "^1.2.0", 302 | "is-regex": "^1.1.0", 303 | "object-inspect": "^1.7.0", 304 | "object-keys": "^1.1.1", 305 | "object.assign": "^4.1.0", 306 | "string.prototype.trimend": "^1.0.1", 307 | "string.prototype.trimstart": "^1.0.1" 308 | } 309 | }, 310 | "es-array-method-boxes-properly": { 311 | "version": "1.0.0", 312 | "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", 313 | "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", 314 | "dev": true 315 | }, 316 | "es-get-iterator": { 317 | "version": "1.1.0", 318 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", 319 | "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", 320 | "dev": true, 321 | "requires": { 322 | "es-abstract": "^1.17.4", 323 | "has-symbols": "^1.0.1", 324 | "is-arguments": "^1.0.4", 325 | "is-map": "^2.0.1", 326 | "is-set": "^2.0.1", 327 | "is-string": "^1.0.5", 328 | "isarray": "^2.0.5" 329 | } 330 | }, 331 | "es-to-primitive": { 332 | "version": "1.2.1", 333 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 334 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 335 | "dev": true, 336 | "requires": { 337 | "is-callable": "^1.1.4", 338 | "is-date-object": "^1.0.1", 339 | "is-symbol": "^1.0.2" 340 | } 341 | }, 342 | "escape-string-regexp": { 343 | "version": "1.0.5", 344 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 345 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 346 | "dev": true 347 | }, 348 | "esprima": { 349 | "version": "4.0.1", 350 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 351 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 352 | "dev": true 353 | }, 354 | "expect.js": { 355 | "version": "0.3.1", 356 | "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", 357 | "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=", 358 | "dev": true 359 | }, 360 | "fill-range": { 361 | "version": "7.0.1", 362 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 363 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 364 | "dev": true, 365 | "requires": { 366 | "to-regex-range": "^5.0.1" 367 | } 368 | }, 369 | "find-up": { 370 | "version": "5.0.0", 371 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 372 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 373 | "dev": true, 374 | "requires": { 375 | "locate-path": "^6.0.0", 376 | "path-exists": "^4.0.0" 377 | } 378 | }, 379 | "flat": { 380 | "version": "4.1.0", 381 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 382 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 383 | "dev": true, 384 | "requires": { 385 | "is-buffer": "~2.0.3" 386 | } 387 | }, 388 | "fs.realpath": { 389 | "version": "1.0.0", 390 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 391 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 392 | "dev": true 393 | }, 394 | "fsevents": { 395 | "version": "2.1.3", 396 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", 397 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", 398 | "dev": true, 399 | "optional": true 400 | }, 401 | "function-bind": { 402 | "version": "1.1.1", 403 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 404 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 405 | "dev": true 406 | }, 407 | "get-caller-file": { 408 | "version": "2.0.5", 409 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 410 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 411 | "dev": true 412 | }, 413 | "glob": { 414 | "version": "7.1.3", 415 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 416 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 417 | "dev": true, 418 | "requires": { 419 | "fs.realpath": "^1.0.0", 420 | "inflight": "^1.0.4", 421 | "inherits": "2", 422 | "minimatch": "^3.0.4", 423 | "once": "^1.3.0", 424 | "path-is-absolute": "^1.0.0" 425 | } 426 | }, 427 | "glob-parent": { 428 | "version": "5.1.1", 429 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 430 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 431 | "dev": true, 432 | "requires": { 433 | "is-glob": "^4.0.1" 434 | } 435 | }, 436 | "growl": { 437 | "version": "1.10.5", 438 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 439 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 440 | "dev": true 441 | }, 442 | "has": { 443 | "version": "1.0.3", 444 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 445 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 446 | "dev": true, 447 | "requires": { 448 | "function-bind": "^1.1.1" 449 | } 450 | }, 451 | "has-flag": { 452 | "version": "3.0.0", 453 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 454 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 455 | "dev": true 456 | }, 457 | "has-symbols": { 458 | "version": "1.0.1", 459 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 460 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 461 | "dev": true 462 | }, 463 | "he": { 464 | "version": "1.2.0", 465 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 466 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 467 | "dev": true 468 | }, 469 | "inflight": { 470 | "version": "1.0.6", 471 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 472 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 473 | "dev": true, 474 | "requires": { 475 | "once": "^1.3.0", 476 | "wrappy": "1" 477 | } 478 | }, 479 | "inherits": { 480 | "version": "2.0.4", 481 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 482 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 483 | "dev": true 484 | }, 485 | "is-arguments": { 486 | "version": "1.0.4", 487 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", 488 | "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", 489 | "dev": true 490 | }, 491 | "is-binary-path": { 492 | "version": "2.1.0", 493 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 494 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 495 | "dev": true, 496 | "requires": { 497 | "binary-extensions": "^2.0.0" 498 | } 499 | }, 500 | "is-buffer": { 501 | "version": "2.0.4", 502 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 503 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", 504 | "dev": true 505 | }, 506 | "is-callable": { 507 | "version": "1.2.0", 508 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", 509 | "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", 510 | "dev": true 511 | }, 512 | "is-date-object": { 513 | "version": "1.0.2", 514 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 515 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 516 | "dev": true 517 | }, 518 | "is-extglob": { 519 | "version": "2.1.1", 520 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 521 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 522 | "dev": true 523 | }, 524 | "is-fullwidth-code-point": { 525 | "version": "2.0.0", 526 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 527 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 528 | "dev": true 529 | }, 530 | "is-glob": { 531 | "version": "4.0.1", 532 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 533 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 534 | "dev": true, 535 | "requires": { 536 | "is-extglob": "^2.1.1" 537 | } 538 | }, 539 | "is-map": { 540 | "version": "2.0.1", 541 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", 542 | "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", 543 | "dev": true 544 | }, 545 | "is-number": { 546 | "version": "7.0.0", 547 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 548 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 549 | "dev": true 550 | }, 551 | "is-plain-obj": { 552 | "version": "1.1.0", 553 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 554 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", 555 | "dev": true 556 | }, 557 | "is-regex": { 558 | "version": "1.1.1", 559 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", 560 | "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", 561 | "dev": true, 562 | "requires": { 563 | "has-symbols": "^1.0.1" 564 | } 565 | }, 566 | "is-set": { 567 | "version": "2.0.1", 568 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", 569 | "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", 570 | "dev": true 571 | }, 572 | "is-string": { 573 | "version": "1.0.5", 574 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 575 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", 576 | "dev": true 577 | }, 578 | "is-symbol": { 579 | "version": "1.0.3", 580 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 581 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 582 | "dev": true, 583 | "requires": { 584 | "has-symbols": "^1.0.1" 585 | } 586 | }, 587 | "isarray": { 588 | "version": "2.0.5", 589 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 590 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 591 | "dev": true 592 | }, 593 | "isexe": { 594 | "version": "2.0.0", 595 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 596 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 597 | "dev": true 598 | }, 599 | "iterate-iterator": { 600 | "version": "1.0.1", 601 | "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", 602 | "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", 603 | "dev": true 604 | }, 605 | "iterate-value": { 606 | "version": "1.0.2", 607 | "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", 608 | "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", 609 | "dev": true, 610 | "requires": { 611 | "es-get-iterator": "^1.0.2", 612 | "iterate-iterator": "^1.0.1" 613 | } 614 | }, 615 | "js-tokens": { 616 | "version": "4.0.0", 617 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 618 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 619 | "dev": true 620 | }, 621 | "js-yaml": { 622 | "version": "3.13.1", 623 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 624 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 625 | "dev": true, 626 | "requires": { 627 | "argparse": "^1.0.7", 628 | "esprima": "^4.0.0" 629 | } 630 | }, 631 | "locate-path": { 632 | "version": "6.0.0", 633 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 634 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 635 | "dev": true, 636 | "requires": { 637 | "p-locate": "^5.0.0" 638 | } 639 | }, 640 | "log-symbols": { 641 | "version": "4.0.0", 642 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", 643 | "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", 644 | "dev": true, 645 | "requires": { 646 | "chalk": "^4.0.0" 647 | }, 648 | "dependencies": { 649 | "ansi-styles": { 650 | "version": "4.2.1", 651 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 652 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 653 | "dev": true, 654 | "requires": { 655 | "@types/color-name": "^1.1.1", 656 | "color-convert": "^2.0.1" 657 | } 658 | }, 659 | "chalk": { 660 | "version": "4.1.0", 661 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 662 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 663 | "dev": true, 664 | "requires": { 665 | "ansi-styles": "^4.1.0", 666 | "supports-color": "^7.1.0" 667 | } 668 | }, 669 | "color-convert": { 670 | "version": "2.0.1", 671 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 672 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 673 | "dev": true, 674 | "requires": { 675 | "color-name": "~1.1.4" 676 | } 677 | }, 678 | "color-name": { 679 | "version": "1.1.4", 680 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 681 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 682 | "dev": true 683 | } 684 | } 685 | }, 686 | "minimatch": { 687 | "version": "3.0.4", 688 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 689 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 690 | "dev": true, 691 | "requires": { 692 | "brace-expansion": "^1.1.7" 693 | } 694 | }, 695 | "minimist": { 696 | "version": "1.2.5", 697 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 698 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 699 | "dev": true 700 | }, 701 | "mkdirp": { 702 | "version": "0.5.5", 703 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 704 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 705 | "dev": true, 706 | "requires": { 707 | "minimist": "^1.2.5" 708 | } 709 | }, 710 | "mocha": { 711 | "version": "8.1.3", 712 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.3.tgz", 713 | "integrity": "sha512-ZbaYib4hT4PpF4bdSO2DohooKXIn4lDeiYqB+vTmCdr6l2woW0b6H3pf5x4sM5nwQMru9RvjjHYWVGltR50ZBw==", 714 | "dev": true, 715 | "requires": { 716 | "ansi-colors": "4.1.1", 717 | "browser-stdout": "1.3.1", 718 | "chokidar": "3.4.2", 719 | "debug": "4.1.1", 720 | "diff": "4.0.2", 721 | "escape-string-regexp": "4.0.0", 722 | "find-up": "5.0.0", 723 | "glob": "7.1.6", 724 | "growl": "1.10.5", 725 | "he": "1.2.0", 726 | "js-yaml": "3.14.0", 727 | "log-symbols": "4.0.0", 728 | "minimatch": "3.0.4", 729 | "ms": "2.1.2", 730 | "object.assign": "4.1.0", 731 | "promise.allsettled": "1.0.2", 732 | "serialize-javascript": "4.0.0", 733 | "strip-json-comments": "3.0.1", 734 | "supports-color": "7.1.0", 735 | "which": "2.0.2", 736 | "wide-align": "1.1.3", 737 | "workerpool": "6.0.0", 738 | "yargs": "13.3.2", 739 | "yargs-parser": "13.1.2", 740 | "yargs-unparser": "1.6.1" 741 | }, 742 | "dependencies": { 743 | "escape-string-regexp": { 744 | "version": "4.0.0", 745 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 746 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 747 | "dev": true 748 | }, 749 | "glob": { 750 | "version": "7.1.6", 751 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 752 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 753 | "dev": true, 754 | "requires": { 755 | "fs.realpath": "^1.0.0", 756 | "inflight": "^1.0.4", 757 | "inherits": "2", 758 | "minimatch": "^3.0.4", 759 | "once": "^1.3.0", 760 | "path-is-absolute": "^1.0.0" 761 | } 762 | }, 763 | "js-yaml": { 764 | "version": "3.14.0", 765 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", 766 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", 767 | "dev": true, 768 | "requires": { 769 | "argparse": "^1.0.7", 770 | "esprima": "^4.0.0" 771 | } 772 | } 773 | } 774 | }, 775 | "ms": { 776 | "version": "2.1.2", 777 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 778 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 779 | "dev": true 780 | }, 781 | "normalize-path": { 782 | "version": "3.0.0", 783 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 784 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 785 | "dev": true 786 | }, 787 | "object-inspect": { 788 | "version": "1.8.0", 789 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", 790 | "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", 791 | "dev": true 792 | }, 793 | "object-keys": { 794 | "version": "1.1.1", 795 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 796 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 797 | "dev": true 798 | }, 799 | "object.assign": { 800 | "version": "4.1.0", 801 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 802 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 803 | "dev": true, 804 | "requires": { 805 | "define-properties": "^1.1.2", 806 | "function-bind": "^1.1.1", 807 | "has-symbols": "^1.0.0", 808 | "object-keys": "^1.0.11" 809 | } 810 | }, 811 | "once": { 812 | "version": "1.4.0", 813 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 814 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 815 | "dev": true, 816 | "requires": { 817 | "wrappy": "1" 818 | } 819 | }, 820 | "p-limit": { 821 | "version": "3.0.2", 822 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", 823 | "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", 824 | "dev": true, 825 | "requires": { 826 | "p-try": "^2.0.0" 827 | } 828 | }, 829 | "p-locate": { 830 | "version": "5.0.0", 831 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 832 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 833 | "dev": true, 834 | "requires": { 835 | "p-limit": "^3.0.2" 836 | } 837 | }, 838 | "p-try": { 839 | "version": "2.2.0", 840 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 841 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 842 | "dev": true 843 | }, 844 | "path-exists": { 845 | "version": "4.0.0", 846 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 847 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 848 | "dev": true 849 | }, 850 | "path-is-absolute": { 851 | "version": "1.0.1", 852 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 853 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 854 | "dev": true 855 | }, 856 | "path-parse": { 857 | "version": "1.0.6", 858 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 859 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 860 | "dev": true 861 | }, 862 | "picomatch": { 863 | "version": "2.2.2", 864 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 865 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 866 | "dev": true 867 | }, 868 | "promise.allsettled": { 869 | "version": "1.0.2", 870 | "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", 871 | "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", 872 | "dev": true, 873 | "requires": { 874 | "array.prototype.map": "^1.0.1", 875 | "define-properties": "^1.1.3", 876 | "es-abstract": "^1.17.0-next.1", 877 | "function-bind": "^1.1.1", 878 | "iterate-value": "^1.0.0" 879 | } 880 | }, 881 | "randombytes": { 882 | "version": "2.1.0", 883 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 884 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 885 | "dev": true, 886 | "requires": { 887 | "safe-buffer": "^5.1.0" 888 | } 889 | }, 890 | "readdirp": { 891 | "version": "3.4.0", 892 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", 893 | "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", 894 | "dev": true, 895 | "requires": { 896 | "picomatch": "^2.2.1" 897 | } 898 | }, 899 | "require-directory": { 900 | "version": "2.1.1", 901 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 902 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 903 | "dev": true 904 | }, 905 | "require-main-filename": { 906 | "version": "2.0.0", 907 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 908 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 909 | "dev": true 910 | }, 911 | "resolve": { 912 | "version": "1.17.0", 913 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 914 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 915 | "dev": true, 916 | "requires": { 917 | "path-parse": "^1.0.6" 918 | } 919 | }, 920 | "safe-buffer": { 921 | "version": "5.2.1", 922 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 923 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 924 | "dev": true 925 | }, 926 | "semver": { 927 | "version": "5.7.1", 928 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 929 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 930 | "dev": true 931 | }, 932 | "serialize-javascript": { 933 | "version": "4.0.0", 934 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", 935 | "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", 936 | "dev": true, 937 | "requires": { 938 | "randombytes": "^2.1.0" 939 | } 940 | }, 941 | "set-blocking": { 942 | "version": "2.0.0", 943 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 944 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 945 | "dev": true 946 | }, 947 | "sprintf-js": { 948 | "version": "1.0.3", 949 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 950 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 951 | "dev": true 952 | }, 953 | "string-width": { 954 | "version": "2.1.1", 955 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 956 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 957 | "dev": true, 958 | "requires": { 959 | "is-fullwidth-code-point": "^2.0.0", 960 | "strip-ansi": "^4.0.0" 961 | } 962 | }, 963 | "string.prototype.trimend": { 964 | "version": "1.0.1", 965 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 966 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 967 | "dev": true, 968 | "requires": { 969 | "define-properties": "^1.1.3", 970 | "es-abstract": "^1.17.5" 971 | } 972 | }, 973 | "string.prototype.trimstart": { 974 | "version": "1.0.1", 975 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 976 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 977 | "dev": true, 978 | "requires": { 979 | "define-properties": "^1.1.3", 980 | "es-abstract": "^1.17.5" 981 | } 982 | }, 983 | "strip-ansi": { 984 | "version": "4.0.0", 985 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 986 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 987 | "dev": true, 988 | "requires": { 989 | "ansi-regex": "^3.0.0" 990 | } 991 | }, 992 | "strip-json-comments": { 993 | "version": "3.0.1", 994 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", 995 | "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", 996 | "dev": true 997 | }, 998 | "supports-color": { 999 | "version": "7.1.0", 1000 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 1001 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 1002 | "dev": true, 1003 | "requires": { 1004 | "has-flag": "^4.0.0" 1005 | }, 1006 | "dependencies": { 1007 | "has-flag": { 1008 | "version": "4.0.0", 1009 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1010 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1011 | "dev": true 1012 | } 1013 | } 1014 | }, 1015 | "to-regex-range": { 1016 | "version": "5.0.1", 1017 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1018 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1019 | "dev": true, 1020 | "requires": { 1021 | "is-number": "^7.0.0" 1022 | } 1023 | }, 1024 | "tslib": { 1025 | "version": "1.13.0", 1026 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", 1027 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", 1028 | "dev": true 1029 | }, 1030 | "tslint": { 1031 | "version": "6.1.3", 1032 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", 1033 | "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", 1034 | "dev": true, 1035 | "requires": { 1036 | "@babel/code-frame": "^7.0.0", 1037 | "builtin-modules": "^1.1.1", 1038 | "chalk": "^2.3.0", 1039 | "commander": "^2.12.1", 1040 | "diff": "^4.0.1", 1041 | "glob": "^7.1.1", 1042 | "js-yaml": "^3.13.1", 1043 | "minimatch": "^3.0.4", 1044 | "mkdirp": "^0.5.3", 1045 | "resolve": "^1.3.2", 1046 | "semver": "^5.3.0", 1047 | "tslib": "^1.13.0", 1048 | "tsutils": "^2.29.0" 1049 | }, 1050 | "dependencies": { 1051 | "diff": { 1052 | "version": "4.0.2", 1053 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1054 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 1055 | "dev": true 1056 | } 1057 | } 1058 | }, 1059 | "tsutils": { 1060 | "version": "2.29.0", 1061 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 1062 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 1063 | "dev": true, 1064 | "requires": { 1065 | "tslib": "^1.8.1" 1066 | } 1067 | }, 1068 | "typescript": { 1069 | "version": "3.9.7", 1070 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", 1071 | "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", 1072 | "dev": true 1073 | }, 1074 | "which": { 1075 | "version": "2.0.2", 1076 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1077 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1078 | "dev": true, 1079 | "requires": { 1080 | "isexe": "^2.0.0" 1081 | } 1082 | }, 1083 | "which-module": { 1084 | "version": "2.0.0", 1085 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1086 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 1087 | "dev": true 1088 | }, 1089 | "wide-align": { 1090 | "version": "1.1.3", 1091 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1092 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1093 | "dev": true, 1094 | "requires": { 1095 | "string-width": "^1.0.2 || 2" 1096 | } 1097 | }, 1098 | "workerpool": { 1099 | "version": "6.0.0", 1100 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", 1101 | "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", 1102 | "dev": true 1103 | }, 1104 | "wrap-ansi": { 1105 | "version": "5.1.0", 1106 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 1107 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 1108 | "dev": true, 1109 | "requires": { 1110 | "ansi-styles": "^3.2.0", 1111 | "string-width": "^3.0.0", 1112 | "strip-ansi": "^5.0.0" 1113 | }, 1114 | "dependencies": { 1115 | "ansi-regex": { 1116 | "version": "4.1.0", 1117 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1118 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1119 | "dev": true 1120 | }, 1121 | "string-width": { 1122 | "version": "3.1.0", 1123 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1124 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1125 | "dev": true, 1126 | "requires": { 1127 | "emoji-regex": "^7.0.1", 1128 | "is-fullwidth-code-point": "^2.0.0", 1129 | "strip-ansi": "^5.1.0" 1130 | } 1131 | }, 1132 | "strip-ansi": { 1133 | "version": "5.2.0", 1134 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1135 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1136 | "dev": true, 1137 | "requires": { 1138 | "ansi-regex": "^4.1.0" 1139 | } 1140 | } 1141 | } 1142 | }, 1143 | "wrappy": { 1144 | "version": "1.0.2", 1145 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1146 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1147 | "dev": true 1148 | }, 1149 | "y18n": { 1150 | "version": "4.0.0", 1151 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 1152 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 1153 | "dev": true 1154 | }, 1155 | "yargs": { 1156 | "version": "13.3.2", 1157 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", 1158 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", 1159 | "dev": true, 1160 | "requires": { 1161 | "cliui": "^5.0.0", 1162 | "find-up": "^3.0.0", 1163 | "get-caller-file": "^2.0.1", 1164 | "require-directory": "^2.1.1", 1165 | "require-main-filename": "^2.0.0", 1166 | "set-blocking": "^2.0.0", 1167 | "string-width": "^3.0.0", 1168 | "which-module": "^2.0.0", 1169 | "y18n": "^4.0.0", 1170 | "yargs-parser": "^13.1.2" 1171 | }, 1172 | "dependencies": { 1173 | "ansi-regex": { 1174 | "version": "4.1.0", 1175 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1176 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1177 | "dev": true 1178 | }, 1179 | "find-up": { 1180 | "version": "3.0.0", 1181 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 1182 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 1183 | "dev": true, 1184 | "requires": { 1185 | "locate-path": "^3.0.0" 1186 | } 1187 | }, 1188 | "locate-path": { 1189 | "version": "3.0.0", 1190 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1191 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1192 | "dev": true, 1193 | "requires": { 1194 | "p-locate": "^3.0.0", 1195 | "path-exists": "^3.0.0" 1196 | } 1197 | }, 1198 | "p-limit": { 1199 | "version": "2.3.0", 1200 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1201 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1202 | "dev": true, 1203 | "requires": { 1204 | "p-try": "^2.0.0" 1205 | } 1206 | }, 1207 | "p-locate": { 1208 | "version": "3.0.0", 1209 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1210 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1211 | "dev": true, 1212 | "requires": { 1213 | "p-limit": "^2.0.0" 1214 | } 1215 | }, 1216 | "path-exists": { 1217 | "version": "3.0.0", 1218 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1219 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1220 | "dev": true 1221 | }, 1222 | "string-width": { 1223 | "version": "3.1.0", 1224 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1225 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1226 | "dev": true, 1227 | "requires": { 1228 | "emoji-regex": "^7.0.1", 1229 | "is-fullwidth-code-point": "^2.0.0", 1230 | "strip-ansi": "^5.1.0" 1231 | } 1232 | }, 1233 | "strip-ansi": { 1234 | "version": "5.2.0", 1235 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1236 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1237 | "dev": true, 1238 | "requires": { 1239 | "ansi-regex": "^4.1.0" 1240 | } 1241 | } 1242 | } 1243 | }, 1244 | "yargs-parser": { 1245 | "version": "13.1.2", 1246 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", 1247 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", 1248 | "dev": true, 1249 | "requires": { 1250 | "camelcase": "^5.0.0", 1251 | "decamelize": "^1.2.0" 1252 | } 1253 | }, 1254 | "yargs-unparser": { 1255 | "version": "1.6.1", 1256 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", 1257 | "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", 1258 | "dev": true, 1259 | "requires": { 1260 | "camelcase": "^5.3.1", 1261 | "decamelize": "^1.2.0", 1262 | "flat": "^4.1.0", 1263 | "is-plain-obj": "^1.1.0", 1264 | "yargs": "^14.2.3" 1265 | }, 1266 | "dependencies": { 1267 | "ansi-regex": { 1268 | "version": "4.1.0", 1269 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1270 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1271 | "dev": true 1272 | }, 1273 | "find-up": { 1274 | "version": "3.0.0", 1275 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 1276 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 1277 | "dev": true, 1278 | "requires": { 1279 | "locate-path": "^3.0.0" 1280 | } 1281 | }, 1282 | "locate-path": { 1283 | "version": "3.0.0", 1284 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1285 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1286 | "dev": true, 1287 | "requires": { 1288 | "p-locate": "^3.0.0", 1289 | "path-exists": "^3.0.0" 1290 | } 1291 | }, 1292 | "p-limit": { 1293 | "version": "2.3.0", 1294 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1295 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1296 | "dev": true, 1297 | "requires": { 1298 | "p-try": "^2.0.0" 1299 | } 1300 | }, 1301 | "p-locate": { 1302 | "version": "3.0.0", 1303 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1304 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1305 | "dev": true, 1306 | "requires": { 1307 | "p-limit": "^2.0.0" 1308 | } 1309 | }, 1310 | "path-exists": { 1311 | "version": "3.0.0", 1312 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1313 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1314 | "dev": true 1315 | }, 1316 | "string-width": { 1317 | "version": "3.1.0", 1318 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1319 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1320 | "dev": true, 1321 | "requires": { 1322 | "emoji-regex": "^7.0.1", 1323 | "is-fullwidth-code-point": "^2.0.0", 1324 | "strip-ansi": "^5.1.0" 1325 | } 1326 | }, 1327 | "strip-ansi": { 1328 | "version": "5.2.0", 1329 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1330 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1331 | "dev": true, 1332 | "requires": { 1333 | "ansi-regex": "^4.1.0" 1334 | } 1335 | }, 1336 | "yargs": { 1337 | "version": "14.2.3", 1338 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", 1339 | "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", 1340 | "dev": true, 1341 | "requires": { 1342 | "cliui": "^5.0.0", 1343 | "decamelize": "^1.2.0", 1344 | "find-up": "^3.0.0", 1345 | "get-caller-file": "^2.0.1", 1346 | "require-directory": "^2.1.1", 1347 | "require-main-filename": "^2.0.0", 1348 | "set-blocking": "^2.0.0", 1349 | "string-width": "^3.0.0", 1350 | "which-module": "^2.0.0", 1351 | "y18n": "^4.0.0", 1352 | "yargs-parser": "^15.0.1" 1353 | } 1354 | }, 1355 | "yargs-parser": { 1356 | "version": "15.0.1", 1357 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", 1358 | "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", 1359 | "dev": true, 1360 | "requires": { 1361 | "camelcase": "^5.0.0", 1362 | "decamelize": "^1.2.0" 1363 | } 1364 | } 1365 | } 1366 | } 1367 | } 1368 | } 1369 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cue-parser", 3 | "preferGlobal": false, 4 | "version": "0.3.0", 5 | "author": { 6 | "name": "Xiao Han", 7 | "homepage": "https://github.com/justlaputa" 8 | }, 9 | "contributors": [ 10 | { 11 | "name": "Borewit", 12 | "homepage": "https://github.com/Borewit" 13 | }, 14 | { 15 | "name": "Xiao Han", 16 | "homepage": "https://github.com/justlaputa" 17 | } 18 | ], 19 | "description": "A simple js library to parse cue sheet", 20 | "keywords": [ 21 | "cue", 22 | "sheet", 23 | "cue-sheet", 24 | "parser", 25 | "eac", 26 | "xld" 27 | ], 28 | "scripts": { 29 | "test": "mocha test/test.js", 30 | "compile-lib": "tsc -p lib", 31 | "compile": "npm run compile-lib", 32 | "build": "npm run compile", 33 | "lint": "tslint 'lib/**/*.ts'", 34 | "fix-lint": "tslint --fix 'lib/**/*.ts'" 35 | }, 36 | "repository": { 37 | "type": "git", 38 | "url": "git+https://github.com/justlaputa/cue-parser.git" 39 | }, 40 | "dependencies": { 41 | "chardet": "^1.0.0" 42 | }, 43 | "devDependencies": { 44 | "@types/node": "^14.0.23", 45 | "expect.js": "^0.3.1", 46 | "mocha": "^8.1.0", 47 | "tslint": "^6.0.0", 48 | "typescript": "^3.5.3" 49 | }, 50 | "main": "lib/cue", 51 | "typings": "lib/cue", 52 | "files": [ 53 | "lib/**/*.js", 54 | "lib/**/*.d.ts" 55 | ], 56 | "engines": { 57 | "node": ">=10", 58 | "npm": ">=6" 59 | }, 60 | "license": "MIT" 61 | } 62 | -------------------------------------------------------------------------------- /test/cue/Frank Boeijen - Palermo - CD1.eac.cue: -------------------------------------------------------------------------------- 1 | REM GENRE Pop 2 | REM DATE 2018 3 | REM DISCID 7F09CF0A 4 | REM COMMENT "ExactAudioCopy v1.3" 5 | PERFORMER "Frank Boeijen" 6 | TITLE "Palermo" 7 | REM COMPOSER "" 8 | FILE "01. Frank Boeijen - Achter De Wolken.wav" WAVE 9 | TRACK 01 AUDIO 10 | TITLE "Achter De Wolken" 11 | PERFORMER "Frank Boeijen" 12 | REM COMPOSER "" 13 | ISRC NL5BD1700101 14 | FLAGS DCP 15 | INDEX 01 00:00:00 16 | TRACK 02 AUDIO 17 | TITLE "Hoe Het Was" 18 | PERFORMER "Frank Boeijen" 19 | REM COMPOSER "" 20 | ISRC NL5BD1700102 21 | FLAGS DCP 22 | INDEX 00 04:30:66 23 | FILE "02. Frank Boeijen - Hoe Het Was.wav" WAVE 24 | INDEX 01 00:00:00 25 | TRACK 03 AUDIO 26 | TITLE "Vuur En Vlam" 27 | PERFORMER "Frank Boeijen" 28 | REM COMPOSER "" 29 | ISRC NL5BD1700103 30 | FLAGS DCP 31 | INDEX 00 04:12:65 32 | FILE "03. Frank Boeijen - Vuur En Vlam.wav" WAVE 33 | INDEX 01 00:00:00 34 | TRACK 04 AUDIO 35 | TITLE "Jij Bent Hier" 36 | PERFORMER "Frank Boeijen" 37 | REM COMPOSER "" 38 | ISRC NL5BD1700104 39 | FLAGS DCP 40 | INDEX 00 03:08:00 41 | FILE "04. Frank Boeijen - Jij Bent Hier.wav" WAVE 42 | INDEX 01 00:00:00 43 | TRACK 05 AUDIO 44 | TITLE "Vandaag" 45 | PERFORMER "Frank Boeijen" 46 | REM COMPOSER "" 47 | ISRC NL5BD1700105 48 | FLAGS DCP 49 | INDEX 00 03:26:14 50 | FILE "05. Frank Boeijen - Vandaag.wav" WAVE 51 | INDEX 01 00:00:00 52 | TRACK 06 AUDIO 53 | TITLE "Daar Zal Het Zijn" 54 | PERFORMER "Frank Boeijen" 55 | REM COMPOSER "" 56 | ISRC NL5BD1700106 57 | FLAGS DCP 58 | INDEX 00 04:07:72 59 | FILE "06. Frank Boeijen - Daar Zal Het Zijn.wav" WAVE 60 | INDEX 01 00:00:00 61 | TRACK 07 AUDIO 62 | TITLE "Alles Is Teder" 63 | PERFORMER "Frank Boeijen" 64 | REM COMPOSER "" 65 | ISRC NL5BD1700107 66 | FLAGS DCP 67 | INDEX 00 03:50:46 68 | FILE "07. Frank Boeijen - Alles Is Teder.wav" WAVE 69 | INDEX 01 00:00:00 70 | TRACK 08 AUDIO 71 | TITLE "Zon" 72 | PERFORMER "Frank Boeijen" 73 | REM COMPOSER "" 74 | ISRC NL5BD1700108 75 | FLAGS DCP 76 | INDEX 00 04:34:25 77 | FILE "08. Frank Boeijen - Zon.wav" WAVE 78 | INDEX 01 00:00:00 79 | TRACK 09 AUDIO 80 | TITLE "Droom Van Jou" 81 | PERFORMER "Frank Boeijen" 82 | REM COMPOSER "" 83 | ISRC NL5BD1700109 84 | FLAGS DCP 85 | INDEX 00 03:50:04 86 | FILE "09. Frank Boeijen - Droom Van Jou.wav" WAVE 87 | INDEX 01 00:00:00 88 | TRACK 10 AUDIO 89 | TITLE "Hoe Het Ook Gaat" 90 | PERFORMER "Frank Boeijen" 91 | REM COMPOSER "" 92 | ISRC NL5BD1700110 93 | FLAGS DCP 94 | INDEX 00 04:47:13 95 | FILE "10. Frank Boeijen - Hoe Het Ook Gaat.wav" WAVE 96 | INDEX 01 00:00:00 97 | -------------------------------------------------------------------------------- /test/cue/Frank Boeijen Groep - Welkom In Utopia.eac.cue: -------------------------------------------------------------------------------- 1 | REM GENRE Nederpop 2 | REM DATE 1987 3 | REM DISCID 910B940B 4 | REM COMMENT "ExactAudioCopy v0.99pb5" 5 | PERFORMER "Frank Boeijen Groep" 6 | TITLE "Welkom In Utopia" 7 | FILE "01 Welkom In Utopia I.wav" WAVE 8 | TRACK 01 AUDIO 9 | TITLE "Welkom In Utopia I" 10 | PERFORMER "Frank Boeijen Groep" 11 | INDEX 01 00:00:00 12 | FILE "02 Hier Komt De Storm.wav" WAVE 13 | TRACK 02 AUDIO 14 | TITLE "Hier Komt De Storm" 15 | PERFORMER "Frank Boeijen Groep" 16 | INDEX 01 00:00:00 17 | FILE "03 De Wind Nam Hem Mee.wav" WAVE 18 | TRACK 03 AUDIO 19 | TITLE "De Wind Nam Hem Mee" 20 | PERFORMER "Frank Boeijen Groep" 21 | INDEX 01 00:00:00 22 | TRACK 04 AUDIO 23 | TITLE "De Tijden" 24 | PERFORMER "Frank Boeijen Groep" 25 | INDEX 00 05:27:00 26 | FILE "04 De Tijden.wav" WAVE 27 | INDEX 01 00:00:00 28 | FILE "05 Niemand Heeft Gelijk.wav" WAVE 29 | TRACK 05 AUDIO 30 | TITLE "Niemand Heeft Gelijk" 31 | PERFORMER "Frank Boeijen Groep" 32 | INDEX 01 00:00:00 33 | TRACK 06 AUDIO 34 | TITLE "Mantel Der Liefde" 35 | PERFORMER "Frank Boeijen Groep" 36 | INDEX 00 04:10:37 37 | FILE "06 Mantel Der Liefde.wav" WAVE 38 | INDEX 01 00:00:00 39 | TRACK 07 AUDIO 40 | TITLE "Winter In Hamburg" 41 | PERFORMER "Frank Boeijen Groep" 42 | INDEX 00 03:39:25 43 | FILE "07 Winter In Hamburg.wav" WAVE 44 | INDEX 01 00:00:00 45 | TRACK 08 AUDIO 46 | TITLE "Kleine Blonde Prinses" 47 | PERFORMER "Frank Boeijen Groep" 48 | INDEX 00 05:18:25 49 | FILE "08 Kleine Blonde Prinses.wav" WAVE 50 | INDEX 01 00:00:00 51 | FILE "09 De Oorlog Der Liefde.wav" WAVE 52 | TRACK 09 AUDIO 53 | TITLE "De Oorlog Der Liefde" 54 | PERFORMER "Frank Boeijen Groep" 55 | INDEX 01 00:00:00 56 | FILE "10 Vrienden Onder Elkaar.wav" WAVE 57 | TRACK 10 AUDIO 58 | TITLE "Vrienden Onder Elkaar" 59 | PERFORMER "Frank Boeijen Groep" 60 | INDEX 01 00:00:00 61 | FILE "11 Welkom In Utopia II.wav" WAVE 62 | TRACK 11 AUDIO 63 | TITLE "Welkom In Utopia II" 64 | PERFORMER "Frank Boeijen Groep" 65 | INDEX 01 00:00:00 66 | -------------------------------------------------------------------------------- /test/cue/Michael Kiwanuka - Love And Hate.cue: -------------------------------------------------------------------------------- 1 | REM GENRE R&B 2 | REM DATE 2016 3 | REM DISCID 720CEB0A 4 | REM COMMENT "ExactAudioCopy v1.1" 5 | PERFORMER "Michael Kiwanuka" 6 | TITLE "Love And Hate" 7 | FILE "Michael Kiwanuka - Love And Hate.flac" WAVE 8 | TRACK 01 AUDIO 9 | TITLE "Cold Little Heart" 10 | PERFORMER "Michael Kiwanuka" 11 | INDEX 01 00:00:00 12 | TRACK 02 AUDIO 13 | TITLE "Black Man In A White World" 14 | PERFORMER "Michael Kiwanuka" 15 | INDEX 00 09:58:54 16 | INDEX 01 10:10:36 17 | TRACK 03 AUDIO 18 | TITLE "Falling" 19 | PERFORMER "Michael Kiwanuka" 20 | INDEX 01 14:29:33 21 | TRACK 04 AUDIO 22 | TITLE "Place I Belong" 23 | PERFORMER "Michael Kiwanuka" 24 | INDEX 01 18:46:24 25 | TRACK 05 AUDIO 26 | TITLE "Love And Hate" 27 | PERFORMER "Michael Kiwanuka" 28 | INDEX 01 23:33:63 29 | TRACK 06 AUDIO 30 | TITLE "One More Night" 31 | PERFORMER "Michael Kiwanuka" 32 | INDEX 01 30:40:70 33 | TRACK 07 AUDIO 34 | TITLE "I'll Never Love" 35 | PERFORMER "Michael Kiwanuka" 36 | INDEX 01 34:34:26 37 | TRACK 08 AUDIO 38 | TITLE "Rule The World" 39 | PERFORMER "Michael Kiwanuka" 40 | INDEX 01 37:20:25 41 | TRACK 09 AUDIO 42 | TITLE "Father's Child" 43 | PERFORMER "Michael Kiwanuka" 44 | INDEX 01 43:03:12 45 | INDEX 02 50:06:41 46 | TRACK 10 AUDIO 47 | TITLE "The Final Frame" 48 | PERFORMER "Michael Kiwanuka" 49 | INDEX 00 50:06:41 50 | INDEX 01 50:08:23 51 | -------------------------------------------------------------------------------- /test/cue/Paco de Lucía - Fuente y Caudal.eac.cue: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/justlaputa/cue-parser/ba7be3c44a37672437ee2bd292bfe41e74e4b676/test/cue/Paco de Lucía - Fuente y Caudal.eac.cue -------------------------------------------------------------------------------- /test/cue/Putumayo Presents - Yoga Lounge.xld.cue: -------------------------------------------------------------------------------- 1 | TITLE "Putumayo Presents - Yoga Lounge" 2 | REM GENRE "New Age" 3 | REM DATE "2014" 4 | REM DISCNUMBER 1 5 | REM TOTALDISCS 1 6 | REM DISCID B40E350C 7 | REM REPLAYGAIN_ALBUM_GAIN -3.10 dB 8 | REM REPLAYGAIN_ALBUM_PEAK 0.977478 9 | REM COMPILATION TRUE 10 | FILE "01 Dreamcatcher.flac" WAVE 11 | TRACK 01 AUDIO 12 | TITLE "Dreamcatcher" 13 | PERFORMER "Bahramji & Maneesh De Moor" 14 | ISRC US6QR1400036 15 | REM REPLAYGAIN_TRACK_GAIN -2.15 dB 16 | REM REPLAYGAIN_TRACK_PEAK 0.749939 17 | INDEX 01 00:00:00 18 | TRACK 02 AUDIO 19 | TITLE "Rama Bolo" 20 | PERFORMER "Jai Uttal & Ben Leinbach" 21 | ISRC US6QR1400045 22 | REM REPLAYGAIN_TRACK_GAIN -2.64 dB 23 | REM REPLAYGAIN_TRACK_PEAK 0.794312 24 | INDEX 00 05:44:65 25 | FILE "02 Rama Bolo.flac" WAVE 26 | INDEX 01 00:00:00 27 | TRACK 03 AUDIO 28 | TITLE "Om Tare Tuttare" 29 | PERFORMER "Donna De Lory" 30 | ISRC US6QR1400046 31 | REM REPLAYGAIN_TRACK_GAIN -2.72 dB 32 | REM REPLAYGAIN_TRACK_PEAK 0.977478 33 | INDEX 00 05:21:33 34 | FILE "03 Om Tare Tuttare.flac" WAVE 35 | INDEX 01 00:00:00 36 | TRACK 04 AUDIO 37 | TITLE "Nectar Drop" 38 | PERFORMER "DJ Drez" 39 | ISRC US6QR1400047 40 | REM REPLAYGAIN_TRACK_GAIN -2.80 dB 41 | REM REPLAYGAIN_TRACK_PEAK 0.867279 42 | INDEX 00 03:27:23 43 | FILE "04 Nectar Drop.flac" WAVE 44 | INDEX 01 00:00:00 45 | TRACK 05 AUDIO 46 | TITLE "Sapano Se Pucho" 47 | PERFORMER "Niraj Chag With Japjit Kaur" 48 | ISRC GBVWC0800016 49 | REM REPLAYGAIN_TRACK_GAIN -4.68 dB 50 | REM REPLAYGAIN_TRACK_PEAK 0.688446 51 | INDEX 00 04:00:72 52 | FILE "05 Sapano Se Pucho.flac" WAVE 53 | INDEX 01 00:00:00 54 | TRACK 06 AUDIO 55 | TITLE "Cosmic Flow" 56 | PERFORMER "Maneesh De Moor" 57 | ISRC US6QR1400049 58 | REM REPLAYGAIN_TRACK_GAIN -3.46 dB 59 | REM REPLAYGAIN_TRACK_PEAK 0.910156 60 | INDEX 00 03:50:72 61 | FILE "06 Cosmic Flow.flac" WAVE 62 | INDEX 01 00:00:00 63 | TRACK 07 AUDIO 64 | TITLE "Mahamrtyunjaya Mantra" 65 | PERFORMER "Reema Datta, Ferenz Kallos" 66 | ISRC US6QR1400050 67 | REM REPLAYGAIN_TRACK_GAIN -0.81 dB 68 | REM REPLAYGAIN_TRACK_PEAK 0.902039 69 | INDEX 00 03:51:70 70 | FILE "07 Mahamrtyunjaya Mantra.flac" WAVE 71 | INDEX 01 00:00:00 72 | TRACK 08 AUDIO 73 | TITLE "Evening Star (Early Mix)" 74 | PERFORMER "All India Radio" 75 | ISRC US6QR1400051 76 | REM REPLAYGAIN_TRACK_GAIN -0.14 dB 77 | REM REPLAYGAIN_TRACK_PEAK 0.794312 78 | INDEX 00 05:44:72 79 | FILE "08 Evening Star (Early Mix).flac" WAVE 80 | INDEX 01 00:00:00 81 | FILE "09 Peace Song (Putumayo Version).flac" WAVE 82 | TRACK 09 AUDIO 83 | TITLE "Peace Song (Putumayo Version)" 84 | PERFORMER "Sean Johnson & The Wild Lotus Band" 85 | ISRC USZ321400011 86 | REM REPLAYGAIN_TRACK_GAIN -4.53 dB 87 | REM REPLAYGAIN_TRACK_PEAK 0.725006 88 | INDEX 01 00:00:00 89 | FILE "10 Prajna's Dream (Remix).flac" WAVE 90 | TRACK 10 AUDIO 91 | TITLE "Prajna's Dream (Remix)" 92 | PERFORMER "Stevin McNamara" 93 | ISRC US6QR1400052 94 | REM REPLAYGAIN_TRACK_GAIN -1.40 dB 95 | REM REPLAYGAIN_TRACK_PEAK 0.841370 96 | INDEX 01 00:00:00 97 | FILE "11 Ra Ma Da Sa (Putumayo Version).flac" WAVE 98 | TRACK 11 AUDIO 99 | TITLE "Ra Ma Da Sa (Putumayo Version)" 100 | PERFORMER "Mirabai Ceiba" 101 | ISRC US6QR1400053 102 | REM REPLAYGAIN_TRACK_GAIN -2.85 dB 103 | REM REPLAYGAIN_TRACK_PEAK 0.725952 104 | INDEX 01 00:00:00 105 | FILE "12 Shanti (Peace Out).flac" WAVE 106 | TRACK 12 AUDIO 107 | TITLE "Shanti (Peace Out)" 108 | PERFORMER "MC Yogi" 109 | ISRC US6QR1400054 110 | REM REPLAYGAIN_TRACK_GAIN -2.30 dB 111 | REM REPLAYGAIN_TRACK_PEAK 0.730804 112 | INDEX 01 00:00:00 113 | -------------------------------------------------------------------------------- /test/cue/Putumayo Presents Arabic Beat.cue: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/justlaputa/cue-parser/ba7be3c44a37672437ee2bd292bfe41e74e4b676/test/cue/Putumayo Presents Arabic Beat.cue -------------------------------------------------------------------------------- /test/cue/Putumayo Presents Café Del Mundo.cue: -------------------------------------------------------------------------------- 1 | TITLE "Putumayo Presents: Café Del Mundo" 2 | PERFORMER "Various Artists" 3 | REM GENRE "World Music" 4 | REM DATE "2014" 5 | REM DISCID 8C098C0C 6 | REM REPLAYGAIN_ALBUM_GAIN -4.11 dB 7 | REM REPLAYGAIN_ALBUM_PEAK 0.930603 8 | REM COMPILATION TRUE 9 | FILE "01 Metro – Boulot – Dodo.flac" WAVE 10 | TRACK 01 AUDIO 11 | TITLE "Metro – Boulot – Dodo" 12 | PERFORMER "Les Frères Guissé (Sénégal)" 13 | SONGWRITER "Guissé, Cheikh T.; Guissé, Oumar; Guissé, Ousmane; Guissé, Aliou" 14 | ISRC US6QR1400035 15 | REM REPLAYGAIN_TRACK_GAIN -4.73 dB 16 | REM REPLAYGAIN_TRACK_PEAK 0.871185 17 | INDEX 01 00:00:00 18 | TRACK 02 AUDIO 19 | TITLE "Ojos Negros" 20 | PERFORMER "Kelvis Ochoa and Descemer Bueno (Cuba)" 21 | SONGWRITER "Ochoa, Kelvis" 22 | ISRC US6QR1400039 23 | REM REPLAYGAIN_TRACK_GAIN -4.27 dB 24 | REM REPLAYGAIN_TRACK_PEAK 0.879761 25 | INDEX 00 04:14:48 26 | FILE "02 Ojos Negros.flac" WAVE 27 | INDEX 01 00:00:00 28 | FILE "03 Nuovo.flac" WAVE 29 | TRACK 03 AUDIO 30 | TITLE "Nuovo" 31 | PERFORMER "Gianmaria Testa (Italy)" 32 | SONGWRITER "TESTA Gianmaria" 33 | ISRC ITG951100001 34 | REM REPLAYGAIN_TRACK_GAIN -2.65 dB 35 | REM REPLAYGAIN_TRACK_PEAK 0.486206 36 | INDEX 01 00:00:00 37 | TRACK 04 AUDIO 38 | TITLE "Lon-Dubh (Blackbird)" 39 | PERFORMER "Julie Fowlis (Scotland)" 40 | SONGWRITER "Lennon, John & McCartney, Paul" 41 | ISRC US6QR1400040 42 | REM REPLAYGAIN_TRACK_GAIN -4.74 dB 43 | REM REPLAYGAIN_TRACK_PEAK 0.701874 44 | INDEX 00 03:15:66 45 | FILE "04 Lon-Dubh (Blackbird).flac" WAVE 46 | INDEX 01 00:00:00 47 | TRACK 05 AUDIO 48 | TITLE "Lluvia Sol" 49 | PERFORMER "Les Babacools (Germany)" 50 | SONGWRITER "Les Babacools" 51 | ISRC US6QR1400041 52 | REM REPLAYGAIN_TRACK_GAIN -2.98 dB 53 | REM REPLAYGAIN_TRACK_PEAK 0.901489 54 | INDEX 00 02:39:48 55 | FILE "05 Lluvia Sol.flac" WAVE 56 | INDEX 01 00:00:00 57 | TRACK 06 AUDIO 58 | TITLE "Gran Intento" 59 | PERFORMER "Mónica Giraldo (Colombia)" 60 | SONGWRITER "Giraldo, Mónica" 61 | ISRC COGY11300077 62 | REM REPLAYGAIN_TRACK_GAIN -4.65 dB 63 | REM REPLAYGAIN_TRACK_PEAK 0.837738 64 | INDEX 00 04:13:71 65 | FILE "06 Gran Intento.flac" WAVE 66 | INDEX 01 00:00:00 67 | TRACK 07 AUDIO 68 | TITLE "Hèmlè" 69 | PERFORMER "Blick Bassy (Cameroon/France)" 70 | SONGWRITER "Bassy, Blick" 71 | ISRC US6QR1400042 72 | REM REPLAYGAIN_TRACK_GAIN -4.72 dB 73 | REM REPLAYGAIN_TRACK_PEAK 0.930603 74 | INDEX 00 03:23:34 75 | FILE "07 Hèmlè.flac" WAVE 76 | INDEX 01 00:00:00 77 | TRACK 08 AUDIO 78 | TITLE "Ny Alantsika" 79 | PERFORMER "Razia Said (Republic of Madagascar)" 80 | SONGWRITER "Said, Razia" 81 | ISRC US6QR1400043 82 | REM REPLAYGAIN_TRACK_GAIN -3.77 dB 83 | REM REPLAYGAIN_TRACK_PEAK 0.707428 84 | INDEX 00 02:50:47 85 | FILE "08 Ny Alantsika.flac" WAVE 86 | INDEX 01 00:00:00 87 | TRACK 09 AUDIO 88 | TITLE "Sinar" 89 | PERFORMER "Rita Lestariani (Indonesia)" 90 | SONGWRITER "Lestariani, Rita; Narayan, Amith" 91 | ISRC USCGH0515792 92 | REM REPLAYGAIN_TRACK_GAIN -4.68 dB 93 | REM REPLAYGAIN_TRACK_PEAK 0.582489 94 | INDEX 00 03:29:54 95 | FILE "09 Sinar.flac" WAVE 96 | INDEX 01 00:00:00 97 | FILE "10 Amarte’Ei.flac" WAVE 98 | TRACK 10 AUDIO 99 | TITLE "Amarte’Ei" 100 | PERFORMER "Fernando Lameirinhas (Portugal/The Netherlands)" 101 | SONGWRITER "Lameirinhas, Fernando" 102 | ISRC US6QR1400044 103 | REM REPLAYGAIN_TRACK_GAIN -2.78 dB 104 | REM REPLAYGAIN_TRACK_PEAK 0.780151 105 | INDEX 01 00:00:00 106 | TRACK 11 AUDIO 107 | TITLE "Beschäftigt Mit Dem Blues" 108 | PERFORMER "Katharine Mehrling (Germany)" 109 | SONGWRITER "Mehrling, Katharine" 110 | ISRC DEA651100008 111 | REM REPLAYGAIN_TRACK_GAIN -2.85 dB 112 | REM REPLAYGAIN_TRACK_PEAK 0.589355 113 | INDEX 00 02:32:21 114 | FILE "11 Beschäftigt Mit Dem Blues.flac" WAVE 115 | INDEX 01 00:00:00 116 | TRACK 12 AUDIO 117 | TITLE "Les Lendemains Mélodieux" 118 | PERFORMER "Pascal Lejeune (Canada)" 119 | SONGWRITER "Lejeuné, Pascal" 120 | ISRC CAB2H0900031 121 | REM REPLAYGAIN_TRACK_GAIN -3.28 dB 122 | REM REPLAYGAIN_TRACK_PEAK 0.700043 123 | INDEX 00 03:34:09 124 | FILE "12 Les Lendemains Mélodieux.flac" WAVE 125 | INDEX 01 00:00:00 126 | -------------------------------------------------------------------------------- /test/cue/Schiller - Day and Night.cue: -------------------------------------------------------------------------------- 1 | REM DATE 2005 2 | REM DISCID 1411B112 3 | REM COMMENT "ExactAudioCopy v1.1" 4 | PERFORMER "Schiller" 5 | TITLE "Day and Night" 6 | FILE "Schiller - Day and Night.flac" WAVE 7 | TRACK 01 AUDIO 8 | TITLE "Welcome" 9 | PERFORMER "Schiller" 10 | INDEX 01 00:00:00 11 | TRACK 02 AUDIO 12 | TITLE "Nightflight" 13 | PERFORMER "Schiller" 14 | INDEX 01 01:09:47 15 | TRACK 03 AUDIO 16 | TITLE "Tired of Being Alone" 17 | PERFORMER "Schiller" 18 | INDEX 01 06:55:22 19 | TRACK 04 AUDIO 20 | TITLE "What's Coming" 21 | PERFORMER "Schiller" 22 | INDEX 01 10:57:36 23 | TRACK 05 AUDIO 24 | TITLE "Sunrise" 25 | PERFORMER "Schiller" 26 | INDEX 01 15:23:43 27 | TRACK 06 AUDIO 28 | TITLE "Miles and Miles" 29 | PERFORMER "Schiller" 30 | INDEX 01 18:36:31 31 | TRACK 07 AUDIO 32 | TITLE "Das Meer" 33 | PERFORMER "Schiller" 34 | INDEX 01 22:30:57 35 | TRACK 08 AUDIO 36 | TITLE "I Know (feat. Jette Von Roth)" 37 | PERFORMER "Schiller" 38 | INDEX 01 27:21:18 39 | TRACK 09 AUDIO 40 | TITLE "Morning Dew" 41 | PERFORMER "Schiller" 42 | INDEX 01 32:19:36 43 | TRACK 10 AUDIO 44 | TITLE "Berlin Bombay" 45 | PERFORMER "Schiller" 46 | INDEX 01 36:22:07 47 | TRACK 11 AUDIO 48 | TITLE "The Smile" 49 | PERFORMER "Schiller" 50 | INDEX 01 41:11:63 51 | TRACK 12 AUDIO 52 | TITLE "Lightstorm (feat. Kim Sanders)" 53 | PERFORMER "Schiller" 54 | INDEX 01 44:26:20 55 | TRACK 13 AUDIO 56 | TITLE "Falling" 57 | PERFORMER "Schiller" 58 | INDEX 01 47:45:33 59 | TRACK 14 AUDIO 60 | TITLE "Rings of Time" 61 | PERFORMER "Schiller" 62 | INDEX 01 53:02:26 63 | TRACK 15 AUDIO 64 | TITLE "I Saved You (feat. Kim Sanders)" 65 | PERFORMER "Schiller" 66 | INDEX 01 56:52:66 67 | TRACK 16 AUDIO 68 | TITLE "Misguiding Light" 69 | PERFORMER "Schiller" 70 | INDEX 01 61:31:43 71 | TRACK 17 AUDIO 72 | TITLE "Fireworks" 73 | PERFORMER "Schiller" 74 | INDEX 01 64:49:60 75 | TRACK 18 AUDIO 76 | TITLE "Sleepy Storm (feat. Jette Von Roth)" 77 | PERFORMER "Schiller" 78 | INDEX 01 69:54:21 79 | -------------------------------------------------------------------------------- /test/cue/Schiller - Zeitreise - Das Beste Von Schiller 1.cue: -------------------------------------------------------------------------------- 1 | REM GENRE Electronic 2 | REM DATE 2016 3 | REM DISCID F0130D12 4 | REM COMMENT "ExactAudioCopy v1.0b4" 5 | CATALOG 0602557156669 6 | PERFORMER "Schiller" 7 | TITLE "Zeitreise - Das Beste Von Schiller" 8 | FILE "Schiller - Zeitreise - Das Beste Von Schiller.flac" WAVE 9 | TRACK 01 AUDIO 10 | TITLE "Zeitreise I" 11 | PERFORMER "Schiller" 12 | ISRC DEUM71604463 13 | INDEX 01 00:00:00 14 | TRACK 02 AUDIO 15 | TITLE "Schwerelos" 16 | PERFORMER "Schiller" 17 | ISRC DEUM71604464 18 | INDEX 01 02:18:06 19 | TRACK 03 AUDIO 20 | TITLE "The Future III" 21 | PERFORMER "Schiller" 22 | ISRC DEUM71604465 23 | INDEX 01 08:37:55 24 | TRACK 04 AUDIO 25 | TITLE "Ile Aye (Mit Stephenie Coker)" 26 | PERFORMER "Schiller" 27 | ISRC DEUM71604466 28 | INDEX 01 14:17:61 29 | TRACK 05 AUDIO 30 | TITLE "Tiefblau" 31 | PERFORMER "Schiller" 32 | ISRC DEUM71604467 33 | INDEX 01 18:30:17 34 | TRACK 06 AUDIO 35 | TITLE "Der Tag...Du Bist Erwacht (Mit Jette Von Roth)" 36 | PERFORMER "Schiller" 37 | ISRC DEUM71604468 38 | INDEX 01 23:39:14 39 | TRACK 07 AUDIO 40 | TITLE "Sommerregen" 41 | PERFORMER "Schiller" 42 | ISRC DEUM71604469 43 | INDEX 01 27:56:71 44 | TRACK 08 AUDIO 45 | TITLE "Playing With Madness (Mit Mia Bergstroem)" 46 | PERFORMER "Schiller" 47 | ISRC DEUM71604470 48 | INDEX 01 31:39:71 49 | TRACK 09 AUDIO 50 | TITLE "Leben...I Feel You (Mit Heppner)" 51 | PERFORMER "Schiller" 52 | ISRC DEUM71604471 53 | INDEX 01 36:41:28 54 | TRACK 10 AUDIO 55 | TITLE "In Der Weite" 56 | PERFORMER "Schiller" 57 | ISRC DEUM71604472 58 | INDEX 01 40:31:67 59 | TRACK 11 AUDIO 60 | TITLE "Ultramarin" 61 | PERFORMER "Schiller" 62 | ISRC DEUM71604473 63 | INDEX 01 46:04:12 64 | TRACK 12 AUDIO 65 | TITLE "Berlin - Moskau" 66 | PERFORMER "Schiller" 67 | ISRC DEUM71604474 68 | INDEX 01 50:51:28 69 | TRACK 13 AUDIO 70 | TITLE "Salton Sea" 71 | PERFORMER "Schiller" 72 | ISRC DEUM71604475 73 | INDEX 01 55:24:18 74 | TRACK 14 AUDIO 75 | TITLE "Mitternacht" 76 | PERFORMER "Schiller" 77 | ISRC DEUM71604476 78 | INDEX 01 60:13:40 79 | TRACK 15 AUDIO 80 | TITLE "Polarstern" 81 | PERFORMER "Schiller" 82 | ISRC DEUM71604477 83 | INDEX 01 64:41:65 84 | TRACK 16 AUDIO 85 | TITLE "Once Upon A Time" 86 | PERFORMER "Schiller" 87 | ISRC DEUM71604478 88 | INDEX 01 69:10:68 89 | TRACK 17 AUDIO 90 | TITLE "Dream Of You (Mit Heppner)" 91 | PERFORMER "Schiller" 92 | ISRC DEUM71604479 93 | INDEX 01 72:59:57 94 | TRACK 18 AUDIO 95 | TITLE "Denn Wer Liebt (Mit Anna Maria Muehe)" 96 | PERFORMER "Schiller" 97 | ISRC DEUM71604480 98 | INDEX 01 76:57:08 99 | -------------------------------------------------------------------------------- /test/cue/sample-win.cue: -------------------------------------------------------------------------------- 1 | CATALOG 3898347789120 2 | CDTEXTFILE "C:\LONG FILENAME.CDT" 3 | PERFORMER "Sample performer" 4 | SONGWRITER "Sample songwriter" 5 | TITLE "Sample title" 6 | REM Comment in toplevel 7 | 8 | FILE "sample file.ape" WAVE 9 | TRACK 01 AUDIO 10 | FLAGS DCP PRE 11 | ISRC ABCDE1234567 12 | TITLE "Sample track 1" 13 | PERFORMER "Sample performer" 14 | SONGWRITER "Sample songwriter" 15 | PREGAP 00:02:00 16 | INDEX 00 00:00:00 17 | INDEX 01 00:00:33 18 | POSTGAP 00:02:00 19 | 20 | TRACK 02 AUDIO 21 | TITLE "Sample track 2" 22 | PERFORMER "Sample performer" 23 | SONGWRITER "Sample songwriter" 24 | INDEX 00 00:05:10 25 | INDEX 01 00:05:23 26 | REM Comment in track 27 | -------------------------------------------------------------------------------- /test/cue/sample.cue: -------------------------------------------------------------------------------- 1 | CATALOG 3898347789120 2 | CDTEXTFILE "C:\LONG FILENAME.CDT" 3 | PERFORMER "Sample performer" 4 | SONGWRITER "Sample songwriter" 5 | TITLE "Sample title" 6 | REM Comment in toplevel 7 | 8 | FILE "sample file.ape" WAVE 9 | TRACK 01 AUDIO 10 | FLAGS DCP PRE 11 | ISRC ABCDE1234567 12 | TITLE "Sample track 1" 13 | PERFORMER "Sample performer" 14 | SONGWRITER "Sample songwriter" 15 | PREGAP 00:02:00 16 | INDEX 00 00:00:00 17 | INDEX 01 00:00:33 18 | POSTGAP 00:02:00 19 | 20 | TRACK 02 AUDIO 21 | TITLE "Sample track 2" 22 | PERFORMER "Sample performer" 23 | SONGWRITER "Sample songwriter" 24 | INDEX 00 00:05:10 25 | INDEX 01 00:05:23 26 | REM Comment in track 27 | 28 | TRACK 03 AUDIO 29 | TITLE "Sample track 3" 30 | PERFORMER "Sample performer" 31 | SONGWRITER "Sample songwriter" 32 | INDEX 00 9999:05:10 33 | INDEX 01 9999:05:23 34 | REM Comment in track 35 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const expect = require('expect.js'); 3 | const parser = require('../lib/cue'); 4 | 5 | describe('cue-parser', function () { 6 | let sheet; 7 | 8 | const cueDir = path.join(__dirname, 'cue'); 9 | 10 | describe('it should parse windows files with', () => { 11 | 12 | it('should skip newlines', function () { 13 | sheet = parser.parse(path.join(cueDir, '/sample-win.cue')); 14 | 15 | expect(sheet.catalog).to.be('3898347789120'); 16 | 17 | expect(sheet.files).to.be.an('array'); 18 | expect(sheet.files).to.have.length(1); 19 | expect(sheet.files[0].name).to.be('sample file.ape'); 20 | expect(sheet.files[0].type).to.be('WAVE'); 21 | 22 | const tracks = sheet.files[0].tracks; 23 | 24 | expect(tracks).to.be.an('array'); 25 | expect(tracks).to.have.length(2); 26 | 27 | expect(tracks[1].number).to.be(2); 28 | expect(tracks[1].type).to.be('AUDIO'); 29 | }); 30 | }); 31 | 32 | describe('it should parse linux files with', () => { 33 | beforeEach(() => { 34 | sheet = parser.parse(path.join(cueDir, '/sample.cue')); 35 | }); 36 | 37 | it('should parse CATALOG', () => { 38 | expect(sheet.catalog).to.be('3898347789120'); 39 | }); 40 | 41 | it('should parse CDTEXTFILE', () => { 42 | expect(sheet.cdTextFile).to.be('C:\\LONG FILENAME.CDT'); 43 | }); 44 | 45 | it('should parse FILE', () => { 46 | expect(sheet.files).to.be.an('array'); 47 | expect(sheet.files).to.have.length(1); 48 | expect(sheet.files[0].name).to.be('sample file.ape'); 49 | expect(sheet.files[0].type).to.be('WAVE'); 50 | }); 51 | 52 | it('should parse Disk PERFORMER', () => { 53 | expect(sheet.performer).to.be('Sample performer'); 54 | }); 55 | 56 | it('should parse Disk SONGWRITER', () => { 57 | expect(sheet.songWriter).to.be('Sample songwriter'); 58 | }); 59 | 60 | it('should parse Disk TITLE', () => { 61 | expect(sheet.title).to.be('Sample title'); 62 | }); 63 | 64 | it('should parse all tracks of the file', () => { 65 | const tracks = sheet.files[0].tracks; 66 | 67 | expect(tracks).to.be.an('array'); 68 | expect(tracks).to.have.length(3); 69 | 70 | expect(tracks[0].number).to.be(1); 71 | expect(tracks[0].type).to.be('AUDIO'); 72 | 73 | expect(tracks[1].number).to.be(2); 74 | expect(tracks[1].type).to.be('AUDIO'); 75 | 76 | expect(tracks[2].number).to.be(3); 77 | expect(tracks[2].type).to.be('AUDIO'); 78 | }); 79 | 80 | it('should parse all REMs', () => { 81 | expect(sheet.rem).to.be.an('array'); 82 | expect(sheet.rem[0]).to.be('Comment in toplevel'); 83 | expect(sheet.rem[1]).to.be('Comment in track'); 84 | }); 85 | 86 | describe('track detail infos', () => { 87 | let track1, track2, track3; 88 | 89 | beforeEach(function () { 90 | const tracks = sheet.files[0].tracks; 91 | 92 | track1 = tracks[0]; 93 | track2 = tracks[1]; 94 | track3 = tracks[2]; 95 | }); 96 | 97 | it('should parse FLAGS', function () { 98 | expect(track1.flags).to.be.an('array'); 99 | expect(track1.flags[0]).to.be('DCP'); 100 | expect(track1.flags[1]).to.be('PRE'); 101 | }); 102 | 103 | it('should parse track ISRC', function () { 104 | expect(track1.isrc).to.be('ABCDE1234567'); 105 | expect(track2.isrc).to.be(null); 106 | }); 107 | 108 | it('should parse track TITLE', function () { 109 | expect(track1.title).to.be('Sample track 1'); 110 | expect(track2.title).to.be('Sample track 2'); 111 | expect(track3.title).to.be('Sample track 3'); 112 | }); 113 | 114 | it('should parse track PERFORMER', function () { 115 | expect(track1.performer).to.be('Sample performer'); 116 | expect(track2.performer).to.be('Sample performer'); 117 | }); 118 | 119 | it('should parse track SONGWRITER', function () { 120 | expect(track1.songWriter).to.be('Sample songwriter'); 121 | expect(track2.songWriter).to.be('Sample songwriter'); 122 | }); 123 | 124 | it('should parse track INDEX', function () { 125 | expect(track1.indexes).to.have.length(2); 126 | expect(track1.indexes[0].number).to.be(0); 127 | expect(track1.indexes[0].time).to.eql({min: 0, sec: 0, frame: 0}); 128 | expect(track1.indexes[1].number).to.be(1); 129 | expect(track1.indexes[1].time).to.eql({min: 0, sec: 0, frame: 33}); 130 | 131 | expect(track2.indexes).to.have.length(2); 132 | expect(track2.indexes[0].number).to.be(0); 133 | expect(track2.indexes[0].time).to.eql({min: 0, sec: 5, frame: 10}); 134 | expect(track2.indexes[1].number).to.be(1); 135 | expect(track2.indexes[1].time).to.eql({min: 0, sec: 5, frame: 23}); 136 | 137 | expect(track3.indexes).to.have.length(2); 138 | expect(track3.indexes[0].number).to.be(0); 139 | expect(track3.indexes[0].time).to.eql({min: 9999, sec: 5, frame: 10}); 140 | expect(track3.indexes[1].number).to.be(1); 141 | expect(track3.indexes[1].time).to.eql({min: 9999, sec: 5, frame: 23}); 142 | }); 143 | 144 | it('should parse track PREGAP', function () { 145 | expect(track1.pregap).to.eql({min: 0, sec: 2, frame: 0}); 146 | expect(track2.pregap).to.be(null); 147 | }); 148 | 149 | it('should parse track POSTGAP', function () { 150 | expect(track1.postgap).to.eql({min: 0, sec: 2, frame: 0}); 151 | expect(track2.postgap).to.be(null); 152 | }); 153 | }); 154 | }); 155 | 156 | describe('it should parse EAC generated CUE files', function () { 157 | 158 | it('parse: Frank Boeijen - Palermo - CD1.eac.cue', function () { 159 | sheet = parser.parse(path.join(cueDir, 'Frank Boeijen - Palermo - CD1.eac.cue')); 160 | expect(sheet.performer).to.be('Frank Boeijen'); 161 | expect(sheet.title).to.be('Palermo'); 162 | expect(sheet.files.length).to.be(10); 163 | }); 164 | 165 | it('parse: Frank Boeijen Groep - Welkom In Utopia', function () { 166 | sheet = parser.parse(path.join(cueDir, 'Frank Boeijen Groep - Welkom In Utopia.eac.cue')); 167 | expect(sheet.performer).to.be('Frank Boeijen Groep'); 168 | expect(sheet.title).to.be('Welkom In Utopia'); 169 | expect(sheet.files.length).to.be(11); 170 | }); 171 | }); 172 | 173 | describe('it should parse XLD generated CUE files', function () { 174 | 175 | it('parse: Putumayo Presents - Yoga Lounge', function () { 176 | sheet = parser.parse(path.join(cueDir, 'Putumayo Presents - Yoga Lounge.xld.cue')); 177 | expect(sheet.files.length).to.be(12); 178 | 179 | const file_track_1 = sheet.files[0]; 180 | expect(file_track_1.tracks.length).to.be(1); 181 | expect(file_track_1.tracks[0].title).to.be('Dreamcatcher'); 182 | expect(file_track_1.tracks[0].performer).to.be('Bahramji & Maneesh De Moor'); 183 | }); 184 | }); 185 | 186 | describe('Support text encoding', function () { 187 | 188 | it('should be able to decode "UTF-8"', function () { 189 | sheet = parser.parse(path.join(cueDir, 'Putumayo Presents Café Del Mundo.cue')); 190 | 191 | expect(sheet.encoding).to.be('UTF-8'); 192 | 193 | const file_track_7 = sheet.files[6]; 194 | expect(file_track_7.tracks.length).to.be(1); 195 | expect(file_track_7.tracks[0].number).to.be(7); 196 | expect(file_track_7.name).to.be('07 Hèmlè.flac') 197 | }); 198 | 199 | it('should be able to decode "ISO-8859-1"', function () { 200 | sheet = parser.parse(path.join(cueDir, 'Paco de Lucía - Fuente y Caudal.eac.cue')); 201 | 202 | expect(sheet.encoding).to.be('ISO-8859-1'); 203 | 204 | expect(sheet.files.length).to.be(8); 205 | 206 | const file_track_4 = sheet.files[3]; 207 | expect(file_track_4.tracks.length).to.be(1); 208 | expect(file_track_4.tracks[0].number).to.be(4); 209 | expect(file_track_4.tracks[0].title).to.be('Solera (Bulería por Soleá)'); 210 | expect(file_track_4.tracks[0].performer).to.be('Paco de Lucía'); 211 | }); 212 | 213 | }); 214 | 215 | describe('issue #22', function () { 216 | 217 | it('Michael Kiwanuka - Love And Hate"', () => { 218 | sheet = parser.parse(path.join(cueDir, 'Michael Kiwanuka - Love And Hate.cue')); 219 | 220 | expect(sheet.encoding).to.be('ISO-8859-1'); 221 | expect(sheet.performer).to.be('Michael Kiwanuka'); 222 | expect(sheet.title).to.be('Love And Hate'); 223 | expect(sheet.files.length).to.be(1); 224 | const tracks = sheet.files[0].tracks; 225 | expect(tracks.length).to.be(10); 226 | }); 227 | 228 | it('Schiller - Day and Night.cue', () => { 229 | sheet = parser.parse(path.join(cueDir, 'Schiller - Day and Night.cue')); 230 | 231 | expect(sheet.encoding).to.be('ISO-8859-1'); 232 | expect(sheet.performer).to.be('Schiller'); 233 | expect(sheet.title).to.be('Day and Night'); 234 | 235 | expect(sheet.files.length).to.be(1); 236 | const tracks = sheet.files[0].tracks; 237 | expect(tracks.length).to.be(18); 238 | }); 239 | 240 | it('Schiller - Zeitreise - Das Beste Von Schiller 1.cue', () => { 241 | sheet = parser.parse(path.join(cueDir, 'Schiller - Zeitreise - Das Beste Von Schiller 1.cue')); 242 | 243 | expect(sheet.encoding).to.be('ISO-8859-1'); 244 | expect(sheet.performer).to.be('Schiller'); 245 | expect(sheet.title).to.be('Zeitreise - Das Beste Von Schiller'); 246 | 247 | expect(sheet.files.length).to.be(1); 248 | const tracks = sheet.files[0].tracks; 249 | expect(tracks.length).to.be(18); 250 | }); 251 | 252 | }); 253 | 254 | }); 255 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "inlineSources": false, 4 | "module": "commonjs", 5 | "moduleResolution": "node", 6 | "target": "ES2017", 7 | "sourceMap": true 8 | } 9 | } 10 | 11 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint:latest", 3 | "rules": { 4 | "curly": false, 5 | "max-classes-per-file": [false], 6 | "semicolon": [true, "always", "ignore-interfaces"], 7 | "quotemark": false, 8 | "trailing-comma": [true, {"multiline": "never", "singleline": "never"}], 9 | "object-literal-key-quotes": [true, "as-needed"], 10 | "variable-name": [true, "ban-keywords"], 11 | "object-literal-sort-keys": false, 12 | "max-line-length": [true, 200], 13 | "switch-default": false, 14 | "prefer-for-of": false, 15 | "ordered-imports": false, 16 | "forin": false, 17 | "arrow-parens": [true, "ban-single-arg-parens"], 18 | "no-implicit-dependencies": [true, "dev"], 19 | "no-var-requires": true, 20 | "no-console": false 21 | } 22 | } --------------------------------------------------------------------------------