Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Collection – фреймворк для управления данными (https://javascript.ru/forum/project/27848-collection-%E2%80%93-frejjmvork-dlya-upravleniya-dannymi.html)

kobezzza 26.04.2012 21:54

Collection – фреймворк для управления данными
 
Всем привет!:)

Хочу представить всем свою разработку (хотя уже как то представлял давно, но тема забилась оффтопом).

Данный фреймворк даёт очень мощное и гибкое АПИ для управлениями данными, в принципе есть всё, чтобы использовать, как полноценную СУБД.

Краткий список возможностей:
  1. Копирование, перемещение, удаление, слияние, сортировка и группировка;
  2. Статистические функции;
  3. Запросы по сложным фильтрам;
  4. Хранение данных в DOM Storage;
  5. Пространства имён;
  6. DOM шаблонизатор;
  7. Интерпретатор SQL.

Фреймворк написан на чистом JavaScript, однако для работы с DOM он использует сторонние библиотеки (для поиска узлов), из коробки есть поддержка: jQuery, DoJo, Mootools, Prototype, QSA (надеюсь Devote не против:) ), Sizzle. Хотя расширить этот список не составит труда.

Сфера применения огромна: например используя Collection можно за пару дней написать очень мощный табличный процессор, оффлайн БД для настольных приложений и т.д.. Сейчас я занимаюсь одним стартапом, где пробую свой велосипед на сервере (node.js), как основную СУБД, также Collection используется в некоторых сервисах Yandex.

Имеется подробный мануал и документация на сайте проекте: http://www.collection-js.com

Сама либа: http://www.collection-js.com/files/c...lection.min.js
Github: https://github.com/kobezzza/Collection

Чтобы понять, что же это такое, рекомендую прочитать: http://www.collection-js.com/manual/part-1.html

С уважением, Андрей!

ЗЫ: просьба не разводить холивар и оффтоп.

B~Vladi 27.04.2012 22:45

Цитата:

Сообщение от kobezzza
надеюсь Devote не против

Думаю, он будет только рад :)

Какие заметные отличия от похожего инструмента Follow.js?

Kolyaj 27.04.2012 23:32

Цитата:

Сообщение от B~Vladi
Какие заметные отличия от похожего инструмента Follow.js?

В коридор выйдите оба и поговорите. Вы в соседних комнатах сидите :)

B~Vladi 27.04.2012 23:33

Цитата:

Сообщение от Kolyaj
В коридор выйдите оба и поговорите. Вы в соседних комнатах сидите

Он сейчас в отпуске :)
Да и другим, возможно, интересно :)

Кстати, чувак, который это делал, рядом со мной сидит.

trikadin 27.04.2012 23:45

Цитата:

Сообщение от Kolyaj
В коридор выйдите оба и поговорите. Вы в соседних комнатах сидите

Ты сделал мою ночь)

B~Vladi 28.04.2012 00:07

Цитата:

Сообщение от trikadin
Ты сделал мою ночь)

Эмм, переведи?

kobezzza 28.04.2012 00:15

Цитата:

Сообщение от B~Vladi (Сообщение 171656)
Какие заметные отличия от похожего инструмента Follow.js?

Не знал про данную либу, посмотрел, интересно:) Но всё же у нас с ней мало чего общего, т.к. у меня основной упор делается именно на управление данными (т.е. я действительно очень серьёзно к этому подошёл, возможны перекрёстные ссылки, лимитируемость, группировки и т.д.), а не на их представление.

Изначально, когда я начинал писать свой Collection, мне нужен был только общий интерфейс стандартных методов для массивов и объектов, затем меня увлекла идея написания своей СУБД на JS, которая могла бы работать как на клиенте, так и на сервере.

Пример некоторого запроса на моём Collection:
// создадим новую коллекцию (структура может быть любой)
var db = new Collection({
	users: [
		{name: 'Андрей', age: 22},
		{name: 'Вася', age: 25},
		{name: 'Гоша', age: 19},
		{name: 'Петя', age: 27},
		{name: 'Стас', age: 23}
	],
	nmb: [1, 2, 3, 4, 5]
});

// запросим данные из кластера users о всех людях старше 20-ти и моложе 25-ти
// затем сохраним данные в новую коллекцию в стеке (назовём test) и назначим её активной
db.get('users >> :el.age > 20 && el.age < 25', '>>>test');
// теперь отсортируем по полю name
db.sort('name');


