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 +1 -1
- package/src/generator.js +33 -9
- package/src/prompts.js +1 -1
- package/src/versions.generated.json +1 -1
package/package.json
CHANGED
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
|
|
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);
|