@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 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.0",
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(/^create-/, '')} [имя-проекта | .] [-- флаги]
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 имя команды для справки, например create-xx-project
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
- /** Подставляет {{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;