@zintrust/core 2.3.0 → 2.4.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zintrust/core",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "description": "Production-grade TypeScript backend framework for JavaScript",
5
5
  "homepage": "https://zintrust.com",
6
6
  "repository": {
@@ -210,7 +210,7 @@
210
210
  "bullmq": "^5.77.6",
211
211
  "chalk": "^5.6.2",
212
212
  "commander": "^15.0.0",
213
- "inquirer": "^14.0.0",
213
+ "inquirer": "^14.0.1",
214
214
  "ioredis": "^5.11.0",
215
215
  "jsonwebtoken": "^9.0.3",
216
216
  "mysql2": "^3.22.4",
@@ -227,7 +227,6 @@
227
227
  "fast-uri": "3.1.2",
228
228
  "fast-xml-parser": "5.8.0",
229
229
  "protobufjs": "7.5.9",
230
- "brace-expansion": "^5.0.5",
231
230
  "picomatch": "^4.0.4",
232
231
  "cross-spawn": "^7.0.5",
233
232
  "glob": "^11.1.0",
@@ -238,6 +237,10 @@
238
237
  "uuid": "14.0.0",
239
238
  "ioredis": "^5.11.0",
240
239
  "axios": "^1.16.1",
240
+ "tmp": "^0.2.6",
241
+ "sonarqube-scanner": {
242
+ "axios": "^1.16.1"
243
+ },
241
244
  "@actions/github": {
242
245
  "undici": "^6.24.0"
243
246
  },
@@ -254,9 +257,10 @@
254
257
  "braces": "^3.0.3",
255
258
  "lodash": "^4.17.21",
256
259
  "semver": "^7.6.3",
257
- "tmp": "^0.2.4",
258
260
  "ws": "^8.20.0",
259
- "micromatch": "^4.0.8"
261
+ "micromatch": "^4.0.8",
262
+ "brace-expansion": "^5.0.6",
263
+ "qs": "^6.15.2"
260
264
  },
261
265
  "bin": {
262
266
  "zintrust": "bin/zintrust.js",
@@ -38,7 +38,7 @@ const createIoredisClient = (params) => {
38
38
  port: Env.REDIS_PORT,
39
39
  password: Env.get('REDIS_PASSWORD', ''),
40
40
  db,
41
- }, 3, { subsystem: 'cache' });
41
+ }, 3, { subsystem: 'cache', requireDirectForScripts: false });
42
42
  return client !== null && typeof client.get === 'function' ? client : null;
43
43
  }
44
44
  catch (error) {
package/src/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @zintrust/core v2.3.0
2
+ * @zintrust/core v2.4.0
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-05-29T19:55:12.757Z
8
+ * Built: 2026-05-30T23:27:53.523Z
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-05-29T19:55:12.719Z'; // Replaced during build
24
+ export const ZINTRUST_BUILD_DATE = '2026-05-30T23:27:53.490Z'; // 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';
@@ -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,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"}
1
+ {"version":3,"file":"SecurityMiddleware.d.ts","sourceRoot":"","sources":["../../../src/middleware/SecurityMiddleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,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;AAmRD,eAAO,MAAM,kBAAkB;IAC7B;;OAEG;qBACa,eAAe,GAAQ,UAAU;EAgBjD,CAAC"}
@@ -4,6 +4,7 @@
4
4
  * Zero-dependency implementation replacing helmet/cors
5
5
  */
6
6
  import { securityConfig } from '../config/security.js';
7
+ import { isNullish, isUndefinedOrNull } from '../helper/index.js';
7
8
  const normalizeCorsList = (values, fallback) => {
8
9
  const normalized = (values ?? [])
9
10
  .map((value) => (typeof value === 'string' ? value.trim() : ''))
@@ -169,24 +170,54 @@ function applyCors(req, res, cors) {
169
170
  const method = req.getMethod();
170
171
  const originHeader = req.getHeader('origin');
171
172
  const origin = typeof originHeader === 'string' ? originHeader : undefined;
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
- });
184
173
  // Handle Preflight
185
174
  if (method === 'OPTIONS') {
175
+ const requestedMethodHeader = req.getHeader('access-control-request-method');
176
+ const requestedMethod = typeof requestedMethodHeader === 'string' ? requestedMethodHeader : undefined;
177
+ const requestedHeadersHeader = req.getHeader('access-control-request-headers');
178
+ const requestedHeaders = typeof requestedHeadersHeader === 'string' ? parseHeaderList(requestedHeadersHeader) : [];
179
+ // Validate origin first
180
+ const allowedOrigin = resolveAllowedOrigin(cors.origin, origin, cors.credentials);
181
+ if (allowedOrigin === undefined) {
182
+ // Origin not allowed - don't set CORS headers and let request fail
183
+ return false;
184
+ }
185
+ // Validate requested method is allowed
186
+ const allowedMethods = resolveAllowedMethods(cors.methods, requestedMethod);
187
+ if (allowedMethods.length === 0 || (allowedMethods.length === 1 && allowedMethods[0] === '*')) {
188
+ // No specific methods configured or wildcard - allow
189
+ }
190
+ else if (!isUndefinedOrNull(requestedMethod) &&
191
+ !isNullish(requestedMethod) &&
192
+ !allowedMethods.includes(requestedMethod)) {
193
+ // Requested method not in allowed list
194
+ return false;
195
+ }
196
+ // Apply CORS headers for preflight
197
+ applyCorsHeaders(res, {
198
+ origin: allowedOrigin,
199
+ methods: allowedMethods,
200
+ allowedHeaders: resolveAllowedHeaders(cors.allowedHeaders, requestedHeaders),
201
+ exposedHeaders: resolveExposedHeaders(cors.exposedHeaders),
202
+ credentials: cors.credentials,
203
+ maxAge: cors.maxAge,
204
+ });
186
205
  res.setStatus(204);
187
206
  res.send('');
188
207
  return true;
189
208
  }
209
+ // Handle actual requests
210
+ const allowedOrigin = resolveAllowedOrigin(cors.origin, origin, cors.credentials);
211
+ if (allowedOrigin !== undefined) {
212
+ applyCorsHeaders(res, {
213
+ origin: allowedOrigin,
214
+ methods: resolveAllowedMethods(cors.methods, undefined),
215
+ allowedHeaders: resolveAllowedHeaders(cors.allowedHeaders, []),
216
+ exposedHeaders: resolveExposedHeaders(cors.exposedHeaders),
217
+ credentials: cors.credentials,
218
+ maxAge: cors.maxAge,
219
+ });
220
+ }
190
221
  return false;
191
222
  }
192
223
  export const SecurityMiddleware = Object.freeze({
@@ -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;