Commit 9a32a0e5 by Иван Кубота

zero version. first test generator

parents
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# misc
.DS_Store
.vscode
/.idea
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
package-lock.json
номер карточки,ингредиент,молочка,мясо,крупа,яйцо,овощ,углевод,всякое
1,Блины,1,,,1,,,
1,бекон с/к,,1,,,,,
1,ветчина куриная,,1,,,,,
1,сливки питьевые,1,,,,,,
1,куриная грудка су-вид,,1,,,,,
1,сыр твердый «Пармезан»,1,,,,,,
2,блины,,,1,1,,,
2,филе грудки куриное,,1,,,,,
2,лук репчатый свежий,,,,,1,,
2,шампиньоны свежие,,,,,1,,
2,соус «Бешамель»,1,,,,1,,
2,масло подсолнечное,,,,,1,,
2,"сыр""Чечил""",1,,,,,,
3,блины,1,,,1,,,
3,ветчина,,1,,,,,
3,сыр,1,,,,,,
4,Блины,1,,,1,,,
4,свиной фарш,,1,,,,,
4,говяжьий фарш,,1,,,,,
5,Блины,1,,,1,,,
5,картофель отварной,,,,,1,,
5,шампиньоны жареные,,,,,1,,
5,масло подсолнечное,,,,,1,,
6,вишня быстрозамороженная,,,,,1,,
6,сахар,,,,,,1,
6,загуститель — пектин,,,,,1,,
6,лимонная кислота,,,,,,,1
7,малина замороженная,,,,,1,,
7,сахар,,,,,,1,
8,сахар,,,,,,1,
8,слива свежая или быстрозамороженная,,,,,1,,
8,лимоны свежие,,,,,1,,
8,имбирь свежий,,,,,1,,
8,загуститель — пектин,,,,,1,,
9,черника свежая или быстрозамороженная,,,,,1,,
9,сахар,,,,,,1,
10,клубника свежая,,,,,1,,
10,листья мяты свежие,,,,,1,,
10,сахар,,,,,,1,
11,Филе куриное замороженное,,1,,,,,
11,капуста белокачанная свежая,,,,,1,,
11,крупа рисовая шлифованная,,,1,,,,
11,яйцо куриное пищевое,,,,1,,,
11,мука пшеничная,,,,,,,
11,масло подсолнечное,,,,,,,
12,«молоко» кокосовое,,,,,,,
12,тыква свежая,,,,,,,
12,чеснок свежий,,,,,,,
12,масло подсолнечное,,,,,,,
12,тимьян свежий,,,,,,,
12,перец Кочукару молотый,,,,,,,
12,бадья сушеный молотый,,,,,,,
13,фарш из минтая пищевой мороженый,,,,,,,
13,масло подсолнечное,,,,,,,
13,белок яичный,,,,,,,
13,сливки,,,,,,,
13,хлеб из муки пшеничной,,,,,,,
13,запечённые овощи,,,,,,,
14,Макаронные изделия Спагетти,,,,,,,
14,филе лососевых рыб,,,,,,,
14,лук репчатый свежий,,,,,,,
14,помидоры в собственном соку,,,,,,,
15,капуста свежая белокочанная,,,,,,,
15,филе куриного окорочка,,,,,,,
15,филе куриной грудки,,,,,,,
15,крупа рисовая,,,,,,,
15,соус,,,,,,,
16,мука пшеничная,,,,,,,
16,"масло сливочное м. д. ж. 82,5%",,,,,,,
16,сахар,,,,,,,
16,солод ржаной сухой неферментированный,,,,,,,
16,дрожжи хлебопекарные прессованные,,,,,,,
16,соль пищевая,,,,,,,
16,семена кунжута черного,,,,,,,
17,мука ржаная,,,,,,,
17,«заварка»,,,,,,,
17,закваска ржаная,,,,,,,
17,сахар,,,,,,,
17,кориандр молотый,,,,,,,
17,кориандр цельный,,,,,,,
18,мука пшеничная в/с,,,,,,,
18,"закваска (мука пшеничная в/с, вода)",,,,,,,
18,масло оливковое Extra Vergin,,,,,,,
19,мука пшеничная,,,,,,,
19,мука пшеничная свежесмолотая грубого помола,,,,,,,
19,семя льна коричневое и белое,,,,,,,
20,мука пшеничная хлебопекарная,,,,,,,
20,"масло сливочное массовая доля жира 82,5%",,,,,,,
20,сахар,,,,,,,
20,дрожжи хлебопекарные прессованные,,,,,,,
20,меланж,,,,,,,
21,Мидии мясо варено-мороженное,,,,,,,
22,Кальмар,,,,,,,
23,Креветка,,,,,,,
24,Кальмар,,,,,,,
25,Кальмар,,,,,,,
26,листья шпината резаные,,,,,,,
27,рис,,,,,,,
27,зерна кукурузы,,,,,,,
27,зеленый горошек,,,,,,,
27,перец,,,,,,,
28,морковь,,,,,,,
28,зеленый горошек,,,,,,,
28,перец сладкий,,,,,,,
28,кукуруза зерно,,,,,,,
28,фасоль резаная,,,,,,,
29,морковь,,,,,,,
29,картофель,,,,,,,
29,лук,,,,,,,
29,зеленый горошек,,,,,,,
29,зеленая фасоль,,,,,,,
30,Перец сладкий свежий,,,,,,,
30,морковь столовая свежая,,,,,,,
30,"лук репчатый свежий,",,,,,,,
30,лук порей свежий,,,,,,,
30,сельдерей свежий,,,,,,,
31,свинина,,,,,,,
31,шпик,,,,,,,
31,чеснок свежий,,,,,,,
31,коньяк,,,,,,,
31,перец черный и душистый,,,,,,,
32,мясо индейки,,,,,,,
32,сухое молоко,,,,,,,
32,экстракты специй,,,,,,,
33,филе грудки и бедра индейки,,,,,,,
33,продукт яичный (меланж),,,,,,,
33,чеснок свежий,,,,,,,
33,пряности натуральные молотые,,,,,,,
34,говядина,,,,,,,
34,шпик,,,,,,,
34,свинина,,,,,,,
34,пряности,,,,,,,
34,стартовая культура микроорганизмов,,,,,,,
35,свинина,,,,,,,
35,кровь пищевая сырая говяжья,,,,,,,
35,крупа гречневая,,,,,,,
35,лук репчатый свежий,,,,,,,
35,лук репчатый жареный,,,,,,,
35,перец черный и душистый,,,,,,,
41,персики свежие,,,,,,,
42,яблоки,,,,,,,
43,яблоки свежие,,,,,,,
43,сахар,,,,,,,
43,белок яйца куриного,,,,,,,
43,сок лимонный прямого отжима,,,,,,,
44,яблоки свежие,,,,,,,
44,вишня свежая или свежемороженая,,,,,,,
44,сахар,,,,,,,
44,белок яйца куриного,,,,,,,
44,лимонный сок прямого отжима,,,,,,,
45,сахар,,,,,,,
45,пюре яблочное,,,,,,,
45,ягоды облепихи замороженные,,,,,,,
45,желирующий агент — пектин яблочный,,,,,,,
45,лимонная кислота,,,,,,,
46,булгур,,,,,,,
47,кускус,,,,,,,
48,киноа,,,,,,,
49,рис,,,,,,,
50,рис,,,,,,,
51,молоко обезжиренное,,,,,,,
51,молоко цельное с использованием йогуртовой закваски,,,,,,,
52,нормализованное молоко,,,,,,,
52,сироп шиповника,,,,,,,
52,сахар,,,,,,,
52,термофильный молочнокислый стрептококк,,,,,,,
52,молочнокислая болгарская палочка,,,,,,,
52,молочнокислая палочка,,,,,,,
53,молоко нормализованное,,,,,,,
53,закваска на чистых культурах термофильного молочнокислого стрептококка и болгарской молочнокислой палочки,,,,,,,
53,молочные дрожжи,,,,,,,
54,молоко нормализованное,,,,,,,
54,закваска Icelandic SKYR,,,,,,,
55,молоко обезжиренное,,,,,,,
55,молоко цельное,,,,,,,
55,заквасочные молочнокислые культуры,,,,,,,
56,мясо говядина,,,,,,,
56,экстракты специй,,,,,,,
56,специи,,,,,,,
56,ягоды можжевельника,,,,,,,
56,стартовая культура микроорганизмов,,,,,,,
57,мясо индейки,,,,,,,
57,"экстракт черного, душистого перца",,,,,,,
57,экстракт мускатного ореха,,,,,,,
57,культура стартовая бактериальная Фермаром,,,,,,,
58,свинина,,,,,,,
58,соль морская пищевая,,,,,,,
58,сахар,,,,,,,
59,Филе грудки индейки,,,,,,,
59,подсолнечное масло,,,,,,,
59,овощи,,,,,,,
59,"специи и их экстракты: чеснок, паприка, томат, перец черный, горчица, кориандр, перец красный, перец белый, орегано",,,,,,,
59,крахмал картофельный,,,,,,,
60,говядина,,,,,,,
61,свинина,,,,,,,
62,кролик,,,,,,,
63,индейка,,,,,,,
64,курица,,,,,,,
65,сахар,,,,,,,
65,настой чая черного,,,,,,,
65,настой лимона,,,,,,,
65,сок лимона концентрированный,,,,,,,
65,консервант — сорбиновая кислота,,,,,,,
65,ароматизатор натуральный «Масло эфирное лимонное»,,,,,,,
66,вода питьевая,,,,,,,
66,зерна овса,,,,,,,
66,чай черный и зеленый,,,,,,,
66,чистая культура чайного гриба,,,,,,,
66,экстракт стевии,,,,,,,
67,вода питьевая подготовленная,,,,,,,
67,растительный экстракт лимона,,,,,,,
67,растительный экстракт имбиря,,,,,,,
69,вода кокосовая,,,,,,,
69,масло кокосовое природное холодного отжима,,,,,,,
69,патока крахмальная,,,,,,,
69,"загустители (крахмал тапиоковый природный, пектин яблочный)",,,,,,,
69,бактериальная закваска,,,,,,,
70,свинина,,,,,,,
70,печень куриная,,,,,,,
70,гранатовый сок,,,,,,,
70,морковь сушеная,,,,,,,
70,молоко сухое,,,,,,,
70,желатин,,,,,,,
71, «сыр» тофу,,,,,,,
71,масло подсолнечное нерафинированное,,,,,,,
71,масло оливковое нерафинированное,,,,,,,
71,перец сладкий сушеный,,,,,,,
71,томаты сушеные,,,,,,,
71,зеленый базилик сушеный,,,,,,,
71,майоран сушеный,,,,,,,
72,горбуша,,,,,,,
72,масло подсолнечное рафинированное,,,,,,,
72,творог м. д. ж. 9%,,,,,,,
72,ядро миндаля сушёное,,,,,,,
72,"молоко сухое м. д. ж. 1,5%",,,,,,,
72,луковый порошок,,,,,,,
72,крахмал картофельный,,,,,,,
72,крупа манная,,,,,,,
72,соль пищевая,,,,,,,
72,сахар,,,,,,,
72,перец чёрный молотый,,,,,,,
73,печень индейки,,,,,,,
73,свинина,,,,,,,
73,шпик,,,,,,,
73,яичный продукт (меланж),,,,,,,
73,груша вяленая,,,,,,,
73,соль,,,,,,,
73,комплексная пищевая добавка,,,,,,,
73,лук сушеный,,,,,,,
74,печень кролика,,,,,,,
74,шампиньоны свежие,,,,,,,
74,шпик свиной,,,,,,,
74,свинина,,,,,,,
74,лук репчатый,,,,,,,
75,бульон говяжий натуральный,,,,,,,
75,лук репчатый,,,,,,,
75,морковь,,,,,,,
75,томат-паста,,,,,,,
75,говядина,,,,,,,
75,рис длиннозерный пропаренный,,,,,,,
76,Борщ,,,,,,,
77,бульон куриный натуральный,,,,,,,
77,"филе куриное, лапша",,,,,,,
77,лук репчатый свежий,,,,,,,
77,морковь свежая,,,,,,,
77,соль поваренная пищевая,,,,,,,
77,петрушка свежая,,,,,,,
78,рыбный бульон из семги,,,,,,,
78,запеченные овощи,,,,,,,
78,картофель свежий,,,,,,,
78,лосось атлантический (семга),,,,,,,
78,сливки,,,,,,,
78,укроп свежий,,,,,,,
78,черный перец горошком,,,,,,,
79,рыбный бульон из лосося семги,,,,,,,
79,запеченные овощи,,,,,,,
79,картофель свежий,,,,,,,
79,морковь столовая свежая,,,,,,,
79,филе семги,,,,,,,
79,укроп свежий,,,,,,,
79,черный перец горошком,,,,,,,
80,омуль,,,,,,,
80,мускун,,,,,,,
80,чир,,,,,,,
81,скумбрия атлантическая,,,,,,,
81,горбуша дальневосточная,,,,,,,
82,горбуша,,,,,,,
82,скумбрия,,,,,,,
82,саворин,,,,,,,
83,"корюшка (непотрошеная, с головой)",,,,,,,
83,соль поваренная пищевая,,,,,,,
84,Муксун,,,,,,,
84,соль поваренная пищевая,,,,,,,
85,Яблоко Гренни Смит,,,,,,,
85,свекла столовая свежая,,,,,,,
85,соус мятный,,,,,,,
85,чернослив сушеный,,,,,,,
85,ядра арахиса жареные,,,,,,,
86,яйцо,,,,,,,
86,майонез,,,,,,,
86,филе горбуши отварное су-вид,,,,,,,
86,картофель отварной,,,,,,,
86,морковь столовая отварная,,,,,,,
86,сыр Гауда,,,,,,,
87,салат «Айсберг»,,,,,,,
87,грудка куриная,,,,,,,
87,шампиньоны,,,,,,,
87,яйцо куриное,,,,,,,
87,маслины,,,,,,,
87,зеленый лук,,,,,,,
87,кинза,,,,,,,
87,кунжут,,,,,,,
87,масло растительное,,,,,,,
87,соевый соус,,,,,,,
87,мед,,,,,,,
88,Ветчина отварная,,,,,,,
88,картофель отварной,,,,,,,
88,"морковь продовольственная отварная,",,,,,,,
88,огурцы соленые,,,,,,,
88,зеленый горошек быстрозамороженный,,,,,,,
88,яйцо куриное пищевое отварное,,,,,,,
88,Соус: домашний майонез,,,,,,,
88,горчица столовая,,,,,,,
88,сок лимона прямого отжима,,,,,,,
89,"свекла столовая отварная,",,,,,,,
89,картофель отварной,,,,,,,
89,морковь столовая отварная,,,,,,,
89,огурцы консервированные,,,,,,,
89,капуста маринованная,,,,,,,
89,горошек зелёный консервированный,,,,,,,
89,масло подсолнечное нерафинированно,,,,,,,
90,молоко пастеризованное,,,,,,,
90,бактериальная закваска мезофильных молочнокислых микроорганизмов,,,,,,,
90,соль пищевая,,,,,,,
91,пастеризованное козье молоко,,,,,,,
91,ягоды брусники свежие,,,,,,,
91,яблоко свежее,,,,,,,
91,закваска - мезофильные молочнокислые микроорганизмы,,,,,,,
92,молоко коровье пастеризованное,,,,,,,
92,соль поваренная пищевая,,,,,,,
92,закваска молочнокислых бактерий,,,,,,,
93,молоко нормализованное пастеризованное,,,,,,,
93,бактериальная закваска мезофильных молочнокислых микроорганизмов,,,,,,,
94,молоко пастеризованное,,,,,,,
94,бактериальная закваска мезофильных и термофильных молочнокислых микроорганизмов,,,,,,,
95,Целлюлоза,,,,,,,
96,сливки,,,,,,,
96,сметана,,,,,,,
96,повидло яблочное стерилизованное,,,,,,,
96,шоколад,,,,,,,
96,мука пшеничная,,,,,,,
96,сахарная пудра,,,,,,,
96,сахар,,,,,,,
96,молоко цельное сгущенное с сахаром,,,,,,,
96,масло сладкосливочное,,,,,,,
96,какао-порошок,,,,,,,
96,яйцо куриное столовое пищевое,,,,,,,
96,разрыхлитель,,,,,,,
97,молоко коровье,,,,,,,
97,сливки пастеризованные,,,,,,,
97,сахар,,,,,,,
97,желатин пищевой,,,,,,,
97,манго мороженое,,,,,,,
97,маракуйя мороженая,,,,,,,
97,натуральный ароматизатор — французская ваниль,,,,,,,
97,апельсин свежий,,,,,,,
98,молоко кокосовое,,,,,,,
98,темный шоколад,,,,,,,
98,"мука пшеничная,",,,,,,,
98,сахар,,,,,,,
98,масло подсолнечное,,,,,,,
98,ядро фундука дробленое,,,,,,,
98,какао-порошок,,,,,,,
98,разрыхлитель,,,,,,,
98,пюре черной смородины,,,,,,,
99,"масло «Крестьянское» 72,5%",,,,,,,
99,яйцо куриное,,,,,,,
99,сгущенное молоко с сахаром,,,,,,,
99,мука пшеничная в/с,,,,,,,
99,сахар-песок,,,,,,,
99,ванилин,,,,,,,
100,кокосовое молоко,,,,,,,
100,"смесь для выпечки,",,,,,,,
100,ядро миндаля сладкого,,,,,,,
100,масло кокосовое холодного отжима,,,,,,,
100,сироп тапинамбура,,,,,,,
100,малина свежезамороженная,,,,,,,
100,крахмал кукурузный,,,,,,,
101,мята,,,,,,,
102,чабрец,,,,,,,
103,чай,,,,,,,
103,мята,,,,,,,
104,чай,,,,,,,
105,гречиха татарская,,,,,,,
\ No newline at end of file
[
{
"cid": 1,
"type": 0,
"eid": 16,
"tag": 1
},
{
"cid": 2,
"type": 0,
"eid": 3,
"tag": 1
},
{
"cid": 3,
"type": 0,
"eid": 3,
"tag": 2
},
{
"cid": 4,
"type": 0,
"eid": 4,
"tag": 1
},
{
"cid": 5,
"type": 0,
"eid": 4,
"tag": 2
},
{
"cid": 6,
"type": 0,
"eid": 21,
"tag": 2
},
{
"cid": 7,
"type": 0,
"eid": 32,
"tag": 2
},
{
"cid": 8,
"type": 0,
"eid": 56,
"tag": 2
},
{
"cid": 9,
"type": 0,
"eid": 57,
"tag": 2
},
{
"cid": 10,
"type": 0,
"eid": 70,
"tag": 2
},
{
"cid": 11,
"type": 0,
"eid": 73,
"tag": 2
},
{
"cid": 12,
"type": 0,
"eid": 1,
"tag": 1
},
{
"cid": 13,
"type": 0,
"eid": 2,
"tag": 1
},
{
"cid": 14,
"type": 0,
"eid": 5,
"tag": 1
},
{
"cid": 15,
"type": 0,
"eid": 3,
"tag": 3
},
{
"cid": 16,
"type": 0,
"eid": 31,
"tag": 2
},
{
"cid": 17,
"type": 0,
"eid": 33,
"tag": 2
},
{
"cid": 18,
"type": 0,
"eid": 34,
"tag": 2
},
{
"cid": 19,
"type": 0,
"eid": 35,
"tag": 2
},
{
"cid": 20,
"type": 0,
"eid": 6,
"tag": 4
},
{
"cid": 21,
"type": 0,
"eid": 8,
"tag": 4
},
{
"cid": 22,
"type": 0,
"eid": 9,
"tag": 4
},
{
"cid": 23,
"type": 0,
"eid": 10,
"tag": 4
},
{
"cid": 24,
"type": 0,
"eid": 6,
"tag": 5
},
{
"cid": 25,
"type": 0,
"eid": 8,
"tag": 5
},
{
"cid": 26,
"type": 0,
"eid": 9,
"tag": 5
},
{
"cid": 27,
"type": 0,
"eid": 10,
"tag": 5
},
{
"cid": 28,
"type": 0,
"eid": 7,
"tag": 4
},
{
"cid": 29,
"type": 0,
"eid": 100,
"tag": 4
},
{
"cid": 30,
"type": 0,
"eid": 98,
"tag": 6
},
{
"cid": 31,
"type": 0,
"eid": 100,
"tag": 6
},
{
"cid": 32,
"type": 0,
"eid": 98,
"tag": 4
},
{
"cid": 33,
"type": 0,
"eid": 96,
"tag": 4
},
{
"cid": 34,
"type": 0,
"eid": 96,
"tag": 7
},
{
"cid": 35,
"type": 0,
"eid": 98,
"tag": 7
},
{
"cid": 36,
"type": 0,
"eid": 96,
"tag": 6
},
{
"cid": 37,
"type": 0,
"eid": 11,
"tag": 2
},
{
"cid": 38,
"type": 0,
"eid": 15,
"tag": 2
},
{
"cid": 39,
"type": 0,
"eid": 12,
"tag": 2
},
{
"cid": 40,
"type": 0,
"eid": 23,
"tag": 2
},
{
"cid": 41,
"type": 0,
"eid": 12,
"tag": 8
},
{
"cid": 42,
"type": 0,
"eid": 23,
"tag": 8
},
{
"cid": 43,
"type": 0,
"eid": 14,
"tag": 8
},
{
"cid": 44,
"type": 0,
"eid": 78,
"tag": 8
},
{
"cid": 45,
"type": 0,
"eid": 79,
"tag": 8
},
{
"cid": 47,
"type": 0,
"eid": 17,
"tag": 1
},
{
"cid": 48,
"type": 0,
"eid": 19,
"tag": 1
},
{
"cid": 49,
"type": 0,
"eid": 20,
"tag": 1
},
{
"cid": 50,
"type": 0,
"eid": 18,
"tag": 1
},
{
"cid": 51,
"type": 0,
"eid": 22,
"tag": 2
},
{
"cid": 52,
"type": 0,
"eid": 24,
"tag": 2
},
{
"cid": 53,
"type": 0,
"eid": 25,
"tag": 2
},
{
"cid": 54,
"type": 0,
"eid": 22,
"tag": 8
},
{
"cid": 55,
"type": 0,
"eid": 24,
"tag": 8
},
{
"cid": 56,
"type": 0,
"eid": 25,
"tag": 8
},
{
"cid": 57,
"type": 0,
"eid": 27,
"tag": 9
},
{
"cid": 58,
"type": 0,
"eid": 28,
"tag": 9
},
{
"cid": 59,
"type": 0,
"eid": 29,
"tag": 9
},
{
"cid": 60,
"type": 0,
"eid": 30,
"tag": 9
},
{
"cid": 61,
"type": 0,
"eid": 26,
"tag": 9
},
{
"cid": 62,
"type": 0,
"eid": 36,
"tag": 10
},
{
"cid": 63,
"type": 0,
"eid": 37,
"tag": 10
},
{
"cid": 64,
"type": 0,
"eid": 38,
"tag": 10
},
{
"cid": 65,
"type": 0,
"eid": 40,
"tag": 10
},
{
"cid": 66,
"type": 0,
"eid": 36,
"tag": 11
},
{
"cid": 67,
"type": 0,
"eid": 37,
"tag": 11
},
{
"cid": 68,
"type": 0,
"eid": 38,
"tag": 11
},
{
"cid": 69,
"type": 0,
"eid": 40,
"tag": 11
},
{
"cid": 70,
"type": 0,
"eid": 41,
"tag": 6
},
{
"cid": 71,
"type": 0,
"eid": 42,
"tag": 6
},
{
"cid": 72,
"type": 0,
"eid": 43,
"tag": 6
},
{
"cid": 73,
"type": 0,
"eid": 44,
"tag": 6
},
{
"cid": 74,
"type": 0,
"eid": 65,
"tag": 12
},
{
"cid": 75,
"type": 0,
"eid": 66,
"tag": 12
},
{
"cid": 76,
"type": 0,
"eid": 103,
"tag": 12
},
{
"cid": 77,
"type": 0,
"eid": 104,
"tag": 12
},
{
"cid": 78,
"type": 0,
"eid": 105,
"tag": 12
},
{
"cid": 79,
"type": 0,
"eid": 46,
"tag": 13
},
{
"cid": 80,
"type": 0,
"eid": 46,
"tag": 14
},
{
"cid": 81,
"type": 0,
"eid": 48,
"tag": 15
},
{
"cid": 82,
"type": 0,
"eid": 48,
"tag": 13
},
{
"cid": 83,
"type": 0,
"eid": 11,
"tag": 16
},
{
"cid": 84,
"type": 0,
"eid": 15,
"tag": 16
},
{
"cid": 85,
"type": 0,
"eid": 27,
"tag": 16
},
{
"cid": 86,
"type": 0,
"eid": 49,
"tag": 16
},
{
"cid": 87,
"type": 0,
"eid": 50,
"tag": 16
},
{
"cid": 88,
"type": 0,
"eid": 75,
"tag": 16
},
{
"cid": 89,
"type": 0,
"eid": 53,
"tag": 17
},
{
"cid": 90,
"type": 0,
"eid": 96,
"tag": 18
},
{
"cid": 91,
"type": 0,
"eid": 53,
"tag": 18
},
{
"cid": 92,
"type": 0,
"eid": 55,
"tag": 18
},
{
"cid": 93,
"type": 0,
"eid": 72,
"tag": 19
},
{
"cid": 94,
"type": 0,
"eid": 72,
"tag": 8
},
{
"cid": 95,
"type": 0,
"eid": 2,
"tag": 2
},
{
"cid": 96,
"type": 0,
"eid": 14,
"tag": 2
},
{
"cid": 97,
"type": 0,
"eid": 59,
"tag": 2
},
{
"cid": 98,
"type": 0,
"eid": 64,
"tag": 2
},
{
"cid": 99,
"type": 0,
"eid": 77,
"tag": 2
},
{
"cid": 101,
"type": 0,
"eid": 86,
"tag": 2
},
{
"cid": 102,
"type": 0,
"eid": 63,
"tag": 2
},
{
"cid": 103,
"type": 0,
"eid": 60,
"tag": 2
},
{
"cid": 104,
"type": 0,
"eid": 61,
"tag": 2
},
{
"cid": 105,
"type": 0,
"eid": 61,
"tag": 20
},
{
"cid": 106,
"type": 0,
"eid": 47,
"tag": 13
},
{
"cid": 107,
"type": 0,
"eid": 47,
"tag": 21
},
{
"cid": 108,
"type": 0,
"eid": 51,
"tag": 17
},
{
"cid": 109,
"type": 0,
"eid": 51,
"tag": 18
},
{
"cid": 110,
"type": 0,
"eid": 1,
"tag": 2
},
{
"cid": 111,
"type": 0,
"eid": 99,
"tag": 6
},
{
"cid": 112,
"type": 0,
"eid": 99,
"tag": 4
},
{
"cid": 113,
"type": 0,
"eid": 65,
"tag": 22
},
{
"cid": 114,
"type": 0,
"eid": 66,
"tag": 22
},
{
"cid": 115,
"type": 0,
"eid": 67,
"tag": 22
},
{
"cid": 116,
"type": 0,
"eid": 69,
"tag": 22
},
{
"cid": 117,
"type": 0,
"eid": 68,
"tag": 22
},
{
"cid": 118,
"type": 0,
"eid": 68,
"tag": 23
},
{
"cid": 119,
"type": 0,
"eid": 71,
"tag": 2
},
{
"cid": 120,
"type": 0,
"eid": 74,
"tag": 2
},
{
"cid": 121,
"type": 0,
"eid": 70,
"tag": 24
},
{
"cid": 122,
"type": 0,
"eid": 71,
"tag": 24
},
{
"cid": 123,
"type": 0,
"eid": 73,
"tag": 24
},
{
"cid": 124,
"type": 0,
"eid": 74,
"tag": 24
},
{
"cid": 125,
"type": 0,
"eid": 52,
"tag": 17
},
{
"cid": 126,
"type": 0,
"eid": 52,
"tag": 18
},
{
"cid": 127,
"type": 0,
"eid": 92,
"tag": 18
},
{
"cid": 128,
"type": 0,
"eid": 92,
"tag": 3
},
{
"cid": 129,
"type": 0,
"eid": 91,
"tag": 3
},
{
"cid": 130,
"type": 0,
"eid": 91,
"tag": 18
},
{
"cid": 131,
"type": 0,
"eid": 90,
"tag": 3
},
{
"cid": 132,
"type": 0,
"eid": 90,
"tag": 17
},
{
"cid": 133,
"type": 0,
"eid": 93,
"tag": 3
},
{
"cid": 134,
"type": 0,
"eid": 94,
"tag": 3
},
{
"cid": 135,
"type": 0,
"eid": 93,
"tag": 17
},
{
"cid": 136,
"type": 0,
"eid": 94,
"tag": 17
},
{
"cid": 137,
"type": 0,
"eid": 54,
"tag": 18
},
{
"cid": 138,
"type": 0,
"eid": 54,
"tag": 22
},
{
"cid": 139,
"type": 0,
"eid": 62,
"tag": 2
},
{
"cid": 140,
"type": 0,
"eid": 85,
"tag": 25
},
{
"cid": 141,
"type": 0,
"eid": 86,
"tag": 25
},
{
"cid": 142,
"type": 0,
"eid": 87,
"tag": 25
},
{
"cid": 143,
"type": 0,
"eid": 88,
"tag": 25
},
{
"cid": 144,
"type": 0,
"eid": 89,
"tag": 25
},
{
"cid": 145,
"type": 0,
"eid": 58,
"tag": 2
},
{
"cid": 146,
"type": 0,
"eid": 58,
"tag": 20
},
{
"cid": 147,
"type": 0,
"eid": 3,
"tag": 20
},
{
"cid": 148,
"type": 0,
"eid": 4,
"tag": 20
},
{
"cid": 149,
"type": 0,
"eid": 31,
"tag": 20
},
{
"cid": 150,
"type": 0,
"eid": 34,
"tag": 20
},
{
"cid": 151,
"type": 0,
"eid": 35,
"tag": 20
},
{
"cid": 152,
"type": 0,
"eid": 70,
"tag": 20
},
{
"cid": 153,
"type": 0,
"eid": 73,
"tag": 20
},
{
"cid": 154,
"type": 0,
"eid": 74,
"tag": 20
},
{
"cid": 155,
"type": 0,
"eid": 81,
"tag": 26
},
{
"cid": 156,
"type": 0,
"eid": 82,
"tag": 26
},
{
"cid": 157,
"type": 0,
"eid": 81,
"tag": 8
},
{
"cid": 158,
"type": 0,
"eid": 82,
"tag": 8
},
{
"cid": 159,
"type": 0,
"eid": 83,
"tag": 26
},
{
"cid": 160,
"type": 0,
"eid": 84,
"tag": 26
},
{
"cid": 161,
"type": 0,
"eid": 83,
"tag": 8
},
{
"cid": 162,
"type": 0,
"eid": 84,
"tag": 8
},
{
"cid": 163,
"type": 0,
"eid": 80,
"tag": 8
},
{
"cid": 164,
"type": 0,
"eid": 80,
"tag": 26
},
{
"cid": 165,
"type": 0,
"eid": 101,
"tag": 27
},
{
"cid": 166,
"type": 0,
"eid": 103,
"tag": 27
},
{
"cid": 167,
"type": 0,
"eid": 102,
"tag": 27
},
{
"cid": 168,
"type": 0,
"eid": 102,
"tag": 12
},
{
"cid": 169,
"type": 0,
"eid": 95,
"tag": 28
},
{
"cid": 170,
"type": 0,
"eid": 75,
"tag": 29
},
{
"cid": 171,
"type": 0,
"eid": 77,
"tag": 29
},
{
"cid": 172,
"type": 0,
"eid": 78,
"tag": 29
}
]
\ No newline at end of file
,название,описание,категория,подкатегория,подподкатегория,участвует в тесте
1,"Блины ""Карбонара""","Начинка состоит из бекона с куриной ветчиной и куриной грудкой, приготовленной по технологии су-вид (продукты в вакуумной упаковке готовятся на водяной бане), отлично дополняют сливки и твердый сыр ""Пармезан"". Рекомендуется подогреть перед употреблением",продукты,блюда ТОП 35,Блины,1
2,Блины с начинкой жюльен,Блины с французской куриной закуской с сыром и соусом «Бешамель».,продукты,блюда ТОП 35,Блины,0
3,Блины с ветчиной (из свинины) и с сыром,Готовые охлажденные блины с начинкой из наших сыра Гауда и ветчины по-Ленинградски.,продукты,блюда ТОП 35,Блины,0
4,Блины с мясом,"Блины из пшеничной муки с сочной мясной начинкой из свиного и говяжьего фарша. В составе только свежие и качественные ингредиенты, без консервантов и усилителей вкуса.",продукты,блюда ТОП 35,Блины,0
5,Блины постные с картофелем и грибами,Постные блины с постной начинкой,продукты,блюда ТОП 35,Блины,0
6,"Варенье вишневое, 50 г","Маленькая баночка сладкого топпинга из ягод вишни. Удобно взять с собой на работу в дополнении к блинам, сырникам или просто в качестве сладости к чаю.",продукты,блюда ТОП 35,Варенье,1
7,Малина дроблёная с сахаром,"Свежая ягода, протертая с сахаром. Вкусный и полезный перекус, или даже легкий десерт. Малина обладает жаропонижающим и противовоспалительным эффектом.",продукты,блюда ТОП 35,Варенье,0
8,Варенье из слив с лимоном и имбирем,"Варенье из свежей или замороженной сливы, лимона, имбиря, сахара и пектина. В составе нашего варенья только фрукты и сахар. Хотя ГОСТ разрешает добавлять в варенье лимонную, аскорбиновую и винную пищевую кислоту, в нашем продукте вы ничего этого не увидите.",продукты,блюда ТОП 35,Варенье,0
9,Варенье черничное,"Варенье приготовлено из свежей или быстрозамороженной черники и сахара. Всем известно, что черника полезна для зрения, она способствует его сохранению и улучшению.",продукты,блюда ТОП 35,Варенье,0
10,Варенье из клубники с мятой,Приготовлено из свежих ягод с добавлением свежих листев мяты. Новый взгляд на привычный вкус. Варенье изготовлено в солнечной Армении.,продукты,блюда ТОП 35,Варенье,0
11,Голубцы ленивые в сметанном соусе,"Нежное блюдо на основе куриного филе и капусты белокочанной с добавлением риса, муки и сливочного масла. Все это дополняет ароматный сливочный соус на основе сметаны и тушеных овощей.",продукты,блюда ТОП 35,Вторые блюда,1
12,Лингвини с креветками и с соусом с тыквой,"Лингвини - это паста из твердых сортов пшеницы. Приготовлена""альденте"" с добавлением креветок и тыквенного соуса на основе растительных масел. Это блюдо можно разогреть, но истинные гурманы оценят его и в холодном виде.",продукты,блюда ТОП 35,Вторые блюда,0
13,Котлетки рыбные с запечёнными овощами,Сытные рыбные котлетки из минтая с добавлением запеченных овощей. Отличный вариант для диетического обеда.,продукты,блюда ТОП 35,Вторые блюда,1
14,Паста с лососем в сливочном соусе,"Спагетти из твердых сортов пшеницы приготовленные «аль денте» дополнены нежным филе лосося холодного копчения. Соус на основе сливок добавляет этому блюду мягкость во вкусе, а сыр пармезан - пикантные нотки.",продукты,блюда ТОП 35,Вторые блюда,1
15,Голубцы с курицей в томатном соусе,Нежные конвертики из капустных листьев плотно набитые начинкой из куриного филе с добавлением лука и рисовой крупы. Яркий соус на основе куриного бульона и томатов в собственном соку идеально дополняет блюдо.,продукты,блюда ТОП 35,Вторые блюда,1
16,Бейгл с кунжутом,"Румяная сдоба с черно-белым кунжутом в качестве присыпки, разрезаная пополам, подходит для наполнения различными начинками, к примеру творожным сыром и помидором или джемом.",продукты,блюда ТОП 35,Выпечка и хлеб,1
17,Хлеб бородинский бездрожжевой,"Хлеб на ржаной муке, приготовленный без добавления дрожжей. Зерна кориандра, посыпанные сверху, дополняют вкус и придают яркий аромат.",продукты,блюда ТОП 35,Выпечка и хлеб,1
18,Чиабатта,"Классический итальянский хлеб на основе пшеничной муки с добавлением дрожжей. Отличная основа как для изысканных перекусов, так и для обычных бутербродов с маслом и сыром",продукты,блюда ТОП 35,Выпечка и хлеб,0
19,Хлеб Печерский масличный,"Бездрожжевой пшеничный хлеб с семенами льна, которые способствуют очищению организма от шлаков и улучшают работу ЖКТ",продукты,блюда ТОП 35,Выпечка и хлеб,0
20,Слойка Свердловская,Ароматная воздушная булочка со вкусом из детства. Слойка изготовлена из пшеничной муки с добавлением сливочного масла.,продукты,блюда ТОП 35,Выпечка и хлеб,1
21,Мидии мясо варено-мороженное,"Вылавлены в Тихом океане. Покрыты тоненьким слоем глазури, в продукте ее не больше 7%. Хорошо очищены от раковин.",продукты,блюда ТОП 35,Замороженные морепродукты,0
22,Кальмар филе очищенный зам.,"Район вылова — Дальний восток. Очищены от кожи, можно жарить, варить, фаршировать, добавлять в различные салаты.",продукты,блюда ТОП 35,Замороженные морепродукты,0
23,Креветка северная варено-мороженая,"Район вылова- Гренландия. Они не искусственно выращенные, а дикие. Поэтому их мясо качественно отличается от искусственных аналогов. Сразу после вылова на корабле продукт подвергают шоковой заморозке",продукты,блюда ТОП 35,Замороженные морепродукты,0
24,Кальмар кольца зам.,"Продукт нарезан на колечки. Удобный вариант для приготовления закусок, салатов и вторых блюд. Район вылова — Дальний восток.",продукты,блюда ТОП 35,Замороженные морепродукты,0
25,Кальмар тушка зам.,"Продукт богат белком и быстро готовится, достаточно на 2 минуты опустить в кипящую воду. Если мясо переварить, оно станет резиновым на вкус.",продукты,блюда ТОП 35,Замороженные морепродукты,1
26,Шпинат свежезамороженный,"Резаные листья используют для приготовления закусок, салатов, гарниров, в качестве начинки для пирогов и для приготовления самых разных вторых блюд. На производстве используется уникальная японская технология заморозки CAS. Ее особенность в том, что заморозка происходит равномерно по всей толще овощей.",продукты,блюда ТОП 35,"Замороженные овощи, грибы, ягоды и фрукты",0
27,Смесь Гавайская с/м,"Замороженная смесь из риса, кукурузы, зеленого горошка и перца. Изготовлено из отечественных овощей. Гавайская смесь отлично сочетается с мясом и рыбой в качестве гарнира",продукты,блюда ТОП 35,"Замороженные овощи, грибы, ягоды и фрукты",0
28,Смесь мексиканская с/м,"Замороженная смесь из кукурузы, зеленого горошка, моркови, зеленой фасоли и перца. Изготовлено из отечественных овощей. Можно использовать в качестве гарнира, как основу для салата, для приготовления различных мясных и овощных блюд",продукты,блюда ТОП 35,"Замороженные овощи, грибы, ягоды и фрукты",0
29,Весенние овощи с/м,"Замороженная смесь из моркови, картофеля, зеленого горошка, зеленой фасоли и лука. Изготовлено из отечественных овощей. Эта смесь универсальна. Ее можно использовать для приготовления первых блюд, как основу для салатов, в качестве гарнира",продукты,блюда ТОП 35,"Замороженные овощи, грибы, ягоды и фрукты",0
30,Смесь овощная для вок с/м,"Готовая свежемороженая смесь из сладкого перца, свежей моркови, репчатого лука, а также лука порея и свежего сельдерея. Такой набор идеален для приготовления лапши вок с тофу и овощами, рецепт которой указан на упаковке. Не нужно мыть,чистить, а потом еще и нарезать овощи, эта смесь помогает отлично сэкономить время на готовке.",продукты,блюда ТОП 35,"Замороженные овощи, грибы, ягоды и фрукты",1
31,Колбаса «Сервелат Коньячный» в/к,"Варено-копченая колбаса из свинины, говядины и свиного шпика с добавлением чеснока, черного и душистого перца. В составе натуральный коньяк, а не ароматизатор. Он наделяет сервелат благородным ароматом. Обладает мягким несильно соленым вкусом.",продукты,блюда ТОП 35,Колбасы. Ветчина,0
32,Колбаса «Особенная» из индейки варёная,"Колбаса из индейки с вкраплениями цельных кусочков мяса. Вкус и аромат колбасы подчеркивают черный перец, мускатный орех, зеленый перец и лимон. Мясо индейки диетическое.",продукты,блюда ТОП 35,Колбасы. Ветчина,0
33,Колбаса запеченная из индейки,"Запеченная колбаса из филе грудки и бедра индейки с добавлением свежего чеснока, черного и душистого перца и мускатного ореха.",продукты,блюда ТОП 35,Колбасы. Ветчина,0
34,Колбаса «Брауншвейг. полусухая» с/к в/у,"приготовлена из говядины и свиного шпика с добавлением пряностей. Фарш маринуют в рассоле и коптят ольховым, буковым и дубовым дымом в течение 5 суток. Затем колбаса проходит стадию созревания.",продукты,блюда ТОП 35,Колбасы. Ветчина,0
35,Колбаса кровяная с гречкой,"Такую колбасу еще называют домашней, поскольку она достаточно проста в приготовлении при наличии необходимых ингредиентов. У славян была традиция, подавать такую колбасу на праздничный стол в Рождество. Колбаса обладает насыщенным вкусом и легким ароматом специй.",продукты,блюда ТОП 35,Колбасы. Ветчина,1
36,Шампунь Яичный,"Шампунь для нормальных, поврежденных и сухих волос. Запечатывает секущиеся кончики, обеспечивает комплексное восстановление структуры волоса, делает волосы шелковистыми.",продукты,блюда ТОП 35,"Косметика, средства гигиены",0
37,Шампунь мужской,"Подходит для всех типов волос. Шампунь обеспечивает комплексное восстановление структуры волос, возвращает им здоровье и ухоженный вид. Комплекс мягких ПАВ растительного происхождения очищает волосы, не раздражая кожу головы.",продукты,блюда ТОП 35,"Косметика, средства гигиены",0
38,Шампунь молочный Миндаль,"Шампунь молочный с экстрактом миндаля предназначен для ухода за волосами всех типов, превосходно очищает жирные волосы, мягко и бережно ухаживает за сухими и ломкими волосами, возвращая им здоровье и ухоженный вид.",продукты,блюда ТОП 35,"Косметика, средства гигиены",0
39,Маска для волос Сладкий миндаль,Восстанавливает и питает волосы. Обеспечивает легкое расчесывние и здоровый блеск волос. Имеет очень нежный сладковатый аромат миндаля,продукты,блюда ТОП 35,"Косметика, средства гигиены",0
40,"Шампунь твёрдый ""Крапивный""","Твердый шампунь для волос с экстрактом крапивы. Небольшой брусочек крапивного шампуня отлично пенится и хорошо смывается водой. Этот шампунь питает, увлажняет и улучшает структуру волос, сохраняя яркость цвета. Придает волосам объем и шелковистый блеск.",продукты,блюда ТОП 35,"Косметика, средства гигиены",1
41,Пастила фруктовая из персика,"Продукт изготовлен исключительно из свежих плодов, без добавления сахара. Сладость у продукта естественная, природная. Лёгкий снек для правильного перекуса.",продукты,блюда ТОП 35,Леденцы. Мармелад. Халва. Зефир,1
42,Пастила яблочная натуральная,"Полезное лакомство в составе которого только яблоки. Приготовлено методом бережной сушки. Эта технология позволяет сохранить максимальное количество витаминов и полезных веществ, содержащихся в яблоках",продукты,блюда ТОП 35,Леденцы. Мармелад. Халва. Зефир,0
43,Пастила яблочная хрустящая,"Вкусное и хрустящее лакомство, в составе которого только свежие яблоки, сахар, яичный белок и лимонный сок прямого отжима. Приготовлено методом сушки. Эта технология позволяет сохранить максимальное количество витаминов и полезных веществ, содержащихся в яблоках.",продукты,блюда ТОП 35,Леденцы. Мармелад. Халва. Зефир,0
44,Пастила яблоко-вишня хрустящая,"Вкусное и хрустящее лакомство, в составе которого только свежие яблоки, вишня, яичный белок и сахар. Приготовлено при низкой температуре с сохранением полезных витаминов и микроэлементах.",продукты,блюда ТОП 35,Леденцы. Мармелад. Халва. Зефир,0
45,"Мармелад ""Облепиха""","Легкий ягодный аромат и сладкий, но не приторный вкус. В основе яблочное пюре, сахар и ягоды облепихи",продукты,блюда ТОП 35,Леденцы. Мармелад. Халва. Зефир,1
46,Булгур,"популярен в турецкой, ливанской и сицилийской кухнях. Для его получения цельные зерна пшеницы замачивают, пропаривают, высушивают, удаляют оболочку и дробят. Таким образом крупа приобретает приятный ореховый вкус.",продукты,блюда ТОП 35,"Макароны, крупы, бобовые",0
47,Кускус,Дробленая крупа из твердых сортов пшеницы. Традиционное блюдо в Марокко и Тунисе. Традиционно готовится на пару или достаточно залить кипятком,продукты,блюда ТОП 35,"Макароны, крупы, бобовые",0
48,Киноа,"Крупа народов инков. За ее богатый состав прозвали «божественным зерном» и «матерью всех злаков». Помимо комплекса витаминов и минералов, имеет идеальный баланс протеинов. Способна полностью компенсировать отсутствие мяса в рационе.",продукты,блюда ТОП 35,"Макароны, крупы, бобовые",0
49,Рис для плова Басмати экстрадлинный,Идеально подходит для приготовления плова. При варке увеличивающееся в 2 раза. Обладает способностью хорошо поглощать жир и остается рассыпчатым после приготовления.,продукты,блюда ТОП 35,"Макароны, крупы, бобовые",0
50,"Рис ""Жасмин""","Универсальный продукт из которого можно приготовить множество блюд. Идеально подходит как для приготовления плова, так и для молочных каш, гарниров или супов.",продукты,блюда ТОП 35,"Макароны, крупы, бобовые",1
51,Йогурт греческий,Продукт приготовлен из натурального коровьего молока с использованием йогуртовой закваски. Богат белком и кальцием; - укрепляет костную ткань; - ускоряет обменные процессы в организме; - нормализует пищеварительные процессы; - укрепляет иммунитет.,продукты,блюда ТОП 35,Молочные продукты,0
52,Иммуноцея с сиропом шиповника,"Кисломолочный продукт, приготовленный из коровьего молока и закваски с добавлением сиропа шиповника. Способствует укреплению иммунитета, помогает ему в борьбе с простудой. Особенно такой продукт актуален осенью, когда наш организм подвержен простудным заболеваниям.",продукты,блюда ТОП 35,Молочные продукты,0
53,Мацони,"необычный кисломолочный продукт. Он напоминает сразу и простоквашу, и кефир, и даже йогурт. Готовят его традиционного из кипяченого коровьего молока и закваски, содержащей молочнокислые бактерии и болгарскую палочку.",продукты,блюда ТОП 35,Молочные продукты,0
54,"Скир ""Исландский"" 1,5%","Продукт на основе нормализованного коровьего молока и закваски. Нечто среднее между сметаной и творожной массой. По вкусу напоминает греческий йогурт. Можно кушать как самостоятельное блюдо, а можно с фруктами или овощами, в качестве соуса, а также в качестве заправки в салат.",продукты,блюда ТОП 35,Молочные продукты,1
55,"Творог 5%, 180 г",Продукт из свежего коровьего молока и закваски в компактной упаковке. Подходит для приготовления сырников.,продукты,блюда ТОП 35,Молочные продукты,1
56,Балык «Королевский» с/к,"Деликатес из говядины с толстого края. Отличительная часть мяса с этой части туши в том, что в нем встречаются нежные прожилки, как в мраморной говядине. Мясо посыпают солью и сахаром, выдерживают 7 дней. Затем коптят холодным дымом (температура до 32 градусов) на буковых и дубовых щепах.",продукты,блюда ТОП 35,Мясная гастрономия,0
57,Карпаччо из индейки с/к,"Тонкие ломтики нежного сырокопченного мяса индейки. Не содержат влагоудерживающих компонентов и консервантов. Советуем попробовать со свежим багетом и
ягодным соусом, например, черносмородиновым.",продукты,блюда ТОП 35,Мясная гастрономия,0
58,"Шпек сыровяленый нарезка, 50 г","Похожая на прошутто ветчина, с более насыщенным вкусом. Коптят продукт холодным способом. После того как мясо прокоптилось, оно 6−8 месяцев дозревает в специальных климатических камерах, в условиях максимально приближенных к средиземноморскому климату",продукты,блюда ТОП 35,Мясная гастрономия,0
59,"Филе грудки индейки ""Су-вид"" в маринаде Корридо","Продукт замаринован в смеси сушеных овощей и специй и приготовлен по технологии «су-вид». ( мясо помещают в вакумный пакет и медленно готовят при сравнительно низкой и точно контролируемой температуре, обычно в водяной бане) Такой процесс позволяет сохранить максимальное количество полезных свойства продукта.",продукты,блюда ТОП 35,Мясная гастрономия,1
60,"Ребрышки говяжьи, 400 г","Готовятся быстро. Идеально подойдут как для приготовления наваристого бульона, так и для жаркого, солянки, плова и других видов мясных блюд. А можно их просто поджарить с добавлением соли и специй и подать с овощами.",продукты,блюда ТОП 35,"Мясо, птица",1
61,Вырезка из свинины,"Самая нежная часть туши. Можно жарить, тушить, запекать, в любом случае будет вкусно. Мясо более плотное, обладает насыщенным вкусом и приятным ароматом",продукты,блюда ТОП 35,"Мясо, птица",0
62,Половина тушки кролика,"Мясо считается диетическим. Усваивается намного лучше, чем другие виды мяса. Гипоаллергенно, потому его рекомендуют детям, беременным и кормящим женщинам.",продукты,блюда ТОП 35,"Мясо, птица",0
63,Стейк из индейки,"Мясо нарезанно на удобные стейки. Отличный вариант для жарки. Диетическое, в нем мало холестерина. Легко усваивается и легко переваривается.",продукты,блюда ТОП 35,"Мясо, птица",0
64,Филе бедра куриное бескостное,"Диетический продукт питания, обладает более высокими вкусовыми и питательными свойствами по сравнению с мясом взрослой птицы. Достаточно промыть продукт и замариновать по вкусу, в духовке, на сковороде, на пару или на гриле, независимо от того как вы готовите курицу, получится вкусно и сочно",продукты,блюда ТОП 35,"Мясо, птица",1
65,Напиток Чай с лимоном,"Освежающий напиток на основе настоя черного чая и лимона. Не содержит искусственных ароматизаторов. Этот напиток поможет утолить жажду, взбодрит и придаст сил.",продукты,блюда ТОП 35,Напитки,0
66,Напиток «Чайный гриб» со стевией,"Непастеризованный нефильтрованный и безалкогольный напиток.
Производится из пророщенных злаков без сахара посредством брожения с помощью чистой культуры чайного гриба с последующим добавлением медовой травы — стевии.",продукты,блюда ТОП 35,Напитки,0
67,Напиток «Лимон-Имбирь»,"Освежающий детокс-напиток, приводящий в чувство, к бодрости. Среднегазированный.",продукты,блюда ТОП 35,Напитки,0
68,Вода минеральная Псыж 1л,"Газированная минеральная природная вода из скважины номер 1А Псыжского участка минеральных вод Карачаево-Черкесской республики. Вода применяется в профилактических целях, а также при лечении гастрита, болезней пищевода и кишечника.",продукты,блюда ТОП 35,Напитки,0
69,"Напиток ""Кокосовый"" на бактериальной закваске",Напиток на основе кокосовой воды и кокосового масла с добавлением закваски. Обладает легкой кислинкой во вкусе.,продукты,блюда ТОП 35,Напитки,1
70,Паштет мясной запеченный,"Паштет приготовлен из свинины, куриной печени, сливочного масла, моркови, репчатого лука.",продукты,блюда ТОП 35,"Паштеты, холодцы",0
71,Паштет из тофу «По-испански»,"Постный паштет с добавлением подсолнечного и оливкового масла, сладкого перца, томатов и сушеного базилика. Вкусное и сытное наполнение для бутербродов и хлебцев.",продукты,блюда ТОП 35,"Паштеты, холодцы",0
72,Риет из горбуши с миндалем,"Риет- метод приготовления мяса, похожий на паштет. В основе филе горбуши с добавлением подсолнечного масла, 9%-го творога и ядер миндаля. Консистенция плотная, нежирная, хорошо размазывается по тосту.",продукты,блюда ТОП 35,"Паштеты, холодцы",1
73,Паштет мясной с печенью индейки и грушей,"Продукт украшен тончайшей корочкой из сахарного сиропа с добавлением экстракта натурального чернослива, вяленой вишней и тыквенными семечками. Груша в паштет добавлена маленькими кусочками, что только оттеняет нежность паштета.",продукты,блюда ТОП 35,"Паштеты, холодцы",0
74,Паштет из печени кролика с шампиньонами,"Паштет на основе печени кролика и свинины, с добавлением шампиньонов, свиного шпика, репчатого лука и пряностей. Рекомендуется разогреть перед употреблением, благодаря нагреванию все ингредиенты раскрывают свой вкус.",продукты,блюда ТОП 35,"Паштеты, холодцы",1
75,Суп Харчо,"Классический рецепт этого блюда пришел к нам из грузинской кухни. Приготовлен суп из говяжьего бульона, говядины, риса, томатной пасты и пряностей. В составе только свежие и качественные ингредиенты, без консервантов и усилителей вкуса.",продукты,блюда ТОП 35,Первые блюда,0
76,Борщ вегетарианский,"Традиционное блюдо, которое можно в пост, вегетарианцам и веганам. Вкусно со сметаной, соевым майонезом и хлебцами.",продукты,блюда ТОП 35,Первые блюда,0
77,Суп куриный с домашней лапшой,"Наваристый домашний суп из куриного бульона, куриного филе и лапши. Блюдо приготовлено из свежих и качественных ингредиентов, без консервантов и усилителей вкуса.",продукты,блюда ТОП 35,Первые блюда,0
78,Суп-пюре норвежский с сёмгой,"Нежный и ароматный суп-пюре из семги, запеченных моркови и лука, свежего картофеля с добавлением сливок и специй. Цельные кусочки норвежской семги делают это блюдо сытным.",продукты,блюда ТОП 35,Первые блюда,1
79,Уха русская с сёмгой,"Легкий супчик на бульоне из семги атлантической с добавлением овощей, укропа и специй. Идеально для здорового питания",продукты,блюда ТОП 35,Первые блюда,1
80,"Ассорти из омуля, муксуна, чира",Необычная подборка подкопченных рыбных деликатесов семейства лососевых в одной упаковке.,продукты,блюда ТОП 35,Рыбная гастрономия,1
81,Ассорти рыбное х/к из скумбрии и горбуши,"Рыба с легким ароматом копчения не нужно чистить и удалять косточки, все уже готово к употреблению.",продукты,блюда ТОП 35,Рыбная гастрономия,1
82,Ассорти рыбное х/к ломтики,Рыбная нарезка из дальневосточной горбуши и атлантической скумбрии и саворина. Имеет самый простой состав — рыба и соль.,продукты,блюда ТОП 35,Рыбная гастрономия,0
83,Корюшка горячего копчения,"Выловлена в Санкт-Петербурге. Одна из отличительных особенностей этой рыбы — ее запах свежих огурцов, из-за чего ее прозвали «огуречником»",продукты,блюда ТОП 35,Рыбная гастрономия,0
84,Муксун ломтики холодного копчения,Деликатесная рыба с белым жирным и очень нежным мясом. Выловлена в Якутии.,продукты,блюда ТОП 35,Рыбная гастрономия,0
85,"Салат с яблоком, свеклой и черносливом","Хрустящий салат богатый витаминами и клетчаткой. Заправка на основе лимонного сока, мёда и мяты отлично раскрывает вкус всех ингредиентов. Идеально для тех, кто следит за фигурой.",продукты,блюда ТОП 35,Салаты и закуски,1
86,Салат Мимоза,"Рыбный салат из отварного филе горбуши, куриных яиц, картофеля, моркови и сыра. Заправлен майонезом. Все ингредиенты аккуратно выложены слоями.",продукты,блюда ТОП 35,Салаты и закуски,0
87,Салат «Грин Энерджи»,"Сочетание салата «Айсберг», куриной грудки, шампиньонов, куриного яйца, маслин, зеленого лука, кинзы и кунжута. Заправка приготовлена из растительного масла, соевого соуса и меда. Этот салат очень питательный, при этом обладает низкой калорийностью.",продукты,блюда ТОП 35,Салаты и закуски,0
88,Салат «Оливье»,"Классический салат с куриной ветчиной, отварной куриной грудкой и отварной говядиной. Заправлен натуральным майонезом.",продукты,блюда ТОП 35,Салаты и закуски,0
89,Салат винегрет с маринованной капустой,"Готовый салат. В качестве заправки нерафинированное подсолнечное масло. Не смотря на всю простоту этого салата, его приготовление даже у опытной хозяйки займет немало времени. Мы предлагаем вам готовый вариант.",продукты,блюда ТОП 35,Салаты и закуски,0
90,"Сыр ""Российский"" тёртый","Сыр в удобном формате. Желтоватый цвет сыру придает натуральный пищевой краситель – аннато. В натертом виде такой сыр отлично подойдет для приготовления любых видов блюд, начиная от пасты и заканчивая пиццей.",продукты,блюда ТОП 35,Сыры,1
91,"Сыр козий ""Кремчиз с брусникой и яблоком""","Нежный сливочный сыр с прослойкой кисло-сладкого соуса. Отлично подойдет как в качестве сытного перекуса, так и в качестве десерта к чаю.",продукты,блюда ТОП 35,Сыры,1
92,Сыр твердый «Грюнбергер»,"Сыр, который по праву можно считать аналогом известного швейцарского сыра «Грюйер».Это твердый желтый сыр без дырок, имеющий острый пикантный аромат и слегка ореховый вкус.",продукты,блюда ТОП 35,Сыры,0
93,Сыр «Эдам»,"Знаменитый полутвердый сыр из коровьего молока, относится к голландским сортам. Не содержит растительных жиров и консервантов. Этот сыр обладает слегка сладковатым сливочным вкусом с пикантными нотками.",продукты,блюда ТОП 35,Сыры,0
94,Сыр «Алтайский» полутвёрдый,Сыр можно назвать нашим аналогом популярного голландского сыра «Маасдам». Он обладает слегка сладковатым пикантным вкусом.,продукты,блюда ТОП 35,Сыры,0
95,"Тетрадь в линейку, 48 л",Плотная тетрадь в линейку с оригинальным цветом страниц и обложки.,продукты,блюда ТОП 35,Товары для дома и кухни,1
96,"Десерт молочный ""Ночь в Брюгге""",Нежный шоколадный десерт со вкусом горького шоколада и легкой кислинки яблочного повидла с нежный кремом.,продукты,блюда ТОП 35,Торты. Пирожные. Муссы. Суфле,1
97,Панна-котта «Манго-маракуйя-апельсин»,"Нежный десерт из молока, сливок, манго, маракуйи и апельсина, в основе приготовления которого итальянская рецептура.",продукты,блюда ТОП 35,Торты. Пирожные. Муссы. Суфле,0
98,Пирожное постное «Трюфельное»,"Шоколадное пирожное без молока и яиц. Приготовлено из кокосового молока, темного шоколада с добавлением муки, фундука и черной смородины. Пирожное по вкусу очень напоминает трюфель, отсюда и название.",продукты,блюда ТОП 35,Торты. Пирожные. Муссы. Суфле,0
99,Рулет бисквитный,"Бисквит с нежной кремовой прослойкой. В составе сливочное масло и сгущенное молоко «Избёнка». Десерт максимально похож на десерт, продававшийся в советские годы.",продукты,блюда ТОП 35,Торты. Пирожные. Муссы. Суфле,0
100,"Пирожное ""Малиновое"" на кокосовом молоке","Десерт приготовлен на коксовом молоке и рисовой муке, без добавления сахара. Подходит вегетарианцам и людям избегающим глютеносодержащие продукты. Сладость десерту придает сироп топинамбура и ягоды малины.",продукты,блюда ТОП 35,Торты. Пирожные. Муссы. Суфле,1
101,Мята душистая,"Чай освежает, помогает быстро снять признаки усталости, улучшает пищеварение и помогает избавиться от головной боли.",продукты,блюда ТОП 35,Чай. Травы. Кофе. Какао,0
102,Горный чабрец,"Обладает насыщенным пряным ароматом и ярким вкусом. Чай с чабрецом поможет снять усталость, взбодрит и придаст сил. Рекомендуется при частых стрессах и бессоннице.",продукты,блюда ТОП 35,Чай. Травы. Кофе. Какао,0
103,Чай с мятой и календулой в пакетиках,"Используются крымские травы, выращенные на горных экологически чистых участках.",продукты,блюда ТОП 35,Чай. Травы. Кофе. Какао,0
104,Чай зеленый байховый в пакетиках,"Чай выращивают в Мацестинской долине, расположенной вблизи города Сочи в уникальной субтропической зоне. Это самый северный чай в мире. Благодаря такому происхождению в нем накапливается больше полезных веществ, чем в чаях, выращенных в более южных регионах",продукты,блюда ТОП 35,Чай. Травы. Кофе. Какао,0
105,"Чай гречишный, в пирамидках","В составе только гречиха татарская, никаких добавок и искусственных ароматизаторов. Гречишный чай - это напиток имеющий золотистый цвет, ореховый аромат и сладко - ореховый вкус, похожий на карамель. Приятная альтернатива привычному чаю.",продукты,блюда ТОП 35,Чай. Травы. Кофе. Какао,1
\ No newline at end of file
[
{
"id": 1,
"name": "мучное"
},
{
"id": 2,
"name": "мясо"
},
{
"id": 3,
"name": "сыр"
},
{
"id": 4,
"name": "сахар"
},
{
"id": 5,
"name": "варенье"
},
{
"id": 6,
"name": "сладкое"
},
{
"id": 7,
"name": "шоколад"
},
{
"id": 8,
"name": "морепродукты"
},
{
"id": 9,
"name": "овощи"
},
{
"id": 10,
"name": "шампунь"
},
{
"id": 11,
"name": "гигиена"
},
{
"id": 12,
"name": "чай"
},
{
"id": 13,
"name": "крупа"
},
{
"id": 14,
"name": "булгур"
},
{
"id": 15,
"name": "киноа"
},
{
"id": 16,
"name": "рис"
},
{
"id": 17,
"name": "молочный продукт"
},
{
"id": 18,
"name": "молочное"
},
{
"id": 19,
"name": "риет"
},
{
"id": 20,
"name": "харам"
},
{
"id": 21,
"name": "кускус"
},
{
"id": 22,
"name": "напиток"
},
{
"id": 23,
"name": "вода"
},
{
"id": 24,
"name": "паштет"
},
{
"id": 25,
"name": "салат"
},
{
"id": 26,
"name": "рыба"
},
{
"id": 27,
"name": "травы"
},
{
"id": 28,
"name": "канцтовары"
},
{
"id": 29,
"name": "суп"
}
]
\ No newline at end of file
import csv from 'csv-parser';
import fs from 'fs';
const readCSV = async function(scope) {
const {fileName, types, keys, index} = scope,
postProcess = scope.postProcess || (a => a);
const trash = Symbol('Trash')
const hash = {};
return await new Promise(function(resolve, reject) {
let id = 1;
const inc = ()=>id++;
fs.createReadStream(fileName)
.pipe(csv({
mapHeaders: ({header}) => keys[header] || trash,
mapValues: ({header, value}) => header in types ? types[header](value) : null
}))
.on('data', (obj) => {
postProcess(obj, inc);
hash[obj[index]] = obj;
})
.on('end', () => {
resolve(hash);
console.log('CSV parsed: '+ fileName)
});
});
};
import connections from './data/connections.json';
import tags from './data/tags.json';
export const data = {tags, connections};
(async()=>{
data.components = await readCSV({
fileName: './data/components.csv',
keys: {
'номер карточки': 'id',
'ингредиент': 'name'
},
types: {
id: Number,
name: String
},
postProcess: (a, inc) => a.iID = inc(),
index: 'iID'
});
data.products = await readCSV({
fileName: './data/products.csv',
keys: {
'': 'id',
'название': 'title',
'описание': 'description',
'категория': 'cat',
'подкатегория': 'subcat',
'подподкатегория': 'subsubcat',
'участвует в тесте': 'use'
},
types: {
id: Number,
title: String,
description: String,
cat: String,
subcat: String,
subsubcat: String,
use: a=>Boolean(Number(a))
},
index: 'id'
});
})();
const keys = {
'номер карточки': 'id',
'ингредиент': 'name'
};
const mapper = {
id: Number,
name: String
};
<!DOCTYPE html>
<html>
<head>
<title>Category mapper</title>
<meta charset="utf-8" />
<script src="js/releasable-observer.js"></script>
<script src="js/pcg-base.js"></script>
<script src="js/pcg-dom-util.js"></script>
<script src="js/csv.js"></script>
<script src="js/model/store.js"></script>
<script src="js/model/data.js"></script>
<script src="js/model/provider.js"></script>
<script src="js/model/slice/productTable.js"></script>
<script src="js/model/tag.js"></script>
<script src="js/model/product.js"></script>
<script src="js/helpers/textFilter.js"></script>
<script src="js/view/base.js"></script>
<script src="js/view/cmp/base.js"></script>
<script src="js/view/cmp/menu.js"></script>
<script src="js/view/cmp/switch.js"></script>
<script src="js/view/cmp/table.js"></script>
<script src="js/view/cmp/tag.js"></script>
<script src="js/view/cmp/tagfield.js"></script>
<script src="js/view/page/products.js"></script>
<script src="js/view/page/export.js"></script>
<script src="js/view/page/generate.js"></script>
<script src="js/controller/exportLogic.js"></script>
<script src="js/controller/quizGenerator.js"></script>
<script src="main.js"></script>
<link type="text/css" rel="stylesheet" href="main.css">
</head>
<body>
<script>initDataProvider($DATA$);init();</script>
</body>
</html>
\ No newline at end of file
var env = {};
const APP_HOST = env.APP_HOST || "127.0.0.1";
const APP_PORT = env.APP_PORT || 4000;
const DB_PATH = env.DB_PATH || "./db/users.json";
import {data} from "./db.js";
import App from 'express';
import Router from 'node-async-router';
const app = App(),
router = Router();
import fs from 'fs';
const tpls = {
index: fs.readFileSync('./index.html')+''
};
const print = function(data) {
return tpls.index.replace('$DATA$', data)
};
router.get('ivasic', async function(req, res) {
res.end(print('lalka'));
});
router.all('/', function(req, res) {
res.end(print(JSON.stringify(data)));
});
app.use(router);
app.use(App.static('public'))
app.listen(APP_PORT);
console.log(`LISTEN port :`+APP_PORT);
{
"type": "module",
"dependencies": {
"csv-parser": "^2.3.2",
"express": "^4.17.1",
"node-async-router": "^0.0.2"
},
"scripts": {
"start": "node --experimental-modules index.js"
}
}
function sqlEscape(str) {
return (str+'').replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) {
switch (char) {
case "\0":
return "\\0";
case "\x08":
return "\\b";
case "\x09":
return "\\t";
case "\x1a":
return "\\z";
case "\n":
return "\\n";
case "\r":
return "\\r";
case "\"":
case "'":
case "\\":
case "%":
return "\\"+char; // prepends a backslash to backslash, percent,
// and double/single quotes
default:
return char;
}
});
}
const indexKey = {
connections: 'cid',
tags: 'id'//'iID'
},
yamlEscape = function(a) {
return typeof a === 'number'? a : '\''+(a+'').replace(/'/,'\'\'')+'\''
};
const formatters = {
json: function(data) {
return JSON.stringify(data, null, 2);
},
csv: toCSV,
sql: function(data) {
if(data.length){
const item = data[0], header = [];
for(let key in item){
header.push(key);
}
const rows = data.map(item=>header.map(key=>item[key]));
return [ 'INSERT INTO `' + store.get( 'exportTableName' ) + '` (' + header.map( sqlEscape ).map( a => '`' + a + '`' ).join( ', ' ) + ') VALUES' ].concat(
rows.map( row => '(' + row.map( sqlEscape ).map( a => '\'' + a + '\'' ).join( ', ' ) + ')' ).join( ',\n' )
).join( '\n' ) + ';';
}else{
return ';'
}
},
yaml: function(data, exportData) {
const index = indexKey[exportData]
return data
.map(item=>
[exportData.substr(0,exportData.length-1)+item[index]+':'].concat(
Object.keys(item)
.filter(key=>key !== index)
.map(key=>' '+key+': '+ yamlEscape(item[key]))
).join('\n')
).join('\n')
}
};
const exportLogic = function(exportEl) {
store.sub(['exportData', 'exportFormat'], function(exportData, exportFormat) {
var arr = [];
var fullData = dP[exportData];
for(var k in fullData){
arr.push(fullData[k]);
}
exportEl.value = exportFormat in formatters ? formatters[exportFormat](arr, exportData): 'Create formatter '+exportFormat;
});
return exportEl;
};
\ No newline at end of file
const rand = function(a, b){
if(Array.isArray(a)){
return a[Math.random()*a.length|0];
}
a = Math.ceil(a);
b = Math.floor(b);
return Math.floor(Math.random() * (b - a + 1)) + a;
return (r-a)*(b-a)|0;
},
probabilityRand = function(items) {
let sum = 0;
for( let i = 0, _i = items.length; i < _i; i++ ){
const item = items[ i ];
sum += item.probability |0;
}
const theRandom = Math.random();
let total = 0;
for( let i = 0, _i = items.length; i < _i; i++ ){
const item = items[ i ];
total += item.probability/sum;
if(theRandom < total)
return item;
}
};
const normalizeText = function(text) {
return text.trim().toLowerCase().replace(/[^а-я]/g,'').replace(/[аоуеэюёиыя]+/g,'о')
};
const quizTypes = {
checkbox: [],
checkboxPhoto: {
},
radio: [{
type: 'Do not contain',
from: ()=>
rand(
Object.keys(dP.products)
.map(k=>dP.products[k])
.filter((p)=>dP.Product.getComponents(p).length > 1)
),
answer( product, log ){
const out =
shuffle(
dP.Product.getComponents(product)
.map(i=>({correct: false, text: i.name}))
)
.slice(0, rand(this.answers.from - 1, this.answers.to - 1)),
// get tags
tags = product.tags,
donors = [];
log.push('Base product: '+product.title);
log.push(`Have ${dP.Product.getComponents(product).length} components. Took ${out.length}:`);
out.forEach(function(a) {
log.push(' > '+ a.text)
});
log.push('\nTags: '+dP.Product.getTags(product).map(t=>t.name).join(', '));
Object.keys(dP.products)
.map(k=>dP.products[k])
.forEach(item => {
if(item.id === product.id)
return;
const matchedCount = tags.filter(tid=>item.tags.indexOf(tid)>-1).length;
if(matchedCount>0){
donors.push({
count: matchedCount,
item,
title: item.title,
component: dP.Product.getComponents(item).map(a=>a.name)
});
}
});
log.push('Matched '+donors.length+' component donors.');
donors.sort((a,b)=>b.count-a.count);
if(!donors.length){
log.push('Not enough');
return false;
}
const maxCount = donors[0].count;
const minCount = Math.round(maxCount - maxCount/4);
const alreadyExist = out.reduce((store, i)=>{
store[normalizeText(i.text)] = true;
return store;
}, {'соль': true,'сольпощово': true, 'сохор': true});
log.push('Nearest candidate have got '+ maxCount +' similar tag.');
const may = ([].concat.apply(
[],
donors
.filter(i=>i.count > 0 && i.count >= minCount)
.map(i=>
i.component
.filter(c=>{
if(!c.trim())
return false;
const normalized = normalizeText(c);
if(normalized in alreadyExist)
return false;
alreadyExist[normalized] = true;
return true;
})
.map(x => ({count: i.count, item: i.item, text: x}))
)
));
log.push('Filtered candidates with ['+ (minCount===maxCount? minCount : minCount+' - '+ maxCount) +'] similar tags.');
if(may.length<2)
return false;
//console.clear()
//const addAnswersCount = Math.min(rand(this.answers.from, this.answers.to)-out.length, may.length);
const answer = rand(may);
log.push('Use '+ answer.item.title +' as donor.');
log.push('Because it has '+ answer.count +' similar tags: '+ dP.Product.getTags(answer.item).map(t=>t.name).join(', '));
out.push({correct: true, text: answer.text});
log.push('\n << '+ answer.text);
/*
for(let i = 0; i < addAnswersCount; i++){
if(may.length-i<0)
break;
const idx = Math.random()*(may.length-i)|0;
if(idx>=may.length || idx < 0)debugger
console.log(i, may[idx], may)
out.push({correct: true, text: may[idx]});
may[idx] = may[may.length - 1 - i]
}*/
console.log(dP.Product.getTags(product), donors)
return out;
},
answers: {from: 3, to: 6},
question: (product)=> `Выберите лишний ингредиент, НЕ входящий в продукт "${product.title}"`,
probability: 10
}],
radioPhoto: {
}
};
const shuffle = function (a) {
for (let i = a.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[a[i], a[j]] = [a[j], a[i]];
}
return a;
}
const quizGenerator = function(type, photo) {
const cfg = probabilityRand(quizTypes[type+(photo?'Photo':'')]);
const log = ['Quiz generate '+type+(photo ? ' with photo':'') +'. '+(cfg?cfg.type:'FAIL')];
if(!cfg)
return {answers: [], log};
const source = cfg.from.call(cfg, log),
answers = shuffle(cfg.answer.call(cfg, source, log));
if(answers === false){
// давай по новой
return quizGenerator( type, photo );
}
return {question: cfg.question.call(cfg, source, log), answers, log}
};
/*
К какому из продуктов относится это описание: "Важно знать"
В какой из продуктов входят данные ингредиенты: Ингредиент 1, Ингредиент 2, Ингредиент 3, Ингредиент 4
Выберите один ингредиент, который входит в продукт "Название продукта"
Какое из этих описаний относится к продукту "Название продукта"
Какие ингредиенты входят в продукт "Название продукта"
Какие ингредиенты НЕ входят в продукт "Название продукта"
В какие продукты входит следующий ингредиент "Название ингредиента"
Какой продукт изображен на картинке
Какое из этих описаний относится к продукту, изображенному на картинке
Выберите один ингредиент, который входит в продукт, изображенный на картинке
Какие ингредиенты входят в продукт, изображенный на картинке?
Какие ингредиенты НЕ входят в продукт, изображенный на картинке
*/
\ No newline at end of file
const checkSpecialCharsAndEmpty = (value) => {
const thisValue = value.toString().toLowerCase();
let hasSpecialChars = false;
if (typeof value === 'string') {
hasSpecialChars = thisValue.includes('\n')
|| thisValue.includes('\t')
|| thisValue.includes(',')
|| thisValue.includes(';')
|| thisValue.includes('.')
|| thisValue.includes('"')
|| thisValue.includes('\'')
|| thisValue.includes('`')
|| thisValue.includes('´')
|| thisValue.includes(' ')
|| thisValue.length === 0;
}
return hasSpecialChars;
};
const separatorOrLineBreak = (length, elementIdx, separator) => (
length - 1 === elementIdx ? '\n' : separator
);
const escapeDoubleQuotesInsideElement = (element) => {
const thisElement = element.replace(/"/g, '""');
return thisElement;
};
const appendElement = (element, lineLength, elementIdx, separator) => {
const includesSpecials = checkSpecialCharsAndEmpty(element);
let thisElement = element;
if (includesSpecials) {
thisElement = escapeDoubleQuotesInsideElement(thisElement);
}
return (
includesSpecials
? `"${thisElement}"${separatorOrLineBreak(lineLength, elementIdx, separator)}`
: `${thisElement}${separatorOrLineBreak(lineLength, elementIdx, separator)}`
);
};
const toCSV = data => convertArrayOfObjectsToCSV(data, {separator: ','});
const convertArrayOfObjectsToCSV = (data, { header, separator }) => {
const array = [...data];
let csv = '';
if (header) {
header.forEach((headerEl, i) => {
const thisHeaderEl = headerEl || (headerEl === 0 ? 0 : '');
csv += appendElement(thisHeaderEl, header.length, i, separator);
});
}
array.forEach((row, idx) => {
const thisRow = Object.keys(row);
if (!header && idx === 0) {
thisRow.forEach((key, i) => {
const value = key || (key === 0 ? 0 : '');
csv += appendElement(value, thisRow.length, i, separator);
});
}
thisRow.forEach((key, i) => {
const value = row[key] || (row[key] === 0 ? 0 : '');
csv += appendElement(value, thisRow.length, i, separator);
});
});
return csv;
};
\ No newline at end of file
var textCache = {};
const textFilterMatched = function(where, what) {
var prepared = textCache[what];
if(!prepared){
var tokens = what.split(/\s/)
textCache[what] = prepared = tokens.map(token => token[0] === '-' ? {has: false, text: token.substr(1)}: {has: true, text: token});
}
var yep = false;
for( var i = 0, _i = prepared.length; i < _i; i++ ){
var preparedElement = prepared[ i ];
var matched = where.indexOf(preparedElement.text)>-1;
if(preparedElement.has === false && matched){
return false
}
if(matched)
yep = true;
}
return yep;
};
const textFormat = function(text) {
if(typeof text !== 'string')
return text;
const income = text;
if(text.split(/[«"»]/).length % 2 === 0){
// odd count of quotes
text = text.replace(/[«»]/,'')
}
let valids = {}, id = 1, add = (val)=>{
const uid = '_!@#'+id+'#@!_';
id++;
valids[uid] = val;
return uid;
};
text = text
.trim()
.replace(/\n\n/g,'|||||')
.replace(/\s\s+/g,' ')
.replace(/ /g,' ')
.replace(/([а-я][-–—][0-9][-–—][а-я])/g, add)
.replace(/(\d)(руб)/g,'$1 $2')
//.replace(/([а-яА-Я])[—-]([а-яА-Я])/g, (full, a, b)=>add(a+'-'+b))
.replace(/([а-яА-Я])[—-]([а-яА-Я])/g, (full, a, b)=>add('<nobr>'+a+'-'+b+'</nobr>'))
.replace(/([0-9])[,]([0-9])/g, (full, a, b)=>add(a+','+b))
.replace(/(ВкусВилл)/g, add)
.replace(/([^\s])[—-]/g, '$1 —')
.replace(/([,\.:])([а-яА-Я0-9\.,"])/g, '$1 $2')
.replace(/\s([,\.:])/g, '$1')
.replace(/([\(])\s/g, '$1')
.replace(/[^\s]([\(])/g, ' $1')
.replace(/[\s+]([\)])/g, '$1')
.replace(/([а-я\?\.])(\d+\.)/g, '$1 $2')
.replace(/ [-–—] /g, '&nbsp;— ')
.replace(/-(\d)/g, '–$1')
.replace(/ (\d\. [а-яА-Я])/g, '\n$1')
.replace(/"([а-яА-Я][^"]+)\s+"([а-яА-Я\s][^"]+)"\s+([а-яА-Я][^"]+)"/g,'«$1 “$2” $3»')
.replace(/"([^"]+)"/g,'«$1»')
.replace(\s+/g,'«')
.replace(/\s+»/g,'»')
.replace(/([а-я])([А-Я])/g,(ful, a, b)=>a+' '+b.toLowerCase())
//.replace(/\. /g,'.&shy; ')
// phone
.replace(/(\+7|8)[\s\(]*(\d{3})[\s\)]*(\d{3})[\s\-—–]*(\d{2})[\s-—–]*(\d{2})/, '+7&nbsp;($2)&nbsp;$3-$4-$5')
.replace(/[А-Я]+/g, function(text) {
return text.length > 2 || text === 'НЕ' ? '<span class="important">'+text.toLowerCase()+'</span>': text;
})
.replace(/свершении/g,'совершении')
.replace(/, ([А-Я])/g, (f, a)=>', '+a.toLowerCase())
.replace(/\|\|\|\|\|/g,'\n\n')
.replace(/\*\*([^*]+)\*\*/g,'<span class="notificate-text">$1</span>')
;
// HANGING
/*
text = text
.replace(/([«(])/g,'<span class="before-hanging-open"></span>&shy;<span class="hanging-open">$1</span>')
.replace(/([»)])/g,'<span class="hanging-close">$1</span>');
*/
//<span class="hanging-close">»</span>');
var lines = text.split('\n');
var numberStarting = 0;
var lastNumber = 0;
var remake = [];
lines.forEach(function(line) {
line.replace(/^(\d+)\.\s/, function(full, num) {
num = num-0;
if(lastNumber !== num - 1){
if(lastNumber>num){
// ok
}else{
var text = remake.pop();
while(lastNumber<num - 1){
text.replace(new RegExp('[^\\d]'+(lastNumber+1)+'[^\\d]'), function(ful, pos,a){
remake.push(text.substr(0, pos).replace(lastNumber+1, lastNumber+1+'.'))
text = text.substr(pos+(lastNumber+1+'').length)
});
lastNumber++;
}
remake.push(text.replace(lastNumber, lastNumber+'.'));
}
}
lastNumber = num;
});
remake.push(line);
});
var longSentance = 200;
if(remake.length === 1 && remake[0].length>longSentance){
remake = remake[ 0 ].split( '. ' ).map( a => a + '.' ).reduce((store, sentance)=>{
var last = (store.pop()||'');
if(last.length+sentance.length< longSentance*1.3){
store.push([ last, sentance ].join( ' ' ));
}else{
if(last)
store.push(last);
store.push(sentance);
}
return store
},[]);
remake = [].concat.apply( [], remake.map( a => [ a, '' ] ));
}
let out = remake.length === 1 ? remake[0] : remake.map(a=>'<p>'+a+'</p>').join('\n');
out = out.replace(/_!@#(\d+)#@!_/g, (f, num)=>{
return valids[f]
});
console.log(income);
console.log(out);
return out;
};
\ No newline at end of file
const store = new Store({
mainMenuActive: 'products',
exportFormat: 'yaml',
exportData: 'tags',
exportTableName: 'SOMETABLE',
productFilterText: '',
'productFilterByTitle': true,
'productFilterByComponent': true,
'productFilterByTag': true
});
try{
var data = JSON.parse( localStorage.getItem( 'store' ) );
console.log(data)
for(var k in data){
store.set(k, data[k]);
}
}catch( e ){}
store.on('change', function() {
localStorage.setItem('store', JSON.stringify(store._props));
});
dP.Product = {
getByID: function(id) {
return dP.products[id];
},
getComponents: function(product) {
return dP.componentsListHashByProduct[ product.id ] || [];
},
getTags: function(product) {
return product.tags.map(dP.Tag.getByID);
}
};
\ No newline at end of file
const dataProvider = {
maxConnection: 0,
maxTagID: 0,
slice: {},
tags: [],
connections: {},
products: {}
},
dP = dataProvider,
initDataProvider = function(data) {
Object.assign(dP, data);
Object.assign(dP, {
componentsList: [],
componentsListHashByProduct: {}
});
let key;
for(key in data.components){
const cmp = data.components[key];
cmp.tags = [];
dP.componentsList.push(cmp);
(dP.componentsListHashByProduct[cmp.id] || (dP.componentsListHashByProduct[cmp.id] = [])).push(cmp);
}
dP.tagsHash = data.tags.reduce((store, item)=>{
dP.maxTagID = Math.max(dP.maxTagID, item.id);
store[item.id] = item;
return store
}, {});
for(key in data.products){
let product = data.products[key];
product.tags = [];
}
data.connections.forEach((connection) => {
dP.maxConnection = Math.max(dP.maxConnection, connection.cid);
if(connection.type === 0){
data.products[connection.eid].tags.push(connection.tag)
}
});
};
dP.slice.productTable = {
getItems: function() {
return Object.keys(dP.products)
.map(k=>dP.products[k])
.map(item=>{
dP.slice.productTable.updateFilterCache(item);
return item;
})
},
updateFilterCache: function(item) {
item._titleFilter = item.title.toLowerCase();
item._componentsFilter = (dP.componentsListHashByProduct[item.id] || []).map(a=>a.name).join(' ');
item._tagsFilter = (item.tags || []).map(t=>dP.tagsHash[t].name).join(' ');
}
};
\ No newline at end of file
const isEqual = function(original, fn) {
return function(val) {
fn(val===original);
}
};
const Store = function(cfg) {
Observable.call(this);
this._props = cfg || {};
};
Store.prototype = {
set: function(key, val) {
if(this._props[key] !== val){
this._props[ key ] = val;
this.fire( 'change', key, val );
this.fire( key, val );
}
},
get: function(key) {
return this._props[key];
},
sub: function(key, fn) {
if(Array.isArray(key)){
var wrap = () => fn.apply(this, key.map(key=>this.get(key)));
for( var i = 0, _i = key.length; i < _i; i++ ){
this.on(key[i], wrap)
}
wrap();
}else{
this.on( key, fn )
fn( this.get( key ) );
}
return this;
},
equal: function(key, val, fn) {
const wrap = isEqual(val, fn);
this.on(key, wrap);
wrap(this.get(key));
return this;
}
};
Store.prototype = Object.assign(new Observable, Store.prototype);
dP.Tag = {
getOrCreate: function(val) {
const matched = dP.Tag.getByName(val);
if(matched)
return matched;
// create
const tagID = ++dP.maxTagID,
item = {
id: tagID,
name: val
};
dP.tagsHash[tagID] = item;
dP.tags.push(item);
return item;
},
remove: function(tagID) {
dP.tags.splice(dP.tags.indexOf(dP.tagsHash[tagID]), 1);
delete dP.tagsHash[tagID];
},
getByID: function(tagID) {
return dP.tagsHash[tagID]
},
getByName: function(name) {
return dP.tags.filter(a=>a.name === name)[0];
},
disconnectFromProduct: function(product, tag) {
const tagID = tag.id;
if(product.tags.indexOf(tagID) > -1){
product.tags.splice( product.tags.indexOf(tagID), 1 );
const connection = dP.connections
.filter(connection =>
connection.tag === tagID &&
connection.type === 0 &&
connection.eid === product.id
)[0];
if(!connection)
return;
if(connection.cid === dP.maxConnection-1)
dP.maxConnection--;
dP.connections.splice(
dP.connections.indexOf(
connection
) ,1);
dP.Tag.removeIfNoConnections(tag);
dP.slice.productTable.updateFilterCache(product);
}
},
connectToProduct: function(product, tag) {
const tagID = tag.id;
if(product.tags.indexOf(tagID) === -1){
product.tags.push( tagID );
dP.connections.push({
cid: ++dP.maxConnection,
type: 0,
eid: product.id,
tag: tagID
});
dP.slice.productTable.updateFilterCache(product);
}
},
removeIfNoConnections: function({tagID}) {
if(dP.connections.filter(connection=>connection.tag === tagID).length === 0){
dP.Tag.remove(tagID)
}
}
};
\ No newline at end of file
// Pico pico graph!
var PCG = window['PCG'] = function(cfg) {
if(cfg.consts){
this.consts = PCG.apply(PCG.apply({}, this.consts), cfg.consts);
delete cfg.consts;
}
PCG.apply(this, cfg);
this._update = this._update.bind(this);
this.resize = this.resize.bind(this);
this.init();
};
PCG.apply = function(a,b) {
for(var k in b){
a[k] = b[k];
}
return a;
};
PCG.ZOOM = {
PIE: 1,
CUSTOM: 2,
LOAD: 3
};
\ No newline at end of file
(function(PCG){
var svgNS = 'http://www.w3.org/2000/svg';
// I am too lazy to do DOM manually / anyway this solution is optimal enough
var setters = {
cls: function(el) {
return function(cls) {
if( el.tagName.toLowerCase() === 'svg' ){
el.setAttribute( 'class', cls );
}else{
el.className = cls;
}
}
},
attr: function(el, attrName) {
return function(val) {
if(val !== void 0 && val !== false){
el.setAttribute( attrName, val );
}else{
el.removeAttribute(attrName)
}
}
}
};
// ~jsx h function
var domEl = function( type, cfg ){
cfg = cfg || {};
var cls = cfg.cls,
style = cfg.style,
attr = cfg.attr,
prop = cfg.prop,
on = cfg.on,
renderTo = cfg.renderTo,
el = cfg.el || document.createElement( type ),
classList = el.classList;
var i, _i;
if( cls ){
if(typeof cls === 'function'){
cls(setters.cls(el));
}else{
if( el.tagName.toLowerCase() === 'svg' ){
el.setAttribute( 'class', cls );
}else{
el.className = cls;
}
}
//if(el.className !== cls)debugger
//cls.split( ' ' ).forEach( function( clsItem ){ classList.add( clsItem ); });
}
if( style ){
PCG.apply( el.style, style );
}
for( i in attr ){
if(attr.hasOwnProperty( i )){
if( typeof attr[ i ] === 'function' ){
attr[ i ]( setters.attr( el, i ) );
}else{
setters.attr( el, i )( attr[ i ] );
}
}
}
for( i in prop ){
prop.hasOwnProperty( i ) && ( el[ i ] = prop[ i ] );
}
for( i in on ){
on.hasOwnProperty( i ) && el.addEventListener( i, on[ i ] );
}
for( i = 2, _i = arguments.length; i < _i; i++ ){
var child = arguments[ i ];
D.appendChild( el, child );
}
if( renderTo ){
D.appendChild( renderTo, el );
}
return el;
};
var D = PCG.D = {
svg: null,
label: null,
div: null,
span: null,
path: null,
canvas: null,
input: null,
textarea: null,
tBody: null,
tHead: null,
th: null,
td: null,
tr: null,
Text: function( val ){ return document.createTextNode( val );}
};
'div,span,input,label,canvas,span,textarea,table,tr,td,th,tBody,tHead'.split( ',' ).forEach( function( name ){
D[ name ] = function(){
return domEl.apply( null, [ name ].concat([].slice.call(arguments)))
};
} );
'svg,path,circle'.split( ',' ).forEach( function( name ){
D[ name ] = function( cfg){
if( !cfg ){
cfg = {};
}
cfg.el = document.createElementNS( svgNS, name );
cfg.el.setAttribute( 'xmlns', svgNS );
return domEl.apply( null, [ null ].concat([].slice.call(arguments)))
};
} );
D.html = function(cfg){
var el = domEl('div', cfg);
el.innerHTML = [].slice.call(arguments,1).join('\n');
return el;
};
D.removeChildren = function(el){
var subEl;
while((subEl = el.lastChild)){
el.removeChild(subEl);
}
};
D.appendChild = function(el, subEl){
var type = typeof subEl;
if( type !== 'object' ){
if(subEl !== void 0 && subEl !== false){
el.appendChild( D.Text( subEl ) );
}
}else if('dom' in subEl){
el.appendChild( subEl.dom );
}else if( Array.isArray(subEl) ){
subEl.forEach(subEl => D.appendChild( el, subEl ) );
}else{
el.appendChild( subEl );
}
};
D.join = function(arr, delimiter){
var out = [], isFn = typeof delimiter === 'function';
for( var i = 0, _i = arr.length - 1; i < _i; i++ ){
out.push(arr[i], isFn?delimiter():delimiter);
}
if(i < _i+1)
out.push(arr[i]);
return out;
};
D.cls = function() {
var out = [], i = 0, _i = arguments.length, token, tmp, key;
for(;i<_i;i++){
token = arguments[i];
if(typeof token === 'string'&& token){
out.push( token );
}else if(typeof token === 'object'){
if(Array.isArray(token)){
tmp = D.cls.apply(null, token);
tmp && out.push( token );
}else{
for(key in token){
token[key] && out.push( key );
}
}
}else if(typeof token === 'function'){
}
}
return out.join(' ');
};
D.escapeCls = function(cls) {
return (cls+'').replace(/[^a-zA-Z0-9\-_]/g,'');
}
})(window['PCG']);
\ No newline at end of file
var Observable = function() {
this._listeners = {};
};
Observable.prototype = {
on: function(k, v) {
(this._listeners[k] || (this._listeners[k] = [])).push(v);
var _self = this;
return function ReleaseObservable() {
_self.un(k, v);
};
},
un: function(k, v) {
var list = this._listeners[k];
if(list){
var id = list.indexOf(v);
if(id > -1){
list.splice(id, 1);
}
}
},
fire: function(k) {
var listeners = this._listeners[k];
if(listeners === void 0)
return;
for( var i = 0, _i = listeners.length; i < _i; i++ ){
const listener = listeners[ i ];
listener.apply(this, [].slice.call(arguments, 1));
}
}
};
const D = PCG.D;
const {div, span} = D;
const view = {
page: {},
cmp: {}
};
\ No newline at end of file
view.cmp.Menu = ({title, id, key, cls}) =>
div({
cls: update => store.equal(
key,
id,
active => update(
D.cls(
'main-menu-item',
'main-menu-item__'+D.escapeCls(id),
cls,
{'main-menu-item__active':active}
)
)
),
on: {
click: ()=> store.set(key, id)}
}, title);
\ No newline at end of file
view.cmp.Switch = (cfg, contentHash) => {
const cmp = div( {
cls: update => store.sub(
cfg.key,
val => update(
D.cls(
'cmp-switch',
cfg.cls,
{ 'cmp-switch__filled': val in contentHash } ) ) ) } );
store.sub( cfg.key, (val)=> {
D.removeChildren(cmp);
if(val in contentHash)
D.appendChild( cmp, contentHash[ val ] );
});
return cmp;
};
\ No newline at end of file
view.cmp.Table = function(cfg){
Object.assign(this, cfg);
const children = this.childrenEl = D.div({
cls: 'cmp-table__children'
});
this.dom = D.div({
cls: D.cls('cmp-table', cfg.cls)
}, children);
this.currentSlice = [];
this.childrenEls = [];
setTimeout(()=>this.updateChildren(),0);
};
view.cmp.Table.prototype = {
currentSlice: [],
childrenEls: [],
childrenEl: null,
filterText: '',
filterFn: () => true,
afterFilter: ()=>true,
filter: function(text) {
this.filterText = text;
this.filterRegExp = new RegExp(text.replace(/[\?\*\.\+]/g,''), 'ig')
},
fetch: function() {
const field = Object.keys(this.sort[0])[0]
this.currentSlice = this.items
.filter(item=>this.filterFn.call(item, this.filterText, this))
.sort((a,b)=>a[field] > b.field ? 1 : a[field] < b.field ? -1 : 0)
.map(data=>({data, dom: null}));
this.afterFilter(this.getSelected());
},
updateChildren: function() {
this.fetch();
D.removeChildren(this.childrenEl);
this.currentSlice.forEach((item) => {
D.appendChild(this.childrenEl, item.dom = this.itemTpl(item.data, this, item));
})
},
updateChild: function(item) {
if(item.dom){
const dom = this.itemTpl(item.data, this, item);
item.dom.parentNode.replaceChild(dom, item.dom);
item.dom = dom;
}
},
updateChildByData: function(data) {
const match = this.currentSlice.filter(i=>i.data===data),
item = match[0];
if(!item)
return;
if(item.dom){
const dom = this.itemTpl(item.data, this, item);
item.dom.parentNode.replaceChild(dom, item.dom);
item.dom = dom;
}
},
getSelected: function() {
return this.currentSlice.filter(i=>!i.hidden).map(i=>i.data)
},
highlight: function(text) {
if(!this.filterText)
return text;
return D.join(text.split(this.filterRegExp), ()=>D.span({cls: 'highlighted'}, this.filterText))
},
getActionDelegate: function() {
var me = this;
return function(e) {
const [type, val] = this.getAttribute('data-action').split(':');
const match = me.currentSlice.filter(({data})=>data.id+'' === val+'');
if(type === 'hide'){
if(match.length){
match[0].hidden = true;
me.updateChild(match[0])
me.afterFilter(me.getSelected());
}
}
if(type === 'toggle'){
if(match.length){
match[0].full = !match[0].full;
me.updateChild(match[0])
}
}
e.stopPropagation();
}
},
};
\ No newline at end of file
view.cmp.Tag = function(text) {
return D.span({cls: 'tag'}, '#', text)
};
\ No newline at end of file
view.cmp.TagField = (function(){
const TagField = function( data ){
Observable.call( this );
var field, isFocused = false, lastVal, dropDown;
//var cacheTagsDom = {};
var offset = 0;
var matchedItems = 0;
var neBlur = false;
var autocomplete = ( e ) => {
offset = 0;
var val = field.value.trim().toLowerCase();
if( lastVal !== val ){
var matched = val === '' ? [] : dP.tags.filter( t => t.name.toLowerCase().trim() !== val && t.name.toLowerCase().trim().indexOf( val ) > -1 ).slice( 0, 20 );
this.value = lastVal = val;
matchedItems = matched.length;
D.removeChildren( dropDown );
matched.forEach( function( match ){
D.appendChild( dropDown, div( {
cls: 'cmp-tag-dropdown-item',
on: {
click: () => {
field.value = match.name;
autocomplete();
},
mousedown: () => {
neBlur = true;
setTimeout( () => neBlur = false, 40 )
clearTimeout( blurTimeout )
}
}
},
view.cmp.Table.prototype.highlight.call( {
filterText: val,
filterRegExp: new RegExp( val, 'ig' )
}, match.name ) ) );//cacheTagsDom[match.id] || (cacheTagsDom[match.id] = );
} );
dropDownUpdateCls();
}
};
var _dropDownUpdateCls,
dropDownUpdateCls = function(){
_dropDownUpdateCls(
D.cls( 'cmp-tag-dropdown', {
'cmp-tag-dropdown__hidden': matchedItems === 0 || isFocused === false
} )
)
};
var blurTimeout;
var el = div( { cls: 'cmp-tag-field' },
field = D.input( {
cls: 'cmp-tag-input',
attr: { placeholder: 'Тэг' },
on: {
input: autocomplete,
focus: () => {
clearTimeout( blurTimeout );
isFocused = true;
dropDownUpdateCls()
},
blur: () => {
if( !neBlur ){
blurTimeout = setTimeout( function(){
isFocused = false;
dropDownUpdateCls();
}, 100 )
}
}
}
} ),
dropDown = div( {
cls: ( update ) => {
_dropDownUpdateCls = update;
dropDownUpdateCls();
}
} )
);
this.dom = el;
};
TagField.prototype = {
getValue: function(){
return this.value;
}
};
TagField.prototype = Object.assign( new Observable, TagField.prototype );
return TagField;
})();
\ No newline at end of file
view.page.Export = function() {
this.dom =
div({cls: 'export-panel'},
div({cls: 'title-gradient'},
div({cls: 'export-sub-menu'},
div({cls: 'export-sub-menu'},
view.cmp.Menu({title: 'Тэги', id: 'tags', key: 'exportData'}),
view.cmp.Menu({title: 'Связи', id: 'connections', key: 'exportData'})
),
div({cls: 'export-sub-menu'},
view.cmp.Menu({title: 'CSV', id: 'csv', key: 'exportFormat'}),
view.cmp.Menu({title: 'JSON', id: 'json', key: 'exportFormat'}),
view.cmp.Menu({title: 'YAML', id: 'yaml', key: 'exportFormat'}),
view.cmp.Menu({title: 'SQL', id: 'sql', key: 'exportFormat'}),
)
)
),
exportLogic(D.textarea({cls: 'export-data'})),
div({cls: 'export-comment'}, `Connetction type<Enum>: 0 — продукт, 1 — компонент`)
);
};
\ No newline at end of file
view.cmp.Answer = function(answer, type) {
return D.label({cls: D.cls('quiz-answer-label', 'quiz-answer-label__'+type)},
D.input({
attr: {type, checked: answer.correct}
}),
answer.text
)
};
view.page.Generate = function() {
const update = function() {
const photo = store.get('generatePhoto') === 'photo',
type = store.get('generateType'),
result = quizGenerator(type, photo);
title.innerText = result.question;
debug.value = result.log.join('\n')
D.removeChildren(answers);
D.appendChild(answers, result.answers.map((a)=>view.cmp.Answer(a, type)));
};
let title, answers, debug;
this.dom =
div({cls: 'generate-panel'},
div({cls: 'title-gradient'},
div({cls: 'generate-sub-menu'},
div({cls: 'generate-sub-menu'},
view.cmp.Menu({title: 'Единственный', id: 'radio', key: 'generateType'}),
view.cmp.Menu({title: 'Множественный', id: 'checkbox', key: 'generateType'})
),
div({cls: 'generate-sub-menu'},
view.cmp.Menu({title: 'С фото', id: 'photo', key: 'generatePhoto'}),
view.cmp.Menu({title: 'Без фото', id: 'noPhoto', key: 'generatePhoto'})
)
)
),
div({cls: 'generate-controls'},
D.input({
attr: {type: 'button', value: 'Refresh'},
on: {click: update}})),
div({cls: 'generate-example'},
title = div({cls: 'generate-title'}),
answers = div({cls: 'generate-answers'}),
debug = D.textarea({cls: 'generate-debug'})
)
);
store.sub(['generateType', 'generatePhoto'], update);
};
\ No newline at end of file
view.page.Products = function() {
let productTable, productFilterByTitle, productFilterByComponent, productFilterByTag, productFilterText,
tagField;
this.dom = div({cls: 'content-products'},
div({cls: 'product-filter__area title-gradient'},
div({cls: 'product-filter'},
div({cls: 'product-filter__title'},'Фильтр'),
D.input({
attr: {
value: (update)=>store.sub('productFilterText', (val)=>update(val))},
cls: 'product-filter__input',
on: {input: (e)=>store.set('productFilterText', e.target.value)}})
),
div({cls: 'product-filter'},
span({cls: 'product-filter__hint'},'Область фильтрации:'),
D.label({cls: 'product-filter__label'},
D.input({
attr:{
type: 'checkbox',
checked: (update)=>store.sub('productFilterByTitle', (val)=>update(val))},
on: {input: (e)=>{store.set('productFilterByTitle', e.target.checked)}}
}), 'Название'
),
D.label({cls: 'product-filter__label'},
D.input({
attr:{
type: 'checkbox',
checked: (update)=>store.sub('productFilterByComponent', (val)=>update(val))},
on: {input: (e)=>{store.set('productFilterByComponent', e.target.checked)}}
}), 'Ингредиенты'
),
D.label({cls: 'product-filter__label'},
D.input({
attr:{
type: 'checkbox',
checked: (update)=>store.sub('productFilterByTag', (val)=>update(val))},
on: {input: (e)=>{store.set('productFilterByTag', e.target.checked)}}
}), 'Тэги'
)
)
),
div({cls: 'tag-manipulations'},
D.input({attr:{type: 'button', value: 'Удалить тэг'}, on: {
click: ()=> {
var val = tagField.getValue().trim();
if(val!==''){
var tag = dP.Tag.getByName(val);
if(!tag)
return;
productTable.getSelected().forEach(function(item) {
dP.Tag.disconnectFromProduct(dP.Product.getByID(item.id), tag);
productTable.updateChildByData(item);
});
}
}}}),
tagField = new view.cmp.TagField(),
D.input({
cls: update =>
store.sub('productFilteredCount', count =>
update(D.cls('tag-manipulations-add-tag', {
'tag-manipulations__not-active': count === 0 || count > 30}))),
attr:{type: 'button', value: 'Добавить тэг'},
on: {
click: ()=> {
var val = tagField.getValue().trim();
if(val==='')
return;
const tag = dP.Tag.getOrCreate(val);
productTable.getSelected().forEach(function(item) {
dP.Tag.connectToProduct(dP.Product.getByID(item.id), tag);
productTable.updateChildByData(item);
});
}
}
}),
),
productTable = new view.cmp.Table({
sorters: [{id: 'title', type: String}],
sort: [{title: 'asc'}],
filterBy: {title: true, tag: true, component: true},
filterFn: function(text, me) {
return !text ||
(me.filterBy.title && textFilterMatched(this._titleFilter, text)) ||
(me.filterBy.tag && textFilterMatched(this._tagsFilter,text)) ||
(me.filterBy.component && textFilterMatched(this._componentsFilter,text))
},
afterFilter: (items)=>store.set('productFilteredCount', items.length),
itemTpl: (item, me, bonus) => {
const dom = div({
cls: 'table-item table-item__product',
on: { click: tableAction },
attr:{ 'data-action': 'toggle:'+ item.id}
},
div( {
cls: 'table-item-action table-item-collapse',
attr: { title: 'Скрыть', 'data-action': 'hide:' + item.id },
on: { click: tableAction }
}, '←' ),
span( { cls: 'product-title' }, me.highlight( item.title ) ),
( item.tags || [] ).map( t => me.highlight( dP.tagsHash[ t ].name ) ).map( view.cmp.Tag ),
bonus.full && D.html( { cls: 'product-description' }, textFormat(item.description) ),
div(
{ cls: 'table-item__product-components' },
D.join( ( dP.componentsListHashByProduct[ item.id ] || [] ).map( a => D.span( { cls: 'product-cmp' }, me.highlight( a.name ) ) ), ', ' )
)
);
if(bonus.hidden){
if(bonus.hiddenFull){
dom.classList.add( 'table-item__hidden-full' );
}else{
setTimeout( () => {
dom.classList.add( 'table-item__hidden' );
}, 1 )
setTimeout( () => {
bonus.hiddenFull = true;
dom.classList.add( 'table-item__hidden-full' );
}, 300 )
}
}
return dom;
},
items: dP.slice.productTable.getItems()
})
);
const tableAction = productTable.getActionDelegate();
store.sub([
'productFilterText',
'productFilterByTitle',
'productFilterByComponent',
'productFilterByTag'
], function(text, title, component, tag) {
Object.assign(productTable.filterBy, {title, component, tag});
productTable.filter(text.trim().toLowerCase());
productTable.updateChildren();
});
};
\ No newline at end of file
body {
font-family: Verdana, Serif;
}
.main-menu, .export-sub-menu {
display: flex;
}
.main-menu-item.main-menu-item__active {
border-bottom: 5px solid #00832a;
}
.main-menu-item {
flex-direction: row;
padding: 4px 8px 4px;
margin: 5px 5px 2px 5px;
border-bottom: 5px solid transparent;
}
.main-menu-item__export {
margin-left: auto;
}
.main-menu {
border-bottom: 1px solid #00832a;
//margin-bottom: 15px;
}
.table-item {
padding: 10px;
transition: all ease-out 0.3s;
max-height: 500px;
opacity: 1;
position: relative;
}
.table-item:hover {
background: #ffe476;
}
.table-item:hover .product-cmp {
background: #fff;
}
.table-item__product-components {
margin-left: -5px;
}
.table-item__hidden {
max-height: 0;
opacity: 0;
padding: 0;
}
.table-item__hidden-full {
display: none;
}
.table-item-action {
cursor: pointer
}
.tag {
color: #125ba1;
font-style: italic;
font-size: 14px;
margin-left: 8px;
}
.product-cmp {
border-radius: 8px;
background: #fff3ca;
padding: 1px 5px;
font-size: 12px;
}
.product-title {
font-size: 17px;
margin-right: 16px;
}
textarea.export-data {
width: calc(100% - 32px);
margin: 16px 0 5px 14px;
height: calc(100vh - 200px);
}
.export-sub-menu {
margin-right: 10%;
margin-bottom: 10px;
}
.export-sub-menu .main-menu-item, .product-filter__title, .product-filter{
color: #fff;
}
.main-menu-item {
cursor: pointer;
transition: all 0.5s;
}
.product-filter {
display: flex;
padding: 5px;
}
.product-filter__title {
font-size: 20px;
padding-top:4px;
}
.product-filter__input {
margin-left: 20px;
padding: 4px 10px;
font-size: 20px;
font-family: Verdana;
flex-grow: 1;
}
.product-filter__label {
margin-right: 16px;
}
.highlighted {
background: #00832a;
color: #fff;
}
.product-filter__hint {
margin-right: 16px;
}
input:focus, textarea:focus, select:focus {
outline-color: #00832a;
}
.product-filter__area, .title-gradient {
background: linear-gradient(181deg, #afca0b, #00832a);
padding: 12px 8px 16px;
}
.export-panel .title-gradient {
padding-bottom: 0;
}
.export-panel .main-menu-item.main-menu-item__active,
.generate-panel .main-menu-item.main-menu-item__active{
border-bottom: 5px solid #fff;
}
body {margin: 0; padding: 0}
.tag-manipulations {
padding: 8px;
}
.tag-manipulations__not-active {
opacity: 0.3;
pointer-events: none;
}
.cmp-tag-field {
display: inline-block;
width: 300px;
position: relative;
}
.cmp-tag-input {
width: 100%;
box-sizing: border-box;
}
.cmp-tag-dropdown {
position: absolute;
width: 100%;
background: #fff;
border: 1px solid #158b26;
box-sizing: border-box;
margin-top: -1px;
}
.cmp-tag-dropdown-item {
margin: 8px;
}
.cmp-tag-dropdown__hidden {
display: none;
}
.table-item-action {
display: none;
cursor: pointer;
color: #a00;
position: absolute;
top: -4px;
}
.table-item:hover .table-item-action {
display: inline-block;
}
.product-description {
font-size: 14px;
padding: 16px 0 8px;
max-width: 480px;
}
.quiz-answer-label {
display: block;
}
textarea.generate-debug {
width: calc(100% - 32px);
margin: 16px 0 5px 14px;
height: 300px;
}
\ No newline at end of file
data = null;
const init = function() {
let
tagField, exportEl;
div({
renderTo: document.body,
cls: 'content'
},
div({
cls: 'main-menu'
},
view.cmp.Menu({title: 'Продукты', id: 'products', key: 'mainMenuActive'}),
view.cmp.Menu({title: 'Ингредиенты', id: 'components', key: 'mainMenuActive'}),
view.cmp.Menu({title: 'Генерируем', id: 'generate', key: 'mainMenuActive'}),
view.cmp.Menu({title: 'Export', id: 'export', key: 'mainMenuActive', cls: 'menu-item-export'}),
),
view.cmp.Switch({cls: 'content-area', key: 'mainMenuActive'}, {
products: new view.page.Products(),
components: div({}, 'components'),
'export': new view.page.Export(),
generate: new view.page.Generate()
})
);
};
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@hapi/address@^2.1.2":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==
"@hapi/formula@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-1.2.0.tgz#994649c7fea1a90b91a0a1e6d983523f680e10cd"
integrity sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==
"@hapi/hoek@^8.2.4", "@hapi/hoek@^8.3.0":
version "8.5.0"
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.0.tgz#2f9ce301c8898e1c3248b0a8564696b24d1a9a5a"
integrity sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==
"@hapi/joi@^16.1.4":
version "16.1.8"
resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-16.1.8.tgz#84c1f126269489871ad4e2decc786e0adef06839"
integrity sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==
dependencies:
"@hapi/address" "^2.1.2"
"@hapi/formula" "^1.2.0"
"@hapi/hoek" "^8.2.4"
"@hapi/pinpoint" "^1.0.2"
"@hapi/topo" "^3.1.3"
"@hapi/pinpoint@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@hapi/pinpoint/-/pinpoint-1.0.2.tgz#025b7a36dbbf4d35bf1acd071c26b20ef41e0d13"
integrity sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==
"@hapi/topo@^3.1.3":
version "3.1.6"
resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29"
integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==
dependencies:
"@hapi/hoek" "^8.3.0"
accepts@~1.3.7:
version "1.3.7"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
dependencies:
mime-types "~2.1.24"
negotiator "0.6.2"
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
array-flatten@2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296"
integrity sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=
body-parser@1.19.0:
version "1.19.0"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
dependencies:
bytes "3.1.0"
content-type "~1.0.4"
debug "2.6.9"
depd "~1.1.2"
http-errors "1.7.2"
iconv-lite "0.4.24"
on-finished "~2.3.0"
qs "6.7.0"
raw-body "2.4.0"
type-is "~1.6.17"
buffer-alloc-unsafe@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
buffer-alloc@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
dependencies:
buffer-alloc-unsafe "^1.1.0"
buffer-fill "^1.0.0"
buffer-fill@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
buffer-from@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
bytes@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
content-disposition@0.5.3:
version "0.5.3"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
dependencies:
safe-buffer "5.1.2"
content-type@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
cookie-signature@1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
cookie@0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
csv-parser@^2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/csv-parser/-/csv-parser-2.3.2.tgz#3a4146abb9a0be7c3cbcae9c289f0a7e622dc07b"
integrity sha512-ggurTYuhhoUJyrPXTAkiO1x6QXkxAoimV+YSz2eSAXF+jQ/Xve/030T34tVStKFmX56pPtY5PiZl3bR4HkZK+Q==
dependencies:
"@hapi/joi" "^16.1.4"
buffer-alloc "^1.1.0"
buffer-from "^1.0.0"
generate-object-property "^1.0.0"
minimist "^1.2.0"
ndjson "^1.4.0"
debug@2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
destroy@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
etag@~1.8.1:
version "1.8.1"
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
express@^4.17.1:
version "4.17.1"
resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
dependencies:
accepts "~1.3.7"
array-flatten "1.1.1"
body-parser "1.19.0"
content-disposition "0.5.3"
content-type "~1.0.4"
cookie "0.4.0"
cookie-signature "1.0.6"
debug "2.6.9"
depd "~1.1.2"
encodeurl "~1.0.2"
escape-html "~1.0.3"
etag "~1.8.1"
finalhandler "~1.1.2"
fresh "0.5.2"
merge-descriptors "1.0.1"
methods "~1.1.2"
on-finished "~2.3.0"
parseurl "~1.3.3"
path-to-regexp "0.1.7"
proxy-addr "~2.0.5"
qs "6.7.0"
range-parser "~1.2.1"
safe-buffer "5.1.2"
send "0.17.1"
serve-static "1.14.1"
setprototypeof "1.1.1"
statuses "~1.5.0"
type-is "~1.6.18"
utils-merge "1.0.1"
vary "~1.1.2"
finalhandler@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
dependencies:
debug "2.6.9"
encodeurl "~1.0.2"
escape-html "~1.0.3"
on-finished "~2.3.0"
parseurl "~1.3.3"
statuses "~1.5.0"
unpipe "~1.0.0"
forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
fresh@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
generate-object-property@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
integrity sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=
dependencies:
is-property "^1.0.0"
http-errors@1.7.2:
version "1.7.2"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
dependencies:
depd "~1.1.2"
inherits "2.0.3"
setprototypeof "1.1.1"
statuses ">= 1.5.0 < 2"
toidentifier "1.0.0"
http-errors@~1.7.2:
version "1.7.3"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
dependencies:
depd "~1.1.2"
inherits "2.0.4"
setprototypeof "1.1.1"
statuses ">= 1.5.0 < 2"
toidentifier "1.0.0"
iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
dependencies:
safer-buffer ">= 2.1.2 < 3"
inherits@2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
inherits@2.0.4, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
ipaddr.js@1.9.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65"
integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==
is-property@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=
isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
json-stringify-safe@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
methods@^1.1.2, methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
mime-db@1.43.0:
version "1.43.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58"
integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==
mime-types@~2.1.24:
version "2.1.26"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06"
integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==
dependencies:
mime-db "1.43.0"
mime@1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
minimist@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
ms@2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
ndjson@^1.4.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/ndjson/-/ndjson-1.5.0.tgz#ae603b36b134bcec347b452422b0bf98d5832ec8"
integrity sha1-rmA7NrE0vOw0e0UkIrC/mNWDLsg=
dependencies:
json-stringify-safe "^5.0.1"
minimist "^1.2.0"
split2 "^2.1.0"
through2 "^2.0.3"
negotiator@0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
node-async-router@^0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/node-async-router/-/node-async-router-0.0.2.tgz#d80982a5235be28e621ffb68a5d7970885b3548c"
integrity sha1-2AmCpSNb4o5iH/topdeXCIWzVIw=
dependencies:
methods "^1.1.2"
router "^1.1.4"
on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
dependencies:
ee-first "1.1.1"
parseurl@~1.3.2, parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
path-to-regexp@0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
proxy-addr@~2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34"
integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==
dependencies:
forwarded "~0.1.2"
ipaddr.js "1.9.0"
qs@6.7.0:
version "6.7.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
range-parser@~1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
raw-body@2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
dependencies:
bytes "3.1.0"
http-errors "1.7.2"
iconv-lite "0.4.24"
unpipe "1.0.0"
readable-stream@~2.3.6:
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
isarray "~1.0.0"
process-nextick-args "~2.0.0"
safe-buffer "~5.1.1"
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
router@^1.1.4:
version "1.3.3"
resolved "https://registry.yarnpkg.com/router/-/router-1.3.3.tgz#c142f6b5ea4d6b3359022ca95b6580bd217f89cf"
integrity sha1-wUL2tepNazNZAiypW2WAvSF/ic8=
dependencies:
array-flatten "2.1.1"
debug "2.6.9"
methods "~1.1.2"
parseurl "~1.3.2"
path-to-regexp "0.1.7"
setprototypeof "1.1.0"
utils-merge "1.0.1"
safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
"safer-buffer@>= 2.1.2 < 3":
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
send@0.17.1:
version "0.17.1"
resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
dependencies:
debug "2.6.9"
depd "~1.1.2"
destroy "~1.0.4"
encodeurl "~1.0.2"
escape-html "~1.0.3"
etag "~1.8.1"
fresh "0.5.2"
http-errors "~1.7.2"
mime "1.6.0"
ms "2.1.1"
on-finished "~2.3.0"
range-parser "~1.2.1"
statuses "~1.5.0"
serve-static@1.14.1:
version "1.14.1"
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
dependencies:
encodeurl "~1.0.2"
escape-html "~1.0.3"
parseurl "~1.3.3"
send "0.17.1"
setprototypeof@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
setprototypeof@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
split2@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493"
integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==
dependencies:
through2 "^2.0.2"
"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
dependencies:
safe-buffer "~5.1.0"
through2@^2.0.2, through2@^2.0.3:
version "2.0.5"
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
dependencies:
readable-stream "~2.3.6"
xtend "~4.0.1"
toidentifier@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
type-is@~1.6.17, type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
dependencies:
media-typer "0.3.0"
mime-types "~2.1.24"
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment