create-vimp-game 0.3.0 → 0.3.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-vimp-game",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Scaffolder for VIMP game plugins",
5
5
  "keywords": [
6
6
  "vimp",
package/src/generator.js CHANGED
@@ -144,19 +144,43 @@ async function applyEnginePath(targetDir, enginePath) {
144
144
  await writeFile(file, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
145
145
  }
146
146
 
147
+ // Приводит введённое человеком к голому https-адресу проекта, из которого
148
+ // собираются оба поля. Разбираются все формы, которые реально вводят руками:
149
+ // шорткат `user/repo`, строка из кнопки "Code → HTTPS" (хвост `.git`),
150
+ // scp-форма `git@host:a/b`, `git+`/`ssh://`/`git://`, `#readme` и слэш.
151
+ //
152
+ // Движковый resolveProjectUrl сюда не импортируется: у пакета нулевые
153
+ // рантайм-зависимости (см. prompts.js), а vimp-engine ему даже не
154
+ // зависимость. Формы держать согласованными с packages/engine/src/lib/
155
+ // packageLink.js — их читает та же ссылка в футере.
156
+ function normalizeRepositoryUrl(raw) {
157
+ let url = raw.trim().replace(/^git\+/, '');
158
+
159
+ if (/^[\w.-]+\/[\w.-]+$/.test(url)) {
160
+ return `https://github.com/${url}`;
161
+ }
162
+
163
+ // scp-форма git@host:user/repo — двоеточие здесь разделитель, не порт
164
+ const scp = /^git@([^:/]+):(.+)$/.exec(url);
165
+
166
+ if (scp) {
167
+ url = `https://${scp[1]}/${scp[2]}`;
168
+ }
169
+
170
+ return url
171
+ .replace(/^ssh:\/\/(git@)?/, 'https://')
172
+ .replace(/^git:\/\//, 'https://')
173
+ .replace(/#readme$/, '')
174
+ .replace(/\.git(?=$|[#?])/, '')
175
+ .replace(/\/+$/, '');
176
+ }
177
+
147
178
  // Адрес проекта в package.json: движок берёт из него ссылку в футере формы
148
179
  // входа (docs/en/client.md), а правило контракта A7 предупреждает, когда поля
149
180
  // нет. Пишется только по явно заданному значению — угаданный URL уехал бы
150
181
  // битой ссылкой к игрокам.
151
- //
152
- // Раскрывается лишь шорткат `user/repo`: у пакета нулевые рантайм-зависимости,
153
- // поэтому движковый resolveProjectUrl сюда не импортируется — все остальные
154
- // формы (`git+ssh://`, хвост `.git`) он разбирает уже при чтении.
155
182
  async function applyRepository(targetDir, repository) {
156
- const value = repository.trim();
157
- const url = /^[\w.-]+\/[\w.-]+$/.test(value)
158
- ? `https://github.com/${value}`
159
- : value;
183
+ const url = normalizeRepositoryUrl(repository);
160
184
 
161
185
  const file = path.join(targetDir, 'package.json');
162
186
  const manifest = JSON.parse(await readFile(file, 'utf8'));
@@ -210,7 +234,7 @@ export async function generate({
210
234
  }
211
235
 
212
236
  if (
213
- repository.trim() !== '' &&
237
+ (repository ?? '').trim() !== '' &&
214
238
  (await exists(path.join(targetDir, 'package.json')))
215
239
  ) {
216
240
  await applyRepository(targetDir, repository);
package/src/prompts.js CHANGED
@@ -29,7 +29,7 @@ export async function ask(question, fallback = '') {
29
29
  }
30
30
 
31
31
  // переспрос на месте: без него невалидный id всплывал бы TokenError-ом уже
32
- // после всех пяти вопросов, и вводить пришлось бы заново
32
+ // после всех шести вопросов, и вводить пришлось бы заново
33
33
  export async function askValid(question, fallback, isValid, hint) {
34
34
  for (;;) {
35
35
  const answer = await ask(question, fallback);
@@ -1,4 +1,4 @@
1
1
  {
2
- "engine": "0.18.0",
2
+ "engine": "0.19.0",
3
3
  "core": "0.8.4"
4
4
  }