function parser(file, callback) {
    // file exit conditions
    if (file.isNull()) {
        return callback(null, file); // pass along
    }

    if (file.isStream()) {
        return callback(new Error('Streaming not supported'));
    }

    try {
        /** @type {string} */
        let text = String(file.contents.toString('utf8'));
        let lines = text.split('\n');
        let filename = file.path.slice(0, -4);
        let key = 'server' + path.sep + 'documents';
        let position = filename.indexOf(key);

        // exit conditions
        if (!lines) {
            return;
        }
        if (position < 0) {
            return callback(null, file);
        }

        filename = filename.slice(position + key.length + 1, filename.length).replaceAll(path.win32.sep, path.posix.sep);

        let lineCount = lines.length;
        let active = false;
        let yaml = [];
        let categories = [
            'UI Element',
            'UI Global',
            'UI Collection',
            'UI View',
            'UI Module',
            'UI Behavior',
        ];
        let index;
        let meta;
        let line;

        for (index = 0; index < lineCount; index++) {
            line = lines[index];

            // Wait for metadata block to begin
            if (!active) {
                if (startsWith(line, '---')) {
                    active = true;
                }

                continue;
            }
            // End of metadata block, stop parsing.
            if (startsWith(line, '---')) {
                break;
            }
            yaml.push(line);
        }

        // Parse yaml.
        meta = YAML.load(yaml.join('\n'));
        if (meta && meta.type && meta.title && inArray(meta.type, categories)) {
            meta.category = meta.type;
            meta.filename = filename;
            meta.url = '/' + filename;
            // Primary key will be filepath
            data[meta.element.toLowerCase()] = meta;
        }
    } catch (error) {
        console.log(error, file.path);
    }

    callback(null, file);
}
Parses a file for metadata and stores result in a data object.
@param {File} file - object provided by map-stream.
@param {function(?,File)} - callback provided by map-stream to
reply when done.