sqlstack 1.0.23 → 1.0.24
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/dist/cjs/core/fileResolution.d.ts +24 -0
- package/dist/cjs/core/fileResolution.d.ts.map +1 -1
- package/dist/cjs/core/fileResolution.js +109 -44
- package/dist/cjs/core/fileResolution.js.map +1 -1
- package/dist/esm/core/fileResolution.js +105 -44
- package/dist/esm/core/fileResolution.js.map +1 -1
- package/package.json +1 -1
|
@@ -8,4 +8,28 @@ export declare function coerceRootPath(input?: string): {
|
|
|
8
8
|
from?: 'file' | 'folder';
|
|
9
9
|
};
|
|
10
10
|
export declare function guessDecoratorDir(): string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Finds the package root from a starting directory by walking up to find package.json.
|
|
13
|
+
* @internal Exported for testing
|
|
14
|
+
*/
|
|
15
|
+
export declare function findPackageRoot(startDir: string): string | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Detects if a path belongs to sqlstack package.
|
|
18
|
+
* Handles both source paths (contains 'sqlstack') and node_modules paths.
|
|
19
|
+
* @internal Exported for testing
|
|
20
|
+
*/
|
|
21
|
+
export declare function isSqlstackPath(filePath: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Extracts sqlstack's location from a stack trace.
|
|
24
|
+
* Handles absolute paths, file:// URLs, and relative paths (Vitest uses relative paths).
|
|
25
|
+
* @internal Exported for testing
|
|
26
|
+
*/
|
|
27
|
+
export declare function findSqlstackFromStack(stackString: string): string | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Computes the sqlstack package root directory.
|
|
30
|
+
* Handles both CJS (__dirname) and ESM (stack trace) detection.
|
|
31
|
+
* Validates that __dirname actually points to sqlstack (guards against Vitest injection).
|
|
32
|
+
* @internal Exported for testing
|
|
33
|
+
*/
|
|
34
|
+
export declare function computePackageRoot(dirnameValue: string | undefined, filenameValue: string | undefined, getStack: () => string): string | undefined;
|
|
11
35
|
//# sourceMappingURL=fileResolution.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileResolution.d.ts","sourceRoot":"","sources":["../../../src/core/fileResolution.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAe3C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAgCxH;AAED,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,CAO7F;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"fileResolution.d.ts","sourceRoot":"","sources":["../../../src/core/fileResolution.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAe3C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAgCxH;AAED,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,CAO7F;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAsCtD;AA8BD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAcpE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CASxD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAwB7E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,QAAQ,EAAE,MAAM,MAAM,GACrB,MAAM,GAAG,SAAS,CA0BpB"}
|
|
@@ -6,6 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.resolveSqlFromFs = resolveSqlFromFs;
|
|
7
7
|
exports.coerceRootPath = coerceRootPath;
|
|
8
8
|
exports.guessDecoratorDir = guessDecoratorDir;
|
|
9
|
+
exports.findPackageRoot = findPackageRoot;
|
|
10
|
+
exports.isSqlstackPath = isSqlstackPath;
|
|
11
|
+
exports.findSqlstackFromStack = findSqlstackFromStack;
|
|
12
|
+
exports.computePackageRoot = computePackageRoot;
|
|
9
13
|
const fs_1 = __importDefault(require("fs"));
|
|
10
14
|
const path_1 = __importDefault(require("path"));
|
|
11
15
|
const url_1 = require("url");
|
|
@@ -64,6 +68,9 @@ function guessDecoratorDir() {
|
|
|
64
68
|
const err = new Error();
|
|
65
69
|
const stack = (err.stack || '').split('\n').slice(2);
|
|
66
70
|
const packageRoot = PACKAGE_ROOT_NORMALIZED;
|
|
71
|
+
// DEBUG: Uncomment to trace issues
|
|
72
|
+
// console.log('[guessDecoratorDir] packageRoot:', packageRoot);
|
|
73
|
+
// console.log('[guessDecoratorDir] stack:', stack.slice(0, 5));
|
|
67
74
|
for (const line of stack) {
|
|
68
75
|
const m = line.match(/\((.*?):\d+:\d+\)/) || line.match(/at (.*?):\d+:\d+/);
|
|
69
76
|
const file = m?.[1];
|
|
@@ -79,9 +86,14 @@ function guessDecoratorDir() {
|
|
|
79
86
|
if (!normalized)
|
|
80
87
|
continue;
|
|
81
88
|
// Skip frames from sqlstack's own package (when running from source)
|
|
89
|
+
// Also skip if the path contains /sqlstack/ anywhere (linked package scenario)
|
|
82
90
|
if (packageRoot && normalized.startsWith(packageRoot)) {
|
|
83
91
|
continue;
|
|
84
92
|
}
|
|
93
|
+
// Additional check: skip if this is a sqlstack path (handles linked packages with relative paths)
|
|
94
|
+
if (isSqlstackPath(resolved)) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
85
97
|
// Return the first valid frame - this is where @Query is defined
|
|
86
98
|
return path_1.default.dirname(resolved);
|
|
87
99
|
}
|
|
@@ -114,55 +126,108 @@ function safeNormalize(p) {
|
|
|
114
126
|
const normalized = path_1.default.normalize(p);
|
|
115
127
|
return process.platform === 'win32' ? normalized.toLowerCase() : normalized;
|
|
116
128
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
129
|
+
/**
|
|
130
|
+
* Finds the package root from a starting directory by walking up to find package.json.
|
|
131
|
+
* @internal Exported for testing
|
|
132
|
+
*/
|
|
133
|
+
function findPackageRoot(startDir) {
|
|
134
|
+
let current = startDir;
|
|
135
|
+
for (let i = 0; i < 6; i++) {
|
|
136
|
+
const candidate = path_1.default.join(current, 'package.json');
|
|
137
|
+
if (fs_1.default.existsSync(candidate)) {
|
|
138
|
+
const root = path_1.default.dirname(candidate);
|
|
139
|
+
const normalizedRoot = safeNormalize(root);
|
|
140
|
+
return normalizedRoot ? ensureTrailingSep(normalizedRoot) : ensureTrailingSep(root);
|
|
141
|
+
}
|
|
142
|
+
const parent = path_1.default.dirname(current);
|
|
143
|
+
if (parent === current)
|
|
144
|
+
break;
|
|
145
|
+
current = parent;
|
|
146
|
+
}
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Detects if a path belongs to sqlstack package.
|
|
151
|
+
* Handles both source paths (contains 'sqlstack') and node_modules paths.
|
|
152
|
+
* @internal Exported for testing
|
|
153
|
+
*/
|
|
154
|
+
function isSqlstackPath(filePath) {
|
|
155
|
+
const normalized = filePath.toLowerCase();
|
|
156
|
+
// Check for source development path (e.g., /path/to/sqlstack/src/...)
|
|
157
|
+
if (normalized.includes(path_1.default.sep + 'sqlstack' + path_1.default.sep))
|
|
158
|
+
return true;
|
|
159
|
+
// Check for node_modules installation
|
|
160
|
+
if (normalized.includes('node_modules' + path_1.default.sep + 'sqlstack' + path_1.default.sep))
|
|
161
|
+
return true;
|
|
162
|
+
// Check for scoped package (@noego/sqlstack or similar)
|
|
163
|
+
if (normalized.includes('node_modules' + path_1.default.sep + '@') && normalized.includes('sqlstack' + path_1.default.sep))
|
|
164
|
+
return true;
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Extracts sqlstack's location from a stack trace.
|
|
169
|
+
* Handles absolute paths, file:// URLs, and relative paths (Vitest uses relative paths).
|
|
170
|
+
* @internal Exported for testing
|
|
171
|
+
*/
|
|
172
|
+
function findSqlstackFromStack(stackString) {
|
|
173
|
+
const lines = stackString.split('\n');
|
|
174
|
+
for (const line of lines) {
|
|
175
|
+
const m = line.match(/\((.*?):\d+:\d+\)/) || line.match(/at (.*?):\d+:\d+/);
|
|
176
|
+
const file = m?.[1];
|
|
177
|
+
if (!file)
|
|
178
|
+
continue;
|
|
179
|
+
try {
|
|
180
|
+
let resolved;
|
|
181
|
+
if (file.startsWith('file://')) {
|
|
182
|
+
resolved = (0, url_1.fileURLToPath)(file);
|
|
145
183
|
}
|
|
146
|
-
|
|
147
|
-
|
|
184
|
+
else if (path_1.default.isAbsolute(file)) {
|
|
185
|
+
resolved = file;
|
|
148
186
|
}
|
|
187
|
+
else if (!file.startsWith('node:') && !file.startsWith('webpack://')) {
|
|
188
|
+
// Relative path - resolve it (Vitest uses relative paths in stack traces)
|
|
189
|
+
resolved = path_1.default.resolve(file);
|
|
190
|
+
}
|
|
191
|
+
if (resolved && resolved.includes('fileResolution')) {
|
|
192
|
+
return path_1.default.dirname(resolved);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// Skip invalid paths
|
|
149
197
|
}
|
|
150
198
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Computes the sqlstack package root directory.
|
|
203
|
+
* Handles both CJS (__dirname) and ESM (stack trace) detection.
|
|
204
|
+
* Validates that __dirname actually points to sqlstack (guards against Vitest injection).
|
|
205
|
+
* @internal Exported for testing
|
|
206
|
+
*/
|
|
207
|
+
function computePackageRoot(dirnameValue, filenameValue, getStack) {
|
|
208
|
+
const candidates = [];
|
|
209
|
+
// CJS: use __dirname/__filename, but validate they actually point to sqlstack
|
|
210
|
+
// (Vitest can inject __dirname incorrectly when transforming CJS modules)
|
|
211
|
+
if (typeof dirnameValue === 'string' && isSqlstackPath(dirnameValue)) {
|
|
212
|
+
candidates.push(dirnameValue);
|
|
213
|
+
}
|
|
214
|
+
if (typeof filenameValue === 'string' && isSqlstackPath(filenameValue)) {
|
|
215
|
+
candidates.push(path_1.default.dirname(filenameValue));
|
|
216
|
+
}
|
|
217
|
+
// ESM fallback or when __dirname was incorrectly injected: parse stack trace
|
|
218
|
+
if (candidates.length === 0) {
|
|
219
|
+
const stackDir = findSqlstackFromStack(getStack());
|
|
220
|
+
if (stackDir) {
|
|
221
|
+
candidates.push(stackDir);
|
|
164
222
|
}
|
|
165
223
|
}
|
|
224
|
+
// Find the package root from the first valid candidate
|
|
225
|
+
for (const base of candidates) {
|
|
226
|
+
const root = findPackageRoot(base);
|
|
227
|
+
if (root)
|
|
228
|
+
return root;
|
|
229
|
+
}
|
|
166
230
|
return undefined;
|
|
167
|
-
}
|
|
231
|
+
}
|
|
232
|
+
const PACKAGE_ROOT_NORMALIZED = computePackageRoot(typeof __dirname === 'string' ? __dirname : undefined, typeof __filename === 'string' ? __filename : undefined, () => new Error().stack || '');
|
|
168
233
|
//# sourceMappingURL=fileResolution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileResolution.js","sourceRoot":"","sources":["../../../src/core/fileResolution.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport type { Dialect } from '../registry';\n\nconst DIALECT_EXT: Record<Dialect, string> = {\n postgres: 'pg',\n mysql: 'mysql',\n sqlite: 'sqlite',\n};\n\nconst contentCache = new Map<string, string>();\nconst pathCache = new Map<string, string>();\n\nfunction key(root: string, method: string, dialect: Dialect): string {\n return `${root}::${method}::${dialect}`;\n}\n\nexport function resolveSqlFromFs(rootDir: string, methodName: string, dialect: Dialect): { sql: string; tried: string[] } {\n const k = key(rootDir, methodName, dialect);\n const tried: string[] = [];\n const ext = DIALECT_EXT[dialect];\n const dialectPath = path.join(rootDir, `${methodName}.${ext}.sql`);\n const genericPath = path.join(rootDir, `${methodName}.sql`);\n\n // Cached path\n let chosen = pathCache.get(k);\n if (!chosen) {\n if (fs.existsSync(dialectPath)) {\n chosen = dialectPath;\n } else if (fs.existsSync(genericPath)) {\n chosen = genericPath;\n }\n if (chosen) pathCache.set(k, chosen);\n }\n\n if (!chosen) {\n tried.push(dialectPath, genericPath);\n throw new Error(\n `sqlstack: SQL file not found for ${methodName}\\ntried: ${tried.join(\"\\n\")}`\n );\n }\n\n // Cached content\n let sql = contentCache.get(chosen);\n if (!sql) {\n sql = fs.readFileSync(chosen, 'utf8');\n contentCache.set(chosen, sql);\n }\n return { sql, tried: [chosen] };\n}\n\nexport function coerceRootPath(input?: string): { rootDir?: string; from?: 'file' | 'folder' } {\n if (!input) return {};\n const stat = fs.existsSync(input) ? fs.statSync(input) : undefined;\n if (stat?.isDirectory()) return { rootDir: input, from: 'folder' };\n if (stat?.isFile()) return { rootDir: path.dirname(input), from: 'file' };\n // If not found, treat as folder hint anyway\n return { rootDir: input, from: 'folder' };\n}\n\nexport function guessDecoratorDir(): string | undefined {\n const err = new Error();\n const stack = (err.stack || '').split('\\n').slice(2);\n const packageRoot = PACKAGE_ROOT_NORMALIZED;\n\n for (const line of stack) {\n const m = line.match(/\\((.*?):\\d+:\\d+\\)/) || line.match(/at (.*?):\\d+:\\d+/);\n const file = m?.[1];\n if (!file) continue;\n\n const resolved = toAbsolutePath(file);\n if (!resolved) continue;\n\n // Skip frames from node_modules (including sqlstack itself when used as dependency)\n if (resolved.includes('node_modules')) continue;\n\n const normalized = safeNormalize(resolved);\n if (!normalized) continue;\n\n // Skip frames from sqlstack's own package (when running from source)\n if (packageRoot && normalized.startsWith(packageRoot)) {\n continue;\n }\n\n // Return the first valid frame - this is where @Query is defined\n return path.dirname(resolved);\n }\n return undefined;\n}\n\nfunction toAbsolutePath(file: string): string | undefined {\n try {\n if (file.startsWith('file://')) {\n return fileURLToPath(file);\n }\n // Skip Node.js internal modules and bundler internals\n if (file.startsWith('node:') || file.startsWith('webpack://')) {\n return undefined;\n }\n if (!path.isAbsolute(file)) {\n return path.resolve(file);\n }\n return file;\n } catch {\n return undefined;\n }\n}\n\nfunction ensureTrailingSep(p: string): string {\n return p.endsWith(path.sep) ? p : p + path.sep;\n}\n\nfunction safeNormalize(p?: string): string | undefined {\n if (!p) return undefined;\n const normalized = path.normalize(p);\n return process.platform === 'win32' ? normalized.toLowerCase() : normalized;\n}\n\nconst PACKAGE_ROOT_NORMALIZED = (() => {\n const dirs: string[] = [];\n\n // CJS: use __dirname/__filename\n if (typeof __dirname === 'string') dirs.push(__dirname);\n if (typeof __filename === 'string') dirs.push(path.dirname(__filename));\n\n // ESM fallback: parse stack trace to find this file's location\n if (dirs.length === 0) {\n const err = new Error();\n const stack = (err.stack || '').split('\\n');\n for (const line of stack) {\n const m = line.match(/\\((.*?):\\d+:\\d+\\)/) || line.match(/at (.*?):\\d+:\\d+/);\n const file = m?.[1];\n if (!file) continue;\n try {\n let resolved: string | undefined;\n if (file.startsWith('file://')) {\n resolved = fileURLToPath(file);\n } else if (path.isAbsolute(file)) {\n resolved = file;\n }\n if (resolved && resolved.includes('fileResolution')) {\n dirs.push(path.dirname(resolved));\n break;\n }\n } catch {\n // Skip invalid paths\n }\n }\n }\n\n for (const base of dirs) {\n let current = base;\n for (let i = 0; i < 6; i++) {\n const candidate = path.join(current, 'package.json');\n if (fs.existsSync(candidate)) {\n const root = path.dirname(candidate);\n const normalizedRoot = safeNormalize(root);\n return normalizedRoot ? ensureTrailingSep(normalizedRoot) : ensureTrailingSep(root);\n }\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n }\n return undefined;\n})();\n"]}
|
|
1
|
+
{"version":3,"file":"fileResolution.js","sourceRoot":"","sources":["../../../src/core/fileResolution.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport type { Dialect } from '../registry';\n\nconst DIALECT_EXT: Record<Dialect, string> = {\n postgres: 'pg',\n mysql: 'mysql',\n sqlite: 'sqlite',\n};\n\nconst contentCache = new Map<string, string>();\nconst pathCache = new Map<string, string>();\n\nfunction key(root: string, method: string, dialect: Dialect): string {\n return `${root}::${method}::${dialect}`;\n}\n\nexport function resolveSqlFromFs(rootDir: string, methodName: string, dialect: Dialect): { sql: string; tried: string[] } {\n const k = key(rootDir, methodName, dialect);\n const tried: string[] = [];\n const ext = DIALECT_EXT[dialect];\n const dialectPath = path.join(rootDir, `${methodName}.${ext}.sql`);\n const genericPath = path.join(rootDir, `${methodName}.sql`);\n\n // Cached path\n let chosen = pathCache.get(k);\n if (!chosen) {\n if (fs.existsSync(dialectPath)) {\n chosen = dialectPath;\n } else if (fs.existsSync(genericPath)) {\n chosen = genericPath;\n }\n if (chosen) pathCache.set(k, chosen);\n }\n\n if (!chosen) {\n tried.push(dialectPath, genericPath);\n throw new Error(\n `sqlstack: SQL file not found for ${methodName}\\ntried: ${tried.join(\"\\n\")}`\n );\n }\n\n // Cached content\n let sql = contentCache.get(chosen);\n if (!sql) {\n sql = fs.readFileSync(chosen, 'utf8');\n contentCache.set(chosen, sql);\n }\n return { sql, tried: [chosen] };\n}\n\nexport function coerceRootPath(input?: string): { rootDir?: string; from?: 'file' | 'folder' } {\n if (!input) return {};\n const stat = fs.existsSync(input) ? fs.statSync(input) : undefined;\n if (stat?.isDirectory()) return { rootDir: input, from: 'folder' };\n if (stat?.isFile()) return { rootDir: path.dirname(input), from: 'file' };\n // If not found, treat as folder hint anyway\n return { rootDir: input, from: 'folder' };\n}\n\nexport function guessDecoratorDir(): string | undefined {\n const err = new Error();\n const stack = (err.stack || '').split('\\n').slice(2);\n const packageRoot = PACKAGE_ROOT_NORMALIZED;\n\n // DEBUG: Uncomment to trace issues\n // console.log('[guessDecoratorDir] packageRoot:', packageRoot);\n // console.log('[guessDecoratorDir] stack:', stack.slice(0, 5));\n\n for (const line of stack) {\n const m = line.match(/\\((.*?):\\d+:\\d+\\)/) || line.match(/at (.*?):\\d+:\\d+/);\n const file = m?.[1];\n if (!file) continue;\n\n const resolved = toAbsolutePath(file);\n if (!resolved) continue;\n\n // Skip frames from node_modules (including sqlstack itself when used as dependency)\n if (resolved.includes('node_modules')) continue;\n\n const normalized = safeNormalize(resolved);\n if (!normalized) continue;\n\n // Skip frames from sqlstack's own package (when running from source)\n // Also skip if the path contains /sqlstack/ anywhere (linked package scenario)\n if (packageRoot && normalized.startsWith(packageRoot)) {\n continue;\n }\n\n // Additional check: skip if this is a sqlstack path (handles linked packages with relative paths)\n if (isSqlstackPath(resolved)) {\n continue;\n }\n\n // Return the first valid frame - this is where @Query is defined\n return path.dirname(resolved);\n }\n return undefined;\n}\n\nfunction toAbsolutePath(file: string): string | undefined {\n try {\n if (file.startsWith('file://')) {\n return fileURLToPath(file);\n }\n // Skip Node.js internal modules and bundler internals\n if (file.startsWith('node:') || file.startsWith('webpack://')) {\n return undefined;\n }\n if (!path.isAbsolute(file)) {\n return path.resolve(file);\n }\n return file;\n } catch {\n return undefined;\n }\n}\n\nfunction ensureTrailingSep(p: string): string {\n return p.endsWith(path.sep) ? p : p + path.sep;\n}\n\nfunction safeNormalize(p?: string): string | undefined {\n if (!p) return undefined;\n const normalized = path.normalize(p);\n return process.platform === 'win32' ? normalized.toLowerCase() : normalized;\n}\n\n/**\n * Finds the package root from a starting directory by walking up to find package.json.\n * @internal Exported for testing\n */\nexport function findPackageRoot(startDir: string): string | undefined {\n let current = startDir;\n for (let i = 0; i < 6; i++) {\n const candidate = path.join(current, 'package.json');\n if (fs.existsSync(candidate)) {\n const root = path.dirname(candidate);\n const normalizedRoot = safeNormalize(root);\n return normalizedRoot ? ensureTrailingSep(normalizedRoot) : ensureTrailingSep(root);\n }\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return undefined;\n}\n\n/**\n * Detects if a path belongs to sqlstack package.\n * Handles both source paths (contains 'sqlstack') and node_modules paths.\n * @internal Exported for testing\n */\nexport function isSqlstackPath(filePath: string): boolean {\n const normalized = filePath.toLowerCase();\n // Check for source development path (e.g., /path/to/sqlstack/src/...)\n if (normalized.includes(path.sep + 'sqlstack' + path.sep)) return true;\n // Check for node_modules installation\n if (normalized.includes('node_modules' + path.sep + 'sqlstack' + path.sep)) return true;\n // Check for scoped package (@noego/sqlstack or similar)\n if (normalized.includes('node_modules' + path.sep + '@') && normalized.includes('sqlstack' + path.sep)) return true;\n return false;\n}\n\n/**\n * Extracts sqlstack's location from a stack trace.\n * Handles absolute paths, file:// URLs, and relative paths (Vitest uses relative paths).\n * @internal Exported for testing\n */\nexport function findSqlstackFromStack(stackString: string): string | undefined {\n const lines = stackString.split('\\n');\n for (const line of lines) {\n const m = line.match(/\\((.*?):\\d+:\\d+\\)/) || line.match(/at (.*?):\\d+:\\d+/);\n const file = m?.[1];\n if (!file) continue;\n try {\n let resolved: string | undefined;\n if (file.startsWith('file://')) {\n resolved = fileURLToPath(file);\n } else if (path.isAbsolute(file)) {\n resolved = file;\n } else if (!file.startsWith('node:') && !file.startsWith('webpack://')) {\n // Relative path - resolve it (Vitest uses relative paths in stack traces)\n resolved = path.resolve(file);\n }\n if (resolved && resolved.includes('fileResolution')) {\n return path.dirname(resolved);\n }\n } catch {\n // Skip invalid paths\n }\n }\n return undefined;\n}\n\n/**\n * Computes the sqlstack package root directory.\n * Handles both CJS (__dirname) and ESM (stack trace) detection.\n * Validates that __dirname actually points to sqlstack (guards against Vitest injection).\n * @internal Exported for testing\n */\nexport function computePackageRoot(\n dirnameValue: string | undefined,\n filenameValue: string | undefined,\n getStack: () => string\n): string | undefined {\n const candidates: string[] = [];\n\n // CJS: use __dirname/__filename, but validate they actually point to sqlstack\n // (Vitest can inject __dirname incorrectly when transforming CJS modules)\n if (typeof dirnameValue === 'string' && isSqlstackPath(dirnameValue)) {\n candidates.push(dirnameValue);\n }\n if (typeof filenameValue === 'string' && isSqlstackPath(filenameValue)) {\n candidates.push(path.dirname(filenameValue));\n }\n\n // ESM fallback or when __dirname was incorrectly injected: parse stack trace\n if (candidates.length === 0) {\n const stackDir = findSqlstackFromStack(getStack());\n if (stackDir) {\n candidates.push(stackDir);\n }\n }\n\n // Find the package root from the first valid candidate\n for (const base of candidates) {\n const root = findPackageRoot(base);\n if (root) return root;\n }\n return undefined;\n}\n\nconst PACKAGE_ROOT_NORMALIZED = computePackageRoot(\n typeof __dirname === 'string' ? __dirname : undefined,\n typeof __filename === 'string' ? __filename : undefined,\n () => new Error().stack || ''\n);\n"]}
|
|
@@ -56,6 +56,9 @@ export function guessDecoratorDir() {
|
|
|
56
56
|
const err = new Error();
|
|
57
57
|
const stack = (err.stack || '').split('\n').slice(2);
|
|
58
58
|
const packageRoot = PACKAGE_ROOT_NORMALIZED;
|
|
59
|
+
// DEBUG: Uncomment to trace issues
|
|
60
|
+
// console.log('[guessDecoratorDir] packageRoot:', packageRoot);
|
|
61
|
+
// console.log('[guessDecoratorDir] stack:', stack.slice(0, 5));
|
|
59
62
|
for (const line of stack) {
|
|
60
63
|
const m = line.match(/\((.*?):\d+:\d+\)/) || line.match(/at (.*?):\d+:\d+/);
|
|
61
64
|
const file = m?.[1];
|
|
@@ -71,9 +74,14 @@ export function guessDecoratorDir() {
|
|
|
71
74
|
if (!normalized)
|
|
72
75
|
continue;
|
|
73
76
|
// Skip frames from sqlstack's own package (when running from source)
|
|
77
|
+
// Also skip if the path contains /sqlstack/ anywhere (linked package scenario)
|
|
74
78
|
if (packageRoot && normalized.startsWith(packageRoot)) {
|
|
75
79
|
continue;
|
|
76
80
|
}
|
|
81
|
+
// Additional check: skip if this is a sqlstack path (handles linked packages with relative paths)
|
|
82
|
+
if (isSqlstackPath(resolved)) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
77
85
|
// Return the first valid frame - this is where @Query is defined
|
|
78
86
|
return path.dirname(resolved);
|
|
79
87
|
}
|
|
@@ -106,55 +114,108 @@ function safeNormalize(p) {
|
|
|
106
114
|
const normalized = path.normalize(p);
|
|
107
115
|
return process.platform === 'win32' ? normalized.toLowerCase() : normalized;
|
|
108
116
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
117
|
+
/**
|
|
118
|
+
* Finds the package root from a starting directory by walking up to find package.json.
|
|
119
|
+
* @internal Exported for testing
|
|
120
|
+
*/
|
|
121
|
+
export function findPackageRoot(startDir) {
|
|
122
|
+
let current = startDir;
|
|
123
|
+
for (let i = 0; i < 6; i++) {
|
|
124
|
+
const candidate = path.join(current, 'package.json');
|
|
125
|
+
if (fs.existsSync(candidate)) {
|
|
126
|
+
const root = path.dirname(candidate);
|
|
127
|
+
const normalizedRoot = safeNormalize(root);
|
|
128
|
+
return normalizedRoot ? ensureTrailingSep(normalizedRoot) : ensureTrailingSep(root);
|
|
129
|
+
}
|
|
130
|
+
const parent = path.dirname(current);
|
|
131
|
+
if (parent === current)
|
|
132
|
+
break;
|
|
133
|
+
current = parent;
|
|
134
|
+
}
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Detects if a path belongs to sqlstack package.
|
|
139
|
+
* Handles both source paths (contains 'sqlstack') and node_modules paths.
|
|
140
|
+
* @internal Exported for testing
|
|
141
|
+
*/
|
|
142
|
+
export function isSqlstackPath(filePath) {
|
|
143
|
+
const normalized = filePath.toLowerCase();
|
|
144
|
+
// Check for source development path (e.g., /path/to/sqlstack/src/...)
|
|
145
|
+
if (normalized.includes(path.sep + 'sqlstack' + path.sep))
|
|
146
|
+
return true;
|
|
147
|
+
// Check for node_modules installation
|
|
148
|
+
if (normalized.includes('node_modules' + path.sep + 'sqlstack' + path.sep))
|
|
149
|
+
return true;
|
|
150
|
+
// Check for scoped package (@noego/sqlstack or similar)
|
|
151
|
+
if (normalized.includes('node_modules' + path.sep + '@') && normalized.includes('sqlstack' + path.sep))
|
|
152
|
+
return true;
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Extracts sqlstack's location from a stack trace.
|
|
157
|
+
* Handles absolute paths, file:// URLs, and relative paths (Vitest uses relative paths).
|
|
158
|
+
* @internal Exported for testing
|
|
159
|
+
*/
|
|
160
|
+
export function findSqlstackFromStack(stackString) {
|
|
161
|
+
const lines = stackString.split('\n');
|
|
162
|
+
for (const line of lines) {
|
|
163
|
+
const m = line.match(/\((.*?):\d+:\d+\)/) || line.match(/at (.*?):\d+:\d+/);
|
|
164
|
+
const file = m?.[1];
|
|
165
|
+
if (!file)
|
|
166
|
+
continue;
|
|
167
|
+
try {
|
|
168
|
+
let resolved;
|
|
169
|
+
if (file.startsWith('file://')) {
|
|
170
|
+
resolved = fileURLToPath(file);
|
|
137
171
|
}
|
|
138
|
-
|
|
139
|
-
|
|
172
|
+
else if (path.isAbsolute(file)) {
|
|
173
|
+
resolved = file;
|
|
140
174
|
}
|
|
175
|
+
else if (!file.startsWith('node:') && !file.startsWith('webpack://')) {
|
|
176
|
+
// Relative path - resolve it (Vitest uses relative paths in stack traces)
|
|
177
|
+
resolved = path.resolve(file);
|
|
178
|
+
}
|
|
179
|
+
if (resolved && resolved.includes('fileResolution')) {
|
|
180
|
+
return path.dirname(resolved);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Skip invalid paths
|
|
141
185
|
}
|
|
142
186
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Computes the sqlstack package root directory.
|
|
191
|
+
* Handles both CJS (__dirname) and ESM (stack trace) detection.
|
|
192
|
+
* Validates that __dirname actually points to sqlstack (guards against Vitest injection).
|
|
193
|
+
* @internal Exported for testing
|
|
194
|
+
*/
|
|
195
|
+
export function computePackageRoot(dirnameValue, filenameValue, getStack) {
|
|
196
|
+
const candidates = [];
|
|
197
|
+
// CJS: use __dirname/__filename, but validate they actually point to sqlstack
|
|
198
|
+
// (Vitest can inject __dirname incorrectly when transforming CJS modules)
|
|
199
|
+
if (typeof dirnameValue === 'string' && isSqlstackPath(dirnameValue)) {
|
|
200
|
+
candidates.push(dirnameValue);
|
|
201
|
+
}
|
|
202
|
+
if (typeof filenameValue === 'string' && isSqlstackPath(filenameValue)) {
|
|
203
|
+
candidates.push(path.dirname(filenameValue));
|
|
204
|
+
}
|
|
205
|
+
// ESM fallback or when __dirname was incorrectly injected: parse stack trace
|
|
206
|
+
if (candidates.length === 0) {
|
|
207
|
+
const stackDir = findSqlstackFromStack(getStack());
|
|
208
|
+
if (stackDir) {
|
|
209
|
+
candidates.push(stackDir);
|
|
156
210
|
}
|
|
157
211
|
}
|
|
212
|
+
// Find the package root from the first valid candidate
|
|
213
|
+
for (const base of candidates) {
|
|
214
|
+
const root = findPackageRoot(base);
|
|
215
|
+
if (root)
|
|
216
|
+
return root;
|
|
217
|
+
}
|
|
158
218
|
return undefined;
|
|
159
|
-
}
|
|
219
|
+
}
|
|
220
|
+
const PACKAGE_ROOT_NORMALIZED = computePackageRoot(typeof __dirname === 'string' ? __dirname : undefined, typeof __filename === 'string' ? __filename : undefined, () => new Error().stack || '');
|
|
160
221
|
//# sourceMappingURL=fileResolution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileResolution.js","sourceRoot":"","sources":["../../../src/core/fileResolution.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport type { Dialect } from '../registry';\n\nconst DIALECT_EXT: Record<Dialect, string> = {\n postgres: 'pg',\n mysql: 'mysql',\n sqlite: 'sqlite',\n};\n\nconst contentCache = new Map<string, string>();\nconst pathCache = new Map<string, string>();\n\nfunction key(root: string, method: string, dialect: Dialect): string {\n return `${root}::${method}::${dialect}`;\n}\n\nexport function resolveSqlFromFs(rootDir: string, methodName: string, dialect: Dialect): { sql: string; tried: string[] } {\n const k = key(rootDir, methodName, dialect);\n const tried: string[] = [];\n const ext = DIALECT_EXT[dialect];\n const dialectPath = path.join(rootDir, `${methodName}.${ext}.sql`);\n const genericPath = path.join(rootDir, `${methodName}.sql`);\n\n // Cached path\n let chosen = pathCache.get(k);\n if (!chosen) {\n if (fs.existsSync(dialectPath)) {\n chosen = dialectPath;\n } else if (fs.existsSync(genericPath)) {\n chosen = genericPath;\n }\n if (chosen) pathCache.set(k, chosen);\n }\n\n if (!chosen) {\n tried.push(dialectPath, genericPath);\n throw new Error(\n `sqlstack: SQL file not found for ${methodName}\\ntried: ${tried.join(\"\\n\")}`\n );\n }\n\n // Cached content\n let sql = contentCache.get(chosen);\n if (!sql) {\n sql = fs.readFileSync(chosen, 'utf8');\n contentCache.set(chosen, sql);\n }\n return { sql, tried: [chosen] };\n}\n\nexport function coerceRootPath(input?: string): { rootDir?: string; from?: 'file' | 'folder' } {\n if (!input) return {};\n const stat = fs.existsSync(input) ? fs.statSync(input) : undefined;\n if (stat?.isDirectory()) return { rootDir: input, from: 'folder' };\n if (stat?.isFile()) return { rootDir: path.dirname(input), from: 'file' };\n // If not found, treat as folder hint anyway\n return { rootDir: input, from: 'folder' };\n}\n\nexport function guessDecoratorDir(): string | undefined {\n const err = new Error();\n const stack = (err.stack || '').split('\\n').slice(2);\n const packageRoot = PACKAGE_ROOT_NORMALIZED;\n\n for (const line of stack) {\n const m = line.match(/\\((.*?):\\d+:\\d+\\)/) || line.match(/at (.*?):\\d+:\\d+/);\n const file = m?.[1];\n if (!file) continue;\n\n const resolved = toAbsolutePath(file);\n if (!resolved) continue;\n\n // Skip frames from node_modules (including sqlstack itself when used as dependency)\n if (resolved.includes('node_modules')) continue;\n\n const normalized = safeNormalize(resolved);\n if (!normalized) continue;\n\n // Skip frames from sqlstack's own package (when running from source)\n if (packageRoot && normalized.startsWith(packageRoot)) {\n continue;\n }\n\n // Return the first valid frame - this is where @Query is defined\n return path.dirname(resolved);\n }\n return undefined;\n}\n\nfunction toAbsolutePath(file: string): string | undefined {\n try {\n if (file.startsWith('file://')) {\n return fileURLToPath(file);\n }\n // Skip Node.js internal modules and bundler internals\n if (file.startsWith('node:') || file.startsWith('webpack://')) {\n return undefined;\n }\n if (!path.isAbsolute(file)) {\n return path.resolve(file);\n }\n return file;\n } catch {\n return undefined;\n }\n}\n\nfunction ensureTrailingSep(p: string): string {\n return p.endsWith(path.sep) ? p : p + path.sep;\n}\n\nfunction safeNormalize(p?: string): string | undefined {\n if (!p) return undefined;\n const normalized = path.normalize(p);\n return process.platform === 'win32' ? normalized.toLowerCase() : normalized;\n}\n\nconst PACKAGE_ROOT_NORMALIZED = (() => {\n const dirs: string[] = [];\n\n // CJS: use __dirname/__filename\n if (typeof __dirname === 'string') dirs.push(__dirname);\n if (typeof __filename === 'string') dirs.push(path.dirname(__filename));\n\n // ESM fallback: parse stack trace to find this file's location\n if (dirs.length === 0) {\n const err = new Error();\n const stack = (err.stack || '').split('\\n');\n for (const line of stack) {\n const m = line.match(/\\((.*?):\\d+:\\d+\\)/) || line.match(/at (.*?):\\d+:\\d+/);\n const file = m?.[1];\n if (!file) continue;\n try {\n let resolved: string | undefined;\n if (file.startsWith('file://')) {\n resolved = fileURLToPath(file);\n } else if (path.isAbsolute(file)) {\n resolved = file;\n }\n if (resolved && resolved.includes('fileResolution')) {\n dirs.push(path.dirname(resolved));\n break;\n }\n } catch {\n // Skip invalid paths\n }\n }\n }\n\n for (const base of dirs) {\n let current = base;\n for (let i = 0; i < 6; i++) {\n const candidate = path.join(current, 'package.json');\n if (fs.existsSync(candidate)) {\n const root = path.dirname(candidate);\n const normalizedRoot = safeNormalize(root);\n return normalizedRoot ? ensureTrailingSep(normalizedRoot) : ensureTrailingSep(root);\n }\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n }\n return undefined;\n})();\n"]}
|
|
1
|
+
{"version":3,"file":"fileResolution.js","sourceRoot":"","sources":["../../../src/core/fileResolution.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport type { Dialect } from '../registry';\n\nconst DIALECT_EXT: Record<Dialect, string> = {\n postgres: 'pg',\n mysql: 'mysql',\n sqlite: 'sqlite',\n};\n\nconst contentCache = new Map<string, string>();\nconst pathCache = new Map<string, string>();\n\nfunction key(root: string, method: string, dialect: Dialect): string {\n return `${root}::${method}::${dialect}`;\n}\n\nexport function resolveSqlFromFs(rootDir: string, methodName: string, dialect: Dialect): { sql: string; tried: string[] } {\n const k = key(rootDir, methodName, dialect);\n const tried: string[] = [];\n const ext = DIALECT_EXT[dialect];\n const dialectPath = path.join(rootDir, `${methodName}.${ext}.sql`);\n const genericPath = path.join(rootDir, `${methodName}.sql`);\n\n // Cached path\n let chosen = pathCache.get(k);\n if (!chosen) {\n if (fs.existsSync(dialectPath)) {\n chosen = dialectPath;\n } else if (fs.existsSync(genericPath)) {\n chosen = genericPath;\n }\n if (chosen) pathCache.set(k, chosen);\n }\n\n if (!chosen) {\n tried.push(dialectPath, genericPath);\n throw new Error(\n `sqlstack: SQL file not found for ${methodName}\\ntried: ${tried.join(\"\\n\")}`\n );\n }\n\n // Cached content\n let sql = contentCache.get(chosen);\n if (!sql) {\n sql = fs.readFileSync(chosen, 'utf8');\n contentCache.set(chosen, sql);\n }\n return { sql, tried: [chosen] };\n}\n\nexport function coerceRootPath(input?: string): { rootDir?: string; from?: 'file' | 'folder' } {\n if (!input) return {};\n const stat = fs.existsSync(input) ? fs.statSync(input) : undefined;\n if (stat?.isDirectory()) return { rootDir: input, from: 'folder' };\n if (stat?.isFile()) return { rootDir: path.dirname(input), from: 'file' };\n // If not found, treat as folder hint anyway\n return { rootDir: input, from: 'folder' };\n}\n\nexport function guessDecoratorDir(): string | undefined {\n const err = new Error();\n const stack = (err.stack || '').split('\\n').slice(2);\n const packageRoot = PACKAGE_ROOT_NORMALIZED;\n\n // DEBUG: Uncomment to trace issues\n // console.log('[guessDecoratorDir] packageRoot:', packageRoot);\n // console.log('[guessDecoratorDir] stack:', stack.slice(0, 5));\n\n for (const line of stack) {\n const m = line.match(/\\((.*?):\\d+:\\d+\\)/) || line.match(/at (.*?):\\d+:\\d+/);\n const file = m?.[1];\n if (!file) continue;\n\n const resolved = toAbsolutePath(file);\n if (!resolved) continue;\n\n // Skip frames from node_modules (including sqlstack itself when used as dependency)\n if (resolved.includes('node_modules')) continue;\n\n const normalized = safeNormalize(resolved);\n if (!normalized) continue;\n\n // Skip frames from sqlstack's own package (when running from source)\n // Also skip if the path contains /sqlstack/ anywhere (linked package scenario)\n if (packageRoot && normalized.startsWith(packageRoot)) {\n continue;\n }\n\n // Additional check: skip if this is a sqlstack path (handles linked packages with relative paths)\n if (isSqlstackPath(resolved)) {\n continue;\n }\n\n // Return the first valid frame - this is where @Query is defined\n return path.dirname(resolved);\n }\n return undefined;\n}\n\nfunction toAbsolutePath(file: string): string | undefined {\n try {\n if (file.startsWith('file://')) {\n return fileURLToPath(file);\n }\n // Skip Node.js internal modules and bundler internals\n if (file.startsWith('node:') || file.startsWith('webpack://')) {\n return undefined;\n }\n if (!path.isAbsolute(file)) {\n return path.resolve(file);\n }\n return file;\n } catch {\n return undefined;\n }\n}\n\nfunction ensureTrailingSep(p: string): string {\n return p.endsWith(path.sep) ? p : p + path.sep;\n}\n\nfunction safeNormalize(p?: string): string | undefined {\n if (!p) return undefined;\n const normalized = path.normalize(p);\n return process.platform === 'win32' ? normalized.toLowerCase() : normalized;\n}\n\n/**\n * Finds the package root from a starting directory by walking up to find package.json.\n * @internal Exported for testing\n */\nexport function findPackageRoot(startDir: string): string | undefined {\n let current = startDir;\n for (let i = 0; i < 6; i++) {\n const candidate = path.join(current, 'package.json');\n if (fs.existsSync(candidate)) {\n const root = path.dirname(candidate);\n const normalizedRoot = safeNormalize(root);\n return normalizedRoot ? ensureTrailingSep(normalizedRoot) : ensureTrailingSep(root);\n }\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return undefined;\n}\n\n/**\n * Detects if a path belongs to sqlstack package.\n * Handles both source paths (contains 'sqlstack') and node_modules paths.\n * @internal Exported for testing\n */\nexport function isSqlstackPath(filePath: string): boolean {\n const normalized = filePath.toLowerCase();\n // Check for source development path (e.g., /path/to/sqlstack/src/...)\n if (normalized.includes(path.sep + 'sqlstack' + path.sep)) return true;\n // Check for node_modules installation\n if (normalized.includes('node_modules' + path.sep + 'sqlstack' + path.sep)) return true;\n // Check for scoped package (@noego/sqlstack or similar)\n if (normalized.includes('node_modules' + path.sep + '@') && normalized.includes('sqlstack' + path.sep)) return true;\n return false;\n}\n\n/**\n * Extracts sqlstack's location from a stack trace.\n * Handles absolute paths, file:// URLs, and relative paths (Vitest uses relative paths).\n * @internal Exported for testing\n */\nexport function findSqlstackFromStack(stackString: string): string | undefined {\n const lines = stackString.split('\\n');\n for (const line of lines) {\n const m = line.match(/\\((.*?):\\d+:\\d+\\)/) || line.match(/at (.*?):\\d+:\\d+/);\n const file = m?.[1];\n if (!file) continue;\n try {\n let resolved: string | undefined;\n if (file.startsWith('file://')) {\n resolved = fileURLToPath(file);\n } else if (path.isAbsolute(file)) {\n resolved = file;\n } else if (!file.startsWith('node:') && !file.startsWith('webpack://')) {\n // Relative path - resolve it (Vitest uses relative paths in stack traces)\n resolved = path.resolve(file);\n }\n if (resolved && resolved.includes('fileResolution')) {\n return path.dirname(resolved);\n }\n } catch {\n // Skip invalid paths\n }\n }\n return undefined;\n}\n\n/**\n * Computes the sqlstack package root directory.\n * Handles both CJS (__dirname) and ESM (stack trace) detection.\n * Validates that __dirname actually points to sqlstack (guards against Vitest injection).\n * @internal Exported for testing\n */\nexport function computePackageRoot(\n dirnameValue: string | undefined,\n filenameValue: string | undefined,\n getStack: () => string\n): string | undefined {\n const candidates: string[] = [];\n\n // CJS: use __dirname/__filename, but validate they actually point to sqlstack\n // (Vitest can inject __dirname incorrectly when transforming CJS modules)\n if (typeof dirnameValue === 'string' && isSqlstackPath(dirnameValue)) {\n candidates.push(dirnameValue);\n }\n if (typeof filenameValue === 'string' && isSqlstackPath(filenameValue)) {\n candidates.push(path.dirname(filenameValue));\n }\n\n // ESM fallback or when __dirname was incorrectly injected: parse stack trace\n if (candidates.length === 0) {\n const stackDir = findSqlstackFromStack(getStack());\n if (stackDir) {\n candidates.push(stackDir);\n }\n }\n\n // Find the package root from the first valid candidate\n for (const base of candidates) {\n const root = findPackageRoot(base);\n if (root) return root;\n }\n return undefined;\n}\n\nconst PACKAGE_ROOT_NORMALIZED = computePackageRoot(\n typeof __dirname === 'string' ? __dirname : undefined,\n typeof __filename === 'string' ? __filename : undefined,\n () => new Error().stack || ''\n);\n"]}
|