Чтобы понять что за магия с символами и т.д. достаточно прочитать мануал: http://www.collection-js.com/manual/part-1.html (там 10 глав, не более 30-ти минут чтения).

Я потратил на разработку сего чуда почти 3 года и последние 2 месяца трудился над мануалом и докой, хотелось бы услышать критику что ли) Ну а так, на следующем js meetup я уже обязательно про неё расскажу сам)

ЗЫ: завтра я уже выйду на работу, т.к. отпуск брал только на 5 дней)

B~Vladi 28.04.2012 00:32

Ну на следующем митапе я тоже собираюсь рассказать про свой адский шаблонизатор.
Вообще, идея агрегирования обработки данных мне понравилась, пугает только синтаксис запросов - далеко не самый низкий порог вхождения. Например мне не понятно почему при первом вхождении el используется двоеточие, а потом нет?

Gozar 28.04.2012 09:17

Цитата:

Сообщение от B~Vladi (Сообщение 171679)
почему при первом вхождении el используется двоеточие, а потом нет?

Я по началу думал, что:
чтобы найти в строке управляющую конструкцию, а затем её просто запоминаем и нет нужды указывать двоеточие дальше.

А затем натолкнулся на вот эту строку:
'(:el.sex == "female" && el.age > 18) || (:el.sex == "male" && el.age < 30)'


А потом я наткнулся на такую строчку:
':el == <:i:>'


Может я не нашел, но в учебнике напрочь отсутствует сгруппированное объяснение всех этих конструкций: ':el', '<:i:>'
и принцип парсера строки(как например в доке mysql) или просьба ткнуть меня носом.

Ещё у меня вопрос:
collection умеет работать с типами: "дата","время"?

По возрасту и прайсам всё понятно, 12 и т.д. целые числа, а по сложнее, с плавающей точкой например или дата и время?

зы: смотрел быстро, мог не найти где это описано, но я не нашёл.
зы2: по ссылке(
Цитата:

Сообщение от kobezzza
Чтобы понять что за магия с символами и т.д. достаточно прочитать мануал: http://www.collection-js.com/manual/part-1.html (там 10 глав, не более 30-ти минут чтения).

) ходил, не дошло про магию с символами.

Kolyaj 28.04.2012 09:22

Цитата:

Сообщение от kobezzza
где пробую свой велосипед на сервере (node.js), как основную СУБД

А как это на сервере работает? Всё в памяти хранится?

kobezzza 28.04.2012 09:29

На самом деле синтаксис очень простой, постараюсь в двух словах объяснить:)

Допустим у нас есть коллекция:
var db = new Collection([1, 2, 3, 4, [1, 2, 3]]);


Первый способ, обращение по прямой ссылке:
// обратимся к первому элементу вложенного массива
// функция eq выбирает элемент не по ключу, а по порядку
// минус указывает, что отсчёт идёт с конца
// знак > указывает родительское отношение
db.get('eq(-1) > 0');


Второй способ, итеративный поиск с помощью функции callback:
// выберем элементы с чётными индексами
db.get(function (el, key, data, i, length, cObj, id) {
    return i % 2 === 0;
});


Третий способ схож со вторым, т.к. здесь тоже итеративный обход, но вместо прямого указания функции, мы пишем её, строчное сокращение:
// знак : обозначает, что это идёт строчное сокращение, т.е. в нашем случае оно равносильно return
db.get(':i % 2 === 0');

// логично, что мы можем написать и так
db.get(':i % 2 === 0 && el !== 2');

// или так, но здесь компилятор уже создаст 2 разных функции
// вложенность скобок не ограниченна, можно использовать операторы логики: !, &&, ||
db.get('(:i % 2 === 0) && (:el !== 2)');

// также фильтр можно заранее сохранить в стеки (как и многое другое) и обращаться по ИД
// функцию можно указывать в строчном или в явном виде, функция может содержать другие функции
db.pushFilter('odd', ':i % 2 === 0');

// используем фильтр odd и дополнительное условие
db.get('odd && (:el !== 2)');

// вызов фильтра в фильтре
db.pushFilter('filter2', 'odd && (:i % 2 === 0)');

db.get('filter2');


