@zintrust/core 0.4.89 → 0.4.92

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zintrust/core",
3
- "version": "0.4.89",
3
+ "version": "0.4.92",
4
4
  "description": "Production-grade TypeScript backend framework for JavaScript",
5
5
  "homepage": "https://zintrust.com",
6
6
  "repository": {
@@ -69,7 +69,7 @@
69
69
  },
70
70
  "overrides": {
71
71
  "ajv": "^8.18.0",
72
- "axios": "^1.13.5",
72
+ "axios": "^1.15.0",
73
73
  "@tootallnate/once": "^3.0.1",
74
74
  "node-forge": "^1.4.0",
75
75
  "brace-expansion": "^5.0.5",
@@ -215,7 +215,7 @@ const warnIfAdapterMissing = (cmd, conn) => {
215
215
  if (conn.driver === 'mysql' && DatabaseAdapterRegistry.get('mysql') === undefined) {
216
216
  cmd.warn('MySQL adapter is not installed/registered; migrations may not hit a real MySQL DB.');
217
217
  cmd.warn('Install via `zin plugin install adapter:mysql` (or `zin add db:mysql`).');
218
- cmd.debug('[debug] Expected a side-effect import in src/zintrust.plugins.ts like: import "../../../packages/db-mysql/src/register";');
218
+ cmd.debug('[debug] Expected a side-effect import in src/zintrust.plugins.ts like: import "@zintrust/db-mysql/register";');
219
219
  }
220
220
  if (conn.driver === 'postgresql' && DatabaseAdapterRegistry.get('postgresql') === undefined) {
221
221
  cmd.warn('PostgreSQL adapter is not installed/registered; migrations may not hit a real PostgreSQL DB.');
package/src/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @zintrust/core v0.4.89
2
+ * @zintrust/core v0.4.92
3
3
  *
4
4
  * ZinTrust Framework - Production-Grade TypeScript Backend
5
5
  * Built for performance, type safety, and exceptional developer experience
6
6
  *
7
7
  * Build Information:
8
- * Built: 2026-04-09T19:29:38.227Z
8
+ * Built: 2026-04-10T08:32:58.790Z
9
9
  * Node: >=20.0.0
10
10
  * License: MIT
11
11
  *
@@ -21,7 +21,7 @@
21
21
  * Available at runtime for debugging and health checks
22
22
  */
23
23
  export const ZINTRUST_VERSION = '0.1.41';
24
- export const ZINTRUST_BUILD_DATE = '2026-04-09T19:29:38.185Z'; // Replaced during build
24
+ export const ZINTRUST_BUILD_DATE = '2026-04-10T08:32:58.757Z'; // Replaced during build
25
25
  export { Application } from './boot/Application.js';
26
26
  export { AwsSigV4 } from './common/index.js';
27
27
  export { SignedRequest } from './security/SignedRequest.js';
@@ -17,6 +17,7 @@ export interface SecurityOptions {
17
17
  origin?: string | string[];
18
18
  methods?: string[];
19
19
  allowedHeaders?: string[];
20
+ exposedHeaders?: string[];
20
21
  credentials?: boolean;
21
22
  maxAge?: number;
22
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"SecurityMiddleware.d.ts","sourceRoot":"","sources":["../../../src/middleware/SecurityMiddleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,UAAU,CAAC,EAAE;QACX,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;KAChC,CAAC;IACF,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KACvC,CAAC;CACH;AAyID,eAAO,MAAM,kBAAkB;IAC7B;;OAEG;qBACa,eAAe,GAAQ,UAAU;EAgBjD,CAAC"}
1
+ {"version":3,"file":"SecurityMiddleware.d.ts","sourceRoot":"","sources":["../../../src/middleware/SecurityMiddleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,UAAU,CAAC,EAAE;QACX,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;KAChC,CAAC;IACF,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KACvC,CAAC;CACH;AAkPD,eAAO,MAAM,kBAAkB;IAC7B;;OAEG;qBACa,eAAe,GAAQ,UAAU;EAgBjD,CAAC"}
@@ -10,6 +10,29 @@ const normalizeCorsList = (values, fallback) => {
10
10
  .filter((value) => value !== '');
11
11
  return normalized.length > 0 ? normalized : fallback;
12
12
  };
13
+ const parseHeaderList = (value) => {
14
+ return String(value ?? '')
15
+ .split(',')
16
+ .map((element) => element.trim())
17
+ .filter((element) => element !== '');
18
+ };
19
+ const hasWildcard = (values) => {
20
+ if (typeof values === 'string')
21
+ return values.trim() === '*';
22
+ return (values ?? []).some((value) => value.trim() === '*');
23
+ };
24
+ const mergeCorsHeaders = (configured, requested) => {
25
+ const merged = new Map();
26
+ for (const header of [...(configured ?? []), ...(requested ?? [])]) {
27
+ const normalized = header.toLowerCase();
28
+ if (normalized === '')
29
+ continue;
30
+ if (!merged.has(normalized)) {
31
+ merged.set(normalized, header);
32
+ }
33
+ }
34
+ return Array.from(merged.values());
35
+ };
13
36
  const getSecurityCorsConfig = () => {
14
37
  const config = securityConfig;
15
38
  return config?.cors ?? {};
@@ -18,6 +41,61 @@ const resolveCorsOrigin = () => {
18
41
  const origins = normalizeCorsList(getSecurityCorsConfig().origins, ['*']);
19
42
  return origins.includes('*') ? '*' : origins;
20
43
  };
44
+ const resolveAllowedOrigin = (configuredOrigin, requestOrigin, credentials) => {
45
+ if (configuredOrigin === undefined)
46
+ return undefined;
47
+ if (typeof configuredOrigin === 'string') {
48
+ if (configuredOrigin.trim() === '*') {
49
+ return credentials === true && requestOrigin !== undefined ? requestOrigin : '*';
50
+ }
51
+ return configuredOrigin;
52
+ }
53
+ if (hasWildcard(configuredOrigin)) {
54
+ return credentials === true && requestOrigin !== undefined ? requestOrigin : '*';
55
+ }
56
+ if (requestOrigin === undefined || !configuredOrigin.includes(requestOrigin)) {
57
+ return undefined;
58
+ }
59
+ return requestOrigin;
60
+ };
61
+ const resolveAllowedMethods = (configuredMethods, requestMethod) => {
62
+ if (!hasWildcard(configuredMethods))
63
+ return configuredMethods ?? [];
64
+ if (requestMethod === undefined || requestMethod.trim() === '')
65
+ return ['*'];
66
+ return [requestMethod.trim()];
67
+ };
68
+ const resolveAllowedHeaders = (configuredHeaders, requestedHeaders) => {
69
+ if (hasWildcard(configuredHeaders)) {
70
+ return requestedHeaders.length > 0 ? requestedHeaders : ['*'];
71
+ }
72
+ return mergeCorsHeaders(configuredHeaders, requestedHeaders);
73
+ };
74
+ const resolveExposedHeaders = (configuredHeaders) => {
75
+ if (!hasWildcard(configuredHeaders))
76
+ return configuredHeaders ?? [];
77
+ return ['*'];
78
+ };
79
+ const applyCorsHeaders = (res, options) => {
80
+ if (options.origin !== undefined) {
81
+ res.setHeader('Access-Control-Allow-Origin', options.origin);
82
+ }
83
+ if (options.methods.length > 0) {
84
+ res.setHeader('Access-Control-Allow-Methods', options.methods.join(', '));
85
+ }
86
+ if (options.allowedHeaders.length > 0) {
87
+ res.setHeader('Access-Control-Allow-Headers', options.allowedHeaders.join(', '));
88
+ }
89
+ if (options.exposedHeaders.length > 0) {
90
+ res.setHeader('Access-Control-Expose-Headers', options.exposedHeaders.join(', '));
91
+ }
92
+ if (options.credentials !== undefined) {
93
+ res.setHeader('Access-Control-Allow-Credentials', options.credentials ? 'true' : 'false');
94
+ }
95
+ if (options.maxAge !== undefined) {
96
+ res.setHeader('Access-Control-Max-Age', options.maxAge.toString());
97
+ }
98
+ };
21
99
  const DEFAULT_OPTIONS = {
22
100
  hsts: {
23
101
  maxAge: 15552000, // 180 days
@@ -43,6 +121,7 @@ const DEFAULT_OPTIONS = {
43
121
  'X-Requested-With',
44
122
  'X-CSRF-Token',
45
123
  ]),
124
+ exposedHeaders: normalizeCorsList(getSecurityCorsConfig().exposedHeaders, []),
46
125
  credentials: getSecurityCorsConfig().credentials,
47
126
  maxAge: getSecurityCorsConfig().maxAge,
48
127
  },
@@ -87,34 +166,23 @@ function applyCsp(res, csp) {
87
166
  function applyCors(req, res, cors) {
88
167
  if (!cors)
89
168
  return false;
169
+ const method = req.getMethod();
90
170
  const originHeader = req.getHeader('origin');
91
171
  const origin = typeof originHeader === 'string' ? originHeader : undefined;
92
- let allowedOrigin = cors.origin;
93
- if (Array.isArray(cors.origin)) {
94
- if (origin === undefined || !cors.origin.includes(origin)) {
95
- allowedOrigin = undefined;
96
- }
97
- else {
98
- allowedOrigin = origin;
99
- }
100
- }
101
- if (allowedOrigin !== null && allowedOrigin !== undefined) {
102
- res.setHeader('Access-Control-Allow-Origin', allowedOrigin ?? '*');
103
- }
104
- if (cors.methods) {
105
- res.setHeader('Access-Control-Allow-Methods', cors.methods.join(', '));
106
- }
107
- if (cors.allowedHeaders) {
108
- res.setHeader('Access-Control-Allow-Headers', cors.allowedHeaders.join(', '));
109
- }
110
- if (cors.credentials !== undefined) {
111
- res.setHeader('Access-Control-Allow-Credentials', cors.credentials ? 'true' : 'false');
112
- }
113
- if (cors.maxAge !== undefined) {
114
- res.setHeader('Access-Control-Max-Age', cors.maxAge.toString());
115
- }
172
+ const requestedMethodHeader = method === 'OPTIONS' ? req.getHeader('access-control-request-method') : undefined;
173
+ const requestedMethod = typeof requestedMethodHeader === 'string' ? requestedMethodHeader : undefined;
174
+ const requestedHeadersHeader = method === 'OPTIONS' ? req.getHeader('access-control-request-headers') : undefined;
175
+ const requestedHeaders = typeof requestedHeadersHeader === 'string' ? parseHeaderList(requestedHeadersHeader) : [];
176
+ applyCorsHeaders(res, {
177
+ origin: resolveAllowedOrigin(cors.origin, origin, cors.credentials),
178
+ methods: resolveAllowedMethods(cors.methods, requestedMethod),
179
+ allowedHeaders: resolveAllowedHeaders(cors.allowedHeaders, requestedHeaders),
180
+ exposedHeaders: resolveExposedHeaders(cors.exposedHeaders),
181
+ credentials: cors.credentials,
182
+ maxAge: cors.maxAge,
183
+ });
116
184
  // Handle Preflight
117
- if (req.getMethod() === 'OPTIONS') {
185
+ if (method === 'OPTIONS') {
118
186
  res.setStatus(204);
119
187
  res.send('');
120
188
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"SQLiteAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/SQLiteAdapter.ts"],"names":[],"mappings":"AACA;;;GAGG;AAUH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AA8M1F,iBAAS,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,gBAAgB,CA0FrE;AAED,eAAO,MAAM,aAAa;;EAExB,CAAC"}
1
+ {"version":3,"file":"SQLiteAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/SQLiteAdapter.ts"],"names":[],"mappings":"AACA;;;GAGG;AAUH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AA+N1F,iBAAS,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,gBAAgB,CA0FrE;AAED,eAAO,MAAM,aAAa;;EAExB,CAAC"}
@@ -66,6 +66,18 @@ function isSelectQuery(sql) {
66
66
  const normalized = sql.trimStart().toLowerCase();
67
67
  return normalized.startsWith('select') || normalized.startsWith('pragma');
68
68
  }
69
+ const TRACE_STORAGE_TABLE_NAMES = [
70
+ 'zin_trace_entries',
71
+ 'zin_trace_entries_tags',
72
+ 'zin_trace_monitoring',
73
+ ];
74
+ function isTraceStorageQuery(sql) {
75
+ const normalized = sql.toLowerCase();
76
+ return TRACE_STORAGE_TABLE_NAMES.some((tableName) => normalized.includes(tableName));
77
+ }
78
+ function shouldLogQuery(sql) {
79
+ return databaseConfig.logging.enabled && !isTraceStorageQuery(sql);
80
+ }
69
81
  function requireDb(db) {
70
82
  if (db === null)
71
83
  throw ErrorFactory.createConnectionError('Database not connected');
@@ -76,13 +88,13 @@ function executeQuery(db, sql, parameters) {
76
88
  const stmt = db.prepare(sql);
77
89
  if (isSelectQuery(sql)) {
78
90
  const rows = stmt.all(parameters);
79
- if (databaseConfig.logging.enabled) {
91
+ if (shouldLogQuery(sql)) {
80
92
  Logger.debug('SQLite query executed', { durationMs: performance.now() - start, sql });
81
93
  }
82
94
  return { rows, rowCount: rows.length };
83
95
  }
84
96
  const info = stmt.run(parameters);
85
- if (databaseConfig.logging.enabled) {
97
+ if (shouldLogQuery(sql)) {
86
98
  Logger.debug('SQLite query executed', { durationMs: performance.now() - start, sql });
87
99
  }
88
100
  return { rows: [], rowCount: info.changes, lastInsertId: info.lastInsertRowid };
@@ -137,7 +149,9 @@ async function rawQuerySQLite(state, sql, parameters) {
137
149
  throw ErrorFactory.createConfigError('Raw SQL queries are disabled');
138
150
  }
139
151
  const currentDb = requireDb(state.db);
140
- Logger.warn(`Raw SQL Query executed: ${sql}`);
152
+ if (!isTraceStorageQuery(sql)) {
153
+ Logger.warn(`Raw SQL Query executed: ${sql}`);
154
+ }
141
155
  try {
142
156
  return executeRawQuery(currentDb, sql, parameters);
143
157
  }
@@ -1,10 +1,7 @@
1
1
  /**
2
- * ZinTrust plugin auto-imports
3
- *
4
- * In real projects, this file is managed by `zin plugin install` and contains
5
- * side-effect imports (e.g. `@zintrust/db-sqlite/register`) that register
6
- * optional adapters/drivers into core registries.
7
- *
2
+ * Auto-generated fallback module.
3
+ * This file is created by scripts/ensure-worker-plugins.mjs when missing.
4
+ * It allows optional runtime plugin imports to resolve in CI/scaffolded setups.
8
5
  */
9
6
  export type {};
10
7
  export declare const __zintrustGeneratedPluginStub = "zintrust.plugins.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"zintrust.plugins.d.ts","sourceRoot":"","sources":["../../src/zintrust.plugins.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,YAAY,EAAE,CAAC;AAgBf,eAAO,MAAM,6BAA6B,wBAAwB,CAAC;;AACnE,wBAAkB"}
1
+ {"version":3,"file":"zintrust.plugins.d.ts","sourceRoot":"","sources":["../../src/zintrust.plugins.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,YAAY,EAAE,CAAC;AAgBf,eAAO,MAAM,6BAA6B,wBAAwB,CAAC;;AACnE,wBAAkB"}
@@ -1,10 +1,7 @@
1
1
  /**
2
- * ZinTrust plugin auto-imports
3
- *
4
- * In real projects, this file is managed by `zin plugin install` and contains
5
- * side-effect imports (e.g. `@zintrust/db-sqlite/register`) that register
6
- * optional adapters/drivers into core registries.
7
- *
2
+ * Auto-generated fallback module.
3
+ * This file is created by scripts/ensure-worker-plugins.mjs when missing.
4
+ * It allows optional runtime plugin imports to resolve in CI/scaffolded setups.
8
5
  */
9
6
  import * as TraceRuntime from './runtime/plugins/trace-runtime.js';
10
7
  globalThis.__zintrust_system_trace_plugin_requested__ = true;
@@ -1,11 +0,0 @@
1
- import '../packages/db-d1/src/register.js';
2
- import '../packages/db-mysql/src/register.js';
3
- import '../packages/db-postgres/src/register.js';
4
- import '../packages/db-sqlite/src/register.js';
5
- import '../packages/db-sqlserver/src/register.js';
6
- import '../packages/mail-sendgrid/src/register.js';
7
- import '../packages/mail-smtp/src/register.js';
8
- import '@zintrust/queue-monitor';
9
- import '../packages/queue-redis/src/register.js';
10
- import '../packages/workers/src/register.js';
11
- //# sourceMappingURL=zintrust.comon.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"zintrust.comon.d.ts","sourceRoot":"","sources":["../../src/zintrust.comon.ts"],"names":[],"mappings":"AAQA,OAAO,mCAAmC,CAAC;AAC3C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,yCAAyC,CAAC;AACjD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,0CAA0C,CAAC;AAClD,OAAO,2CAA2C,CAAC;AACnD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,wCAAwC,CAAC;AAChD,OAAO,yCAAyC,CAAC;AACjD,OAAO,qCAAqC,CAAC"}
@@ -1,17 +0,0 @@
1
- /* eslint-disable no-restricted-imports */
2
- // /**
3
- // * ZinTrust comon plugin auto-imports
4
- // *
5
- // * This file is managed by `zin plugin install` and contains side-effect
6
- // * imports that register optional adapters/drivers into core registries.
7
- // */
8
- import '../packages/db-d1/src/register.js';
9
- import '../packages/db-mysql/src/register.js';
10
- import '../packages/db-postgres/src/register.js';
11
- import '../packages/db-sqlite/src/register.js';
12
- import '../packages/db-sqlserver/src/register.js';
13
- import '../packages/mail-sendgrid/src/register.js';
14
- import '../packages/mail-smtp/src/register.js';
15
- import '@zintrust/queue-monitor';
16
- import '../packages/queue-redis/src/register.js';
17
- import '../packages/workers/src/register.js';