mythik-server 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -14
- package/dist/audit.js +1 -1
- package/dist/audit.js.map +1 -1
- package/dist/auth/db-auth-provider.d.ts +2 -2
- package/dist/auth/db-auth-provider.d.ts.map +1 -1
- package/dist/auth/db-auth-provider.js +17 -15
- package/dist/auth/db-auth-provider.js.map +1 -1
- package/dist/auth/scope-filter.d.ts +7 -1
- package/dist/auth/scope-filter.d.ts.map +1 -1
- package/dist/auth/scope-filter.js +24 -4
- package/dist/auth/scope-filter.js.map +1 -1
- package/dist/catalog-builder.d.ts +2 -1
- package/dist/catalog-builder.d.ts.map +1 -1
- package/dist/catalog-builder.js +24 -13
- package/dist/catalog-builder.js.map +1 -1
- package/dist/connection.d.ts +4 -2
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +74 -7
- package/dist/connection.js.map +1 -1
- package/dist/crud-builder.d.ts +8 -3
- package/dist/crud-builder.d.ts.map +1 -1
- package/dist/crud-builder.js +40 -16
- package/dist/crud-builder.js.map +1 -1
- package/dist/middleware/error-handler.js +1 -1
- package/dist/middleware/error-handler.js.map +1 -1
- package/dist/query-engine.d.ts +12 -4
- package/dist/query-engine.d.ts.map +1 -1
- package/dist/query-engine.js +12 -17
- package/dist/query-engine.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +111 -159
- package/dist/server.js.map +1 -1
- package/dist/spec-serving.d.ts +7 -3
- package/dist/spec-serving.d.ts.map +1 -1
- package/dist/spec-serving.js +36 -12
- package/dist/spec-serving.js.map +1 -1
- package/dist/types.d.ts +34 -11
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -3
package/README.md
CHANGED
|
@@ -30,6 +30,21 @@ wired in.
|
|
|
30
30
|
npm install mythik-server
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
+
Install the SQL driver for your selected database explicitly:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm install pg # PostgreSQL
|
|
37
|
+
npm install mysql2 # MySQL
|
|
38
|
+
npm install mssql # SQL Server
|
|
39
|
+
npm install better-sqlite3 # SQLite
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
SQLite uses the native `better-sqlite3` adapter. If npm prints warnings
|
|
43
|
+
from that adapter's transitive native-build helpers, the warning belongs
|
|
44
|
+
to the SQLite adapter install path, not to `mythik-server` itself.
|
|
45
|
+
Missing SQL adapter errors include the package name and install command
|
|
46
|
+
for the selected dialect.
|
|
47
|
+
|
|
33
48
|
`mythik` is included as a dependency — no separate install required.
|
|
34
49
|
|
|
35
50
|
## When to install this
|
|
@@ -54,6 +69,11 @@ below for what it actually checks.
|
|
|
54
69
|
ApiSpec, opens the database connection, registers all declared
|
|
55
70
|
endpoints, and exposes a `start(port)` method.
|
|
56
71
|
|
|
72
|
+
- **Dialect-aware SQL runtime** — generated CRUD, catalogs,
|
|
73
|
+
pagination, auth provider queries, and scope filters compile through
|
|
74
|
+
the selected database driver. Supported dialects are SQL Server,
|
|
75
|
+
PostgreSQL, MySQL, and SQLite.
|
|
76
|
+
|
|
57
77
|
- **Endpoint patterns** — your ApiSpec declares each endpoint as one
|
|
58
78
|
of four shapes; the server wires the route, validates inputs,
|
|
59
79
|
enforces auth, and applies RLS automatically:
|
|
@@ -82,11 +102,8 @@ import { createServer } from 'mythik-server';
|
|
|
82
102
|
const server = createServer({
|
|
83
103
|
spec: './api-spec.json',
|
|
84
104
|
database: {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
user: process.env.DB_USER!,
|
|
88
|
-
password: process.env.DB_PASSWORD!,
|
|
89
|
-
trustServerCertificate: true,
|
|
105
|
+
type: 'postgres',
|
|
106
|
+
connectionString: process.env.DATABASE_URL!,
|
|
90
107
|
},
|
|
91
108
|
});
|
|
92
109
|
|
|
@@ -97,6 +114,22 @@ await server.start(3010);
|
|
|
97
114
|
policy, catalogs, and CRUD shape. See `ai-context.md` (bundled in the
|
|
98
115
|
`mythik` package) for the ApiSpec schema and patterns.
|
|
99
116
|
|
|
117
|
+
For local demos and tests, SQLite is a one-file option:
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
const server = createServer({
|
|
121
|
+
spec: './api-spec.json',
|
|
122
|
+
database: { type: 'sqlite', filename: './mythik.db' },
|
|
123
|
+
});
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Set `spec.dialect` in the ApiSpec to match the server database when
|
|
127
|
+
Mythik should generate CRUD/catalog/pagination/scope SQL for that
|
|
128
|
+
dialect. Custom SQL remains dialect-native; Mythik compiles named
|
|
129
|
+
params (`@name`) but does not translate a SQL Server query into
|
|
130
|
+
PostgreSQL/MySQL/SQLite SQL at runtime. MySQL generated upsert SQL
|
|
131
|
+
targets MySQL 8.0.19+.
|
|
132
|
+
|
|
100
133
|
## ApiSpec philosophy
|
|
101
134
|
|
|
102
135
|
The ApiSpec describes **what** the API does — not **how**. Routes,
|
|
@@ -158,12 +191,19 @@ to detect; in Mythik both `roleAccess` (frontend) and `policies`
|
|
|
158
191
|
- [`mythik-react`](https://github.com/mldixdev/mythik/tree/main/packages/react#readme) — the frontend consuming this API
|
|
159
192
|
- [`mythik-cli`](https://github.com/mldixdev/mythik/tree/main/packages/cli#readme) — author and cross-validate ApiSpecs (the AI-first surface)
|
|
160
193
|
|
|
161
|
-
## Status
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
frontend specs against backend endpoints before deployment. APIs are
|
|
165
|
-
documented for real-world feedback as the framework evolves.
|
|
166
|
-
|
|
167
|
-
##
|
|
168
|
-
|
|
169
|
-
|
|
194
|
+
## Status
|
|
195
|
+
|
|
196
|
+
Public release line. Use with `mythik contract` to cross-check
|
|
197
|
+
frontend specs against backend endpoints before deployment. APIs are
|
|
198
|
+
documented for real-world feedback as the framework evolves.
|
|
199
|
+
|
|
200
|
+
## Releases
|
|
201
|
+
|
|
202
|
+
Release notes and patch details are published in the
|
|
203
|
+
[CHANGELOG](https://github.com/mldixdev/mythik/blob/main/CHANGELOG.md)
|
|
204
|
+
and on
|
|
205
|
+
[GitHub Releases](https://github.com/mldixdev/mythik/releases).
|
|
206
|
+
|
|
207
|
+
## License
|
|
208
|
+
|
|
209
|
+
Apache-2.0.
|
package/dist/audit.js
CHANGED
|
@@ -19,7 +19,7 @@ function getTimestamp(timezone) {
|
|
|
19
19
|
});
|
|
20
20
|
const parts = formatter.formatToParts(new Date());
|
|
21
21
|
const get = (type) => parts.find(p => p.type === type)?.value ?? '0';
|
|
22
|
-
// Use Date.UTC so
|
|
22
|
+
// Use Date.UTC so SQL Server receives the value as-is (no local timezone conversion)
|
|
23
23
|
return new Date(Date.UTC(parseInt(get('year')), parseInt(get('month')) - 1, parseInt(get('day')), parseInt(get('hour')), parseInt(get('minute')), parseInt(get('second'))));
|
|
24
24
|
}
|
|
25
25
|
/**
|
package/dist/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,SAAS,YAAY,CAAC,QAAiB;IACrC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,IAAI,EAAE,CAAC;IAEjC,gEAAgE;IAChE,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QACjD,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,CAAC,IAAkC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,GAAG,CAAC;IAEnG,
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,SAAS,YAAY,CAAC,QAAiB;IACrC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,IAAI,EAAE,CAAC;IAEjC,gEAAgE;IAChE,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QACjD,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,CAAC,IAAkC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,GAAG,CAAC;IAEnG,qFAAqF;IACrF,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CACtB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EACrB,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAC1B,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EACpB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EACrB,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EACvB,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CACxB,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA+B,EAC/B,KAAkB,EAClB,QAAuB,EACvB,SAA8B;IAE9B,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,SAAS,IAAI,QAAQ;YAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC;QACpE,IAAI,KAAK,CAAC,SAAS;YAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC;IACrD,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,IAAI,QAAQ;QAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC;IACpE,IAAI,KAAK,CAAC,SAAS;QAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC;AACrD,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { SqlDriver } from 'mythik/server';
|
|
2
2
|
import type { ProviderConfig, JwtConfig, LoginResponse } from './types.js';
|
|
3
3
|
import { type RefreshStore } from './refresh-store.js';
|
|
4
4
|
export interface DbAuthProvider {
|
|
@@ -6,5 +6,5 @@ export interface DbAuthProvider {
|
|
|
6
6
|
refresh(refreshToken: string): Promise<LoginResponse>;
|
|
7
7
|
getRefreshStore(): RefreshStore;
|
|
8
8
|
}
|
|
9
|
-
export declare function createDbAuthProvider(config: ProviderConfig, jwtConfig: JwtConfig,
|
|
9
|
+
export declare function createDbAuthProvider(config: ProviderConfig, jwtConfig: JwtConfig, db: SqlDriver): DbAuthProvider;
|
|
10
10
|
//# sourceMappingURL=db-auth-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-auth-provider.d.ts","sourceRoot":"","sources":["../../src/auth/db-auth-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"db-auth-provider.d.ts","sourceRoot":"","sources":["../../src/auth/db-auth-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAC;AAG9F,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG3E,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAClE,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACtD,eAAe,IAAI,YAAY,CAAC;CACjC;AAYD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,SAAS,GACZ,cAAc,CA6HhB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createJwtStrategy } from './jwt-strategy.js';
|
|
2
2
|
import { getPasswordVerifier } from './password-verifier.js';
|
|
3
3
|
import { createRefreshStore } from './refresh-store.js';
|
|
4
|
+
import { assertValidIdentifier } from '../validation/identifier-guard.js';
|
|
4
5
|
/** Case-insensitive field lookup — SQL Server column casing varies by driver/config */
|
|
5
6
|
function getField(row, fieldName) {
|
|
6
7
|
if (fieldName in row)
|
|
@@ -12,38 +13,34 @@ function getField(row, fieldName) {
|
|
|
12
13
|
}
|
|
13
14
|
return undefined;
|
|
14
15
|
}
|
|
15
|
-
export function createDbAuthProvider(config, jwtConfig,
|
|
16
|
+
export function createDbAuthProvider(config, jwtConfig, db) {
|
|
16
17
|
const jwtStrategy = createJwtStrategy(jwtConfig);
|
|
17
18
|
const passwordVerifier = getPasswordVerifier(config.passwordHash);
|
|
18
19
|
const refreshStore = createRefreshStore(jwtConfig.refreshExpiresIn ?? 10080);
|
|
19
20
|
const expiresInSeconds = (jwtConfig.expiresIn ?? 60) * 60;
|
|
20
21
|
const claimsMapping = jwtConfig.claims ?? {};
|
|
21
22
|
async function queryList(sql, username) {
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
const result = await req.query(sql);
|
|
25
|
-
return result.recordset.map((r) => {
|
|
23
|
+
const rows = await db.query(sql, { username });
|
|
24
|
+
return rows.map((r) => {
|
|
26
25
|
const keys = Object.keys(r);
|
|
27
26
|
return r.val ?? r[keys[0]];
|
|
28
27
|
});
|
|
29
28
|
}
|
|
30
29
|
async function queryScalar(sql, username) {
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
const result = await req.query(sql);
|
|
34
|
-
if (!result.recordset[0])
|
|
30
|
+
const rows = await db.query(sql, { username });
|
|
31
|
+
if (!rows[0])
|
|
35
32
|
return null;
|
|
36
|
-
const row =
|
|
33
|
+
const row = rows[0];
|
|
37
34
|
const keys = Object.keys(row);
|
|
38
35
|
return row.val ?? row[keys[0]] ?? null;
|
|
39
36
|
}
|
|
40
37
|
async function lookupUser(username) {
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
assertValidIdentifier(config.usersTable, 'auth.provider.usersTable');
|
|
39
|
+
assertValidIdentifier(config.usernameColumn, 'auth.provider.usernameColumn');
|
|
43
40
|
const condition = config.activeCondition ? ` AND ${config.activeCondition}` : '';
|
|
44
|
-
const sql = `SELECT * FROM ${config.usersTable} WHERE ${config.usernameColumn} = @username${condition}`;
|
|
45
|
-
const
|
|
46
|
-
return
|
|
41
|
+
const sql = `SELECT * FROM ${quoteIdentifierPath(db, config.usersTable)} WHERE ${quoteIdentifierPath(db, config.usernameColumn)} = @username${condition}`;
|
|
42
|
+
const rows = await db.query(sql, { username });
|
|
43
|
+
return rows[0] ?? null;
|
|
47
44
|
}
|
|
48
45
|
async function buildUserInfo(username, userRow) {
|
|
49
46
|
const promises = [
|
|
@@ -127,4 +124,9 @@ export function createDbAuthProvider(config, jwtConfig, pool) {
|
|
|
127
124
|
}
|
|
128
125
|
return { login, refresh, getRefreshStore };
|
|
129
126
|
}
|
|
127
|
+
function quoteIdentifierPath(driver, identifier) {
|
|
128
|
+
return identifier.includes('.')
|
|
129
|
+
? driver.quoteQualified(...identifier.split('.'))
|
|
130
|
+
: driver.quoteIdent(identifier);
|
|
131
|
+
}
|
|
130
132
|
//# sourceMappingURL=db-auth-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-auth-provider.js","sourceRoot":"","sources":["../../src/auth/db-auth-provider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"db-auth-provider.js","sourceRoot":"","sources":["../../src/auth/db-auth-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import type { ScopeFilterConfig } from './types.js';
|
|
2
|
+
import type { SqlDriver } from 'mythik/server';
|
|
2
3
|
/** @internal Alias used when Mythik wraps a source query before applying scope filters. */
|
|
3
4
|
export declare const SCOPE_ALIAS = "_scoped";
|
|
4
5
|
export interface ScopeClause {
|
|
5
6
|
sql: string;
|
|
6
7
|
params: Record<string, unknown>;
|
|
7
8
|
}
|
|
9
|
+
export interface ScopeWhereOptions {
|
|
10
|
+
columnOverride?: string;
|
|
11
|
+
driver?: SqlDriver;
|
|
12
|
+
qualifier?: string | null;
|
|
13
|
+
}
|
|
8
14
|
export declare function resolveActiveScope(headerValue: string | undefined, type: 'int' | 'string' | undefined): unknown | null;
|
|
9
|
-
export declare function buildScopeWhereClause(config: ScopeFilterConfig, userScope: unknown[], activeScope: unknown | undefined, userRoles: string[],
|
|
15
|
+
export declare function buildScopeWhereClause(config: ScopeFilterConfig, userScope: unknown[], activeScope: unknown | undefined, userRoles: string[], columnOverrideOrOptions?: string | ScopeWhereOptions): ScopeClause | null;
|
|
10
16
|
export declare function validateScopeForInsert(config: ScopeFilterConfig, body: Record<string, unknown>, userScope: unknown[], userRoles: string[]): boolean;
|
|
11
17
|
export declare function wrapQueryWithScopeFilter(originalSql: string, scopeClause: ScopeClause): string;
|
|
12
18
|
//# sourceMappingURL=scope-filter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope-filter.d.ts","sourceRoot":"","sources":["../../src/auth/scope-filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"scope-filter.d.ts","sourceRoot":"","sources":["../../src/auth/scope-filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C,2FAA2F;AAC3F,eAAO,MAAM,WAAW,YAAY,CAAC;AAErC,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,GACjC,OAAO,GAAG,IAAI,CAKhB;AAMD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,OAAO,EAAE,EACpB,WAAW,EAAE,OAAO,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,EAAE,EACnB,uBAAuB,CAAC,EAAE,MAAM,GAAG,iBAAiB,GACnD,WAAW,GAAG,IAAI,CA8BpB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,EAAE,OAAO,EAAE,EACpB,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAST;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,WAAW,GACvB,MAAM,CAER"}
|
|
@@ -12,16 +12,18 @@ export function resolveActiveScope(headerValue, type) {
|
|
|
12
12
|
function hasBypassRole(bypassRoles, userRoles) {
|
|
13
13
|
return bypassRoles.some(role => userRoles.includes(role));
|
|
14
14
|
}
|
|
15
|
-
export function buildScopeWhereClause(config, userScope, activeScope, userRoles,
|
|
15
|
+
export function buildScopeWhereClause(config, userScope, activeScope, userRoles, columnOverrideOrOptions) {
|
|
16
16
|
const bypassRoles = config.bypassRoles ?? [];
|
|
17
17
|
if (hasBypassRole(bypassRoles, userRoles))
|
|
18
18
|
return null;
|
|
19
|
-
const
|
|
19
|
+
const options = normalizeScopeWhereOptions(columnOverrideOrOptions);
|
|
20
|
+
const column = options.columnOverride ?? config.column;
|
|
20
21
|
assertValidIdentifier(column, 'scopeFilter.column');
|
|
21
22
|
const mode = config.mode ?? 'all';
|
|
23
|
+
const columnSql = scopeColumnSql(column, options);
|
|
22
24
|
if (mode === 'select') {
|
|
23
25
|
return {
|
|
24
|
-
sql: `${
|
|
26
|
+
sql: `${columnSql} = @_activeScope`,
|
|
25
27
|
params: { _activeScope: activeScope },
|
|
26
28
|
};
|
|
27
29
|
}
|
|
@@ -33,7 +35,7 @@ export function buildScopeWhereClause(config, userScope, activeScope, userRoles,
|
|
|
33
35
|
const params = {};
|
|
34
36
|
userScope.forEach((val, i) => { params[`_scope${i}`] = val; });
|
|
35
37
|
return {
|
|
36
|
-
sql: `${
|
|
38
|
+
sql: `${columnSql} IN (${paramNames.join(', ')})`,
|
|
37
39
|
params,
|
|
38
40
|
};
|
|
39
41
|
}
|
|
@@ -50,4 +52,22 @@ export function validateScopeForInsert(config, body, userScope, userRoles) {
|
|
|
50
52
|
export function wrapQueryWithScopeFilter(originalSql, scopeClause) {
|
|
51
53
|
return `SELECT * FROM (\n${originalSql}\n) AS ${SCOPE_ALIAS}\nWHERE ${scopeClause.sql}`;
|
|
52
54
|
}
|
|
55
|
+
function normalizeScopeWhereOptions(value) {
|
|
56
|
+
if (typeof value === 'string')
|
|
57
|
+
return { columnOverride: value };
|
|
58
|
+
return value ?? {};
|
|
59
|
+
}
|
|
60
|
+
function scopeColumnSql(column, options) {
|
|
61
|
+
const columnSql = options.driver ? quoteIdentifierPath(options.driver, column) : column;
|
|
62
|
+
const qualifier = options.qualifier === undefined ? SCOPE_ALIAS : options.qualifier;
|
|
63
|
+
if (qualifier === null || qualifier === '')
|
|
64
|
+
return columnSql;
|
|
65
|
+
assertValidIdentifier(qualifier, 'scopeFilter.qualifier');
|
|
66
|
+
return `${qualifier}.${columnSql}`;
|
|
67
|
+
}
|
|
68
|
+
function quoteIdentifierPath(driver, identifier) {
|
|
69
|
+
return identifier.includes('.')
|
|
70
|
+
? driver.quoteQualified(...identifier.split('.'))
|
|
71
|
+
: driver.quoteIdent(identifier);
|
|
72
|
+
}
|
|
53
73
|
//# sourceMappingURL=scope-filter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope-filter.js","sourceRoot":"","sources":["../../src/auth/scope-filter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scope-filter.js","sourceRoot":"","sources":["../../src/auth/scope-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import type { CatalogConfig } from './types.js';
|
|
2
|
-
|
|
2
|
+
import type { SqlDriver } from 'mythik/server';
|
|
3
|
+
export declare function buildCatalogQuery(driver: SqlDriver, config: CatalogConfig): string | null;
|
|
3
4
|
//# sourceMappingURL=catalog-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-builder.d.ts","sourceRoot":"","sources":["../src/catalog-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog-builder.d.ts","sourceRoot":"","sources":["../src/catalog-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAoCzF"}
|
package/dist/catalog-builder.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { assertValidIdentifier } from './validation/identifier-guard.js';
|
|
2
|
-
export function buildCatalogQuery(config) {
|
|
2
|
+
export function buildCatalogQuery(driver, config) {
|
|
3
3
|
if (config.static)
|
|
4
4
|
return null;
|
|
5
5
|
if (!config.from)
|
|
@@ -8,28 +8,39 @@ export function buildCatalogQuery(config) {
|
|
|
8
8
|
if (config.distinct) {
|
|
9
9
|
assertValidIdentifier(config.distinct, 'catalog.distinct');
|
|
10
10
|
const orderByClause = config.orderBy
|
|
11
|
-
? `ORDER BY ${
|
|
12
|
-
: `ORDER BY
|
|
13
|
-
return `SELECT DISTINCT
|
|
11
|
+
? `ORDER BY ${quoteOrderBy(driver, config.orderBy)}`
|
|
12
|
+
: `ORDER BY ${quoteIdentifierPath(driver, config.distinct)} ASC`;
|
|
13
|
+
return `SELECT DISTINCT ${quoteIdentifierPath(driver, config.distinct)} AS ${driver.quoteIdent('value')}, ${quoteIdentifierPath(driver, config.distinct)} AS ${driver.quoteIdent('label')} FROM ${quoteIdentifierPath(driver, config.from)} ${orderByClause}`;
|
|
14
14
|
}
|
|
15
15
|
assertValidIdentifier(config.value, 'catalog.value');
|
|
16
16
|
assertValidIdentifier(config.label, 'catalog.label');
|
|
17
|
-
const selectParts = [
|
|
17
|
+
const selectParts = [
|
|
18
|
+
`${quoteIdentifierPath(driver, config.value)} AS ${driver.quoteIdent('value')}`,
|
|
19
|
+
`${quoteIdentifierPath(driver, config.label)} AS ${driver.quoteIdent('label')}`,
|
|
20
|
+
];
|
|
18
21
|
if (config.extra) {
|
|
19
22
|
for (const field of config.extra) {
|
|
20
23
|
assertValidIdentifier(field, 'catalog.extra');
|
|
21
|
-
selectParts.push(
|
|
24
|
+
selectParts.push(quoteIdentifierPath(driver, field));
|
|
22
25
|
}
|
|
23
26
|
}
|
|
24
27
|
const whereClause = config.where ? ` WHERE ${config.where}` : '';
|
|
25
28
|
const orderByClause = config.orderBy
|
|
26
|
-
? `ORDER BY ${
|
|
27
|
-
: `ORDER BY
|
|
28
|
-
return `SELECT ${selectParts.join(', ')} FROM
|
|
29
|
+
? `ORDER BY ${quoteOrderBy(driver, config.orderBy)}`
|
|
30
|
+
: `ORDER BY ${quoteIdentifierPath(driver, config.label)} ASC`;
|
|
31
|
+
return `SELECT ${selectParts.join(', ')} FROM ${quoteIdentifierPath(driver, config.from)}${whereClause} ${orderByClause}`;
|
|
29
32
|
}
|
|
30
|
-
function
|
|
31
|
-
return
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
function quoteIdentifierPath(driver, identifier) {
|
|
34
|
+
return identifier.includes('.')
|
|
35
|
+
? driver.quoteQualified(...identifier.split('.'))
|
|
36
|
+
: driver.quoteIdent(identifier);
|
|
37
|
+
}
|
|
38
|
+
function quoteOrderBy(driver, orderBy) {
|
|
39
|
+
const match = /^([a-zA-Z_][a-zA-Z0-9_.]*)(\s+(?:ASC|DESC))?$/i.exec(orderBy.trim());
|
|
40
|
+
if (!match)
|
|
41
|
+
return orderBy;
|
|
42
|
+
const [, column, direction] = match;
|
|
43
|
+
assertValidIdentifier(column, 'catalog.orderBy');
|
|
44
|
+
return `${quoteIdentifierPath(driver, column)}${direction ?? ''}`;
|
|
34
45
|
}
|
|
35
46
|
//# sourceMappingURL=catalog-builder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-builder.js","sourceRoot":"","sources":["../src/catalog-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog-builder.js","sourceRoot":"","sources":["../src/catalog-builder.ts"],"names":[],"mappings":"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"}
|
package/dist/connection.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { SqlDialect, SqlDriver, SqlDriverConfig } from 'mythik/server';
|
|
2
2
|
import type { ConnectionConfig } from './types.js';
|
|
3
|
-
export declare function
|
|
3
|
+
export declare function resolveDatabaseDialect(config: ConnectionConfig, expectedDialect?: SqlDialect): SqlDialect;
|
|
4
|
+
export declare function toSqlDriverConfig(config: ConnectionConfig, expectedDialect?: SqlDialect): SqlDriverConfig;
|
|
5
|
+
export declare function createDatabaseDriver(config: ConnectionConfig, expectedDialect?: SqlDialect): SqlDriver;
|
|
4
6
|
//# sourceMappingURL=connection.d.ts.map
|
package/dist/connection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,KAAK,EACV,gBAAgB,EAKjB,MAAM,YAAY,CAAC;AAgBpB,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAE,UAAU,GAAG,UAAU,CAazG;AAsCD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAE,UAAU,GAAG,eAAe,CA4BzG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAE,UAAU,GAAG,SAAS,CAEtG"}
|
package/dist/connection.js
CHANGED
|
@@ -1,18 +1,85 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { createSqlDriver } from 'mythik/server';
|
|
2
2
|
import { resolveEnvVars } from './spec-loader.js';
|
|
3
|
-
|
|
3
|
+
const warnedLegacyDefaultConfigs = new WeakSet();
|
|
4
|
+
function withoutType(config) {
|
|
5
|
+
const { type: _type, ...rest } = config;
|
|
6
|
+
return rest;
|
|
7
|
+
}
|
|
8
|
+
function normalizePort(value, fallback) {
|
|
9
|
+
if (value === undefined || value === null || value === '')
|
|
10
|
+
return fallback;
|
|
11
|
+
const parsed = typeof value === 'number' ? value : Number(value);
|
|
12
|
+
return Number.isFinite(parsed) ? parsed : fallback;
|
|
13
|
+
}
|
|
14
|
+
export function resolveDatabaseDialect(config, expectedDialect) {
|
|
15
|
+
const declaredDialect = config.type ?? 'sqlserver';
|
|
16
|
+
if (expectedDialect && declaredDialect !== expectedDialect) {
|
|
17
|
+
throw new Error(`Database dialect mismatch: ApiSpec requested "${expectedDialect}" but database config is "${declaredDialect}".`);
|
|
18
|
+
}
|
|
19
|
+
if (!config.type && (!expectedDialect || expectedDialect === 'sqlserver') && !warnedLegacyDefaultConfigs.has(config)) {
|
|
20
|
+
warnedLegacyDefaultConfigs.add(config);
|
|
21
|
+
console.warn('Mythik server database config omitted "type"; defaulting to "sqlserver" for backwards compatibility.');
|
|
22
|
+
}
|
|
23
|
+
return expectedDialect ?? declaredDialect;
|
|
24
|
+
}
|
|
25
|
+
function sqlServerConnection(config) {
|
|
4
26
|
const resolved = resolveEnvVars(config);
|
|
5
|
-
|
|
27
|
+
return {
|
|
6
28
|
server: resolved.server,
|
|
7
29
|
database: resolved.database,
|
|
8
30
|
user: resolved.user,
|
|
9
31
|
password: resolved.password,
|
|
10
|
-
port: resolved.port
|
|
32
|
+
port: normalizePort(resolved.port, 1433),
|
|
11
33
|
options: {
|
|
12
34
|
trustServerCertificate: resolved.trustServerCertificate ?? true,
|
|
35
|
+
trustedConnection: resolved.trustedConnection ?? false,
|
|
13
36
|
},
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function postgresConnection(config) {
|
|
40
|
+
const resolved = resolveEnvVars(config);
|
|
41
|
+
if (resolved.connectionString) {
|
|
42
|
+
return { ...withoutType(resolved), connectionString: resolved.connectionString };
|
|
43
|
+
}
|
|
44
|
+
return withoutType(resolved);
|
|
45
|
+
}
|
|
46
|
+
function mysqlConnection(config) {
|
|
47
|
+
const resolved = resolveEnvVars(config);
|
|
48
|
+
if (resolved.uri) {
|
|
49
|
+
return resolved.uri;
|
|
50
|
+
}
|
|
51
|
+
return withoutType(resolved);
|
|
52
|
+
}
|
|
53
|
+
function sqliteConnection(config) {
|
|
54
|
+
const resolved = resolveEnvVars(config);
|
|
55
|
+
return withoutType(resolved);
|
|
56
|
+
}
|
|
57
|
+
export function toSqlDriverConfig(config, expectedDialect) {
|
|
58
|
+
const dialect = resolveDatabaseDialect(config, expectedDialect);
|
|
59
|
+
if (dialect === 'sqlserver') {
|
|
60
|
+
return {
|
|
61
|
+
dialect,
|
|
62
|
+
connection: sqlServerConnection(config),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (dialect === 'postgres') {
|
|
66
|
+
return {
|
|
67
|
+
dialect,
|
|
68
|
+
connection: postgresConnection(config),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (dialect === 'mysql') {
|
|
72
|
+
return {
|
|
73
|
+
dialect,
|
|
74
|
+
connection: mysqlConnection(config),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
dialect,
|
|
79
|
+
connection: sqliteConnection(config),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export function createDatabaseDriver(config, expectedDialect) {
|
|
83
|
+
return createSqlDriver(toSqlDriverConfig(config, expectedDialect));
|
|
17
84
|
}
|
|
18
85
|
//# sourceMappingURL=connection.js.map
|
package/dist/connection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|
package/dist/crud-builder.d.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
|
+
import type { SqlDriver, SqlStatement } from 'mythik/server';
|
|
1
2
|
export declare function filterFields(body: Record<string, unknown>, allowedFields: string[]): Record<string, unknown>;
|
|
2
|
-
export declare function buildInsertQuery(table: string, fields: Record<string, unknown
|
|
3
|
+
export declare function buildInsertQuery(driver: SqlDriver, table: string, fields: Record<string, unknown>): {
|
|
3
4
|
sql: string;
|
|
4
5
|
params: Record<string, unknown>;
|
|
5
6
|
};
|
|
6
|
-
export declare function buildUpdateQuery(table: string, primaryKey: string, pkValue: unknown, fields: Record<string, unknown
|
|
7
|
+
export declare function buildUpdateQuery(driver: SqlDriver, table: string, primaryKey: string, pkValue: unknown, fields: Record<string, unknown>, extraWhere?: SqlStatement): {
|
|
7
8
|
sql: string;
|
|
8
9
|
params: Record<string, unknown>;
|
|
9
10
|
};
|
|
10
|
-
export declare function buildDeleteQuery(table: string, primaryKey: string, pkValue: unknown): {
|
|
11
|
+
export declare function buildDeleteQuery(driver: SqlDriver, table: string, primaryKey: string, pkValue: unknown, extraWhere?: SqlStatement): {
|
|
12
|
+
sql: string;
|
|
13
|
+
params: Record<string, unknown>;
|
|
14
|
+
};
|
|
15
|
+
export declare function buildSelectByPrimaryKeyQuery(driver: SqlDriver, table: string, primaryKey: string, pkValue: unknown, extraWhere?: SqlStatement): {
|
|
11
16
|
sql: string;
|
|
12
17
|
params: Record<string, unknown>;
|
|
13
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud-builder.d.ts","sourceRoot":"","sources":["../src/crud-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crud-builder.d.ts","sourceRoot":"","sources":["../src/crud-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAS5G;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAQlD;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,UAAU,CAAC,EAAE,YAAY,GACxB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAQlD;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,UAAU,CAAC,EAAE,YAAY,GACxB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAKlD;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,UAAU,CAAC,EAAE,YAAY,GACxB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAQlD"}
|