mythik-server 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/NOTICE +4 -0
- package/README.md +51 -0
- package/dist/api-handler.d.ts +4 -0
- package/dist/api-handler.d.ts.map +1 -0
- package/dist/api-handler.js +110 -0
- package/dist/api-handler.js.map +1 -0
- package/dist/audit.d.ts +18 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +42 -0
- package/dist/audit.js.map +1 -0
- package/dist/auth/db-auth-provider.d.ts +10 -0
- package/dist/auth/db-auth-provider.d.ts.map +1 -0
- package/dist/auth/db-auth-provider.js +130 -0
- package/dist/auth/db-auth-provider.js.map +1 -0
- package/dist/auth/jwt-strategy.d.ts +3 -0
- package/dist/auth/jwt-strategy.d.ts.map +1 -0
- package/dist/auth/jwt-strategy.js +39 -0
- package/dist/auth/jwt-strategy.js.map +1 -0
- package/dist/auth/middleware.d.ts +4 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +40 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/password-verifier.d.ts +3 -0
- package/dist/auth/password-verifier.d.ts.map +1 -0
- package/dist/auth/password-verifier.js +18 -0
- package/dist/auth/password-verifier.js.map +1 -0
- package/dist/auth/policy-evaluator.d.ts +3 -0
- package/dist/auth/policy-evaluator.d.ts.map +1 -0
- package/dist/auth/policy-evaluator.js +11 -0
- package/dist/auth/policy-evaluator.js.map +1 -0
- package/dist/auth/refresh-store.d.ts +8 -0
- package/dist/auth/refresh-store.d.ts.map +1 -0
- package/dist/auth/refresh-store.js +34 -0
- package/dist/auth/refresh-store.js.map +1 -0
- package/dist/auth/scope-filter.d.ts +10 -0
- package/dist/auth/scope-filter.d.ts.map +1 -0
- package/dist/auth/scope-filter.js +51 -0
- package/dist/auth/scope-filter.js.map +1 -0
- package/dist/auth/types.d.ts +75 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +3 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/user-context.d.ts +4 -0
- package/dist/auth/user-context.d.ts.map +1 -0
- package/dist/auth/user-context.js +18 -0
- package/dist/auth/user-context.js.map +1 -0
- package/dist/catalog-builder.d.ts +3 -0
- package/dist/catalog-builder.d.ts.map +1 -0
- package/dist/catalog-builder.js +35 -0
- package/dist/catalog-builder.js.map +1 -0
- package/dist/connection.d.ts +4 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +18 -0
- package/dist/connection.js.map +1 -0
- package/dist/crud-builder.d.ts +14 -0
- package/dist/crud-builder.d.ts.map +1 -0
- package/dist/crud-builder.js +43 -0
- package/dist/crud-builder.js.map +1 -0
- package/dist/handler-loader.d.ts +9 -0
- package/dist/handler-loader.d.ts.map +1 -0
- package/dist/handler-loader.js +42 -0
- package/dist/handler-loader.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/cors.d.ts +3 -0
- package/dist/middleware/cors.d.ts.map +1 -0
- package/dist/middleware/cors.js +8 -0
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +9 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +56 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/query-engine.d.ts +8 -0
- package/dist/query-engine.d.ts.map +1 -0
- package/dist/query-engine.js +66 -0
- package/dist/query-engine.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +717 -0
- package/dist/server.js.map +1 -0
- package/dist/spec-loader.d.ts +6 -0
- package/dist/spec-loader.d.ts.map +1 -0
- package/dist/spec-loader.js +21 -0
- package/dist/spec-loader.js.map +1 -0
- package/dist/spec-serving.d.ts +9 -0
- package/dist/spec-serving.d.ts.map +1 -0
- package/dist/spec-serving.js +53 -0
- package/dist/spec-serving.js.map +1 -0
- package/dist/types.d.ts +131 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation/identifier-guard.d.ts +2 -0
- package/dist/validation/identifier-guard.d.ts.map +1 -0
- package/dist/validation/identifier-guard.js +3 -0
- package/dist/validation/identifier-guard.js.map +1 -0
- package/dist/validation/spec-validator.d.ts +3 -0
- package/dist/validation/spec-validator.d.ts.map +1 -0
- package/dist/validation/spec-validator.js +3 -0
- package/dist/validation/spec-validator.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-loader.js","sourceRoot":"","sources":["../src/handler-loader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB;IACxD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACnD,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC7D,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YAC5B,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;gBAClC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAc,EACd,QAA8B;IAE9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,YAAY,GAAG,0DAA0D,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAA0D;IACvF,IAAI,CAAC,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;SACjC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;SACtB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAQ,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type { ApiSpec, ApiAuthConfig, ConnectionConfig, CatalogConfig, EndpointConfig, ParamConfig, CrudConfig, Handler, HandlerContext, HandlerResult, UserContext, MythikServer, MythikServerConfig, } from './types.js';
|
|
2
|
+
export type { AuthConfig, JwtConfig, ProviderConfig, PolicyConfig, ScopeFilterConfig, AuthStrategy, PasswordVerifier, LoginResponse, LoginResponseUser, ClaimsMapping, EndpointScopeOverride, } from './auth/types.js';
|
|
3
|
+
export { createServer } from './server.js';
|
|
4
|
+
export { resolveEnvVars } from './spec-loader.js';
|
|
5
|
+
export { validateApiSpec } from './validation/spec-validator.js';
|
|
6
|
+
export { isValidIdentifier, assertValidIdentifier } from './validation/identifier-guard.js';
|
|
7
|
+
export { createJwtStrategy } from './auth/jwt-strategy.js';
|
|
8
|
+
export { createAuthMiddleware } from './auth/middleware.js';
|
|
9
|
+
export { createDbAuthProvider } from './auth/db-auth-provider.js';
|
|
10
|
+
export { evaluatePolicy } from './auth/policy-evaluator.js';
|
|
11
|
+
export { buildScopeWhereClause, wrapQueryWithScopeFilter, validateScopeForInsert, resolveActiveScope } from './auth/scope-filter.js';
|
|
12
|
+
export { buildUserContext } from './auth/user-context.js';
|
|
13
|
+
export { createRefreshStore } from './auth/refresh-store.js';
|
|
14
|
+
export { getPasswordVerifier } from './auth/password-verifier.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,WAAW,EACX,UAAU,EACV,OAAO,EACP,cAAc,EACd,aAAa,EACb,WAAW,EACX,YAAY,EACZ,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,UAAU,EACV,SAAS,EACT,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAG5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACrI,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { createServer } from './server.js';
|
|
2
|
+
export { resolveEnvVars } from './spec-loader.js';
|
|
3
|
+
export { validateApiSpec } from './validation/spec-validator.js';
|
|
4
|
+
export { isValidIdentifier, assertValidIdentifier } from './validation/identifier-guard.js';
|
|
5
|
+
// Auth modules
|
|
6
|
+
export { createJwtStrategy } from './auth/jwt-strategy.js';
|
|
7
|
+
export { createAuthMiddleware } from './auth/middleware.js';
|
|
8
|
+
export { createDbAuthProvider } from './auth/db-auth-provider.js';
|
|
9
|
+
export { evaluatePolicy } from './auth/policy-evaluator.js';
|
|
10
|
+
export { buildScopeWhereClause, wrapQueryWithScopeFilter, validateScopeForInsert, resolveActiveScope } from './auth/scope-filter.js';
|
|
11
|
+
export { buildUserContext } from './auth/user-context.js';
|
|
12
|
+
export { createRefreshStore } from './auth/refresh-store.js';
|
|
13
|
+
export { getPasswordVerifier } from './auth/password-verifier.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA+BA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAE5F,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACrI,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAK3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,MAAM,CAAC;AAGlC,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,cAAc,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Request, Response, NextFunction } from 'express';
|
|
2
|
+
export interface ApiError extends Error {
|
|
3
|
+
type?: 'VALIDATION' | 'NOT_FOUND' | 'QUERY_ERROR' | 'AUTH' | 'FORBIDDEN';
|
|
4
|
+
status?: number;
|
|
5
|
+
code?: string;
|
|
6
|
+
details?: unknown;
|
|
7
|
+
}
|
|
8
|
+
export declare function createErrorHandler(devMode: boolean): (err: ApiError, _req: Request, res: Response, _next: NextFunction) => void;
|
|
9
|
+
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/middleware/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE/D,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,IAAI,CAAC,EAAE,YAAY,GAAG,WAAW,GAAG,aAAa,GAAG,MAAM,GAAG,WAAW,CAAC;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,IACpB,KAAK,QAAQ,EAAE,MAAM,OAAO,EAAE,KAAK,QAAQ,EAAE,OAAO,YAAY,KAAG,IAAI,CA2DrG"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export function createErrorHandler(devMode) {
|
|
2
|
+
return function errorHandler(err, _req, res, _next) {
|
|
3
|
+
// Validation errors
|
|
4
|
+
if (err.type === 'VALIDATION') {
|
|
5
|
+
res.status(400).json({
|
|
6
|
+
error: { code: 'VALIDATION_FAILED', message: err.message, details: err.details },
|
|
7
|
+
});
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
// Not found
|
|
11
|
+
if (err.type === 'NOT_FOUND') {
|
|
12
|
+
res.status(404).json({
|
|
13
|
+
error: { code: 'NOT_FOUND', message: err.message },
|
|
14
|
+
});
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
// Auth errors
|
|
18
|
+
if (err.type === 'AUTH') {
|
|
19
|
+
res.status(401).json({
|
|
20
|
+
error: { code: err.code ?? 'AUTH_ERROR', message: err.message },
|
|
21
|
+
});
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// Forbidden
|
|
25
|
+
if (err.type === 'FORBIDDEN') {
|
|
26
|
+
res.status(403).json({
|
|
27
|
+
error: { code: err.code ?? 'FORBIDDEN', message: devMode ? err.message : 'Access denied' },
|
|
28
|
+
});
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// SQL errors (mssql errors have a 'number' property)
|
|
32
|
+
if ('number' in err && typeof err.number === 'number') {
|
|
33
|
+
const message = devMode ? err.message : 'Database error';
|
|
34
|
+
res.status(400).json({
|
|
35
|
+
error: { code: 'QUERY_ERROR', message },
|
|
36
|
+
});
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Explicit status from handler
|
|
40
|
+
if (err.status) {
|
|
41
|
+
res.status(err.status).json({
|
|
42
|
+
error: { code: err.code ?? 'ERROR', message: err.message },
|
|
43
|
+
});
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Unhandled
|
|
47
|
+
if (devMode) {
|
|
48
|
+
console.error('[Mythik Server Error]', err);
|
|
49
|
+
}
|
|
50
|
+
const message = devMode ? err.message : 'Internal server error';
|
|
51
|
+
res.status(500).json({
|
|
52
|
+
error: { code: 'INTERNAL_ERROR', message },
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/middleware/error-handler.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO,SAAS,YAAY,CAAC,GAAa,EAAE,IAAa,EAAE,GAAa,EAAE,KAAmB;QAC3F,oBAAoB;QACpB,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC9B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;aACjF,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,YAAY;QACZ,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;aACnD,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,cAAc;QACd,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;aAChE,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,YAAY;QACZ,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;aAC3F,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,qDAAqD;QACrD,IAAI,QAAQ,IAAI,GAAG,IAAI,OAAQ,GAA+B,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACnF,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;YACzD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE;aACxC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,+BAA+B;QAC/B,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;aAC3D,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,YAAY;QACZ,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;QAChE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE;SAC3C,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ISqlTypeFactoryWithNoParams } from 'mssql';
|
|
2
|
+
import type { ParamConfig } from './types.js';
|
|
3
|
+
export declare function parseParamValue(raw: string | undefined, type: ParamConfig['type'], max?: number): unknown;
|
|
4
|
+
export declare function getSqlType(type: ParamConfig['type']): ISqlTypeFactoryWithNoParams;
|
|
5
|
+
export declare function buildPaginatedQuery(query: string): string;
|
|
6
|
+
export declare function buildCountQuery(query: string): string;
|
|
7
|
+
export declare function buildTotalsQuery(query: string, totals: string[]): string | null;
|
|
8
|
+
//# sourceMappingURL=query-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-engine.d.ts","sourceRoot":"","sources":["../src/query-engine.ts"],"names":[],"mappings":"AAAA,OAAY,EAAE,KAAK,2BAA2B,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EACzB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAqBT;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,2BAA2B,CASjF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUrD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAmB/E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import sql from 'mssql';
|
|
2
|
+
export function parseParamValue(raw, type, max) {
|
|
3
|
+
if (raw === undefined || raw === '')
|
|
4
|
+
return null;
|
|
5
|
+
switch (type) {
|
|
6
|
+
case 'int': {
|
|
7
|
+
const n = parseInt(raw, 10);
|
|
8
|
+
if (isNaN(n))
|
|
9
|
+
return null;
|
|
10
|
+
return max !== undefined && n > max ? max : n;
|
|
11
|
+
}
|
|
12
|
+
case 'float': {
|
|
13
|
+
const f = parseFloat(raw);
|
|
14
|
+
return isNaN(f) ? null : f;
|
|
15
|
+
}
|
|
16
|
+
case 'boolean':
|
|
17
|
+
return raw === 'true' || raw === '1';
|
|
18
|
+
case 'date':
|
|
19
|
+
return raw;
|
|
20
|
+
case 'string':
|
|
21
|
+
default:
|
|
22
|
+
return raw;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function getSqlType(type) {
|
|
26
|
+
switch (type) {
|
|
27
|
+
case 'int': return sql.Int;
|
|
28
|
+
case 'float': return sql.Float;
|
|
29
|
+
case 'boolean': return sql.Bit;
|
|
30
|
+
case 'date': return sql.NVarChar;
|
|
31
|
+
case 'string':
|
|
32
|
+
default: return sql.NVarChar;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function buildPaginatedQuery(query) {
|
|
36
|
+
return `${query}\nOFFSET @_offset ROWS FETCH NEXT @_pageSize ROWS ONLY`;
|
|
37
|
+
}
|
|
38
|
+
export function buildCountQuery(query) {
|
|
39
|
+
const fromMatch = query.match(/\bFROM\b/i);
|
|
40
|
+
if (!fromMatch || fromMatch.index === undefined) {
|
|
41
|
+
return `SELECT COUNT(*) as _total FROM (${query}) as _countSource`;
|
|
42
|
+
}
|
|
43
|
+
const afterFrom = query.slice(fromMatch.index);
|
|
44
|
+
const stripped = afterFrom.replace(/\s+ORDER\s+BY\s+[\s\S]+$/i, '');
|
|
45
|
+
return `SELECT COUNT(*) as _total ${stripped}`;
|
|
46
|
+
}
|
|
47
|
+
export function buildTotalsQuery(query, totals) {
|
|
48
|
+
if (!totals || totals.length === 0)
|
|
49
|
+
return null;
|
|
50
|
+
const aggregations = totals.map(t => {
|
|
51
|
+
if (t === 'COUNT:*')
|
|
52
|
+
return 'COUNT(*) as [COUNT:*]';
|
|
53
|
+
const [fn, field] = t.split(':');
|
|
54
|
+
if (fn === 'COUNT_DISTINCT')
|
|
55
|
+
return `COUNT(DISTINCT ${field}) as [COUNT_DISTINCT:${field}]`;
|
|
56
|
+
return `${fn}(${field}) as [${fn}:${field}]`;
|
|
57
|
+
});
|
|
58
|
+
const selectClause = aggregations.join(', ');
|
|
59
|
+
const fromMatch = query.match(/\bFROM\b/i);
|
|
60
|
+
if (!fromMatch || fromMatch.index === undefined)
|
|
61
|
+
return null;
|
|
62
|
+
const afterFrom = query.slice(fromMatch.index);
|
|
63
|
+
const stripped = afterFrom.replace(/\s+ORDER\s+BY\s+[\s\S]+$/i, '');
|
|
64
|
+
return `SELECT ${selectClause} ${stripped}`;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=query-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-engine.js","sourceRoot":"","sources":["../src/query-engine.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAW,YAAY,EAAE,kBAAkB,EAAqD,MAAM,YAAY,CAAC;AAkD/H,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CA2OrE"}
|