А последний способ - это указание контекста для фильтра, формула написания такова: контекст + >> + условие. Разумеется - это лишь малая часть возможностей, но сегодня буду писать статью на Хабр, где всё ёмкостно опишу в 1-й статье, а для подробного изучения есть мануал и дока.

kobezzza 28.04.2012 09:39

Цитата:

Сообщение от Kolyaj (Сообщение 171716)
А как это на сервере работает? Всё в памяти хранится?

Сама БД крутится в оперативе, хранится в файлах на жёстком диске, принцип позаимствовал у нашего метража)

Цитата:

Сообщение от Gozar (Сообщение 171714)
А потом я наткнулся на такую строчку:
':el == <:i:>'

про :el - описал выше, а <:i:> - это короткий вызов переменной из стека. Дело в том, что для многих параметров Collection есть своё хранилище (стек), чтобы можно было инкапсулировать все данные внутри экземпляра и есть стек переменных, куда мы можем пихать всё, что угодно, например:

db.pushVariable({
  CONST1: 1,
  CONST2: 2
});

// выбрать все элементы, где значения элементов равны CONST1
db.get(':el === <:CONST1:>');

// или так
db.get(':el === this.getVariable("CONST1")');

// или так
db.get(function (el) {
    return el === this.getVariable('CONST1');
});

kobezzza 28.04.2012 09:43

Цитата:

Сообщение от Gozar (Сообщение 171714)
Может я не нашел, но в учебнике напрочь отсутствует сгруппированное объяснение всех этих конструкций: ':el', '<:i:>'
и принцип парсера строки(как например в доке mysql) или просьба ткнуть меня носом.

Ещё у меня вопрос:
collection умеет работать с типами: "дата","время"?

В главах 1, 2 и 9, хотя действительно, может логично сделать про это отдельную главу.

По второму вопросу: кстати нет, и это действительно упущение, спасибо за наводку!:)

Kolyaj 28.04.2012 09:44

Цитата:

Сообщение от kobezzza
Сама БД крутится в оперативе, хранится в файлах на жёстком диске

А если большая будет? Она же будет большая, иначе какая это БД.
Как часто на диск сбрасывается?

kobezzza 28.04.2012 09:46

Цитата:

Сообщение от Kolyaj (Сообщение 171722)
А если большая будет? Она же будет большая, иначе какая это БД.
Как часто на диск сбрасывается?

Ну этот вариант точно не подходит на все случаи жизни, а только в конкретных, сам механизм сохранения пока в процессе, смотрю как делают всякие там MongoDB и т.д. :)

Gozar 28.04.2012 09:58

Спасибо за пояснение, теперь стал более понятен синтаксис. Про хранение бд, тоже интересно.
Цитата:

Сообщение от kobezzza
буду писать статью на Хабр, где всё ёмкостно опишу в 1-й статье, а для подробного изучения есть мануал и дока.

Я бы хотел видеть объяснение на твоем сайте, на Хабре всё потеряется со временем. jQuery мануал же не на Хабре храниться :) Я врядли вспомню где на хабре видел статью с описанием, а вот твой сайт найду быстрее и возможно очень много людей сделает точно также как я.

А в остальном, мне понравилось и буду следить за развитием проекта.

Kolyaj 28.04.2012 09:59

Можно вот ещё покопать https://github.com/sergeyksv/alfred

kobezzza 28.04.2012 10:04

Спасибо за поддержку! В 4-й версии добавлю волшебный метод query, который на вход будет принимать SQL запрос. Интепретатор уже написан, но пока содержит много багов, будут вложенные запросы, переменные, стат функции, триггеры, хранимые процедуры и т.д. За стандарт SQL взял MySQL:)

vadim5june 02.05.2012 15:32

Есть SQLite в браузере
Какое то сравнение с ней можете сделать?
Dom storage наcколько я помню ограничена 5 mb
а в database storage (SQLite) ограничений не ннашел-реально храню до 100 mb

kobezzza 02.05.2012 17:58

Цитата:

Сообщение от vadim5june (Сообщение 172393)
Есть SQLite в браузере
Какое то сравнение с ней можете сделать?
Dom storage наcколько я помню ограничена 5 mb
а в database storage (SQLite) ограничений не ннашел-реально храню до 100 mb

Ну во первых от SQL Lite отказались в пользу Indexed DB, потом это чудо есть только в новых браузерах и с JS оно взаимодействует с помощью специального внешнего АПИ, т.е. это часть окружения JS, а именно браузера.

