@zalkera/client 0.26.0 → 0.27.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/bin/validate-storefront.mjs +49 -8
- package/package.json +1 -1
|
@@ -4461,18 +4461,25 @@ if (!singletonFound)
|
|
|
4461
4461
|
* - **콘텐츠를 `content/pages/` 밖으로 옮기면** 빠져나간다. `CONTENT_MODE` 가 `none` 이 되어 N 축이
|
|
4462
4462
|
* 통째로 스킵된다. `content/pages/<slug>/index.json` 도 같다 — [contentPageFiles] 는 재귀하지 않는다.
|
|
4463
4463
|
* 이 축은 이 판정 이전부터 그랬다.
|
|
4464
|
-
* -
|
|
4465
|
-
*
|
|
4466
|
-
* 내용이 다른** 것은 못 가른다.
|
|
4467
|
-
*
|
|
4468
|
-
*
|
|
4469
|
-
*
|
|
4470
|
-
*
|
|
4464
|
+
* - **설치된 `@zalkera/client` 의 계약을 손대면** 빠져나간다 — 비지 않은 `SECTION_CONTRACT` 로
|
|
4465
|
+
* 바꿔치우면 교집합이 비어 조용해진다. 비어 있으면 [warnIfContractMissing] 이 관문에서 rc=7 로
|
|
4466
|
+
* 세우지만 **비지 않았는데 내용이 다른** 것은 못 가른다. 단 이 우회는 검사기가 **그 레포의**
|
|
4467
|
+
* 설치본일 때만 선다 — `createRequire(import.meta.url)` 이 검사기 자기 패키지를 먼저 잡으므로,
|
|
4468
|
+
* 바깥에 고정한 검사기로 재면 반입한 가짜는 무시된다(확인 심의 실측).
|
|
4469
|
+
* - **레포 루트 자체의 이름이 `src`** 이고 그 밑에 `app/` 이 바로 있으면 [resolveRepoRoot] 가 한 칸
|
|
4470
|
+
* 위를 루트로 잡아 콘텐츠가 안 보인다. `src` 라는 이름의 디렉터리에 **정상 배치대로**(`<루트>/src`)
|
|
4471
|
+
* 푸는 것은 해당 없다 — 그 형상은 그대로 선다(확인 심의 실측). 서빙 관문은 `/build` 로 복사해
|
|
4472
|
+
* 띄우므로 어느 쪽도 그 경로로는 닿지 않는다(`sandbox/build.sh`).
|
|
4473
|
+
*
|
|
4474
|
+
* 반대 방향의 한계도 적는다. 어휘 중 넷(`HERO`·`FAQ_LIST`·`TESTIMONIALS`·`LEAD_CTA`)은 업계 통용어라
|
|
4471
4475
|
* **우리와 무관한 레포가 우연히 겹칠 수 있다.** 그때 이 판정은 「선언하라」고만 하고 위반을 주장하지
|
|
4472
4476
|
* 않는다 — 처분을 error 가 아니라 rc=7 로 둔 이유가 그것이다.
|
|
4473
4477
|
*
|
|
4474
4478
|
* 이 축들을 더 조이려면 증거를 넓혀야 하는데(예: `@zalkera/client` 의존 존재를 OR), 그러면 관문이
|
|
4475
4479
|
* 부르는 검사기가 곧 그 의존이라 **선언이 사실상 필수**가 된다. 그것은 기계가 아니라 계약의 결정이다.
|
|
4480
|
+
*
|
|
4481
|
+
* 스타일축에는 짝이 되는 증거가 따로 있다 — [usesThemeInjection]. 그쪽이 없으면 `styling` **한 줄만**
|
|
4482
|
+
* 지워도 S 규칙군이 통째로 경고가 되어, 우회가 두 줄에서 한 줄로 싸질 뿐이었다.
|
|
4476
4483
|
*/
|
|
4477
4484
|
function usesContractVocabulary(repoRoot) {
|
|
4478
4485
|
const known = sectionContractMap();
|
|
@@ -4482,6 +4489,40 @@ function usesContractVocabulary(repoRoot) {
|
|
|
4482
4489
|
return usedSectionTypes(repoRoot, "선언 부재 판정(섹션 어휘 대조)").some((t) => known.has(t));
|
|
4483
4490
|
}
|
|
4484
4491
|
|
|
4492
|
+
/**
|
|
4493
|
+
* **스타일축의 증거 — 우리 주입 배선을 부르는가.**
|
|
4494
|
+
*
|
|
4495
|
+
* 콘텐츠축은 어휘로 재는데 스타일축에는 대응물이 없어서, `styling` **한 줄만** 지우면 S 규칙군이
|
|
4496
|
+
* 통째로 경고로 내려가 rc 가 1 에서 0 이 됐다(확인 심의 실측: 리터럴 색 위반 하나를 심은 팩이
|
|
4497
|
+
* 그 한 줄로 초록이 됐다). 콘텐츠축만 막으면 우회가 두 줄에서 **한 줄로 싸졌을 뿐**이다.
|
|
4498
|
+
*
|
|
4499
|
+
* 증거는 `parseThemeColors(` **호출**이다 — `@zalkera/client` 가 발행한 우리 심볼이고, 테넌트 색을
|
|
4500
|
+
* `<html>` 에 싣는 것 말고 쓸 데가 없다. `--color-primary` 같은 토큰 이름은 Tailwind v4 의 통용
|
|
4501
|
+
* 관용구라 증거로 쓰기엔 약하다.
|
|
4502
|
+
*
|
|
4503
|
+
* **못 잡는 것**: 자기 헬퍼로 손수 배선한 레포(`zalkera-allow-custom-theme-inject` 가 인정하는 형태)는
|
|
4504
|
+
* 이 호출이 없어 증거가 안 잡힌다. 열린 방향이 「안 막는다」쪽이라 그대로 둔다.
|
|
4505
|
+
*/
|
|
4506
|
+
function usesThemeInjection() {
|
|
4507
|
+
const rootFile = appRootFile();
|
|
4508
|
+
if (rootFile === null || rootFile.kind !== "app") return false;
|
|
4509
|
+
const raw = readSafe(rootFile.path, "선언 부재 판정(테마 주입 배선)");
|
|
4510
|
+
if (raw === null) return false;
|
|
4511
|
+
// 주석은 거짓말을 한다 — S8-b 와 같은 앵커를 코드에서만 찾는다.
|
|
4512
|
+
return /parseThemeColors\s*\(/.test(stripComments(raw));
|
|
4513
|
+
}
|
|
4514
|
+
|
|
4515
|
+
if (STYLE_MODE === "inferred" && usesThemeInjection()) {
|
|
4516
|
+
const pkg = join(repoRootDir, "package.json");
|
|
4517
|
+
const what =
|
|
4518
|
+
`root layout 이 parseThemeColors(...) 로 테넌트 색을 주입하는데 zalkera.styling 선언이 없어 ` +
|
|
4519
|
+
`스타일(S) 규칙군을 경고로만 돌렸습니다 — 어느 잣대를 댈지 정하지 못했습니다. ` +
|
|
4520
|
+
`\`"zalkera": {"styling": "tailwind-tokens"}\` 를 선언하십시오 — 우리 토큰 계약을 따르는 것이 ` +
|
|
4521
|
+
`아니면 그 주입 배선을 쓰지 마십시오`;
|
|
4522
|
+
if (GATE_MODE) markUnmeasured(fileExists(pkg) ? pkg : repoRootDir, "EDECL", what);
|
|
4523
|
+
else warnings.push(`[S0] ${what}`);
|
|
4524
|
+
}
|
|
4525
|
+
|
|
4485
4526
|
if (CONTENT_MODE === "inferred" && usesContractVocabulary(repoRootDir)) {
|
|
4486
4527
|
// ⚠ **콘텐츠축에만 건다.** 증거가 콘텐츠 어휘라 그것이 말해 주는 것은 「이 레포가 우리 콘텐츠
|
|
4487
4528
|
// 계약 위에 있다」까지다. 스타일축까지 같이 세우면 **콘텐츠 계약은 따르되 스타일은 자기 것을
|
|
@@ -4502,7 +4543,7 @@ if (CONTENT_MODE === "inferred" && usesContractVocabulary(repoRootDir)) {
|
|
|
4502
4543
|
`콘텐츠(N) 규칙군을 경고로만 돌렸습니다 — 어느 잣대를 댈지 정하지 못했습니다. ` +
|
|
4503
4544
|
`\`"zalkera": {"content": "source"}\` 를 선언하십시오 — 우리 계약을 따르는 것이 아니면 ` +
|
|
4504
4545
|
`콘텐츠를 \`content/pages/\` 밖에 두십시오`;
|
|
4505
|
-
if (GATE_MODE) markUnmeasured(pkg, "EDECL", what);
|
|
4546
|
+
if (GATE_MODE) markUnmeasured(fileExists(pkg) ? pkg : repoRootDir, "EDECL", what);
|
|
4506
4547
|
else warnings.push(`[N0] ${what}`);
|
|
4507
4548
|
}
|
|
4508
4549
|
|