@shuji-bonji/rfcxml-mcp 0.3.0 → 0.4.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/README.ja.md +39 -33
- package/README.md +37 -29
- package/dist/config.d.ts +26 -26
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +28 -25
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +30 -5
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +49 -7
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +18 -17
- package/dist/index.js.map +1 -1
- package/dist/services/checklist-generator.d.ts +43 -0
- package/dist/services/checklist-generator.d.ts.map +1 -0
- package/dist/services/checklist-generator.js +107 -0
- package/dist/services/checklist-generator.js.map +1 -0
- package/dist/services/rfc-fetcher.d.ts +11 -11
- package/dist/services/rfc-fetcher.d.ts.map +1 -1
- package/dist/services/rfc-fetcher.js +37 -31
- package/dist/services/rfc-fetcher.js.map +1 -1
- package/dist/services/rfc-text-parser.d.ts +4 -6
- package/dist/services/rfc-text-parser.d.ts.map +1 -1
- package/dist/services/rfc-text-parser.js +9 -40
- package/dist/services/rfc-text-parser.js.map +1 -1
- package/dist/services/rfcxml-parser.d.ts +5 -18
- package/dist/services/rfcxml-parser.d.ts.map +1 -1
- package/dist/services/rfcxml-parser.js +21 -95
- package/dist/services/rfcxml-parser.js.map +1 -1
- package/dist/tools/definitions.d.ts +1 -1
- package/dist/tools/definitions.js +27 -27
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/handlers.d.ts +48 -21
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +72 -156
- package/dist/tools/handlers.js.map +1 -1
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/requirement-extractor.d.ts +24 -0
- package/dist/utils/requirement-extractor.d.ts.map +1 -0
- package/dist/utils/requirement-extractor.js +100 -0
- package/dist/utils/requirement-extractor.js.map +1 -0
- package/dist/utils/section.d.ts +21 -0
- package/dist/utils/section.d.ts.map +1 -0
- package/dist/utils/section.js +53 -0
- package/dist/utils/section.js.map +1 -0
- package/dist/utils/text.d.ts.map +1 -1
- package/dist/utils/text.js +3 -2
- package/dist/utils/text.js.map +1 -1
- package/dist/utils/validation.d.ts +14 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +30 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirement-extractor.d.ts","sourceRoot":"","sources":["../../src/utils/requirement-extractor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGhF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,CAAC,EAAE,iBAAiB,EAC1B,OAAO,GAAE,YAAwC,GAChD,WAAW,EAAE,CA0Ef"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 要件抽出の共通ユーティリティ
|
|
3
|
+
* XML/テキストパーサー共通で使用
|
|
4
|
+
*/
|
|
5
|
+
import { extractSentence } from './text.js';
|
|
6
|
+
/**
|
|
7
|
+
* セクションから要件を再帰的に抽出
|
|
8
|
+
*/
|
|
9
|
+
export function extractRequirementsFromSections(sections, filter, options = { parseComponents: true }) {
|
|
10
|
+
const requirements = [];
|
|
11
|
+
let idCounter = 1;
|
|
12
|
+
function processSection(section, path) {
|
|
13
|
+
const sectionId = section.number || section.anchor || path;
|
|
14
|
+
// セクションフィルタリング(サブセクションも処理続行)
|
|
15
|
+
const shouldProcess = !filter?.section || sectionId.startsWith(filter.section);
|
|
16
|
+
if (shouldProcess) {
|
|
17
|
+
// テキストブロックから要件抽出
|
|
18
|
+
for (const block of section.content) {
|
|
19
|
+
if (block.type === 'text' && block.requirements.length > 0) {
|
|
20
|
+
for (const marker of block.requirements) {
|
|
21
|
+
if (filter?.level && marker.level !== filter.level) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const sentence = extractSentence(block.content, marker.position);
|
|
25
|
+
const components = options.parseComponents
|
|
26
|
+
? parseRequirementComponents(sentence, marker.level)
|
|
27
|
+
: {};
|
|
28
|
+
requirements.push({
|
|
29
|
+
id: `R-${sectionId}-${idCounter++}`,
|
|
30
|
+
level: marker.level,
|
|
31
|
+
text: sentence.trim(),
|
|
32
|
+
section: sectionId,
|
|
33
|
+
sectionTitle: section.title,
|
|
34
|
+
fullContext: block.content,
|
|
35
|
+
...components,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// リストアイテムからも抽出
|
|
40
|
+
if (block.type === 'list') {
|
|
41
|
+
for (const item of block.items) {
|
|
42
|
+
for (const marker of item.requirements) {
|
|
43
|
+
if (filter?.level && marker.level !== filter.level) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const components = options.parseComponents
|
|
47
|
+
? parseRequirementComponents(item.content, marker.level)
|
|
48
|
+
: {};
|
|
49
|
+
requirements.push({
|
|
50
|
+
id: `R-${sectionId}-${idCounter++}`,
|
|
51
|
+
level: marker.level,
|
|
52
|
+
text: item.content.trim(),
|
|
53
|
+
section: sectionId,
|
|
54
|
+
sectionTitle: section.title,
|
|
55
|
+
fullContext: item.content,
|
|
56
|
+
...components,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// サブセクションを再帰処理
|
|
64
|
+
for (const subsection of section.subsections) {
|
|
65
|
+
processSection(subsection, `${sectionId}.${subsection.number || ''}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const section of sections) {
|
|
69
|
+
processSection(section, section.number || '');
|
|
70
|
+
}
|
|
71
|
+
return requirements;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 要件文から構成要素を解析
|
|
75
|
+
*/
|
|
76
|
+
function parseRequirementComponents(text, level) {
|
|
77
|
+
const result = {};
|
|
78
|
+
// 主語の抽出("The client MUST" → "client")
|
|
79
|
+
const subjectMatch = text.match(/^(?:The\s+)?(\w+(?:\s+\w+)?)\s+(?:MUST|SHALL|SHOULD|MAY)/i);
|
|
80
|
+
if (subjectMatch) {
|
|
81
|
+
result.subject = subjectMatch[1].toLowerCase();
|
|
82
|
+
}
|
|
83
|
+
// 条件の抽出("if", "when", "unless")
|
|
84
|
+
const conditionMatch = text.match(/\b(if|when|unless|where|in case)\s+([^,.]+)/i);
|
|
85
|
+
if (conditionMatch) {
|
|
86
|
+
result.condition = conditionMatch[2].trim();
|
|
87
|
+
}
|
|
88
|
+
// 例外の抽出
|
|
89
|
+
const exceptionMatch = text.match(/\b(unless|except|excluding)\s+([^,.]+)/i);
|
|
90
|
+
if (exceptionMatch) {
|
|
91
|
+
result.exception = exceptionMatch[2].trim();
|
|
92
|
+
}
|
|
93
|
+
// アクションの抽出(キーワードの後)
|
|
94
|
+
const actionMatch = text.match(new RegExp(`${level}\\s+(.+?)(?:\\.|,|$)`, 'i'));
|
|
95
|
+
if (actionMatch) {
|
|
96
|
+
result.action = actionMatch[1].trim();
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=requirement-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirement-extractor.js","sourceRoot":"","sources":["../../src/utils/requirement-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* セクション関連ユーティリティ
|
|
3
|
+
*/
|
|
4
|
+
import type { Section } from '../types/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* セクション番号を正規化(section-3.5 → 3.5)
|
|
7
|
+
*/
|
|
8
|
+
export declare function normalizeSectionNumber(sectionId: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* セクションを検索(複数フォーマット対応)
|
|
11
|
+
*/
|
|
12
|
+
export declare function findSection(sections: Section[], target: string): Section | null;
|
|
13
|
+
/**
|
|
14
|
+
* セクションのフルパスを取得
|
|
15
|
+
*/
|
|
16
|
+
export declare function getSectionPath(section: Section): string;
|
|
17
|
+
/**
|
|
18
|
+
* セクションからクロスリファレンスを収集
|
|
19
|
+
*/
|
|
20
|
+
export declare function collectCrossReferences(section: Section): Set<string>;
|
|
21
|
+
//# sourceMappingURL=section.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section.d.ts","sourceRoot":"","sources":["../../src/utils/section.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAqB/E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAEvD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAcpE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* セクション関連ユーティリティ
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* セクション番号を正規化(section-3.5 → 3.5)
|
|
6
|
+
*/
|
|
7
|
+
export function normalizeSectionNumber(sectionId) {
|
|
8
|
+
return sectionId.replace(/^section-/, '');
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* セクションを検索(複数フォーマット対応)
|
|
12
|
+
*/
|
|
13
|
+
export function findSection(sections, target) {
|
|
14
|
+
const normalizedTarget = normalizeSectionNumber(target);
|
|
15
|
+
for (const sec of sections) {
|
|
16
|
+
// 各フォーマットでマッチを試行
|
|
17
|
+
const secNumber = sec.number ? normalizeSectionNumber(sec.number) : '';
|
|
18
|
+
const secAnchor = sec.anchor ? normalizeSectionNumber(sec.anchor) : '';
|
|
19
|
+
if (secNumber === normalizedTarget ||
|
|
20
|
+
secAnchor === normalizedTarget ||
|
|
21
|
+
sec.number === target ||
|
|
22
|
+
sec.anchor === target) {
|
|
23
|
+
return sec;
|
|
24
|
+
}
|
|
25
|
+
const found = findSection(sec.subsections || [], target);
|
|
26
|
+
if (found)
|
|
27
|
+
return found;
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* セクションのフルパスを取得
|
|
33
|
+
*/
|
|
34
|
+
export function getSectionPath(section) {
|
|
35
|
+
return section.number || section.anchor || '';
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* セクションからクロスリファレンスを収集
|
|
39
|
+
*/
|
|
40
|
+
export function collectCrossReferences(section) {
|
|
41
|
+
const refs = new Set();
|
|
42
|
+
for (const block of section.content || []) {
|
|
43
|
+
if (block.type === 'text' && block.crossReferences) {
|
|
44
|
+
for (const ref of block.crossReferences) {
|
|
45
|
+
if (ref.type === 'section' && ref.section) {
|
|
46
|
+
refs.add(ref.section);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return refs;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=section.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section.js","sourceRoot":"","sources":["../../src/utils/section.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,OAAO,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAmB,EAAE,MAAc;IAC7D,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAExD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,iBAAiB;QACjB,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEvE,IACE,SAAS,KAAK,gBAAgB;YAC9B,SAAS,KAAK,gBAAgB;YAC9B,GAAG,CAAC,MAAM,KAAK,MAAM;YACrB,GAAG,CAAC,MAAM,KAAK,MAAM,EACrB,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QACzD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YACnD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBAC1C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/utils/text.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CActE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAwBrE;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,GAAG,CAAC,EAAE,CAG1D"}
|
package/dist/utils/text.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* テキスト処理ユーティリティ
|
|
3
3
|
* RFC パーサー共通のテキスト抽出・解析関数
|
|
4
4
|
*/
|
|
5
|
+
import { createRFCReferenceRegex, createSectionReferenceRegex } from '../constants.js';
|
|
5
6
|
/**
|
|
6
7
|
* 指定位置を含む文を抽出
|
|
7
8
|
* @param text - 対象テキスト
|
|
@@ -30,7 +31,7 @@ export function extractSentence(text, position) {
|
|
|
30
31
|
export function extractCrossReferences(text) {
|
|
31
32
|
const refs = [];
|
|
32
33
|
// RFC参照パターン
|
|
33
|
-
const rfcPattern =
|
|
34
|
+
const rfcPattern = createRFCReferenceRegex();
|
|
34
35
|
let match;
|
|
35
36
|
while ((match = rfcPattern.exec(text)) !== null) {
|
|
36
37
|
refs.push({
|
|
@@ -39,7 +40,7 @@ export function extractCrossReferences(text) {
|
|
|
39
40
|
});
|
|
40
41
|
}
|
|
41
42
|
// セクション参照パターン
|
|
42
|
-
const sectionPattern =
|
|
43
|
+
const sectionPattern = createSectionReferenceRegex();
|
|
43
44
|
while ((match = sectionPattern.exec(text)) !== null) {
|
|
44
45
|
refs.push({
|
|
45
46
|
target: match[1],
|
package/dist/utils/text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAEvF;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,QAAgB;IAC5D,UAAU;IACV,IAAI,KAAK,GAAG,QAAQ,CAAC;IACrB,OAAO,KAAK,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,KAAK,EAAE,CAAC;IACV,CAAC;IAED,UAAU;IACV,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,EAAE,CAAC;IACR,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,IAAI,GAAqB,EAAE,CAAC;IAElC,YAAY;IACZ,MAAM,UAAU,GAAG,uBAAuB,EAAE,CAAC;IAC7C,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC;YACR,MAAM,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE;YACxB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED,cAAc;IACd,MAAM,cAAc,GAAG,2BAA2B,EAAE,CAAC;IACrD,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC;YACR,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;YAChB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;SAClB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAI,KAA0B;IACnD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input Validation Utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Validate RFC number
|
|
6
|
+
* @param rfc - RFC number to validate
|
|
7
|
+
* @throws Error if invalid
|
|
8
|
+
*/
|
|
9
|
+
export declare function validateRFCNumber(rfc: unknown): asserts rfc is number;
|
|
10
|
+
/**
|
|
11
|
+
* Check if RFC number is valid (non-throwing version)
|
|
12
|
+
*/
|
|
13
|
+
export declare function isValidRFCNumber(rfc: unknown): rfc is number;
|
|
14
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAcrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAE5D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input Validation Utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Validate RFC number
|
|
6
|
+
* @param rfc - RFC number to validate
|
|
7
|
+
* @throws Error if invalid
|
|
8
|
+
*/
|
|
9
|
+
export function validateRFCNumber(rfc) {
|
|
10
|
+
if (typeof rfc !== 'number') {
|
|
11
|
+
throw new Error(`RFC number must be a number, got ${typeof rfc}`);
|
|
12
|
+
}
|
|
13
|
+
if (!Number.isInteger(rfc)) {
|
|
14
|
+
throw new Error(`RFC number must be an integer, got ${rfc}`);
|
|
15
|
+
}
|
|
16
|
+
if (rfc < 1) {
|
|
17
|
+
throw new Error(`RFC number must be positive, got ${rfc}`);
|
|
18
|
+
}
|
|
19
|
+
// Current highest RFC is around 9700 (as of 2025), set reasonable upper bound
|
|
20
|
+
if (rfc > 99999) {
|
|
21
|
+
throw new Error(`RFC number ${rfc} seems invalid (too large)`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check if RFC number is valid (non-throwing version)
|
|
26
|
+
*/
|
|
27
|
+
export function isValidRFCNumber(rfc) {
|
|
28
|
+
return typeof rfc === 'number' && Number.isInteger(rfc) && rfc >= 1 && rfc <= 99999;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,GAAG,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,8EAA8E;IAC9E,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,4BAA4B,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC;AACtF,CAAC"}
|