Мою же библиотеку можно рассматривать с разных сторон: как мега-интерфейс для различных операций с объектами и массивами, либо абстрактно представить как СУБД. Тип использования, как и структура данных полностью на усмотрения разработчика. Ядро библиотеки не использует специфичных объектов окружения, поэтому без проблем будет работать как в браузере, на сервере или как дополнение к ОСи.

Насколько я изучал, то у Indexed DB асинхронный интерфейс вызова и это может быть не удобно в некоторых случаях, а у меня интерфейс полностью синхронный, что упрощает написание кода, НО я специально предусмотрел возможность создания асинхронных надстроек, так что написать расширение не составит труда.

ЗЫ: DOM storage можно расширять, а также можно без труда написать любой другой интерфейс для хранения данных.
ЗЫЗЫ: почти закончил работу над обзорной статьёй и небольшим обновлением :)

vasa_c 02.05.2012 18:47

мне нравится.

только что представили либу, а уже v3.7.1

kobezzza 02.05.2012 18:57

Разработка этой либы ведётся уже несколько лет, отсюда и версия)
Я показывал версии: 2.x и 3.0, но ввиду отсутствия доки народ ничего не понял)

vadim5june 02.05.2012 19:00

Цитата:

Сообщение от kobezzza (Сообщение 172420)
ЗЫ: DOM storage можно расширять, а также можно без труда написать любой другой интерфейс для хранения данных.
ЗЫЗЫ: почти закончил работу над обзорной статьёй и небольшим обновлением :)

Вы используете ведь localStorage-там четкие ограничения не более 5мегабайт и увеличить нельзя-нет такого механизма даже-пока в этом будет проблема
Локальное хранилище
Преимущество вашей базы которая как я понял будет целиком в ОЗУ-очевидны-высокое быстродействие-если я все правильно понял
Проект заинтересовал-буду следить-но для меня главная проблема в практическом применении ограничения в 5мб-у меня текстовые файлы по 1.5-2 мб

kobezzza 02.05.2012 19:07

Цитата:

Сообщение от vadim5june (Сообщение 172428)
Вы используете ведь localStorage-там четкие ограничения не более 5мегабайт и увеличить нельзя-нет такого механизма даже-пока в этом будет проблема
Локальное хранилище
Преимущество вашей базы которая как я понял будет целиком в ОЗУ-очевидны-высокое быстродействие-если я все правильно понял
Проект заинтересовал-буду следить-но для меня главная проблема в практическом применении ограничения в 5мб-у меня текстовые файлы по 1.5-2 мб

Когда хранилище переполнено, многие браузеры предлагают его расширить + можно это изменить явно в настройках браузера. Конечно заставлять пользователя что-то делать - это не круто, здесь я согласен, НО интерфейс сохранения является маааленькой частью либы, и никак не влияет на логику ядра, т.е. мы можем написать сохранения используя например FlashStorage, IndexedDB и т.д.

Я подумаю над добавлением новых хранилищ в браузере.

По поводу скорости: всё зависит от архитектуры самой базы. Можно сделать супер скорость, а можно супер лаги, но я специально не навязывал свою структуру, т.к. потерялась бы универсальность.

kobezzza 03.05.2012 07:20

Вышла версия 3.7.2.

Нововведения и исправления:
  • добавлена поддержка работы с датой;
  • исправлена работа параметра lastIndexOf у итеративных методов.

Для работы с датой добавлено 2 статичных метода: date и between. Формат даты должен проходить Date.parse.

var db = [
    {name: 'aa', date: '2012-05-03T01:36:16.856Z'},
    {name: 'aa2', date: '2011-05-03T01:36:16.856Z'},
    {name: 'aa3', date: '2010-05-03T01:36:16.856Z'}
];

db = new Collection(db);

// получить данные в интервале
// $C - это псевдоним Collection
db.get(':$C.between(el.date, "2010-05-03T01:36:16.856Z", "2012-05-03T01:36:16.856Z")')


Запостил в песочницу хабра статью) Как бы то ни было ссылка на статью будет добавлена на оф. сайт или же (в случае если пост не пройдёт модерацию) размещена там явно.

kobezzza 03.05.2012 17:28

Пост с хабра: http://habrahabr.ru/post/143236/

devote 03.05.2012 17:44

