@reformer/builder-plugin-cli 1.0.0-beta.1
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/LICENSE +21 -0
- package/README.md +102 -0
- package/dist/cli.d.ts +26 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +207 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/build.d.ts +57 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +261 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/create.d.ts +31 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +43 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/dev.d.ts +35 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +79 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/dry-run.d.ts +38 -0
- package/dist/commands/dry-run.d.ts.map +1 -0
- package/dist/commands/dry-run.js +148 -0
- package/dist/commands/dry-run.js.map +1 -0
- package/dist/commands/findings.d.ts +31 -0
- package/dist/commands/findings.d.ts.map +1 -0
- package/dist/commands/findings.js +14 -0
- package/dist/commands/findings.js.map +1 -0
- package/dist/commands/pack.d.ts +33 -0
- package/dist/commands/pack.d.ts.map +1 -0
- package/dist/commands/pack.js +78 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/template.d.ts +34 -0
- package/dist/commands/template.d.ts.map +1 -0
- package/dist/commands/template.js +109 -0
- package/dist/commands/template.js.map +1 -0
- package/dist/commands/validate.d.ts +43 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +128 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `reformer-plugin validate`: пропустит ли оболочка этот плагин — ДО оболочки.
|
|
3
|
+
*
|
|
4
|
+
* Каждое правило здесь взято из пакета контракта, а не написано заново: разбор манифеста,
|
|
5
|
+
* разбор словаря, расширения кода. Валидатор, пропускающий то, что оболочка отвергнет, хуже
|
|
6
|
+
* отсутствия валидатора, — поэтому своего у CLI только то, чего оболочка не видит вовсе.
|
|
7
|
+
*
|
|
8
|
+
* ## Что проверяется
|
|
9
|
+
*
|
|
10
|
+
* 1. **Манифест исходников** — `parsePluginSourceManifest`: всё, что проверяет оболочка, кроме
|
|
11
|
+
* имени каталога, плюс обязательная версия. Отказ здесь останавливает проверку: без манифеста
|
|
12
|
+
* не известно, какие файлы искать.
|
|
13
|
+
* 2. **Файлы, на которые манифест ссылается**: точка входа (есть и это код), таблица стилей,
|
|
14
|
+
* словари (есть и плоские). Оболочка отказывает на них при загрузке — здесь то же
|
|
15
|
+
* отказом, но до неё. Эти проверки собираются ВСЕ: автору полезнее список, чем первая беда.
|
|
16
|
+
* 3. **Версия `package.json`**, если он есть, совпадает с версией манифеста. Оболочка
|
|
17
|
+
* `package.json` не читает, поэтому расхождение она не заметит, — а упаковка опубликует пакет
|
|
18
|
+
* одной версии с манифестом другой.
|
|
19
|
+
*
|
|
20
|
+
* Чего здесь НЕТ и почему: сверки `provides` с тем, что плагин регистрирует, потолка числа
|
|
21
|
+
* файлов и сверки `compatibility.builder` с версией билдера. Первое требует исполнить код,
|
|
22
|
+
* второе относится к собранному каталогу, а третьего CLI знать не может: в каком билдере плагин
|
|
23
|
+
* запустят, решает не он, и отказ по этому полю был бы отказом по выдуманному числу. Форма
|
|
24
|
+
* диапазона при этом проверяется — опечатка ловится здесь, а не у человека при загрузке.
|
|
25
|
+
*
|
|
26
|
+
* @module @reformer/builder-plugin-cli/commands/validate
|
|
27
|
+
*/
|
|
28
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
29
|
+
import { join } from 'node:path';
|
|
30
|
+
import { isPluginCodeFile, parseMessagesBundle, parsePluginSourceManifest, PLUGIN_MANIFEST_FILE, } from '@reformer/builder-plugin-api/tooling';
|
|
31
|
+
async function readText(path) {
|
|
32
|
+
try {
|
|
33
|
+
return await readFile(path, 'utf8');
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function isFile(path) {
|
|
40
|
+
try {
|
|
41
|
+
return (await stat(path)).isFile();
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Проверяет каталог исходников плагина. Ничего не бросает: отказы — данные. */
|
|
48
|
+
export async function validatePlugin(dir) {
|
|
49
|
+
const text = await readText(join(dir, PLUGIN_MANIFEST_FILE));
|
|
50
|
+
if (text === undefined) {
|
|
51
|
+
return {
|
|
52
|
+
ok: false,
|
|
53
|
+
findings: [
|
|
54
|
+
{
|
|
55
|
+
code: 'manifest-missing',
|
|
56
|
+
message: `в каталоге нет ${PLUGIN_MANIFEST_FILE}`,
|
|
57
|
+
file: PLUGIN_MANIFEST_FILE,
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const parsed = parsePluginSourceManifest(text);
|
|
63
|
+
if (!parsed.ok)
|
|
64
|
+
return { ok: false, findings: [parsed.problem] };
|
|
65
|
+
const { manifest } = parsed;
|
|
66
|
+
const findings = [];
|
|
67
|
+
if (!isPluginCodeFile(manifest.main)) {
|
|
68
|
+
findings.push({
|
|
69
|
+
code: 'entry-missing',
|
|
70
|
+
message: `точка входа «${manifest.main}» — не файл кода: загрузчик берёт только .js/.ts и родственные`,
|
|
71
|
+
file: PLUGIN_MANIFEST_FILE,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
else if (!(await isFile(join(dir, manifest.main)))) {
|
|
75
|
+
findings.push({
|
|
76
|
+
code: 'entry-missing',
|
|
77
|
+
message: `точки входа «${manifest.main}» нет`,
|
|
78
|
+
file: manifest.main,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
if (manifest.styles !== undefined && !(await isFile(join(dir, manifest.styles.file)))) {
|
|
82
|
+
findings.push({
|
|
83
|
+
code: 'styles-invalid',
|
|
84
|
+
message: `объявленной таблицы стилей «${manifest.styles.file}» нет`,
|
|
85
|
+
file: manifest.styles.file,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const messages = manifest.contributes?.messages ?? {};
|
|
89
|
+
for (const [locale, file] of Object.entries(messages)) {
|
|
90
|
+
const bundle = await readText(join(dir, file));
|
|
91
|
+
if (bundle === undefined) {
|
|
92
|
+
findings.push({
|
|
93
|
+
code: 'messages-invalid',
|
|
94
|
+
message: `словарь локали «${locale}»: «${file}» не читается`,
|
|
95
|
+
file,
|
|
96
|
+
});
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const checked = parseMessagesBundle(bundle);
|
|
100
|
+
if (!checked.ok) {
|
|
101
|
+
findings.push({
|
|
102
|
+
code: 'messages-invalid',
|
|
103
|
+
message: `словарь локали «${locale}»: «${file}» ${checked.reason}`,
|
|
104
|
+
file,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const pkg = await readText(join(dir, 'package.json'));
|
|
109
|
+
if (pkg !== undefined) {
|
|
110
|
+
let version;
|
|
111
|
+
try {
|
|
112
|
+
version = JSON.parse(pkg).version;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
version = undefined;
|
|
116
|
+
}
|
|
117
|
+
if (version !== manifest.version) {
|
|
118
|
+
findings.push({
|
|
119
|
+
code: 'package-version',
|
|
120
|
+
message: `версия package.json («${String(version)}») не совпадает с версией манифеста ` +
|
|
121
|
+
`(«${manifest.version}»): пакет опубликуется одной версией, а оболочка покажет другую`,
|
|
122
|
+
file: 'package.json',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return findings.length === 0 ? { ok: true, manifest } : { ok: false, manifest, findings };
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Программный вход CLI: те же команды, что у `reformer-plugin`, без процесса вокруг.
|
|
3
|
+
*
|
|
4
|
+
* @module @reformer/builder-plugin-cli
|
|
5
|
+
*/
|
|
6
|
+
export { buildPlugin, type BuildOptions, type BuildResult } from './commands/build.js';
|
|
7
|
+
export { createPlugin, type CreateOptions, type CreateResult } from './commands/create.js';
|
|
8
|
+
export { startDev, type DevOptions, type DevSession } from './commands/dev.js';
|
|
9
|
+
export { type CliFindingCode, type Finding } from './commands/findings.js';
|
|
10
|
+
export { packPlugin, type PackOptions, type PackResult } from './commands/pack.js';
|
|
11
|
+
export { validatePlugin, type ValidationFinding, type ValidationResult, } from './commands/validate.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EACL,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Программный вход CLI: те же команды, что у `reformer-plugin`, без процесса вокруг.
|
|
3
|
+
*
|
|
4
|
+
* @module @reformer/builder-plugin-cli
|
|
5
|
+
*/
|
|
6
|
+
export { buildPlugin } from './commands/build.js';
|
|
7
|
+
export { createPlugin } from './commands/create.js';
|
|
8
|
+
export { startDev } from './commands/dev.js';
|
|
9
|
+
export { packPlugin } from './commands/pack.js';
|
|
10
|
+
export { validatePlugin, } from './commands/validate.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAuC,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,YAAY,EAAyC,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAoC,MAAM,mBAAmB,CAAC;AAE/E,OAAO,EAAE,UAAU,EAAqC,MAAM,oBAAoB,CAAC;AACnF,OAAO,EACL,cAAc,GAGf,MAAM,wBAAwB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@reformer/builder-plugin-cli",
|
|
3
|
+
"version": "1.0.0-beta.1",
|
|
4
|
+
"description": "Command-line tools for ReFormer Builder plugin authors: scaffold, validate, build, develop and pack a plugin",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"reformer-plugin": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.build.json",
|
|
19
|
+
"test": "node ../../scripts/run-vitest.mjs"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"reformer",
|
|
23
|
+
"builder",
|
|
24
|
+
"plugin",
|
|
25
|
+
"cli"
|
|
26
|
+
],
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=20.0.0"
|
|
29
|
+
},
|
|
30
|
+
"author": "Alexandr Bukhtatyy",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/AlexandrBukhtatyy/ReFormer.git",
|
|
35
|
+
"directory": "packages/reformer-builder-plugin-cli"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://alexandrbukhtatyy.github.io/ReFormer/",
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/AlexandrBukhtatyy/ReFormer/issues"
|
|
40
|
+
},
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"dist",
|
|
46
|
+
"README.md",
|
|
47
|
+
"LICENSE"
|
|
48
|
+
],
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"@reformer/builder-plugin-api": "*",
|
|
51
|
+
"esbuild": "^0.27.1"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@types/node": "^24.10.1",
|
|
55
|
+
"typescript": "^5.9.3",
|
|
56
|
+
"vitest": "^4.0.8"
|
|
57
|
+
}
|
|
58
|
+
}
|