Извлечение экспорта машинописного текста в файл json с использованием gulp

У меня есть несколько машинописных файлов, некоторые из них экспортируют определенную переменную с именем APIS, которая представляет собой массив объектов. Я хочу извлечь значения всех этих экспортов и передать их в файл json, используя gulp.

Например, у меня есть папка с именем services, с 3 файлами: service1.ts, service2.ts, service3.ts.

service1.ts:

...
export const APIS = [ { "field1" : "blabla" } ];

service2.ts:

...
export const APIS = [ { "field2" : "yadayada" }, { "field3" : "yadabla" } ];

service3.ts: - не экспортирует APIS var.

Я хочу использовать gulp в oder для создания файла json, который выглядит примерно так:

[ { "field1" : "blabla" }, { "field2" : "yadayada" }, { "field3" : "yadabla" } ]

gulpfile.js - это??? является заполнителем для отсутствующего кода.

gulp.task('default', function () {
    return gulp.src('.../services/*.ts')
            .pipe(???)
            .pipe(concat('export.json'))
            .pipe(gulp.dest('./test'));
});

Я новичок и в машинописи, и в глотке, так что я не уверен, как этого добиться... есть идеи?:)

РЕДАКТИРОВАТЬ: Итак, я понимаю, что для этого нет решения OOTB, и мне нужно написать свою собственную задачу / плагин. Я не совсем уверен, как этого добиться. В идеале, я хочу найти плагин gulp (или комбинацию плагинов), который может обрабатывать файлы ts / js как объекты со свойствами. Затем я могу извлечь нужную мне переменную из файла.

Я не мог найти что-то подобное, только плагины для работы со строками. Мне кажется, что обрабатывать мой файл ts как строку и использовать поиск с регулярным выражением слишком сложно. Есть что-то, чего я здесь не хватает? Есть ли более простой способ сделать это?

2 ответа

Решение

Это то, что я в итоге сделал, и это сработало для меня. Я помещаю это здесь в случае, если кто-то еще находит это полезным.:)

Вместо.ts я сохранил экспорт в файлы.js, а именно:

service2.export.js:

exports.APIS = [ { "field2" : "yadayada" }, { "field3" : "yadabla" } ];

Основываясь на ответе, приведенном здесь: /questions/29888937/dostup-k-znacheniyam-peremennyih-v-fajle-mashinopisi-s-pomoschyu-gulp/29888953#29888953 я создал задачу gulp следующим образом:

var gulp = require('gulp');
var concat = require('gulp-concat');
var map = require('gulp-map');
var fs = require('fs');

var allServices;

gulp.task('default', function() {

    var allServices = [];

    var stream = gulp.src('./**/*.export.js')
        .pipe(map(function(file) {
            var obj = require(file.path);
            if (obj.APIS != null) {
                allServices.push.apply(allServices, obj.APIS);
            }
            return file;
        }));

    stream.on("end", function (cb)
    {   
        fs.writeFile('./export.json', JSON.stringify(allServices), cb);
    });

    return stream;
});

и теперь я получаю следующий вывод в export.json:

[ { "field1" : "blabla" }, { "field2" : "yadayada" }, { "field3" : "yadabla" } ]

это именно то, что я хотел.

Здесь уместен API компилятора машинописного текста, поскольку это то, что вам нужно для правильного анализа и понимания ts-кода. К сожалению, я не думаю, что есть плагин gulp, который реализует этот API.

Я думаю, что вам лучше всего полностью изменить стратегию и решить свою проблему другим способом или использовать регулярные выражения, чтобы попытаться извлечь нужные вам константы. Если вы не хотите написать свой собственный плагин gulp, используя API компилятора.

Другие вопросы по тегам