kobezzza,
ты хоть смени версию QSA у себя.. я смотрю у тебя там лежит 1.2.1, но в ней есть один баг вылезающий при работе с селекторами имеющими слешы в контексте поиска. В версии 1.2.2 он исправлен: https://github.com/devote/QSA

kobezzza 03.05.2012 17:45

Цитата:

Сообщение от devote (Сообщение 172558)
kobezzza,
ты хоть смени версию QSA у себя.. я смотрю у тебя там лежит 1.2.1, но в ней есть один баг вылезающий при работе с селекторами имеющими слешы в контексте поиска. В версии 1.2.2 он исправлен: https://github.com/devote/QSA

Ок, перезалью:)

a.malitsky 14.05.2012 12:05

объединение коллекций в запросе get
 
Не понял как эмулировать join (использовать get сразу из нескольких коллекций одного стека). Ткните пожалуйста в нужную страницу учебника.

kobezzza 14.05.2012 19:47

Цитата:

Сообщение от a.malitsky (Сообщение 174402)
Не понял как эмулировать join (использовать get сразу из нескольких коллекций одного стека). Ткните пожалуйста в нужную страницу учебника.

В явном виде интерфейс отсутствует, однако можно использовать для этих целей вложенные запросы (обратите внимание, что один из входных параметров функции условия - это ссылка на сам экземпляр Collection), но лично я гораздо больше люблю использовать подход, когда есть одна коллекция состоящая из многих маленьких, связанных в родительски-дочерних отношениях, а манипуляции идут с помощью добавления в стек различных уровней контекста. Плюсов у такого подхода очень много, но самый главный - это почти мгновенная скорость обработки запросов.

Явный механизм связей между внешними стековыми коллекциями появится в 3.8, которую я думаю завершить на следующей недели.

a.malitsky 28.06.2012 17:14

Банальный вопрос (связанный не только с данным фреймворком) - можно как-нибудь отключить вывод многочисленных предупреждений "anonymous function does not always return a value" в консоли FF по collection.js или придётся смириться? Несколько мешает отладке своих скриптов.

kobezzza 28.06.2012 19:19

Я думаю вам нужно отключить варнинги (предупреждения) JS в настройках отладчика

a.malitsky 23.10.2012 14:05

А что с сайтом? Всё, прощай фреймворк? :) Нужна документация!
Про новую версию уж молчу.

kobezzza 23.10.2012 14:55

Цитата:

Сообщение от a.malitsky (Сообщение 211776)
А что с сайтом? Всё, прощай фреймворк? :) Нужна документация!
Про новую версию уж молчу.

Сайт как раз прикрылся, т.к. почти сделана новая версия и обновляется дока:) Скоро всё снова ок буит:)
Просто пилю после работы, когда есть настроение - вот так и медленно всё.

kobezzza 28.10.2012 20:47

Наконец допилил версию 3.8! Кроме исправления различных багов в новой версии появились следующие фичи:
  • Появился новый метод query, который принимает на вход запрос в SQL синтаксисе;
  • Добавлена поддержка querySelectorAll (нативный DOM драйвер);
  • Увеличена скорость работы некоторых методов;
  • Теперь Collection сжимается в "продвинутом режиме" GCC;
  • Рефакторинг кода и комментариев (теперь комментарии полностью на русском языке, решил не выпендриваться:) );
  • Теперь this в колбеках ссылается на инстанс объекта, а для ссылки на саму функцию была добавлена локальная переменная callee.

Сайт снова работает, однако пока выпилил раздел доки, т.к. хочу её улучшить (пока можно читать комменты в исходниках, тем более, что дока генерится по ним), также пока нету главы в учебнике по методу query, но он, как и дока появится уже в течении недели.
Теперь на главной страничке сайта можно поиграться с консолью:)

По поводу метода query: сейчас он поддерживает только запросы типа SELECT. Есть поддержка переменных (через AS), INNER/LEFT/RIGHT JOIN, GROUP BY, ORDER BY, WHERE, HAVING, TOP, LIMIT, INTO, стат функции SUM/AVG/COUNT и множество строковых функций (можно добавлять свои), а также выполнения сразу нескольких запросов в одном методе (через ; ).

