qfai 0.3.3 → 0.3.4
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 +2 -2
- package/assets/init/.qfai/README.md +2 -0
- package/assets/init/.qfai/prompts/require-to-spec.md +4 -4
- package/assets/init/.qfai/require/README.md +28 -0
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +30 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/report.d.ts +7 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +87 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +9 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +57 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/lib/args.d.ts +18 -0
- package/dist/cli/lib/args.d.ts.map +1 -0
- package/dist/cli/lib/args.js +98 -0
- package/dist/cli/lib/args.js.map +1 -0
- package/dist/cli/lib/assets.d.ts +2 -0
- package/dist/cli/lib/assets.d.ts.map +1 -0
- package/dist/cli/lib/assets.js +24 -0
- package/dist/cli/lib/assets.js.map +1 -0
- package/dist/cli/lib/failOn.d.ts +5 -0
- package/dist/cli/lib/failOn.d.ts.map +1 -0
- package/dist/cli/lib/failOn.js +10 -0
- package/dist/cli/lib/failOn.js.map +1 -0
- package/dist/cli/lib/fs.d.ts +11 -0
- package/dist/cli/lib/fs.d.ts.map +1 -0
- package/dist/cli/lib/fs.js +91 -0
- package/dist/cli/lib/fs.js.map +1 -0
- package/dist/cli/lib/logger.d.ts +4 -0
- package/dist/cli/lib/logger.d.ts.map +1 -0
- package/dist/cli/lib/logger.js +10 -0
- package/dist/cli/lib/logger.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +66 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/core/config.d.ts +44 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +218 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/contractIndex.d.ts +13 -0
- package/dist/core/contractIndex.d.ts.map +1 -0
- package/dist/core/contractIndex.js +66 -0
- package/dist/core/contractIndex.js.map +1 -0
- package/dist/core/contracts.d.ts +5 -0
- package/dist/core/contracts.d.ts.map +1 -0
- package/dist/core/contracts.js +42 -0
- package/dist/core/contracts.js.map +1 -0
- package/dist/core/discovery.d.ts +14 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +55 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/fs.d.ts +6 -0
- package/dist/core/fs.d.ts.map +1 -0
- package/dist/core/fs.js +55 -0
- package/dist/core/fs.js.map +1 -0
- package/dist/core/gherkin/parse.d.ts +7 -0
- package/dist/core/gherkin/parse.d.ts.map +1 -0
- package/dist/core/gherkin/parse.js +25 -0
- package/dist/core/gherkin/parse.js.map +1 -0
- package/dist/core/ids.d.ts +6 -0
- package/dist/core/ids.d.ts.map +1 -0
- package/dist/core/ids.js +52 -0
- package/dist/core/ids.js.map +1 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/parse/adr.d.ts +13 -0
- package/dist/core/parse/adr.d.ts.map +1 -0
- package/dist/core/parse/adr.js +33 -0
- package/dist/core/parse/adr.js.map +1 -0
- package/dist/core/parse/gherkin.d.ts +12 -0
- package/dist/core/parse/gherkin.d.ts.map +1 -0
- package/dist/core/parse/gherkin.js +22 -0
- package/dist/core/parse/gherkin.js.map +1 -0
- package/dist/core/parse/markdown.d.ts +14 -0
- package/dist/core/parse/markdown.d.ts.map +1 -0
- package/dist/core/parse/markdown.js +45 -0
- package/dist/core/parse/markdown.js.map +1 -0
- package/dist/core/parse/spec.d.ts +28 -0
- package/dist/core/parse/spec.d.ts.map +1 -0
- package/dist/core/parse/spec.js +80 -0
- package/dist/core/parse/spec.js.map +1 -0
- package/dist/core/report.d.ts +39 -0
- package/dist/core/report.d.ts.map +1 -0
- package/dist/core/report.js +226 -0
- package/dist/core/report.js.map +1 -0
- package/dist/core/scenarioModel.d.ts +33 -0
- package/dist/core/scenarioModel.d.ts.map +1 -0
- package/dist/core/scenarioModel.js +130 -0
- package/dist/core/scenarioModel.js.map +1 -0
- package/dist/core/specLayout.d.ts +8 -0
- package/dist/core/specLayout.d.ts.map +1 -0
- package/dist/core/specLayout.js +36 -0
- package/dist/core/specLayout.js.map +1 -0
- package/dist/core/types.d.ts +27 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/validate.d.ts +4 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +36 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/core/validators/contracts.d.ts +5 -0
- package/dist/core/validators/contracts.d.ts.map +1 -0
- package/dist/core/validators/contracts.js +162 -0
- package/dist/core/validators/contracts.js.map +1 -0
- package/dist/core/validators/delta.d.ts +4 -0
- package/dist/core/validators/delta.d.ts.map +1 -0
- package/dist/core/validators/delta.js +68 -0
- package/dist/core/validators/delta.js.map +1 -0
- package/dist/core/validators/ids.d.ts +4 -0
- package/dist/core/validators/ids.d.ts.map +1 -0
- package/dist/core/validators/ids.js +88 -0
- package/dist/core/validators/ids.js.map +1 -0
- package/dist/core/validators/scenario.d.ts +5 -0
- package/dist/core/validators/scenario.d.ts.map +1 -0
- package/dist/core/validators/scenario.js +137 -0
- package/dist/core/validators/scenario.js.map +1 -0
- package/dist/core/validators/spec.d.ts +5 -0
- package/dist/core/validators/spec.d.ts.map +1 -0
- package/dist/core/validators/spec.js +94 -0
- package/dist/core/validators/spec.js.map +1 -0
- package/dist/core/validators/traceability.d.ts +4 -0
- package/dist/core/validators/traceability.d.ts.map +1 -0
- package/dist/core/validators/traceability.js +180 -0
- package/dist/core/validators/traceability.js.map +1 -0
- package/dist/core/version.d.ts +2 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +25 -0
- package/dist/core/version.js.map +1 -0
- package/dist/index.d.ts +2 -133
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
- package/assets/init/root/require/README.md +0 -28
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# QFAI Toolkit (v0.3.
|
|
1
|
+
# QFAI Toolkit (v0.3.4)
|
|
2
2
|
|
|
3
3
|
Single-package distribution for QFAI.
|
|
4
4
|
|
|
@@ -18,7 +18,7 @@ npx qfai report
|
|
|
18
18
|
|
|
19
19
|
## できること
|
|
20
20
|
|
|
21
|
-
- `npx qfai init` によるテンプレート生成(specs/contracts
|
|
21
|
+
- `npx qfai init` によるテンプレート生成(specs/contracts に加え、`.qfai/require/README.md`、`.qfai/rules/pnpm.md`、`.qfai/prompts/require-to-spec.md` を含む)
|
|
22
22
|
- `npx qfai validate` による `.qfai/` 内ドキュメントの整合性・トレーサビリティ検査
|
|
23
23
|
- `npx qfai report` によるレポート出力
|
|
24
24
|
|
|
@@ -13,6 +13,7 @@ npx qfai report
|
|
|
13
13
|
|
|
14
14
|
- `specs/` : Spec Pack(spec.md / delta.md / scenario.md)
|
|
15
15
|
- `contracts/` : UI / API / DB 契約を置く場所
|
|
16
|
+
- `require/` : 既存要件の集約(validate 対象外)
|
|
16
17
|
- `rules/` : 規約・運用ルール
|
|
17
18
|
- `prompts/` : 生成プロンプト資産(自動読取はしない)
|
|
18
19
|
- `out/` : `validate` / `report` の出力先(gitignore 推奨)
|
|
@@ -21,6 +22,7 @@ npx qfai report
|
|
|
21
22
|
|
|
22
23
|
- `specs/README.md`
|
|
23
24
|
- `contracts/README.md`
|
|
25
|
+
- `require/README.md`
|
|
24
26
|
- `rules/conventions.md`
|
|
25
27
|
- `rules/pnpm.md`
|
|
26
28
|
- `prompts/README.md`
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# require-to-spec
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
あなたは仕様書作成アシスタントです。`.qfai/require/` 配下の既存要件を読み取り、QFAI の Spec Pack を作成してください。
|
|
4
4
|
|
|
5
5
|
## Inputs
|
|
6
6
|
|
|
7
|
-
-
|
|
7
|
+
- `.qfai/require/` 配下の要件定義書・リンク・原本(読み取れる範囲で)
|
|
8
8
|
- 追加資料がある場合は、それも参照して良い
|
|
9
9
|
|
|
10
10
|
## Output
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
|
|
36
36
|
## 参照ルール(重要)
|
|
37
37
|
|
|
38
|
-
- `.qfai/specs` や `contracts` は
|
|
39
|
-
- `
|
|
38
|
+
- `.qfai/specs` や `contracts` は **.qfai/require を参照してよい**。
|
|
39
|
+
- `.qfai/require` 側から `.qfai/specs` や `contracts` を参照するのは **禁止**。
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# .qfai/require/
|
|
2
|
+
|
|
3
|
+
既存の要件定義書や外部資料を集約するためのディレクトリです。
|
|
4
|
+
QFAI は `.qfai/require/` を **入力(上流)** として扱い、ここに置かれた内容を根拠に Spec を作成します。
|
|
5
|
+
|
|
6
|
+
## 置き方(例)
|
|
7
|
+
|
|
8
|
+
- `.qfai/require/req-0001-<slug>.md`
|
|
9
|
+
- `.qfai/require/links.md`(外部ドキュメントへのリンク集)
|
|
10
|
+
- `.qfai/require/raw/`(PDFや画像などの原本)
|
|
11
|
+
|
|
12
|
+
> 形式は限定しません。内容が参照可能であることを優先してください。
|
|
13
|
+
|
|
14
|
+
## 参照ルール(重要)
|
|
15
|
+
|
|
16
|
+
- `.qfai/require/` は **上流のSSOT** です。
|
|
17
|
+
- `.qfai/specs` や `contracts` は **.qfai/require を参照してよい**。
|
|
18
|
+
- `.qfai/require` 側から `.qfai/specs` や `contracts` を参照するのは **禁止**(循環参照防止)。
|
|
19
|
+
|
|
20
|
+
## AI プロンプトの利用
|
|
21
|
+
|
|
22
|
+
- `.qfai/prompts/require-to-spec.md` を使用し、要件から Spec を作成します。
|
|
23
|
+
- 生成後は必ず人間がレビューし、Spec/Scenario/Contracts の整合を確認してください。
|
|
24
|
+
|
|
25
|
+
## 注意
|
|
26
|
+
|
|
27
|
+
- `.qfai/require/` の内容は QFAI の validate 対象外です。
|
|
28
|
+
- 機密情報の取り扱いは各プロジェクトのルールに従ってください。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;CACd,CAAC;AAEF,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBjE"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { copyTemplateTree } from "../lib/fs.js";
|
|
3
|
+
import { getInitAssetsDir } from "../lib/assets.js";
|
|
4
|
+
import { info } from "../lib/logger.js";
|
|
5
|
+
export async function runInit(options) {
|
|
6
|
+
const assetsRoot = getInitAssetsDir();
|
|
7
|
+
const rootAssets = path.join(assetsRoot, "root");
|
|
8
|
+
const qfaiAssets = path.join(assetsRoot, ".qfai");
|
|
9
|
+
const destRoot = path.resolve(options.dir);
|
|
10
|
+
const destQfai = path.join(destRoot, ".qfai");
|
|
11
|
+
const rootResult = await copyTemplateTree(rootAssets, destRoot, {
|
|
12
|
+
force: options.force,
|
|
13
|
+
dryRun: options.dryRun,
|
|
14
|
+
});
|
|
15
|
+
const qfaiResult = await copyTemplateTree(qfaiAssets, destQfai, {
|
|
16
|
+
force: options.force,
|
|
17
|
+
dryRun: options.dryRun,
|
|
18
|
+
});
|
|
19
|
+
report([...rootResult.copied, ...qfaiResult.copied], [...rootResult.skipped, ...qfaiResult.skipped], options.dryRun, "init");
|
|
20
|
+
}
|
|
21
|
+
function report(copied, skipped, dryRun, label) {
|
|
22
|
+
info(`qfai ${label}: ${dryRun ? "dry-run" : "done"}`);
|
|
23
|
+
if (copied.length > 0) {
|
|
24
|
+
info(` created: ${copied.length}`);
|
|
25
|
+
}
|
|
26
|
+
if (skipped.length > 0) {
|
|
27
|
+
info(` skipped: ${skipped.length}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AASxC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAoB;IAChD,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAElD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE9C,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,QAAQ,EAAE;QAC9D,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,QAAQ,EAAE;QAC9D,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,CACJ,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,EAC5C,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,EAC9C,OAAO,CAAC,MAAM,EACd,MAAM,CACP,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CACb,MAAgB,EAChB,OAAiB,EACjB,MAAe,EACf,KAAa;IAEb,IAAI,CAAC,QAAQ,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,cAAc,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/report.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDrE"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { loadConfig, resolvePath } from "../../core/config.js";
|
|
4
|
+
import { createReportData, formatReportJson, formatReportMarkdown, } from "../../core/report.js";
|
|
5
|
+
import { VALIDATION_SCHEMA_VERSION, } from "../../core/types.js";
|
|
6
|
+
import { error, info } from "../lib/logger.js";
|
|
7
|
+
export async function runReport(options) {
|
|
8
|
+
const root = path.resolve(options.root);
|
|
9
|
+
const configResult = await loadConfig(root);
|
|
10
|
+
const input = configResult.config.output.validateJsonPath;
|
|
11
|
+
const inputPath = path.isAbsolute(input) ? input : path.resolve(root, input);
|
|
12
|
+
let validation;
|
|
13
|
+
try {
|
|
14
|
+
validation = await readValidationResult(inputPath);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
if (isMissingFileError(err)) {
|
|
18
|
+
error([
|
|
19
|
+
`qfai report: 入力ファイルが見つかりません: ${inputPath}`,
|
|
20
|
+
"",
|
|
21
|
+
"まず qfai validate を実行してください。例:",
|
|
22
|
+
" qfai validate",
|
|
23
|
+
"(デフォルトの出力先: .qfai/out/validate.json)",
|
|
24
|
+
"",
|
|
25
|
+
"GitHub Actions テンプレを使っている場合は、workflow の validate ジョブを先に実行してください。",
|
|
26
|
+
].join("\n"));
|
|
27
|
+
process.exitCode = 2;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
32
|
+
const data = await createReportData(root, validation, configResult);
|
|
33
|
+
const output = options.format === "json"
|
|
34
|
+
? formatReportJson(data)
|
|
35
|
+
: formatReportMarkdown(data);
|
|
36
|
+
const outRoot = resolvePath(root, configResult.config, "outDir");
|
|
37
|
+
const defaultOut = options.format === "json"
|
|
38
|
+
? path.join(outRoot, "report.json")
|
|
39
|
+
: path.join(outRoot, "report.md");
|
|
40
|
+
const out = options.outPath ?? defaultOut;
|
|
41
|
+
const outPath = path.isAbsolute(out) ? out : path.resolve(root, out);
|
|
42
|
+
await mkdir(path.dirname(outPath), { recursive: true });
|
|
43
|
+
await writeFile(outPath, `${output}\n`, "utf-8");
|
|
44
|
+
info(`report: info=${validation.counts.info} warning=${validation.counts.warning} error=${validation.counts.error}`);
|
|
45
|
+
info(`wrote report: ${outPath}`);
|
|
46
|
+
}
|
|
47
|
+
async function readValidationResult(inputPath) {
|
|
48
|
+
const raw = await readFile(inputPath, "utf-8");
|
|
49
|
+
const parsed = JSON.parse(raw);
|
|
50
|
+
if (!isValidationResult(parsed)) {
|
|
51
|
+
throw new Error(`validate.json の形式が不正です: ${inputPath}`);
|
|
52
|
+
}
|
|
53
|
+
if (parsed.schemaVersion !== VALIDATION_SCHEMA_VERSION) {
|
|
54
|
+
throw new Error(`validate.json の schemaVersion が不一致です: expected ${VALIDATION_SCHEMA_VERSION}, actual ${parsed.schemaVersion}`);
|
|
55
|
+
}
|
|
56
|
+
return parsed;
|
|
57
|
+
}
|
|
58
|
+
function isValidationResult(value) {
|
|
59
|
+
if (!value || typeof value !== "object") {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
const record = value;
|
|
63
|
+
if (typeof record.schemaVersion !== "string") {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
if (typeof record.toolVersion !== "string") {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
if (!Array.isArray(record.issues)) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
const counts = record.counts;
|
|
73
|
+
if (!counts) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
return (typeof counts.info === "number" &&
|
|
77
|
+
typeof counts.warning === "number" &&
|
|
78
|
+
typeof counts.error === "number");
|
|
79
|
+
}
|
|
80
|
+
function isMissingFileError(error) {
|
|
81
|
+
if (!error || typeof error !== "object") {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
const record = error;
|
|
85
|
+
return record.code === "ENOENT";
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/cli/commands/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FailOn, OutputFormat } from "../../core/config.js";
|
|
2
|
+
export type ValidateOptions = {
|
|
3
|
+
root: string;
|
|
4
|
+
strict: boolean;
|
|
5
|
+
failOn?: FailOn;
|
|
6
|
+
format?: OutputFormat;
|
|
7
|
+
};
|
|
8
|
+
export declare function runValidate(options: ValidateOptions): Promise<number>;
|
|
9
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAMjE,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB3E"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { loadConfig } from "../../core/config.js";
|
|
4
|
+
import { validateProject } from "../../core/validate.js";
|
|
5
|
+
import { shouldFail } from "../lib/failOn.js";
|
|
6
|
+
export async function runValidate(options) {
|
|
7
|
+
const root = path.resolve(options.root);
|
|
8
|
+
const configResult = await loadConfig(root);
|
|
9
|
+
const result = await validateProject(root, configResult);
|
|
10
|
+
const format = options.format ?? "text";
|
|
11
|
+
if (format === "text") {
|
|
12
|
+
emitText(result);
|
|
13
|
+
}
|
|
14
|
+
if (format === "github") {
|
|
15
|
+
result.issues.forEach(emitGitHub);
|
|
16
|
+
}
|
|
17
|
+
await emitJson(result, root, configResult.config.output.validateJsonPath);
|
|
18
|
+
const failOn = resolveFailOn(options, configResult.config.validation.failOn);
|
|
19
|
+
return shouldFail(result, failOn) ? 1 : 0;
|
|
20
|
+
}
|
|
21
|
+
function resolveFailOn(options, fallback) {
|
|
22
|
+
if (options.failOn) {
|
|
23
|
+
return options.failOn;
|
|
24
|
+
}
|
|
25
|
+
if (options.strict) {
|
|
26
|
+
return "warning";
|
|
27
|
+
}
|
|
28
|
+
return fallback;
|
|
29
|
+
}
|
|
30
|
+
function emitText(result) {
|
|
31
|
+
for (const item of result.issues) {
|
|
32
|
+
const location = item.file ? ` (${item.file})` : "";
|
|
33
|
+
const refs = item.refs && item.refs.length > 0 ? ` refs=${item.refs.join(",")}` : "";
|
|
34
|
+
process.stdout.write(`[${item.severity}] ${item.code} ${item.message}${location}${refs}\n`);
|
|
35
|
+
}
|
|
36
|
+
process.stdout.write(`counts: info=${result.counts.info} warning=${result.counts.warning} error=${result.counts.error}\n`);
|
|
37
|
+
}
|
|
38
|
+
function emitGitHub(issue) {
|
|
39
|
+
const level = issue.severity === "error"
|
|
40
|
+
? "error"
|
|
41
|
+
: issue.severity === "warning"
|
|
42
|
+
? "warning"
|
|
43
|
+
: "notice";
|
|
44
|
+
const file = issue.file ? `file=${issue.file}` : "";
|
|
45
|
+
const line = issue.loc?.line ? `,line=${issue.loc.line}` : "";
|
|
46
|
+
const column = issue.loc?.column ? `,col=${issue.loc.column}` : "";
|
|
47
|
+
const location = file ? ` ${file}${line}${column}` : "";
|
|
48
|
+
process.stdout.write(`::${level}${location}::${issue.code}: ${issue.message}\n`);
|
|
49
|
+
}
|
|
50
|
+
async function emitJson(result, root, jsonPath) {
|
|
51
|
+
const abs = path.isAbsolute(jsonPath)
|
|
52
|
+
? jsonPath
|
|
53
|
+
: path.resolve(root, jsonPath);
|
|
54
|
+
await mkdir(path.dirname(abs), { recursive: true });
|
|
55
|
+
await writeFile(abs, `${JSON.stringify(result, null, 2)}\n`, "utf-8");
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type ParsedArgs = {
|
|
2
|
+
command: string | null;
|
|
3
|
+
options: {
|
|
4
|
+
root: string;
|
|
5
|
+
dir: string;
|
|
6
|
+
force: boolean;
|
|
7
|
+
yes: boolean;
|
|
8
|
+
dryRun: boolean;
|
|
9
|
+
reportFormat: "md" | "json";
|
|
10
|
+
reportOut?: string;
|
|
11
|
+
validateFormat: "text" | "github";
|
|
12
|
+
strict: boolean;
|
|
13
|
+
failOn?: "never" | "warning" | "error";
|
|
14
|
+
help: boolean;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
export declare function parseArgs(argv: string[], cwd: string): ParsedArgs;
|
|
18
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/args.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,OAAO,CAAC;QACf,GAAG,EAAE,OAAO,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;QAChB,YAAY,EAAE,IAAI,GAAG,MAAM,CAAC;QAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,GAAG,QAAQ,CAAC;QAClC,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;QACvC,IAAI,EAAE,OAAO,CAAC;KACf,CAAC;CACH,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CA6EjE"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export function parseArgs(argv, cwd) {
|
|
2
|
+
const options = {
|
|
3
|
+
root: cwd,
|
|
4
|
+
dir: cwd,
|
|
5
|
+
force: false,
|
|
6
|
+
yes: false,
|
|
7
|
+
dryRun: false,
|
|
8
|
+
reportFormat: "md",
|
|
9
|
+
validateFormat: "text",
|
|
10
|
+
strict: false,
|
|
11
|
+
help: false,
|
|
12
|
+
};
|
|
13
|
+
const args = [...argv];
|
|
14
|
+
let command = args.shift() ?? null;
|
|
15
|
+
if (command === "--help" || command === "-h") {
|
|
16
|
+
options.help = true;
|
|
17
|
+
command = null;
|
|
18
|
+
}
|
|
19
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
20
|
+
const arg = args[i];
|
|
21
|
+
switch (arg) {
|
|
22
|
+
case "--root":
|
|
23
|
+
options.root = args[i + 1] ?? options.root;
|
|
24
|
+
i += 1;
|
|
25
|
+
break;
|
|
26
|
+
case "--dir":
|
|
27
|
+
options.dir = args[i + 1] ?? options.dir;
|
|
28
|
+
i += 1;
|
|
29
|
+
break;
|
|
30
|
+
case "--force":
|
|
31
|
+
options.force = true;
|
|
32
|
+
break;
|
|
33
|
+
case "--yes":
|
|
34
|
+
options.yes = true;
|
|
35
|
+
break;
|
|
36
|
+
case "--dry-run":
|
|
37
|
+
options.dryRun = true;
|
|
38
|
+
break;
|
|
39
|
+
case "--format": {
|
|
40
|
+
const next = args[i + 1];
|
|
41
|
+
applyFormatOption(command, next, options);
|
|
42
|
+
i += 1;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
case "--strict":
|
|
46
|
+
options.strict = true;
|
|
47
|
+
break;
|
|
48
|
+
case "--fail-on": {
|
|
49
|
+
const next = args[i + 1];
|
|
50
|
+
if (next === "never" || next === "warning" || next === "error") {
|
|
51
|
+
options.failOn = next;
|
|
52
|
+
}
|
|
53
|
+
i += 1;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case "--out":
|
|
57
|
+
{
|
|
58
|
+
const next = args[i + 1];
|
|
59
|
+
if (next) {
|
|
60
|
+
options.reportOut = next;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
i += 1;
|
|
64
|
+
break;
|
|
65
|
+
case "--help":
|
|
66
|
+
case "-h":
|
|
67
|
+
options.help = true;
|
|
68
|
+
break;
|
|
69
|
+
default:
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return { command, options };
|
|
74
|
+
}
|
|
75
|
+
function applyFormatOption(command, value, options) {
|
|
76
|
+
if (!value) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (command === "report") {
|
|
80
|
+
if (value === "md" || value === "json") {
|
|
81
|
+
options.reportFormat = value;
|
|
82
|
+
}
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (command === "validate") {
|
|
86
|
+
if (value === "text" || value === "github") {
|
|
87
|
+
options.validateFormat = value;
|
|
88
|
+
}
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (value === "md" || value === "json") {
|
|
92
|
+
options.reportFormat = value;
|
|
93
|
+
}
|
|
94
|
+
if (value === "text" || value === "github") {
|
|
95
|
+
options.validateFormat = value;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/cli/lib/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/assets.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,IAAI,MAAM,CAuBzC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
export function getInitAssetsDir() {
|
|
5
|
+
const base = import.meta.url;
|
|
6
|
+
const basePath = base.startsWith("file:") ? fileURLToPath(base) : base;
|
|
7
|
+
const baseDir = path.dirname(basePath);
|
|
8
|
+
// src/cli/lib と dist/cli/lib からの解決を想定する。
|
|
9
|
+
const candidates = [
|
|
10
|
+
path.resolve(baseDir, "../../../assets/init"),
|
|
11
|
+
path.resolve(baseDir, "../../assets/init"),
|
|
12
|
+
];
|
|
13
|
+
for (const candidate of candidates) {
|
|
14
|
+
if (existsSync(candidate)) {
|
|
15
|
+
return candidate;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
throw new Error([
|
|
19
|
+
"init 用テンプレートが見つかりません。Template assets not found.",
|
|
20
|
+
"確認したパス / Checked paths:",
|
|
21
|
+
...candidates.map((candidate) => `- ${candidate}`),
|
|
22
|
+
].join("\n"));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../src/cli/lib/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,yCAAyC;IACzC,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,sBAAsB,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,CAAC;KAC3C,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb;QACE,iDAAiD;QACjD,yBAAyB;QACzB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;KACnD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failOn.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/failOn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,YAAY,EAAE,MAAM,EAAE,CAAC;AAEvB,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQ5E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failOn.js","sourceRoot":"","sources":["../../../src/cli/lib/failOn.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,UAAU,CAAC,MAAwB,EAAE,MAAc;IACjE,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type CopyOptions = {
|
|
2
|
+
force: boolean;
|
|
3
|
+
dryRun: boolean;
|
|
4
|
+
};
|
|
5
|
+
export type CopyResult = {
|
|
6
|
+
copied: string[];
|
|
7
|
+
skipped: string[];
|
|
8
|
+
};
|
|
9
|
+
export declare function copyTemplateTree(sourceRoot: string, destRoot: string, options: CopyOptions): Promise<CopyResult>;
|
|
10
|
+
export declare function copyTemplatePaths(sourceRoot: string, destRoot: string, relativePaths: string[], options: CopyOptions): Promise<CopyResult>;
|
|
11
|
+
//# sourceMappingURL=fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/fs.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAGrB;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EAAE,EACvB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CASrB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { access, copyFile, mkdir, readdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export async function copyTemplateTree(sourceRoot, destRoot, options) {
|
|
4
|
+
const files = await collectTemplateFiles(sourceRoot);
|
|
5
|
+
return copyFiles(files, sourceRoot, destRoot, options);
|
|
6
|
+
}
|
|
7
|
+
export async function copyTemplatePaths(sourceRoot, destRoot, relativePaths, options) {
|
|
8
|
+
const allFiles = [];
|
|
9
|
+
for (const relPath of relativePaths) {
|
|
10
|
+
const fullPath = path.join(sourceRoot, relPath);
|
|
11
|
+
const files = await collectTemplateFiles(fullPath);
|
|
12
|
+
allFiles.push(...files);
|
|
13
|
+
}
|
|
14
|
+
return copyFiles(allFiles, sourceRoot, destRoot, options);
|
|
15
|
+
}
|
|
16
|
+
async function copyFiles(files, sourceRoot, destRoot, options) {
|
|
17
|
+
const copied = [];
|
|
18
|
+
const skipped = [];
|
|
19
|
+
const conflicts = [];
|
|
20
|
+
if (!options.force) {
|
|
21
|
+
for (const file of files) {
|
|
22
|
+
const relative = path.relative(sourceRoot, file);
|
|
23
|
+
const dest = path.join(destRoot, relative);
|
|
24
|
+
if (!(await shouldWrite(dest, options.force))) {
|
|
25
|
+
conflicts.push(dest);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (conflicts.length > 0) {
|
|
29
|
+
throw new Error(formatConflictMessage(conflicts));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
for (const file of files) {
|
|
33
|
+
const relative = path.relative(sourceRoot, file);
|
|
34
|
+
const dest = path.join(destRoot, relative);
|
|
35
|
+
if (!(await shouldWrite(dest, options.force))) {
|
|
36
|
+
skipped.push(dest);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (!options.dryRun) {
|
|
40
|
+
await mkdir(path.dirname(dest), { recursive: true });
|
|
41
|
+
await copyFile(file, dest);
|
|
42
|
+
}
|
|
43
|
+
copied.push(dest);
|
|
44
|
+
}
|
|
45
|
+
return { copied, skipped };
|
|
46
|
+
}
|
|
47
|
+
function formatConflictMessage(conflicts) {
|
|
48
|
+
return [
|
|
49
|
+
"既存ファイルと衝突しました。安全のため停止します。",
|
|
50
|
+
"",
|
|
51
|
+
"衝突ファイル:",
|
|
52
|
+
...conflicts.map((conflict) => `- ${conflict}`),
|
|
53
|
+
"",
|
|
54
|
+
"上書きして続行する場合は --force を付けて再実行してください。",
|
|
55
|
+
].join("\n");
|
|
56
|
+
}
|
|
57
|
+
async function collectTemplateFiles(root) {
|
|
58
|
+
const entries = [];
|
|
59
|
+
if (!(await exists(root))) {
|
|
60
|
+
return entries;
|
|
61
|
+
}
|
|
62
|
+
const items = await readdir(root, { withFileTypes: true });
|
|
63
|
+
for (const item of items) {
|
|
64
|
+
const fullPath = path.join(root, item.name);
|
|
65
|
+
if (item.isDirectory()) {
|
|
66
|
+
const nested = await collectTemplateFiles(fullPath);
|
|
67
|
+
entries.push(...nested);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (item.isFile()) {
|
|
71
|
+
entries.push(fullPath);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return entries;
|
|
75
|
+
}
|
|
76
|
+
async function shouldWrite(target, force) {
|
|
77
|
+
if (force) {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
return !(await exists(target));
|
|
81
|
+
}
|
|
82
|
+
async function exists(target) {
|
|
83
|
+
try {
|
|
84
|
+
await access(target);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=fs.js.map
|