@mrktg/project-generator 1.0.1 → 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 CHANGED
@@ -10,14 +10,18 @@
10
10
  ## Что делает движок
11
11
 
12
12
  1. Вопросы (`@clack/prompts`): имя проекта (или `.` — текущая папка), бренд из реестра,
13
- путь после `/journey/`, ставить ли зависимости, делать ли `git init`. Любой ответ можно передать
14
- флагом (`--brand`, `--path`, `--install`/`--no-install`, `--git`/`--no-git`), тогда вопрос не задаётся.
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}}` подставляются, неизвестный ключ — ошибка. Файлы `_gitignore`, `_nvmrc`,
20
- `_editorconfig` переименовываются в dot-файлы (npm выкидывает их при публикации).
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.0.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
  },
@@ -40,6 +43,7 @@ export const buildHelp = ({ command, registry }) => `
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/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
- /** Подставляет {{KEY}} из vars. Неизвестный ключ ошибка, чтобы шаблон не разъезжался с vars.js. */
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.replace(PLACEHOLDER_RE, (_, key) => {
6
- if (!(key in vars)) {
7
- throw new Error(`В шаблоне ${fileName} плейсхолдер {{${key}}}, которого нет в buildVars()`);
8
- }
9
- return String(vars[key]);
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),
@@ -9,4 +9,5 @@ export const SITE = {
9
9
  lang: "{{LANG}}",
10
10
  prodUrl: "{{PROD_URL}}",
11
11
  assetsHost: "{{ASSETS_HOST}}",
12
+ fluid: {{FLUID}},
12
13
  } as const;