Примеры:
var db = new Collection();
db.pushCollection({
	users: [
		{id: 1, name: 'Kobezzza', lvl: 50},
		{id: 2, name: 'Onky', lvl: 55},
		{id: 3, name: 'Drobila', lvl: 60},
		{id: 4, name: 'Over', lvl: 70},
		{id: 5, name: 'Ten', lvl: 60}
	],
	
	skils: [
		{
			sid: 1,
			uid: 1,
			value: 'moto'
		},
		{
			sid: 2,
			uid: 2,
			value: 'auto'
		},
		{
			sid: 3,
			uid: 1,
			value: 'dance'
		}
	],
	
	buf: [
		{
			bid: 1,
			uid: 1,
			b_value: 'ice'
		},
		{
			bid: 2,
			uid: 2,
			b_value: 'fire'
		},
		{
			bid: 3,
			uid: 1,
			b_value: 'water'
		}
	]
});

db.query('SELECT * FROM `users`');
db.query('SELECT el.name, el.lvl FROM `users`');
db.query('SELECT el.name AS nm, el.lvl AS power FROM `users`');
db.query('SELECT * FROM `users`, `skils`');
db.query('SELECT * FROM `users` INNER JOIN `skils` ON id=uid INNER JOIN `buf` ON id=uid');
db.query('\
	SELECT TRIM(el.name) AS name, el.lvl, SUM(el.lvl) AS sum FROM `users`\
		INNER JOIN `skils` ON id=uid\
		INNER JOIN `buf` ON id=uid\
	GROUP BY lvl\
	HAVING sum > 55\
');
db.query('SELECT * FROM `users` WHERE el.lvl > 50 LIMIT 1, 1');
db.query('SELECT TOP 1 * FROM `users` WHERE el.lvl > 50');
db.query('SELECT * INTO `test` FROM `users` WHERE el.lvl > 50');


Буду рад услышать критику и замечания, а также отвечу на любые вопросы:) Спасибо за внимание.

ЗЫ: в версии 3.9 я добавлю поддержку новых хранилищ в браузере (IndexedDB, FlashStorage и т.д., чтобы была возможность хранить большие объёмы данных, вместо 5мб LocalStorage), поддержку популярных шаблонизаторов и закончу систему модульной сборки (можно будет через сайт подключать необходимые модули, чтобы не тащить лишний код).

ЗЫЗЫ: кому интересна логика работы метода query, то копать https://github.com/kobezzza/Collecti...ter/files/csql.

devote 28.10.2012 21:49

kobezzza,
отличная работа.

melky 28.10.2012 22:03

скрипт просто потрясный!

если не секрет, что за сборщик (builder.js) ?

master/collection.min.js - это ужатый в advanced mode скрипт?

похоже, сжатие ещё не идеальное :)

devote 28.10.2012 22:06

Цитата:

Сообщение от melky
похоже, сжатие ещё не идеальное

да, согласен. сжатие не гуд. слишком много длинных переменных.

kobezzza 28.10.2012 22:12

Цитата:

Сообщение от devote (Сообщение 212767)
kobezzza,
отличная работа.

Спасибо:)

Цитата:

Сообщение от melky (Сообщение 212769)
скрипт просто потрясный!

Спасибо за лестный отзыв.

Цитата:

Сообщение от melky (Сообщение 212769)
если не секрет, что за сборщик (builder.js) ?

Это сборщик на ноде, который написал Коля (Kolyaj)
https://github.com/Kolyaj/BuildJS , правда я его немного допил для своих нужд (в Collection этих нужд нет:))

Цитата:

Сообщение от melky (Сообщение 212769)
master/collection.min.js - это ужатый в advanced mode скрипт?

похоже, сжатие ещё не идеальное :)

Да, но увы вряд ли лучше уже получится, т.к. экспортятся публичные методы и свойства (а их много), все приватные методы и свойства сжимаются в кашу (cжимать всякие Collection.prototype нет смысла - это сделает GZIP). Модульная сборка поможет решить проблему "лишнего веса".

melky 28.10.2012 22:38

хм ... ну, только сам автор кода знает, как его коду лучше жаться :)

Цитата:

Сообщение от kobezzza
Это сборщик на ноде, который написал Коля (Kolyaj)
https://github.com/Kolyaj/BuildJS , правда я его немного допил для своих нужд (в Collection этих нужд нет)

я его тоже использую. Если можно, расскажете поподробнее о личных допилах ?


Часовой пояс GMT +3, время: 22:34.