sqlew 4.0.2 → 4.0.3
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/CHANGELOG.md +41 -0
- package/README.md +17 -105
- package/assets/claude-md-snippets/plan-mode-integration.md +13 -0
- package/assets/sample-commands/sqlew.md +144 -0
- package/assets/sample-skills/sqlew-plan-guidance/SKILL.md +55 -0
- package/dist/init-commands.d.ts +5 -2
- package/dist/init-commands.d.ts.map +1 -1
- package/dist/init-commands.js +36 -175
- package/dist/init-commands.js.map +1 -1
- package/dist/init-skills.d.ts +19 -0
- package/dist/init-skills.d.ts.map +1 -0
- package/dist/init-skills.js +104 -0
- package/dist/init-skills.js.map +1 -0
- package/dist/server/setup.d.ts.map +1 -1
- package/dist/server/setup.js +9 -0
- package/dist/server/setup.js.map +1 -1
- package/dist/tests/unit/case-insensitive-validator.test.d.ts +14 -0
- package/dist/tests/unit/case-insensitive-validator.test.d.ts.map +1 -0
- package/dist/tests/unit/case-insensitive-validator.test.js +390 -0
- package/dist/tests/unit/case-insensitive-validator.test.js.map +1 -0
- package/dist/tools/tasks/actions/get.d.ts.map +1 -1
- package/dist/tools/tasks/actions/get.js +1 -4
- package/dist/tools/tasks/actions/get.js.map +1 -1
- package/dist/tools/tasks/internal/task-queries.d.ts.map +1 -1
- package/dist/tools/tasks/internal/task-queries.js +2 -8
- package/dist/tools/tasks/internal/task-queries.js.map +1 -1
- package/docs/SLASH_COMMANDS.md +192 -478
- package/docs/SPECIALIZED_AGENTS.md +81 -43
- package/package.json +1 -1
- package/assets/sample-commands/sqw-documentor.md +0 -204
- package/assets/sample-commands/sqw-plan.md +0 -348
- package/assets/sample-commands/sqw-research.md +0 -359
- package/assets/sample-commands/sqw-review.md +0 -377
- package/assets/sample-commands/sqw-scrum.md +0 -457
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-initialize sqlew skills and CLAUDE.md integration on server startup
|
|
3
|
+
* Copies skills from assets if not present, appends to CLAUDE.md if section missing
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Initialize skills in project's .claude/skills directory
|
|
7
|
+
* Only copies if skill directory doesn't exist
|
|
8
|
+
*/
|
|
9
|
+
export declare function initializeSkills(projectRoot: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* Append Plan Mode Integration section to CLAUDE.md if not present
|
|
12
|
+
*/
|
|
13
|
+
export declare function initializeClaudeMd(projectRoot: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Initialize all sqlew integrations (skills + CLAUDE.md)
|
|
16
|
+
* Called during server startup
|
|
17
|
+
*/
|
|
18
|
+
export declare function initializeSqlewIntegrations(projectRoot: string): void;
|
|
19
|
+
//# sourceMappingURL=init-skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-skills.d.ts","sourceRoot":"","sources":["../src/init-skills.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAuC1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAoC5D;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAQrE"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-initialize sqlew skills and CLAUDE.md integration on server startup
|
|
3
|
+
* Copies skills from assets if not present, appends to CLAUDE.md if section missing
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
import { debugLog } from './utils/debug-logger.js';
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = path.dirname(__filename);
|
|
11
|
+
/**
|
|
12
|
+
* Get path to assets directory (relative to dist/)
|
|
13
|
+
*/
|
|
14
|
+
function getAssetsPath() {
|
|
15
|
+
const distDir = __dirname; // .../dist
|
|
16
|
+
const packageRoot = path.dirname(distDir); // .../mcp-sqlew
|
|
17
|
+
return path.join(packageRoot, 'assets');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Initialize skills in project's .claude/skills directory
|
|
21
|
+
* Only copies if skill directory doesn't exist
|
|
22
|
+
*/
|
|
23
|
+
export function initializeSkills(projectRoot) {
|
|
24
|
+
const skillsSourceDir = path.join(getAssetsPath(), 'sample-skills');
|
|
25
|
+
const skillsTargetDir = path.join(projectRoot, '.claude', 'skills');
|
|
26
|
+
// Check if source exists
|
|
27
|
+
if (!fs.existsSync(skillsSourceDir)) {
|
|
28
|
+
debugLog('WARN', 'Skills source directory not found', { skillsSourceDir });
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Get list of skill directories to copy
|
|
32
|
+
const skillDirs = fs.readdirSync(skillsSourceDir, { withFileTypes: true })
|
|
33
|
+
.filter(dirent => dirent.isDirectory())
|
|
34
|
+
.map(dirent => dirent.name);
|
|
35
|
+
for (const skillName of skillDirs) {
|
|
36
|
+
const sourceSkillDir = path.join(skillsSourceDir, skillName);
|
|
37
|
+
const targetSkillDir = path.join(skillsTargetDir, skillName);
|
|
38
|
+
// Only copy if target doesn't exist
|
|
39
|
+
if (!fs.existsSync(targetSkillDir)) {
|
|
40
|
+
try {
|
|
41
|
+
// Create target directory
|
|
42
|
+
fs.mkdirSync(targetSkillDir, { recursive: true });
|
|
43
|
+
// Copy all files in skill directory
|
|
44
|
+
const files = fs.readdirSync(sourceSkillDir);
|
|
45
|
+
for (const file of files) {
|
|
46
|
+
const sourceFile = path.join(sourceSkillDir, file);
|
|
47
|
+
const targetFile = path.join(targetSkillDir, file);
|
|
48
|
+
fs.copyFileSync(sourceFile, targetFile);
|
|
49
|
+
}
|
|
50
|
+
debugLog('INFO', `Skill initialized: ${skillName}`, { targetSkillDir });
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
debugLog('WARN', `Failed to initialize skill: ${skillName}`, { error });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Append Plan Mode Integration section to CLAUDE.md if not present
|
|
60
|
+
*/
|
|
61
|
+
export function initializeClaudeMd(projectRoot) {
|
|
62
|
+
const claudeMdPath = path.join(projectRoot, 'CLAUDE.md');
|
|
63
|
+
const snippetPath = path.join(getAssetsPath(), 'claude-md-snippets', 'plan-mode-integration.md');
|
|
64
|
+
// Check if snippet source exists
|
|
65
|
+
if (!fs.existsSync(snippetPath)) {
|
|
66
|
+
debugLog('WARN', 'CLAUDE.md snippet not found', { snippetPath });
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// Check if CLAUDE.md exists
|
|
70
|
+
if (!fs.existsSync(claudeMdPath)) {
|
|
71
|
+
debugLog('INFO', 'CLAUDE.md not found, skipping integration', { claudeMdPath });
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Read current CLAUDE.md content
|
|
75
|
+
const currentContent = fs.readFileSync(claudeMdPath, 'utf-8');
|
|
76
|
+
// Check if Plan Mode Integration section already exists
|
|
77
|
+
if (currentContent.includes('## Plan Mode Integration')) {
|
|
78
|
+
debugLog('DEBUG', 'Plan Mode Integration section already present in CLAUDE.md');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// Read snippet content
|
|
82
|
+
const snippetContent = fs.readFileSync(snippetPath, 'utf-8');
|
|
83
|
+
// Append snippet to CLAUDE.md
|
|
84
|
+
try {
|
|
85
|
+
const newContent = currentContent.trimEnd() + '\n\n' + snippetContent;
|
|
86
|
+
fs.writeFileSync(claudeMdPath, newContent, 'utf-8');
|
|
87
|
+
debugLog('INFO', 'Plan Mode Integration section added to CLAUDE.md', { claudeMdPath });
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
debugLog('WARN', 'Failed to update CLAUDE.md', { error });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Initialize all sqlew integrations (skills + CLAUDE.md)
|
|
95
|
+
* Called during server startup
|
|
96
|
+
*/
|
|
97
|
+
export function initializeSqlewIntegrations(projectRoot) {
|
|
98
|
+
debugLog('DEBUG', 'Initializing sqlew integrations', { projectRoot });
|
|
99
|
+
// Initialize skills
|
|
100
|
+
initializeSkills(projectRoot);
|
|
101
|
+
// Initialize CLAUDE.md integration
|
|
102
|
+
initializeClaudeMd(projectRoot);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=init-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-skills.js","sourceRoot":"","sources":["../src/init-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/server/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAgE,MAAM,gBAAgB,CAAC;AAG/G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAM7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/server/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAgE,MAAM,gBAAgB,CAAC;AAG/G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAM7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,eAAe,CAAC;IACpB,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE;QACZ,aAAa,EAAE,OAAO,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,eAAe,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,GAAG,WAAW,CAAC;CACtE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAqLnF;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGtD"}
|
package/dist/server/setup.js
CHANGED
|
@@ -12,6 +12,7 @@ import { FileWatcher } from '../watcher/index.js';
|
|
|
12
12
|
import { initDebugLogger, debugLog } from '../utils/debug-logger.js';
|
|
13
13
|
import { ensureSqlewDirectory } from '../config/example-generator.js';
|
|
14
14
|
import { determineProjectRoot } from '../utils/project-root.js';
|
|
15
|
+
import { initializeSqlewIntegrations } from '../init-skills.js';
|
|
15
16
|
/**
|
|
16
17
|
* Initialize server: database, config, project context, file watcher
|
|
17
18
|
* Returns initialized components for server startup
|
|
@@ -166,6 +167,14 @@ export async function initializeServer(parsedArgs) {
|
|
|
166
167
|
autoDeleteConfig: { messageHours, fileHistoryDays, ignoreWeekend },
|
|
167
168
|
debugLogLevel: debugLogLevel
|
|
168
169
|
});
|
|
170
|
+
// 5. Initialize sqlew integrations (skills + CLAUDE.md) - silent, non-blocking
|
|
171
|
+
try {
|
|
172
|
+
initializeSqlewIntegrations(finalProjectRoot);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
debugLog('WARN', 'Failed to initialize sqlew integrations', { error });
|
|
176
|
+
// Non-fatal - continue server startup
|
|
177
|
+
}
|
|
169
178
|
return {
|
|
170
179
|
db,
|
|
171
180
|
fileConfig,
|
package/dist/server/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/server/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAmB,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC/G,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/server/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAmB,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC/G,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAehE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAsB;IAC3D,iEAAiE;IACjE,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;QAC9C,SAAS,EAAE,UAAU,CAAC,MAAM;QAC5B,aAAa,EAAE,UAAU,CAAC,UAAU;KACrC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,cAAc,CAAC,kBAAkB,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IAE7E,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;QAC5C,SAAS,EAAE,UAAU,CAAC,MAAM;QAC5B,aAAa,EAAE,UAAU,CAAC,UAAU;QACpC,YAAY,EAAE,UAAU,CAAC,QAAQ,EAAE,IAAI;KACxC,CAAC,CAAC;IAEH,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;IAEvC,gCAAgC;IAChC,gEAAgE;IAChE,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC;IAE9D,uEAAuE;IACvE,yDAAyD;IACzD,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC;IACtG,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,EAAE,SAAS,IAAI,MAAM,CAAC;IAC5D,eAAe,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAE7C,QAAQ,CAAC,MAAM,EAAE,yBAAyB,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAClE,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAE9C,yDAAyD;IACzD,IAAI,EAAmB,CAAC;IACxB,MAAM,eAAe,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,KAAK,OAAO;WACrC,UAAU,CAAC,QAAQ,EAAE,IAAI,KAAK,UAAU,CAAC;IAEjE,IAAI,eAAe,EAAE,CAAC;QACpB,8CAA8C;QAC9C,2EAA2E;QAC3E,MAAM,MAAM,GAAG,UAAU,CAAC,QAAS,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,QAAS,CAAC,IAAI,CAAC;QACnG,MAAM,MAAM,GAAG;YACb,YAAY,EAAE,MAAgC;YAC9C,UAAU,EAAE;gBACV,GAAG,UAAU,CAAC,QAAS,CAAC,UAAU;gBAClC,IAAI,EAAE,UAAU,CAAC,QAAS,CAAC,IAAI,EAAE,IAAI;gBACrC,QAAQ,EAAE,UAAU,CAAC,QAAS,CAAC,IAAI,EAAE,QAAQ;aAC9C;SACF,CAAC;QAEF,IAAI,CAAC;YACH,EAAE,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAEtC,+DAA+D;YAC/D,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACnC,QAAQ,CAAC,MAAM,EAAE,6BAA6B,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,mDAAmD;YACnD,MAAM,QAAQ,GAAG,0BAA0B,MAAM,CAAC,YAAY,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;YACnF,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;YAC5F,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACjH,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,+DAA+D;QAC/D,MAAM,MAAM,GAAG,MAAM;YACnB,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;YACtC,CAAC,CAAC,SAAS,CAAC;QACd,EAAE,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,yCAAyC;IACzC,IAAI,UAAU,CAAC,uBAAuB,KAAK,SAAS,EAAE,CAAC;QACrD,MAAM,cAAc,CAAC,EAAE,EAAE,WAAW,CAAC,yBAAyB,EAAE,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClH,CAAC;IACD,IAAI,UAAU,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;QACpD,MAAM,cAAc,CAAC,EAAE,EAAE,WAAW,CAAC,wBAAwB,EAAE,MAAM,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC5G,CAAC;IACD,IAAI,UAAU,CAAC,yBAAyB,KAAK,SAAS,EAAE,CAAC;QACvD,MAAM,cAAc,CAAC,EAAE,EAAE,WAAW,CAAC,4BAA4B,EAAE,MAAM,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnH,CAAC;IAED,iDAAiD;IACjD,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,YAAY,CAAC,WAAW,CAAC,yBAAyB,CAAC,KAAK,GAAG,CAAC;IAClF,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;IACxE,MAAM,eAAe,GAAG,YAAY,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC;IAE/E,iEAAiE;IACjE,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC;IACpC,IAAI,WAAmB,CAAC;IACxB,IAAI,eAAe,GAAwD,WAAW,CAAC;IAEvF,iFAAiF;IACjF,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3B,uEAAuE;QACvE,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;QACrC,eAAe,GAAG,KAAK,CAAC;QACxB,QAAQ,CAAC,MAAM,EAAE,gCAAgC,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QACpC,sCAAsC;QACtC,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;QACtC,eAAe,GAAG,QAAQ,CAAC;QAC3B,QAAQ,CAAC,MAAM,EAAE,+BAA+B,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,+BAA+B;QAC/B,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAErD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,kBAAkB,EAAE,CAAC;YAC3D,IAAI,YAAY,EAAE,CAAC;gBACjB,WAAW,GAAG,YAAY,CAAC;gBAC3B,eAAe,GAAG,KAAK,CAAC;gBACxB,QAAQ,CAAC,MAAM,EAAE,gCAAgC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACpG,CAAC;iBAAM,CAAC;gBACN,6BAA6B;gBAC7B,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC1E,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC;gBAC/D,eAAe,GAAG,WAAW,CAAC;gBAC9B,QAAQ,CAAC,MAAM,EAAE,6BAA6B,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,sCAAsC;YACtC,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC1E,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC;YAC/D,eAAe,GAAG,WAAW,CAAC;YAC9B,QAAQ,CAAC,MAAM,EAAE,sCAAsC,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,2DAA2D;QAC3D,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,aAAa,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,WAAW,EAAE;gBACvE,UAAU,EAAE,UAAU,CAAC,UAAU;aAClC,CAAC,CAAC;YAEH,IAAI,aAAa,EAAE,CAAC;gBAClB,QAAQ,CAAC,MAAM,EAAE,qCAAqC,EAAE;oBACtD,WAAW;oBACX,eAAe;oBACf,UAAU,EAAE,UAAU,CAAC,UAAU,IAAI,mBAAmB;iBACzD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,MAAM,cAAc,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,cAAc,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE;QACrE,eAAe,EAAE,gBAAgB;KAClC,CAAC,CAAC;IAEH,QAAQ,CAAC,MAAM,EAAE,4BAA4B,EAAE;QAC7C,SAAS,EAAE,cAAc,CAAC,YAAY,EAAE;QACxC,WAAW,EAAE,cAAc,CAAC,cAAc,EAAE;KAC7C,CAAC,CAAC;IAEH,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,uCAAuC,EAAE;QACxD,MAAM;QACN,SAAS,EAAE,cAAc,CAAC,YAAY,EAAE;QACxC,WAAW,EAAE,cAAc,CAAC,cAAc,EAAE;QAC5C,gBAAgB,EAAE,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE;QAClE,aAAa,EAAE,aAAa;KAC7B,CAAC,CAAC;IAEH,+EAA+E;IAC/E,IAAI,CAAC;QACH,2BAA2B,CAAC,gBAAgB,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,MAAM,EAAE,yCAAyC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,sCAAsC;IACxC,CAAC;IAED,OAAO;QACL,EAAE;QACF,UAAU;QACV,WAAW,EAAE,gBAAgB;QAC7B,cAAc;QACd,YAAY,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE;QAC9D,eAAe;KAChB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IAC1C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit Tests for Case-Insensitive Validator Utility
|
|
3
|
+
*
|
|
4
|
+
* Tests all normalization and duplicate detection functions:
|
|
5
|
+
* - normalizeIdentifier()
|
|
6
|
+
* - checkNormalizedDuplicate()
|
|
7
|
+
* - validateNoNormalizedDuplicate()
|
|
8
|
+
* - findNormalizedMatch()
|
|
9
|
+
*
|
|
10
|
+
* @see src/utils/case-insensitive-validator.ts
|
|
11
|
+
* @since v4.0.2
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=case-insensitive-validator.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"case-insensitive-validator.test.d.ts","sourceRoot":"","sources":["../../../src/tests/unit/case-insensitive-validator.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit Tests for Case-Insensitive Validator Utility
|
|
3
|
+
*
|
|
4
|
+
* Tests all normalization and duplicate detection functions:
|
|
5
|
+
* - normalizeIdentifier()
|
|
6
|
+
* - checkNormalizedDuplicate()
|
|
7
|
+
* - validateNoNormalizedDuplicate()
|
|
8
|
+
* - findNormalizedMatch()
|
|
9
|
+
*
|
|
10
|
+
* @see src/utils/case-insensitive-validator.ts
|
|
11
|
+
* @since v4.0.2
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, before, after } from 'node:test';
|
|
14
|
+
import assert from 'node:assert';
|
|
15
|
+
import knex from 'knex';
|
|
16
|
+
import { normalizeIdentifier, checkNormalizedDuplicate, validateNoNormalizedDuplicate, findNormalizedMatch } from '../../utils/case-insensitive-validator.js';
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Test Suite: normalizeIdentifier()
|
|
19
|
+
// ============================================================================
|
|
20
|
+
describe('normalizeIdentifier()', () => {
|
|
21
|
+
it('should convert to lowercase', () => {
|
|
22
|
+
assert.strictEqual(normalizeIdentifier('DRY'), 'dry');
|
|
23
|
+
assert.strictEqual(normalizeIdentifier('API'), 'api');
|
|
24
|
+
assert.strictEqual(normalizeIdentifier('SOLID'), 'solid');
|
|
25
|
+
});
|
|
26
|
+
it('should handle kebab-case', () => {
|
|
27
|
+
assert.strictEqual(normalizeIdentifier('api-design'), 'apidesign');
|
|
28
|
+
assert.strictEqual(normalizeIdentifier('test-case-name'), 'testcasename');
|
|
29
|
+
assert.strictEqual(normalizeIdentifier('dry-principle'), 'dryprinciple');
|
|
30
|
+
});
|
|
31
|
+
it('should handle snake_case', () => {
|
|
32
|
+
assert.strictEqual(normalizeIdentifier('api_design'), 'apidesign');
|
|
33
|
+
assert.strictEqual(normalizeIdentifier('test_case_name'), 'testcasename');
|
|
34
|
+
assert.strictEqual(normalizeIdentifier('dry_principle'), 'dryprinciple');
|
|
35
|
+
});
|
|
36
|
+
it('should handle camelCase', () => {
|
|
37
|
+
assert.strictEqual(normalizeIdentifier('apiDesign'), 'apidesign');
|
|
38
|
+
assert.strictEqual(normalizeIdentifier('testCaseName'), 'testcasename');
|
|
39
|
+
assert.strictEqual(normalizeIdentifier('dryPrinciple'), 'dryprinciple');
|
|
40
|
+
});
|
|
41
|
+
it('should handle PascalCase', () => {
|
|
42
|
+
assert.strictEqual(normalizeIdentifier('ApiDesign'), 'apidesign');
|
|
43
|
+
assert.strictEqual(normalizeIdentifier('TestCaseName'), 'testcasename');
|
|
44
|
+
assert.strictEqual(normalizeIdentifier('DryPrinciple'), 'dryprinciple');
|
|
45
|
+
});
|
|
46
|
+
it('should handle mixed formats', () => {
|
|
47
|
+
assert.strictEqual(normalizeIdentifier('API-Design_Test'), 'apidesigntest');
|
|
48
|
+
assert.strictEqual(normalizeIdentifier('test_Case-Name'), 'testcasename');
|
|
49
|
+
assert.strictEqual(normalizeIdentifier('DRY_Principle-Test'), 'dryprincipletest');
|
|
50
|
+
});
|
|
51
|
+
it('should remove spaces', () => {
|
|
52
|
+
assert.strictEqual(normalizeIdentifier('api design'), 'apidesign');
|
|
53
|
+
assert.strictEqual(normalizeIdentifier('test case name'), 'testcasename');
|
|
54
|
+
assert.strictEqual(normalizeIdentifier('dry principle'), 'dryprinciple');
|
|
55
|
+
});
|
|
56
|
+
it('should handle all normalization at once', () => {
|
|
57
|
+
// Test: "API-Design_Test Case" → "apidesigntestcase"
|
|
58
|
+
// - Uppercase → lowercase
|
|
59
|
+
// - Hyphens removed
|
|
60
|
+
// - Underscores removed
|
|
61
|
+
// - Spaces removed
|
|
62
|
+
assert.strictEqual(normalizeIdentifier('API-Design_Test Case'), 'apidesigntestcase');
|
|
63
|
+
});
|
|
64
|
+
it('should be consistent for equivalent values', () => {
|
|
65
|
+
const variants = [
|
|
66
|
+
'apiDesign',
|
|
67
|
+
'api-design',
|
|
68
|
+
'api_design',
|
|
69
|
+
'API_DESIGN',
|
|
70
|
+
'API-DESIGN',
|
|
71
|
+
'ApiDesign',
|
|
72
|
+
'api design'
|
|
73
|
+
];
|
|
74
|
+
const normalized = variants.map(normalizeIdentifier);
|
|
75
|
+
const expected = 'apidesign';
|
|
76
|
+
// All should normalize to the same value
|
|
77
|
+
normalized.forEach((value, index) => {
|
|
78
|
+
assert.strictEqual(value, expected, `"${variants[index]}" should normalize to "${expected}"`);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
// ============================================================================
|
|
83
|
+
// Test Suite: checkNormalizedDuplicate()
|
|
84
|
+
// ============================================================================
|
|
85
|
+
describe('checkNormalizedDuplicate()', () => {
|
|
86
|
+
let db;
|
|
87
|
+
before(async () => {
|
|
88
|
+
// Setup in-memory SQLite database
|
|
89
|
+
db = knex({
|
|
90
|
+
client: 'better-sqlite3',
|
|
91
|
+
connection: ':memory:',
|
|
92
|
+
useNullAsDefault: true
|
|
93
|
+
});
|
|
94
|
+
// Create test table
|
|
95
|
+
await db.schema.createTable('test_tags', (table) => {
|
|
96
|
+
table.increments('id').primary();
|
|
97
|
+
table.integer('project_id').notNullable();
|
|
98
|
+
table.string('name', 255).notNullable();
|
|
99
|
+
});
|
|
100
|
+
// Insert test data
|
|
101
|
+
await db('test_tags').insert([
|
|
102
|
+
{ project_id: 1, name: 'DRY' },
|
|
103
|
+
{ project_id: 1, name: 'api-design' },
|
|
104
|
+
{ project_id: 1, name: 'testCase' },
|
|
105
|
+
{ project_id: 2, name: 'SOLID' }, // Different project
|
|
106
|
+
{ project_id: 2, name: 'API_DESIGN' } // Different project
|
|
107
|
+
]);
|
|
108
|
+
});
|
|
109
|
+
after(async () => {
|
|
110
|
+
await db.destroy();
|
|
111
|
+
});
|
|
112
|
+
it('should return no duplicate for non-existing value', async () => {
|
|
113
|
+
const result = await checkNormalizedDuplicate(db, 'test_tags', 'name', 'new-tag', { project_id: 1 });
|
|
114
|
+
assert.strictEqual(result.isDuplicate, false);
|
|
115
|
+
assert.strictEqual(result.existingValue, undefined);
|
|
116
|
+
assert.strictEqual(result.existingId, undefined);
|
|
117
|
+
assert.strictEqual(result.matchType, undefined);
|
|
118
|
+
});
|
|
119
|
+
it('should return no duplicate for exact match (same value)', async () => {
|
|
120
|
+
// Exact match should NOT be considered a duplicate
|
|
121
|
+
// (e.g., updating existing record with same name)
|
|
122
|
+
const result = await checkNormalizedDuplicate(db, 'test_tags', 'name', 'DRY', { project_id: 1 });
|
|
123
|
+
assert.strictEqual(result.isDuplicate, false, 'Exact match should not be duplicate');
|
|
124
|
+
});
|
|
125
|
+
it('should detect case-only difference (matchType: case)', async () => {
|
|
126
|
+
const result = await checkNormalizedDuplicate(db, 'test_tags', 'name', 'dry', // lowercase vs uppercase "DRY"
|
|
127
|
+
{ project_id: 1 });
|
|
128
|
+
assert.strictEqual(result.isDuplicate, true);
|
|
129
|
+
assert.strictEqual(result.existingValue, 'DRY');
|
|
130
|
+
assert.strictEqual(result.matchType, 'case');
|
|
131
|
+
assert.strictEqual(typeof result.existingId, 'number');
|
|
132
|
+
});
|
|
133
|
+
it('should detect naming convention difference (matchType: naming-convention)', async () => {
|
|
134
|
+
const result = await checkNormalizedDuplicate(db, 'test_tags', 'name', 'api_design', // snake_case vs kebab-case "api-design"
|
|
135
|
+
{ project_id: 1 });
|
|
136
|
+
assert.strictEqual(result.isDuplicate, true);
|
|
137
|
+
assert.strictEqual(result.existingValue, 'api-design');
|
|
138
|
+
assert.strictEqual(result.matchType, 'naming-convention');
|
|
139
|
+
assert.strictEqual(typeof result.existingId, 'number');
|
|
140
|
+
});
|
|
141
|
+
it('should detect camelCase vs kebab-case difference', async () => {
|
|
142
|
+
const result = await checkNormalizedDuplicate(db, 'test_tags', 'name', 'test-case', // kebab-case vs camelCase "testCase"
|
|
143
|
+
{ project_id: 1 });
|
|
144
|
+
assert.strictEqual(result.isDuplicate, true);
|
|
145
|
+
assert.strictEqual(result.existingValue, 'testCase');
|
|
146
|
+
assert.strictEqual(result.matchType, 'naming-convention');
|
|
147
|
+
});
|
|
148
|
+
it('should respect additionalWhere conditions (project isolation)', async () => {
|
|
149
|
+
// "SOLID" exists in project_id: 2, should not conflict with project_id: 1
|
|
150
|
+
const result = await checkNormalizedDuplicate(db, 'test_tags', 'name', 'solid', // lowercase vs "SOLID" in different project
|
|
151
|
+
{ project_id: 1 });
|
|
152
|
+
assert.strictEqual(result.isDuplicate, false);
|
|
153
|
+
});
|
|
154
|
+
it('should detect duplicate in same project only', async () => {
|
|
155
|
+
// "SOLID" exists in project_id: 2
|
|
156
|
+
const result = await checkNormalizedDuplicate(db, 'test_tags', 'name', 'solid', { project_id: 2 });
|
|
157
|
+
assert.strictEqual(result.isDuplicate, true);
|
|
158
|
+
assert.strictEqual(result.existingValue, 'SOLID');
|
|
159
|
+
assert.strictEqual(result.matchType, 'case');
|
|
160
|
+
});
|
|
161
|
+
it('should work without additionalWhere (global check)', async () => {
|
|
162
|
+
const result = await checkNormalizedDuplicate(db, 'test_tags', 'name', 'dry' // Should find "DRY" in project_id: 1
|
|
163
|
+
);
|
|
164
|
+
assert.strictEqual(result.isDuplicate, true);
|
|
165
|
+
assert.strictEqual(result.existingValue, 'DRY');
|
|
166
|
+
});
|
|
167
|
+
it('should handle complex naming variations', async () => {
|
|
168
|
+
// "api-design" exists in project_id: 1
|
|
169
|
+
const variants = ['apiDesign', 'API_DESIGN', 'api_design', 'ApiDesign'];
|
|
170
|
+
for (const variant of variants) {
|
|
171
|
+
const result = await checkNormalizedDuplicate(db, 'test_tags', 'name', variant, { project_id: 1 });
|
|
172
|
+
assert.strictEqual(result.isDuplicate, true, `"${variant}" should be detected as duplicate of "api-design"`);
|
|
173
|
+
assert.strictEqual(result.existingValue, 'api-design');
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
// ============================================================================
|
|
178
|
+
// Test Suite: validateNoNormalizedDuplicate()
|
|
179
|
+
// ============================================================================
|
|
180
|
+
describe('validateNoNormalizedDuplicate()', () => {
|
|
181
|
+
let db;
|
|
182
|
+
before(async () => {
|
|
183
|
+
db = knex({
|
|
184
|
+
client: 'better-sqlite3',
|
|
185
|
+
connection: ':memory:',
|
|
186
|
+
useNullAsDefault: true
|
|
187
|
+
});
|
|
188
|
+
await db.schema.createTable('test_scopes', (table) => {
|
|
189
|
+
table.increments('id').primary();
|
|
190
|
+
table.integer('project_id').notNullable();
|
|
191
|
+
table.string('name', 255).notNullable();
|
|
192
|
+
});
|
|
193
|
+
await db('test_scopes').insert([
|
|
194
|
+
{ project_id: 1, name: 'database' },
|
|
195
|
+
{ project_id: 1, name: 'API-Gateway' }
|
|
196
|
+
]);
|
|
197
|
+
});
|
|
198
|
+
after(async () => {
|
|
199
|
+
await db.destroy();
|
|
200
|
+
});
|
|
201
|
+
it('should not throw for non-duplicate value', async () => {
|
|
202
|
+
await assert.doesNotReject(async () => {
|
|
203
|
+
await validateNoNormalizedDuplicate(db, 'test_scopes', 'name', 'new-scope', 'scope', { project_id: 1 });
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
it('should throw for case-only duplicate', async () => {
|
|
207
|
+
await assert.rejects(async () => {
|
|
208
|
+
await validateNoNormalizedDuplicate(db, 'test_scopes', 'name', 'Database', // vs "database"
|
|
209
|
+
'scope', { project_id: 1 });
|
|
210
|
+
}, {
|
|
211
|
+
name: 'Error',
|
|
212
|
+
message: /Scope "database" already exists \(case-insensitive match with "Database"\)/
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
it('should throw for naming convention duplicate', async () => {
|
|
216
|
+
await assert.rejects(async () => {
|
|
217
|
+
await validateNoNormalizedDuplicate(db, 'test_scopes', 'name', 'api_gateway', // vs "API-Gateway"
|
|
218
|
+
'scope', { project_id: 1 });
|
|
219
|
+
}, {
|
|
220
|
+
name: 'Error',
|
|
221
|
+
message: /Scope "API-Gateway" already exists \(naming conflict with "api_gateway"\)/
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
it('should include entity type in error message (capitalized)', async () => {
|
|
225
|
+
await assert.rejects(async () => {
|
|
226
|
+
await validateNoNormalizedDuplicate(db, 'test_scopes', 'name', 'DATABASE', 'policy', // Different entity type
|
|
227
|
+
{ project_id: 1 });
|
|
228
|
+
}, {
|
|
229
|
+
name: 'Error',
|
|
230
|
+
message: /Policy "database" already exists/
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
it('should respect project isolation', async () => {
|
|
234
|
+
// "database" exists in project_id: 1, but we're checking project_id: 2
|
|
235
|
+
await assert.doesNotReject(async () => {
|
|
236
|
+
await validateNoNormalizedDuplicate(db, 'test_scopes', 'name', 'DATABASE', 'scope', { project_id: 2 });
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
it('should work without additionalWhere', async () => {
|
|
240
|
+
await assert.rejects(async () => {
|
|
241
|
+
await validateNoNormalizedDuplicate(db, 'test_scopes', 'name', 'DATABASE', 'scope');
|
|
242
|
+
}, {
|
|
243
|
+
name: 'Error',
|
|
244
|
+
message: /Scope "database" already exists/
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
// ============================================================================
|
|
249
|
+
// Test Suite: findNormalizedMatch()
|
|
250
|
+
// ============================================================================
|
|
251
|
+
describe('findNormalizedMatch()', () => {
|
|
252
|
+
let db;
|
|
253
|
+
before(async () => {
|
|
254
|
+
db = knex({
|
|
255
|
+
client: 'better-sqlite3',
|
|
256
|
+
connection: ':memory:',
|
|
257
|
+
useNullAsDefault: true
|
|
258
|
+
});
|
|
259
|
+
await db.schema.createTable('test_layers', (table) => {
|
|
260
|
+
table.increments('id').primary();
|
|
261
|
+
table.integer('project_id').notNullable();
|
|
262
|
+
table.string('name', 255).notNullable();
|
|
263
|
+
});
|
|
264
|
+
await db('test_layers').insert([
|
|
265
|
+
{ project_id: 1, name: 'presentation' },
|
|
266
|
+
{ project_id: 1, name: 'Business-Layer' },
|
|
267
|
+
{ project_id: 2, name: 'dataLayer' }
|
|
268
|
+
]);
|
|
269
|
+
});
|
|
270
|
+
after(async () => {
|
|
271
|
+
await db.destroy();
|
|
272
|
+
});
|
|
273
|
+
it('should find exact match', async () => {
|
|
274
|
+
const result = await findNormalizedMatch(db, 'test_layers', 'name', 'presentation', { project_id: 1 });
|
|
275
|
+
assert.notStrictEqual(result, null);
|
|
276
|
+
assert.strictEqual(result.name, 'presentation');
|
|
277
|
+
assert.strictEqual(result.project_id, 1);
|
|
278
|
+
});
|
|
279
|
+
it('should find case-insensitive match', async () => {
|
|
280
|
+
const result = await findNormalizedMatch(db, 'test_layers', 'name', 'PRESENTATION', // vs "presentation"
|
|
281
|
+
{ project_id: 1 });
|
|
282
|
+
assert.notStrictEqual(result, null);
|
|
283
|
+
assert.strictEqual(result.name, 'presentation');
|
|
284
|
+
});
|
|
285
|
+
it('should find naming convention match', async () => {
|
|
286
|
+
const result = await findNormalizedMatch(db, 'test_layers', 'name', 'business_layer', // vs "Business-Layer"
|
|
287
|
+
{ project_id: 1 });
|
|
288
|
+
assert.notStrictEqual(result, null);
|
|
289
|
+
assert.strictEqual(result.name, 'Business-Layer');
|
|
290
|
+
});
|
|
291
|
+
it('should find camelCase match', async () => {
|
|
292
|
+
const result = await findNormalizedMatch(db, 'test_layers', 'name', 'data-layer', // vs "dataLayer"
|
|
293
|
+
{ project_id: 2 });
|
|
294
|
+
assert.notStrictEqual(result, null);
|
|
295
|
+
assert.strictEqual(result.name, 'dataLayer');
|
|
296
|
+
assert.strictEqual(result.project_id, 2);
|
|
297
|
+
});
|
|
298
|
+
it('should return null for non-existing value', async () => {
|
|
299
|
+
const result = await findNormalizedMatch(db, 'test_layers', 'name', 'non-existing', { project_id: 1 });
|
|
300
|
+
assert.strictEqual(result, null);
|
|
301
|
+
});
|
|
302
|
+
it('should respect project isolation', async () => {
|
|
303
|
+
// "dataLayer" exists in project_id: 2, but not in project_id: 1
|
|
304
|
+
const result = await findNormalizedMatch(db, 'test_layers', 'name', 'dataLayer', { project_id: 1 });
|
|
305
|
+
assert.strictEqual(result, null);
|
|
306
|
+
});
|
|
307
|
+
it('should work without additionalWhere (global search)', async () => {
|
|
308
|
+
const result = await findNormalizedMatch(db, 'test_layers', 'name', 'PRESENTATION');
|
|
309
|
+
assert.notStrictEqual(result, null);
|
|
310
|
+
assert.strictEqual(result.name, 'presentation');
|
|
311
|
+
});
|
|
312
|
+
it('should return complete record with all fields', async () => {
|
|
313
|
+
const result = await findNormalizedMatch(db, 'test_layers', 'name', 'business-layer', { project_id: 1 });
|
|
314
|
+
assert.notStrictEqual(result, null);
|
|
315
|
+
assert.strictEqual(typeof result.id, 'number');
|
|
316
|
+
assert.strictEqual(result.project_id, 1);
|
|
317
|
+
assert.strictEqual(result.name, 'Business-Layer');
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
// ============================================================================
|
|
321
|
+
// Integration Tests: Real-world scenarios
|
|
322
|
+
// ============================================================================
|
|
323
|
+
describe('Integration: Real-world scenarios', () => {
|
|
324
|
+
let db;
|
|
325
|
+
before(async () => {
|
|
326
|
+
db = knex({
|
|
327
|
+
client: 'better-sqlite3',
|
|
328
|
+
connection: ':memory:',
|
|
329
|
+
useNullAsDefault: true
|
|
330
|
+
});
|
|
331
|
+
await db.schema.createTable('test_policies', (table) => {
|
|
332
|
+
table.increments('id').primary();
|
|
333
|
+
table.integer('project_id').notNullable();
|
|
334
|
+
table.string('name', 255).notNullable();
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
after(async () => {
|
|
338
|
+
await db.destroy();
|
|
339
|
+
});
|
|
340
|
+
it('should prevent duplicate policy creation with different formats', async () => {
|
|
341
|
+
// Create initial policy
|
|
342
|
+
await db('test_policies').insert({
|
|
343
|
+
project_id: 1,
|
|
344
|
+
name: 'api-design-pattern'
|
|
345
|
+
});
|
|
346
|
+
// Try to create duplicates with different formats
|
|
347
|
+
const duplicateVariants = [
|
|
348
|
+
'apiDesignPattern',
|
|
349
|
+
'API_DESIGN_PATTERN',
|
|
350
|
+
'api_design_pattern',
|
|
351
|
+
'ApiDesignPattern'
|
|
352
|
+
];
|
|
353
|
+
for (const variant of duplicateVariants) {
|
|
354
|
+
await assert.rejects(async () => {
|
|
355
|
+
await validateNoNormalizedDuplicate(db, 'test_policies', 'name', variant, 'policy', { project_id: 1 });
|
|
356
|
+
}, {
|
|
357
|
+
name: 'Error',
|
|
358
|
+
message: /Policy "api-design-pattern" already exists/
|
|
359
|
+
}, `Should reject duplicate: ${variant}`);
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
it('should allow same name in different projects', async () => {
|
|
363
|
+
// Policy exists in project_id: 1
|
|
364
|
+
await assert.doesNotReject(async () => {
|
|
365
|
+
await validateNoNormalizedDuplicate(db, 'test_policies', 'name', 'apiDesignPattern', // Same normalized value, different project
|
|
366
|
+
'policy', { project_id: 2 });
|
|
367
|
+
});
|
|
368
|
+
// Insert should succeed
|
|
369
|
+
await db('test_policies').insert({
|
|
370
|
+
project_id: 2,
|
|
371
|
+
name: 'apiDesignPattern'
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
it('should find existing record regardless of format', async () => {
|
|
375
|
+
// Original: "api-design-pattern" in project_id: 1
|
|
376
|
+
const searchVariants = [
|
|
377
|
+
'api-design-pattern',
|
|
378
|
+
'apiDesignPattern',
|
|
379
|
+
'API_DESIGN_PATTERN',
|
|
380
|
+
'api_design_pattern'
|
|
381
|
+
];
|
|
382
|
+
for (const variant of searchVariants) {
|
|
383
|
+
const result = await findNormalizedMatch(db, 'test_policies', 'name', variant, { project_id: 1 });
|
|
384
|
+
assert.notStrictEqual(result, null, `Should find match for: ${variant}`);
|
|
385
|
+
assert.strictEqual(result.name, 'api-design-pattern');
|
|
386
|
+
assert.strictEqual(result.project_id, 1);
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
//# sourceMappingURL=case-insensitive-validator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"case-insensitive-validator.test.js","sourceRoot":"","sources":["../../../src/tests/unit/case-insensitive-validator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../src/tools/tasks/actions/get.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAM7D;;GAEG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../src/tools/tasks/actions/get.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAM7D;;GAEG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CA+F1C"}
|