@mrktg/project-generator 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -4
- package/package.json +1 -1
- package/src/args.js +5 -1
- package/src/cli.js +1 -1
- package/src/questions.js +8 -0
- package/src/render.js +20 -7
- package/src/vars.js +2 -0
- package/template/base/src/site.config.ts +1 -0
package/README.md
CHANGED
|
@@ -10,14 +10,18 @@
|
|
|
10
10
|
## Что делает движок
|
|
11
11
|
|
|
12
12
|
1. Вопросы (`@clack/prompts`): имя проекта (или `.` — текущая папка), бренд из реестра,
|
|
13
|
-
путь после `/journey/`,
|
|
14
|
-
флагом (`--brand`, `--path`,
|
|
13
|
+
путь после `/journey/`, флюидная ли вёрстка (по умолчанию нет), ставить ли зависимости,
|
|
14
|
+
делать ли `git init`. Любой ответ можно передать флагом (`--brand`, `--path`,
|
|
15
|
+
`--fluid`/`--no-fluid`, `--install`/`--no-install`, `--git`/`--no-git`), тогда вопрос не задаётся.
|
|
15
16
|
2. `buildVars`: из бренда и региона собирает словарь для шаблона — прод-урл
|
|
16
17
|
`https://<хост бренда>/journey/<путь>/`, `base` для Astro, фавиконка и язык бренда, урлы
|
|
17
18
|
инфраструктуры региона (лоадер футера, clamp-scaling, лоадер аналитики), пакет и версия компонентов.
|
|
18
19
|
3. `scaffold`: копирует `template/base` движка, поверх — `config.templateDir` регионального генератора.
|
|
19
|
-
Плейсхолдеры `{{KEY}}` подставляются, неизвестный ключ — ошибка.
|
|
20
|
-
|
|
20
|
+
Плейсхолдеры `{{KEY}}` подставляются, неизвестный ключ — ошибка. Блок `{{#KEY}}…{{/KEY}}`
|
|
21
|
+
на отдельных строках остаётся только при истинном значении (`{{^KEY}}` — наоборот): так
|
|
22
|
+
региональный шаблон подключает css из clamp-scaling только при флюидной вёрстке.
|
|
23
|
+
Файлы `_gitignore`, `_nvmrc`, `_editorconfig` переименовываются в dot-файлы
|
|
24
|
+
(npm выкидывает их при публикации).
|
|
21
25
|
|
|
22
26
|
## Конфиг регионального генератора
|
|
23
27
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mrktg/project-generator",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Движок генератора лендингов: вопросы, шаблон Astro, подстановка. Бренды, регионы и региональные оверлеи приходят от региональных генераторов.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
package/src/args.js
CHANGED
|
@@ -15,6 +15,8 @@ export const readArgs = (argv) => {
|
|
|
15
15
|
'no-install': { type: 'boolean' },
|
|
16
16
|
git: { type: 'boolean' },
|
|
17
17
|
'no-git': { type: 'boolean' },
|
|
18
|
+
fluid: { type: 'boolean' },
|
|
19
|
+
'no-fluid': { type: 'boolean' },
|
|
18
20
|
help: { type: 'boolean', short: 'h' },
|
|
19
21
|
},
|
|
20
22
|
});
|
|
@@ -27,6 +29,7 @@ export const readArgs = (argv) => {
|
|
|
27
29
|
projectName: positionals[0],
|
|
28
30
|
brandId: values.brand,
|
|
29
31
|
landingPath: values.path,
|
|
32
|
+
fluid: flag('fluid', 'no-fluid'),
|
|
30
33
|
install: flag('install', 'no-install'),
|
|
31
34
|
git: flag('git', 'no-git'),
|
|
32
35
|
},
|
|
@@ -35,11 +38,12 @@ export const readArgs = (argv) => {
|
|
|
35
38
|
|
|
36
39
|
export const buildHelp = ({ command, registry }) => `
|
|
37
40
|
Использование:
|
|
38
|
-
npm create ${command.replace(
|
|
41
|
+
npm create ${command.replace(/(^|\/)create-/, '$1')} [имя-проекта | .] [-- флаги]
|
|
39
42
|
|
|
40
43
|
Флаги (каждый заменяет соответствующий вопрос):
|
|
41
44
|
--brand <id> бренд: ${registry.brands.map((brand) => `${brand.id} (${brand.title.en})`).join(', ')}
|
|
42
45
|
--path <slug> путь лендинга после /journey/ (прод-урл: https://<хост бренда>/journey/<slug>/)
|
|
46
|
+
--fluid / --no-fluid флюидная вёрстка (clamp-scaling); по умолчанию нет
|
|
43
47
|
--install / --no-install
|
|
44
48
|
--git / --no-git
|
|
45
49
|
-h, --help
|
package/src/cli.js
CHANGED
|
@@ -18,7 +18,7 @@ const run = (cmd, args, cwd) =>
|
|
|
18
18
|
* всё это приходит в config от регионального пакета.
|
|
19
19
|
*
|
|
20
20
|
* config:
|
|
21
|
-
* command имя
|
|
21
|
+
* command имя пакета генератора, например @scope/create-project: печатается в шапке и в справке
|
|
22
22
|
* registry реестр брендов региона (brands-core IRegistry)
|
|
23
23
|
* region регион с host, bucketHost, componentsPackage
|
|
24
24
|
* templateDir папка регионального оверлея шаблона (кладётся поверх template/base движка)
|
package/src/questions.js
CHANGED
|
@@ -58,6 +58,14 @@ export const buildQuestions = ({ registry }) => [
|
|
|
58
58
|
}),
|
|
59
59
|
validate: validateLandingPath,
|
|
60
60
|
},
|
|
61
|
+
{
|
|
62
|
+
id: 'fluid',
|
|
63
|
+
ask: () =>
|
|
64
|
+
p.confirm({
|
|
65
|
+
message: 'Флюидная вёрстка (1rem = 1px макета, clamp-scaling)?',
|
|
66
|
+
initialValue: false,
|
|
67
|
+
}),
|
|
68
|
+
},
|
|
61
69
|
{
|
|
62
70
|
id: 'install',
|
|
63
71
|
ask: () => p.confirm({ message: 'Установить зависимости (npm install)?', initialValue: true }),
|
package/src/render.js
CHANGED
|
@@ -1,10 +1,23 @@
|
|
|
1
|
+
/** Блок вида {{#KEY}} … {{/KEY}} на отдельных строках: остаётся, если vars.KEY истинно. {{^KEY}} — наоборот. */
|
|
2
|
+
const SECTION_RE = /^[ \t]*\{\{([#^])([A-Z0-9_]+)\}\}[ \t]*\r?\n([\s\S]*?)^[ \t]*\{\{\/\2\}\}[ \t]*\r?\n/gm;
|
|
3
|
+
|
|
1
4
|
const PLACEHOLDER_RE = /\{\{([A-Z0-9_]+)\}\}/g;
|
|
2
5
|
|
|
3
|
-
|
|
6
|
+
const requireVar = (vars, key, fileName) => {
|
|
7
|
+
if (!(key in vars)) {
|
|
8
|
+
throw new Error(`В шаблоне ${fileName} плейсхолдер {{${key}}}, которого нет в buildVars()`);
|
|
9
|
+
}
|
|
10
|
+
return vars[key];
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Сначала раскрывает условные блоки, потом подставляет {{KEY}} из vars.
|
|
15
|
+
* Неизвестный ключ — ошибка, чтобы шаблон не разъезжался с vars.js.
|
|
16
|
+
*/
|
|
4
17
|
export const render = (source, vars, fileName = '') =>
|
|
5
|
-
source
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
18
|
+
source
|
|
19
|
+
.replace(SECTION_RE, (_, kind, key, body) => {
|
|
20
|
+
const keep = kind === '#' ? Boolean(requireVar(vars, key, fileName)) : !requireVar(vars, key, fileName);
|
|
21
|
+
return keep ? body : '';
|
|
22
|
+
})
|
|
23
|
+
.replace(PLACEHOLDER_RE, (_, key) => String(requireVar(vars, key, fileName)));
|
package/src/vars.js
CHANGED
|
@@ -31,6 +31,8 @@ export const buildVars = async (config, answers) => {
|
|
|
31
31
|
FAVICON_TYPE: brand.favicon.type,
|
|
32
32
|
COMPONENTS_PACKAGE: region.componentsPackage,
|
|
33
33
|
COMPONENTS_VERSION: await componentsVersion(region.componentsPackage),
|
|
34
|
+
// Флюидная вёрстка: подключать ли css из clamp-scaling
|
|
35
|
+
FLUID: answers.fluid === true,
|
|
34
36
|
ANALYTICS_LOADER_URL: analyticsLoaderUrl(region),
|
|
35
37
|
CLAMP_SCALING_BASE_URL: clampScalingBaseUrl(region),
|
|
36
38
|
FOOTER_LOADER_URL: footerLoaderUrl(region),
|