@cyberskill/shared 3.10.0 → 3.11.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/dist/config/env/env.util.js.map +1 -1
- package/dist/config/vitest/vitest.e2e.js +1 -1
- package/dist/config/vitest/vitest.unit.js +1 -1
- package/dist/constant/response-status.d.ts +4 -0
- package/dist/constant/response-status.js.map +1 -1
- package/dist/node/express/express.util.d.ts +6 -0
- package/dist/node/express/express.util.js.map +1 -1
- package/dist/node/mongo/mongo.controller.helpers.d.ts +43 -0
- package/dist/node/mongo/mongo.controller.helpers.js +20 -0
- package/dist/node/mongo/mongo.controller.helpers.js.map +1 -0
- package/dist/node/mongo/mongo.controller.native.js +65 -93
- package/dist/node/mongo/mongo.controller.native.js.map +1 -1
- package/dist/node/mongo/mongo.util.js.map +1 -1
- package/dist/node/storage/index.js +3 -3
- package/dist/node/storage/storage.constant.d.ts +0 -3
- package/dist/node/storage/storage.constant.js +2 -2
- package/dist/node/storage/storage.constant.js.map +1 -1
- package/dist/node/storage/storage.type.d.ts +0 -11
- package/dist/node/storage/storage.util.d.ts +1 -1
- package/dist/node/storage/storage.util.js +60 -68
- package/dist/node/storage/storage.util.js.map +1 -1
- package/dist/node/upload/upload.type.d.ts +2 -0
- package/dist/node/upload/upload.type.js.map +1 -1
- package/dist/node/upload/upload.util.js +10 -2
- package/dist/node/upload/upload.util.js.map +1 -1
- package/dist/node_modules/.pnpm/vitest@4.1.0_@types_node@25.5.0_jsdom@29.0.1_@noble_hashes@1.8.0__vite@8.0.1_@types_nod_5f6c16f4d4385f16c87b17afc93c851f/node_modules/vitest/dist/config.js +8 -0
- package/dist/node_modules/.pnpm/{vitest@4.1.0_@types_node@25.5.0_jsdom@29.0.0_@noble_hashes@1.8.0__vite@8.0.1_@types_nod_36acd00c2670b611b011192023dc5bd9 → vitest@4.1.0_@types_node@25.5.0_jsdom@29.0.1_@noble_hashes@1.8.0__vite@8.0.1_@types_nod_5f6c16f4d4385f16c87b17afc93c851f}/node_modules/vitest/dist/config.js.map +1 -1
- package/dist/react/storage/storage.hook.d.ts +1 -1
- package/dist/react/storage/storage.hook.js.map +1 -1
- package/dist/react/storage/storage.util.d.ts +6 -7
- package/dist/react/storage/storage.util.js +15 -10
- package/dist/react/storage/storage.util.js.map +1 -1
- package/dist/util/common/common.util.d.ts +15 -2
- package/dist/util/common/common.util.js +22 -9
- package/dist/util/common/common.util.js.map +1 -1
- package/dist/util/common/index.js +2 -2
- package/dist/util/index.js +7 -7
- package/dist/util/object/object.util.d.ts +7 -3
- package/dist/util/object/object.util.js.map +1 -1
- package/package.json +5 -6
- package/dist/node_modules/.pnpm/vitest@4.1.0_@types_node@25.5.0_jsdom@29.0.0_@noble_hashes@1.8.0__vite@8.0.1_@types_nod_36acd00c2670b611b011192023dc5bd9/node_modules/vitest/dist/config.js +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.util.js","names":[],"sources":["../../../src/config/env/env.util.ts"],"sourcesContent":["import dotenvx from '@dotenvx/dotenvx';\nimport { cleanEnv, makeValidator, str } from 'envalid';\nimport os from 'node:os';\nimport path from 'node:path';\nimport process from 'node:process';\n\nimport { E_Environment } from '#typescript/index.js';\n\nimport type { I_Environment } from './env.type.js';\n\nimport { CYBERSKILL_STORAGE_DIRECTORY } from './env.constant.js';\n\n/**\n * Flag to track whether environment file has been loaded.\n * This variable prevents multiple loading of environment files during\n * the application lifecycle, ensuring environment variables are only\n * loaded once per session.\n */\nlet isEnvFileLoaded = false;\n\n/**\n * Custom validator for debug environment variable.\n * This validator accepts boolean values directly and converts string values\n * to true, providing flexible debug configuration options. It handles\n * both explicit boolean settings and string-based flags.\n *\n * @param input - The input value to validate (boolean or string).\n * @returns True if the input is a valid debug setting, false otherwise.\n */\nconst debugValidator = makeValidator((input) => {\n if (typeof input === 'boolean') {\n return input;\n }\n if (typeof input === 'string') {\n return true;\n }\n\n return false;\n});\n\n/**\n * Loads environment variables from .env files.\n * This function loads environment variables from .env files using dotenvx,\n * but only in non-production environments. It includes a safety mechanism\n * to prevent multiple loading of the same environment file.\n *\n * The function:\n * - Checks if the current environment is not production\n * - Loads environment variables from .env files\n * - Prevents duplicate loading with a flag mechanism\n * - Uses dotenvx for enhanced environment file support\n */\nexport function loadEnvFile() {\n
|
|
1
|
+
{"version":3,"file":"env.util.js","names":[],"sources":["../../../src/config/env/env.util.ts"],"sourcesContent":["import dotenvx from '@dotenvx/dotenvx';\nimport { cleanEnv, makeValidator, str } from 'envalid';\nimport os from 'node:os';\nimport path from 'node:path';\nimport process from 'node:process';\n\nimport { E_Environment } from '#typescript/index.js';\n\nimport type { I_Environment } from './env.type.js';\n\nimport { CYBERSKILL_STORAGE_DIRECTORY } from './env.constant.js';\n\n/**\n * Flag to track whether environment file has been loaded.\n * This variable prevents multiple loading of environment files during\n * the application lifecycle, ensuring environment variables are only\n * loaded once per session.\n */\nlet isEnvFileLoaded = false;\n\n/**\n * Custom validator for debug environment variable.\n * This validator accepts boolean values directly and converts string values\n * to true, providing flexible debug configuration options. It handles\n * both explicit boolean settings and string-based flags.\n *\n * @param input - The input value to validate (boolean or string).\n * @returns True if the input is a valid debug setting, false otherwise.\n */\nconst debugValidator = makeValidator((input) => {\n if (typeof input === 'boolean') {\n return input;\n }\n if (typeof input === 'string') {\n return true;\n }\n\n return false;\n});\n\n/**\n * Loads environment variables from .env files.\n * This function loads environment variables from .env files using dotenvx,\n * but only in non-production environments. It includes a safety mechanism\n * to prevent multiple loading of the same environment file.\n *\n * The function:\n * - Checks if the current environment is not production\n * - Loads environment variables from .env files\n * - Prevents duplicate loading with a flag mechanism\n * - Uses dotenvx for enhanced environment file support\n */\nexport function loadEnvFile() {\n if (process.env['NODE_ENV'] !== E_Environment.PRODUCTION && !isEnvFileLoaded) {\n dotenvx.config();\n isEnvFileLoaded = true;\n }\n}\n\n/**\n * Retrieves and validates the application environment configuration.\n * This function loads environment variables, validates them using envalid,\n * and returns a typed environment object with default values for missing\n * variables. It ensures all required environment variables are present\n * and properly typed.\n *\n * The function validates:\n * - CWD: Current working directory (defaults to process.cwd())\n * - DEBUG: Debug mode flag (defaults to false)\n * - CYBERSKILL_STORAGE_DIRECTORY: Storage directory path (defaults to user home directory)\n *\n * @returns A validated environment object with all required configuration values.\n */\nexport function getEnv(): I_Environment {\n loadEnvFile();\n\n const cleanedEnv = cleanEnv(process.env, {\n CWD: str({ default: process.cwd() }),\n DEBUG: debugValidator({ default: false }),\n CYBERSKILL_STORAGE_DIRECTORY: str({ default: path.join(os.homedir(), CYBERSKILL_STORAGE_DIRECTORY) }),\n });\n\n const env = {\n CWD: cleanedEnv.CWD,\n DEBUG: cleanedEnv.DEBUG,\n CYBERSKILL_STORAGE_DIRECTORY: cleanedEnv.CYBERSKILL_STORAGE_DIRECTORY,\n };\n\n return env;\n}\n"],"mappings":";;;;;;;;AAkBA,IAAI,IAAkB,IAWhB,IAAiB,GAAe,MAC9B,OAAO,KAAU,YACV,IAEP,OAAO,KAAU,SAKvB;AAcF,SAAgB,IAAc;AAC1B,CAAI,EAAQ,IAAI,aAAgB,EAAc,cAAc,CAAC,MACzD,EAAQ,QAAQ,EAChB,IAAkB;;AAkB1B,SAAgB,IAAwB;AACpC,IAAa;CAEb,IAAM,IAAa,EAAS,EAAQ,KAAK;EACrC,KAAK,EAAI,EAAE,SAAS,EAAQ,KAAK,EAAE,CAAC;EACpC,OAAO,EAAe,EAAE,SAAS,IAAO,CAAC;EACzC,8BAA8B,EAAI,EAAE,SAAS,EAAK,KAAK,EAAG,SAAS,EAAE,EAA6B,EAAE,CAAC;EACxG,CAAC;AAQF,QANY;EACR,KAAK,EAAW;EAChB,OAAO,EAAW;EAClB,8BAA8B,EAAW;EAC5C"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { deepMerge as e } from "../../util/object/object.util.js";
|
|
2
|
-
import { defineConfig as t } from "../../node_modules/.pnpm/vitest@4.1.0_@types_node@25.5.0_jsdom@29.0.
|
|
2
|
+
import { defineConfig as t } from "../../node_modules/.pnpm/vitest@4.1.0_@types_node@25.5.0_jsdom@29.0.1_@noble_hashes@1.8.0__vite@8.0.1_@types_nod_5f6c16f4d4385f16c87b17afc93c851f/node_modules/vitest/dist/config.js";
|
|
3
3
|
import n from "@vitejs/plugin-react";
|
|
4
4
|
//#region src/config/vitest/vitest.e2e.ts
|
|
5
5
|
function r(r) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { deepMerge as e } from "../../util/object/object.util.js";
|
|
2
|
-
import { defineConfig as t } from "../../node_modules/.pnpm/vitest@4.1.0_@types_node@25.5.0_jsdom@29.0.
|
|
2
|
+
import { defineConfig as t } from "../../node_modules/.pnpm/vitest@4.1.0_@types_node@25.5.0_jsdom@29.0.1_@noble_hashes@1.8.0__vite@8.0.1_@types_nod_5f6c16f4d4385f16c87b17afc93c851f/node_modules/vitest/dist/config.js";
|
|
3
3
|
import n from "@vitejs/plugin-react";
|
|
4
4
|
//#region src/config/vitest/vitest.unit.ts
|
|
5
5
|
function r(r) {
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated Prefer `GRAPHQL_RESPONSE_STATUS` (string codes) or `HTTP_RESPONSE_STATUS` (numeric codes)
|
|
3
|
+
* for better type safety. Direct use of `RESPONSE_STATUS` yields a union type `number | string` for `CODE`.
|
|
4
|
+
*/
|
|
1
5
|
export declare const RESPONSE_STATUS: {
|
|
2
6
|
readonly GRAPHQL_PARSE_FAILED: {
|
|
3
7
|
readonly CODE: "GRAPHQL_PARSE_FAILED";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-status.js","names":[],"sources":["../../src/constant/response-status.ts"],"sourcesContent":["export const RESPONSE_STATUS = {\n GRAPHQL_PARSE_FAILED: {\n CODE: 'GRAPHQL_PARSE_FAILED',\n MESSAGE: 'The GraphQL operation string contains a syntax error.',\n },\n GRAPHQL_VALIDATION_FAILED: {\n CODE: 'GRAPHQL_VALIDATION_FAILED',\n MESSAGE: `The GraphQL operation is not valid against the server's schema.`,\n },\n BAD_USER_INPUT: {\n CODE: 'BAD_USER_INPUT',\n MESSAGE:\n 'The GraphQL operation includes an invalid value for a field argument.',\n },\n PERSISTED_QUERY_NOT_FOUND: {\n CODE: 'PERSISTED_QUERY_NOT_FOUND',\n MESSAGE:\n 'A client sent the hash of a query string to execute via automatic persisted queries, but the query was not in the APQ cache.',\n },\n PERSISTED_QUERY_NOT_SUPPORTED: {\n CODE: 'PERSISTED_QUERY_NOT_SUPPORTED',\n MESSAGE:\n 'A client sent the hash of a query string to execute via automatic persisted queries, but the server has disabled APQ.',\n },\n OPERATION_RESOLUTION_FAILURE: {\n CODE: 'OPERATION_RESOLUTION_FAILURE',\n MESSAGE: `The request was parsed successfully and is valid against the server's schema, but the server couldn't resolve which operation to run. This occurs when a request containing multiple named operations doesn't specify which operation to run (i.e.,operationName), or if the named operation isn't included in the request.`,\n },\n CONTINUE: {\n CODE: 100,\n MESSAGE: 'Continue',\n },\n SWITCHING_PROTOCOLS: {\n CODE: 101,\n MESSAGE: 'Switching Protocols',\n },\n PROCESSING: {\n CODE: 102,\n MESSAGE: 'Processing',\n },\n OK: {\n CODE: 200,\n MESSAGE: 'OK',\n },\n CREATED: {\n CODE: 201,\n MESSAGE: 'Created',\n },\n ACCEPTED: {\n CODE: 202,\n MESSAGE: 'Accepted',\n },\n NON_AUTHORITATIVE_INFORMATION: {\n CODE: 203,\n MESSAGE: 'Non Authoritative Information',\n },\n NO_CONTENT: {\n CODE: 204,\n MESSAGE: 'No Content',\n },\n RESET_CONTENT: {\n CODE: 205,\n MESSAGE: 'Reset Content',\n },\n PARTIAL_CONTENT: {\n CODE: 206,\n MESSAGE: 'Partial Content',\n },\n MULTI_STATUS: {\n CODE: 207,\n MESSAGE: 'Multi-Status',\n },\n MULTIPLE_CHOICES: {\n CODE: 300,\n MESSAGE: 'Multiple Choices',\n },\n MOVED_PERMANENTLY: {\n CODE: 301,\n MESSAGE: 'Moved Permanently',\n },\n MOVED_TEMPORARILY: {\n CODE: 302,\n MESSAGE: 'Moved Temporarily',\n },\n SEE_OTHER: {\n CODE: 303,\n MESSAGE: 'See Other',\n },\n NOT_MODIFIED: {\n CODE: 304,\n MESSAGE: 'Not Modified',\n },\n USE_PROXY: {\n CODE: 305,\n MESSAGE: 'Use Proxy',\n },\n TEMPORARY_REDIRECT: {\n CODE: 307,\n MESSAGE: 'Temporary Redirect',\n },\n PERMANENT_REDIRECT: {\n CODE: 308,\n MESSAGE: 'Permanent Redirect',\n },\n BAD_REQUEST: {\n CODE: 400,\n MESSAGE: 'Bad Request',\n },\n UNAUTHORIZED: {\n CODE: 401,\n MESSAGE: 'Unauthorized',\n },\n PAYMENT_REQUIRED: {\n CODE: 402,\n MESSAGE: 'Payment Required',\n },\n FORBIDDEN: {\n CODE: 403,\n MESSAGE: 'Forbidden',\n },\n NOT_FOUND: {\n CODE: 404,\n MESSAGE: 'Not Found',\n },\n METHOD_NOT_ALLOWED: {\n CODE: 405,\n MESSAGE: 'Method Not Allowed',\n },\n NOT_ACCEPTABLE: {\n CODE: 406,\n MESSAGE: 'Not Acceptable',\n },\n PROXY_AUTHENTICATION_REQUIRED: {\n CODE: 407,\n MESSAGE: 'Proxy Authentication Required',\n },\n REQUEST_TIMEOUT: {\n CODE: 408,\n MESSAGE: 'Request Timeout',\n },\n CONFLICT: {\n CODE: 409,\n MESSAGE: 'Conflict',\n },\n GONE: {\n CODE: 410,\n MESSAGE: 'Gone',\n },\n LENGTH_REQUIRED: {\n CODE: 411,\n MESSAGE: 'Length Required',\n },\n PRECONDITION_FAILED: {\n CODE: 412,\n MESSAGE: 'Precondition Failed',\n },\n REQUEST_TOO_LONG: {\n CODE: 413,\n MESSAGE: 'Request Entity Too Large',\n },\n REQUEST_URI_TOO_LONG: {\n CODE: 414,\n MESSAGE: 'Request-URI Too Long',\n },\n UNSUPPORTED_MEDIA_TYPE: {\n CODE: 415,\n MESSAGE: 'Unsupported Media Type',\n },\n REQUESTED_RANGE_NOT_SATISFIABLE: {\n CODE: 416,\n MESSAGE: 'Requested Range Not Satisfiable',\n },\n EXPECTATION_FAILED: {\n CODE: 417,\n MESSAGE: 'Expectation Failed',\n },\n IM_A_TEAPOT: {\n CODE: 418,\n MESSAGE: 'I\\'m a teapot',\n },\n INSUFFICIENT_SPACE_ON_RESOURCE: {\n CODE: 419,\n MESSAGE: 'Insufficient Space on Resource',\n },\n METHOD_FAILURE: {\n CODE: 420,\n MESSAGE: 'Method Failure',\n },\n MISDIRECTED_REQUEST: {\n CODE: 421,\n MESSAGE: 'Misdirected Request',\n },\n UNPROCESSABLE_ENTITY: {\n CODE: 422,\n MESSAGE: 'Unprocessable Entity',\n },\n LOCKED: {\n CODE: 423,\n MESSAGE: 'Locked',\n },\n FAILED_DEPENDENCY: {\n CODE: 424,\n MESSAGE: 'Failed Dependency',\n },\n PRECONDITION_REQUIRED: {\n CODE: 428,\n MESSAGE: 'Precondition Required',\n },\n TOO_MANY_REQUESTS: {\n CODE: 429,\n MESSAGE: 'Too Many Requests',\n },\n REQUEST_HEADER_FIELDS_TOO_LARGE: {\n CODE: 431,\n MESSAGE: 'Request Header Fields Too Large',\n },\n UNAVAILABLE_FOR_LEGAL_REASONS: {\n CODE: 451,\n MESSAGE: 'Unavailable For Legal Reasons',\n },\n INTERNAL_SERVER_ERROR: {\n CODE: 500,\n MESSAGE: 'Internal Server Error',\n },\n NOT_IMPLEMENTED: {\n CODE: 501,\n MESSAGE: 'Not Implemented',\n },\n BAD_GATEWAY: {\n CODE: 502,\n MESSAGE: 'Bad Gateway',\n },\n SERVICE_UNAVAILABLE: {\n CODE: 503,\n MESSAGE: 'Service Unavailable',\n },\n GATEWAY_TIMEOUT: {\n CODE: 504,\n MESSAGE: 'Gateway Timeout',\n },\n HTTP_VERSION_NOT_SUPPORTED: {\n CODE: 505,\n MESSAGE: 'HTTP Version Not Supported',\n },\n INSUFFICIENT_STORAGE: {\n CODE: 507,\n MESSAGE: 'Insufficient Storage',\n },\n NETWORK_AUTHENTICATION_REQUIRED: {\n CODE: 511,\n MESSAGE: 'Network Authentication Required',\n },\n} as const satisfies Record<string, { readonly CODE: number | string; readonly MESSAGE: string }>;\n\n// ─── Typed subsets ───────────────────────────────────────────────────────────\n// Use these instead of `RESPONSE_STATUS` when you need compile-time\n// certainty that CODE is a number (HTTP) or string (GraphQL).\n\n/** GraphQL error codes — CODE is always a string. */\nexport const GRAPHQL_RESPONSE_STATUS = {\n GRAPHQL_PARSE_FAILED: RESPONSE_STATUS.GRAPHQL_PARSE_FAILED,\n GRAPHQL_VALIDATION_FAILED: RESPONSE_STATUS.GRAPHQL_VALIDATION_FAILED,\n BAD_USER_INPUT: RESPONSE_STATUS.BAD_USER_INPUT,\n PERSISTED_QUERY_NOT_FOUND: RESPONSE_STATUS.PERSISTED_QUERY_NOT_FOUND,\n PERSISTED_QUERY_NOT_SUPPORTED: RESPONSE_STATUS.PERSISTED_QUERY_NOT_SUPPORTED,\n OPERATION_RESOLUTION_FAILURE: RESPONSE_STATUS.OPERATION_RESOLUTION_FAILURE,\n} as const satisfies Record<string, { readonly CODE: string; readonly MESSAGE: string }>;\n\n/** HTTP status codes — CODE is always a number. */\nexport const HTTP_RESPONSE_STATUS = {\n CONTINUE: RESPONSE_STATUS.CONTINUE,\n SWITCHING_PROTOCOLS: RESPONSE_STATUS.SWITCHING_PROTOCOLS,\n PROCESSING: RESPONSE_STATUS.PROCESSING,\n OK: RESPONSE_STATUS.OK,\n CREATED: RESPONSE_STATUS.CREATED,\n ACCEPTED: RESPONSE_STATUS.ACCEPTED,\n NON_AUTHORITATIVE_INFORMATION: RESPONSE_STATUS.NON_AUTHORITATIVE_INFORMATION,\n NO_CONTENT: RESPONSE_STATUS.NO_CONTENT,\n RESET_CONTENT: RESPONSE_STATUS.RESET_CONTENT,\n PARTIAL_CONTENT: RESPONSE_STATUS.PARTIAL_CONTENT,\n MULTI_STATUS: RESPONSE_STATUS.MULTI_STATUS,\n MULTIPLE_CHOICES: RESPONSE_STATUS.MULTIPLE_CHOICES,\n MOVED_PERMANENTLY: RESPONSE_STATUS.MOVED_PERMANENTLY,\n MOVED_TEMPORARILY: RESPONSE_STATUS.MOVED_TEMPORARILY,\n SEE_OTHER: RESPONSE_STATUS.SEE_OTHER,\n NOT_MODIFIED: RESPONSE_STATUS.NOT_MODIFIED,\n USE_PROXY: RESPONSE_STATUS.USE_PROXY,\n TEMPORARY_REDIRECT: RESPONSE_STATUS.TEMPORARY_REDIRECT,\n PERMANENT_REDIRECT: RESPONSE_STATUS.PERMANENT_REDIRECT,\n BAD_REQUEST: RESPONSE_STATUS.BAD_REQUEST,\n UNAUTHORIZED: RESPONSE_STATUS.UNAUTHORIZED,\n PAYMENT_REQUIRED: RESPONSE_STATUS.PAYMENT_REQUIRED,\n FORBIDDEN: RESPONSE_STATUS.FORBIDDEN,\n NOT_FOUND: RESPONSE_STATUS.NOT_FOUND,\n METHOD_NOT_ALLOWED: RESPONSE_STATUS.METHOD_NOT_ALLOWED,\n NOT_ACCEPTABLE: RESPONSE_STATUS.NOT_ACCEPTABLE,\n PROXY_AUTHENTICATION_REQUIRED: RESPONSE_STATUS.PROXY_AUTHENTICATION_REQUIRED,\n REQUEST_TIMEOUT: RESPONSE_STATUS.REQUEST_TIMEOUT,\n CONFLICT: RESPONSE_STATUS.CONFLICT,\n GONE: RESPONSE_STATUS.GONE,\n LENGTH_REQUIRED: RESPONSE_STATUS.LENGTH_REQUIRED,\n PRECONDITION_FAILED: RESPONSE_STATUS.PRECONDITION_FAILED,\n REQUEST_TOO_LONG: RESPONSE_STATUS.REQUEST_TOO_LONG,\n REQUEST_URI_TOO_LONG: RESPONSE_STATUS.REQUEST_URI_TOO_LONG,\n UNSUPPORTED_MEDIA_TYPE: RESPONSE_STATUS.UNSUPPORTED_MEDIA_TYPE,\n REQUESTED_RANGE_NOT_SATISFIABLE: RESPONSE_STATUS.REQUESTED_RANGE_NOT_SATISFIABLE,\n EXPECTATION_FAILED: RESPONSE_STATUS.EXPECTATION_FAILED,\n IM_A_TEAPOT: RESPONSE_STATUS.IM_A_TEAPOT,\n INSUFFICIENT_SPACE_ON_RESOURCE: RESPONSE_STATUS.INSUFFICIENT_SPACE_ON_RESOURCE,\n METHOD_FAILURE: RESPONSE_STATUS.METHOD_FAILURE,\n MISDIRECTED_REQUEST: RESPONSE_STATUS.MISDIRECTED_REQUEST,\n UNPROCESSABLE_ENTITY: RESPONSE_STATUS.UNPROCESSABLE_ENTITY,\n LOCKED: RESPONSE_STATUS.LOCKED,\n FAILED_DEPENDENCY: RESPONSE_STATUS.FAILED_DEPENDENCY,\n PRECONDITION_REQUIRED: RESPONSE_STATUS.PRECONDITION_REQUIRED,\n TOO_MANY_REQUESTS: RESPONSE_STATUS.TOO_MANY_REQUESTS,\n REQUEST_HEADER_FIELDS_TOO_LARGE: RESPONSE_STATUS.REQUEST_HEADER_FIELDS_TOO_LARGE,\n UNAVAILABLE_FOR_LEGAL_REASONS: RESPONSE_STATUS.UNAVAILABLE_FOR_LEGAL_REASONS,\n INTERNAL_SERVER_ERROR: RESPONSE_STATUS.INTERNAL_SERVER_ERROR,\n NOT_IMPLEMENTED: RESPONSE_STATUS.NOT_IMPLEMENTED,\n BAD_GATEWAY: RESPONSE_STATUS.BAD_GATEWAY,\n SERVICE_UNAVAILABLE: RESPONSE_STATUS.SERVICE_UNAVAILABLE,\n GATEWAY_TIMEOUT: RESPONSE_STATUS.GATEWAY_TIMEOUT,\n HTTP_VERSION_NOT_SUPPORTED: RESPONSE_STATUS.HTTP_VERSION_NOT_SUPPORTED,\n INSUFFICIENT_STORAGE: RESPONSE_STATUS.INSUFFICIENT_STORAGE,\n NETWORK_AUTHENTICATION_REQUIRED: RESPONSE_STATUS.NETWORK_AUTHENTICATION_REQUIRED,\n} as const satisfies Record<string, { readonly CODE: number; readonly MESSAGE: string }>;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"response-status.js","names":[],"sources":["../../src/constant/response-status.ts"],"sourcesContent":["/**\n * @deprecated Prefer `GRAPHQL_RESPONSE_STATUS` (string codes) or `HTTP_RESPONSE_STATUS` (numeric codes)\n * for better type safety. Direct use of `RESPONSE_STATUS` yields a union type `number | string` for `CODE`.\n */\nexport const RESPONSE_STATUS = {\n GRAPHQL_PARSE_FAILED: {\n CODE: 'GRAPHQL_PARSE_FAILED',\n MESSAGE: 'The GraphQL operation string contains a syntax error.',\n },\n GRAPHQL_VALIDATION_FAILED: {\n CODE: 'GRAPHQL_VALIDATION_FAILED',\n MESSAGE: `The GraphQL operation is not valid against the server's schema.`,\n },\n BAD_USER_INPUT: {\n CODE: 'BAD_USER_INPUT',\n MESSAGE:\n 'The GraphQL operation includes an invalid value for a field argument.',\n },\n PERSISTED_QUERY_NOT_FOUND: {\n CODE: 'PERSISTED_QUERY_NOT_FOUND',\n MESSAGE:\n 'A client sent the hash of a query string to execute via automatic persisted queries, but the query was not in the APQ cache.',\n },\n PERSISTED_QUERY_NOT_SUPPORTED: {\n CODE: 'PERSISTED_QUERY_NOT_SUPPORTED',\n MESSAGE:\n 'A client sent the hash of a query string to execute via automatic persisted queries, but the server has disabled APQ.',\n },\n OPERATION_RESOLUTION_FAILURE: {\n CODE: 'OPERATION_RESOLUTION_FAILURE',\n MESSAGE: `The request was parsed successfully and is valid against the server's schema, but the server couldn't resolve which operation to run. This occurs when a request containing multiple named operations doesn't specify which operation to run (i.e.,operationName), or if the named operation isn't included in the request.`,\n },\n CONTINUE: {\n CODE: 100,\n MESSAGE: 'Continue',\n },\n SWITCHING_PROTOCOLS: {\n CODE: 101,\n MESSAGE: 'Switching Protocols',\n },\n PROCESSING: {\n CODE: 102,\n MESSAGE: 'Processing',\n },\n OK: {\n CODE: 200,\n MESSAGE: 'OK',\n },\n CREATED: {\n CODE: 201,\n MESSAGE: 'Created',\n },\n ACCEPTED: {\n CODE: 202,\n MESSAGE: 'Accepted',\n },\n NON_AUTHORITATIVE_INFORMATION: {\n CODE: 203,\n MESSAGE: 'Non Authoritative Information',\n },\n NO_CONTENT: {\n CODE: 204,\n MESSAGE: 'No Content',\n },\n RESET_CONTENT: {\n CODE: 205,\n MESSAGE: 'Reset Content',\n },\n PARTIAL_CONTENT: {\n CODE: 206,\n MESSAGE: 'Partial Content',\n },\n MULTI_STATUS: {\n CODE: 207,\n MESSAGE: 'Multi-Status',\n },\n MULTIPLE_CHOICES: {\n CODE: 300,\n MESSAGE: 'Multiple Choices',\n },\n MOVED_PERMANENTLY: {\n CODE: 301,\n MESSAGE: 'Moved Permanently',\n },\n MOVED_TEMPORARILY: {\n CODE: 302,\n MESSAGE: 'Moved Temporarily',\n },\n SEE_OTHER: {\n CODE: 303,\n MESSAGE: 'See Other',\n },\n NOT_MODIFIED: {\n CODE: 304,\n MESSAGE: 'Not Modified',\n },\n USE_PROXY: {\n CODE: 305,\n MESSAGE: 'Use Proxy',\n },\n TEMPORARY_REDIRECT: {\n CODE: 307,\n MESSAGE: 'Temporary Redirect',\n },\n PERMANENT_REDIRECT: {\n CODE: 308,\n MESSAGE: 'Permanent Redirect',\n },\n BAD_REQUEST: {\n CODE: 400,\n MESSAGE: 'Bad Request',\n },\n UNAUTHORIZED: {\n CODE: 401,\n MESSAGE: 'Unauthorized',\n },\n PAYMENT_REQUIRED: {\n CODE: 402,\n MESSAGE: 'Payment Required',\n },\n FORBIDDEN: {\n CODE: 403,\n MESSAGE: 'Forbidden',\n },\n NOT_FOUND: {\n CODE: 404,\n MESSAGE: 'Not Found',\n },\n METHOD_NOT_ALLOWED: {\n CODE: 405,\n MESSAGE: 'Method Not Allowed',\n },\n NOT_ACCEPTABLE: {\n CODE: 406,\n MESSAGE: 'Not Acceptable',\n },\n PROXY_AUTHENTICATION_REQUIRED: {\n CODE: 407,\n MESSAGE: 'Proxy Authentication Required',\n },\n REQUEST_TIMEOUT: {\n CODE: 408,\n MESSAGE: 'Request Timeout',\n },\n CONFLICT: {\n CODE: 409,\n MESSAGE: 'Conflict',\n },\n GONE: {\n CODE: 410,\n MESSAGE: 'Gone',\n },\n LENGTH_REQUIRED: {\n CODE: 411,\n MESSAGE: 'Length Required',\n },\n PRECONDITION_FAILED: {\n CODE: 412,\n MESSAGE: 'Precondition Failed',\n },\n REQUEST_TOO_LONG: {\n CODE: 413,\n MESSAGE: 'Request Entity Too Large',\n },\n REQUEST_URI_TOO_LONG: {\n CODE: 414,\n MESSAGE: 'Request-URI Too Long',\n },\n UNSUPPORTED_MEDIA_TYPE: {\n CODE: 415,\n MESSAGE: 'Unsupported Media Type',\n },\n REQUESTED_RANGE_NOT_SATISFIABLE: {\n CODE: 416,\n MESSAGE: 'Requested Range Not Satisfiable',\n },\n EXPECTATION_FAILED: {\n CODE: 417,\n MESSAGE: 'Expectation Failed',\n },\n IM_A_TEAPOT: {\n CODE: 418,\n MESSAGE: 'I\\'m a teapot',\n },\n INSUFFICIENT_SPACE_ON_RESOURCE: {\n CODE: 419,\n MESSAGE: 'Insufficient Space on Resource',\n },\n METHOD_FAILURE: {\n CODE: 420,\n MESSAGE: 'Method Failure',\n },\n MISDIRECTED_REQUEST: {\n CODE: 421,\n MESSAGE: 'Misdirected Request',\n },\n UNPROCESSABLE_ENTITY: {\n CODE: 422,\n MESSAGE: 'Unprocessable Entity',\n },\n LOCKED: {\n CODE: 423,\n MESSAGE: 'Locked',\n },\n FAILED_DEPENDENCY: {\n CODE: 424,\n MESSAGE: 'Failed Dependency',\n },\n PRECONDITION_REQUIRED: {\n CODE: 428,\n MESSAGE: 'Precondition Required',\n },\n TOO_MANY_REQUESTS: {\n CODE: 429,\n MESSAGE: 'Too Many Requests',\n },\n REQUEST_HEADER_FIELDS_TOO_LARGE: {\n CODE: 431,\n MESSAGE: 'Request Header Fields Too Large',\n },\n UNAVAILABLE_FOR_LEGAL_REASONS: {\n CODE: 451,\n MESSAGE: 'Unavailable For Legal Reasons',\n },\n INTERNAL_SERVER_ERROR: {\n CODE: 500,\n MESSAGE: 'Internal Server Error',\n },\n NOT_IMPLEMENTED: {\n CODE: 501,\n MESSAGE: 'Not Implemented',\n },\n BAD_GATEWAY: {\n CODE: 502,\n MESSAGE: 'Bad Gateway',\n },\n SERVICE_UNAVAILABLE: {\n CODE: 503,\n MESSAGE: 'Service Unavailable',\n },\n GATEWAY_TIMEOUT: {\n CODE: 504,\n MESSAGE: 'Gateway Timeout',\n },\n HTTP_VERSION_NOT_SUPPORTED: {\n CODE: 505,\n MESSAGE: 'HTTP Version Not Supported',\n },\n INSUFFICIENT_STORAGE: {\n CODE: 507,\n MESSAGE: 'Insufficient Storage',\n },\n NETWORK_AUTHENTICATION_REQUIRED: {\n CODE: 511,\n MESSAGE: 'Network Authentication Required',\n },\n} as const satisfies Record<string, { readonly CODE: number | string; readonly MESSAGE: string }>;\n\n// ─── Typed subsets ───────────────────────────────────────────────────────────\n// Use these instead of `RESPONSE_STATUS` when you need compile-time\n// certainty that CODE is a number (HTTP) or string (GraphQL).\n\n/** GraphQL error codes — CODE is always a string. */\nexport const GRAPHQL_RESPONSE_STATUS = {\n GRAPHQL_PARSE_FAILED: RESPONSE_STATUS.GRAPHQL_PARSE_FAILED,\n GRAPHQL_VALIDATION_FAILED: RESPONSE_STATUS.GRAPHQL_VALIDATION_FAILED,\n BAD_USER_INPUT: RESPONSE_STATUS.BAD_USER_INPUT,\n PERSISTED_QUERY_NOT_FOUND: RESPONSE_STATUS.PERSISTED_QUERY_NOT_FOUND,\n PERSISTED_QUERY_NOT_SUPPORTED: RESPONSE_STATUS.PERSISTED_QUERY_NOT_SUPPORTED,\n OPERATION_RESOLUTION_FAILURE: RESPONSE_STATUS.OPERATION_RESOLUTION_FAILURE,\n} as const satisfies Record<string, { readonly CODE: string; readonly MESSAGE: string }>;\n\n/** HTTP status codes — CODE is always a number. */\nexport const HTTP_RESPONSE_STATUS = {\n CONTINUE: RESPONSE_STATUS.CONTINUE,\n SWITCHING_PROTOCOLS: RESPONSE_STATUS.SWITCHING_PROTOCOLS,\n PROCESSING: RESPONSE_STATUS.PROCESSING,\n OK: RESPONSE_STATUS.OK,\n CREATED: RESPONSE_STATUS.CREATED,\n ACCEPTED: RESPONSE_STATUS.ACCEPTED,\n NON_AUTHORITATIVE_INFORMATION: RESPONSE_STATUS.NON_AUTHORITATIVE_INFORMATION,\n NO_CONTENT: RESPONSE_STATUS.NO_CONTENT,\n RESET_CONTENT: RESPONSE_STATUS.RESET_CONTENT,\n PARTIAL_CONTENT: RESPONSE_STATUS.PARTIAL_CONTENT,\n MULTI_STATUS: RESPONSE_STATUS.MULTI_STATUS,\n MULTIPLE_CHOICES: RESPONSE_STATUS.MULTIPLE_CHOICES,\n MOVED_PERMANENTLY: RESPONSE_STATUS.MOVED_PERMANENTLY,\n MOVED_TEMPORARILY: RESPONSE_STATUS.MOVED_TEMPORARILY,\n SEE_OTHER: RESPONSE_STATUS.SEE_OTHER,\n NOT_MODIFIED: RESPONSE_STATUS.NOT_MODIFIED,\n USE_PROXY: RESPONSE_STATUS.USE_PROXY,\n TEMPORARY_REDIRECT: RESPONSE_STATUS.TEMPORARY_REDIRECT,\n PERMANENT_REDIRECT: RESPONSE_STATUS.PERMANENT_REDIRECT,\n BAD_REQUEST: RESPONSE_STATUS.BAD_REQUEST,\n UNAUTHORIZED: RESPONSE_STATUS.UNAUTHORIZED,\n PAYMENT_REQUIRED: RESPONSE_STATUS.PAYMENT_REQUIRED,\n FORBIDDEN: RESPONSE_STATUS.FORBIDDEN,\n NOT_FOUND: RESPONSE_STATUS.NOT_FOUND,\n METHOD_NOT_ALLOWED: RESPONSE_STATUS.METHOD_NOT_ALLOWED,\n NOT_ACCEPTABLE: RESPONSE_STATUS.NOT_ACCEPTABLE,\n PROXY_AUTHENTICATION_REQUIRED: RESPONSE_STATUS.PROXY_AUTHENTICATION_REQUIRED,\n REQUEST_TIMEOUT: RESPONSE_STATUS.REQUEST_TIMEOUT,\n CONFLICT: RESPONSE_STATUS.CONFLICT,\n GONE: RESPONSE_STATUS.GONE,\n LENGTH_REQUIRED: RESPONSE_STATUS.LENGTH_REQUIRED,\n PRECONDITION_FAILED: RESPONSE_STATUS.PRECONDITION_FAILED,\n REQUEST_TOO_LONG: RESPONSE_STATUS.REQUEST_TOO_LONG,\n REQUEST_URI_TOO_LONG: RESPONSE_STATUS.REQUEST_URI_TOO_LONG,\n UNSUPPORTED_MEDIA_TYPE: RESPONSE_STATUS.UNSUPPORTED_MEDIA_TYPE,\n REQUESTED_RANGE_NOT_SATISFIABLE: RESPONSE_STATUS.REQUESTED_RANGE_NOT_SATISFIABLE,\n EXPECTATION_FAILED: RESPONSE_STATUS.EXPECTATION_FAILED,\n IM_A_TEAPOT: RESPONSE_STATUS.IM_A_TEAPOT,\n INSUFFICIENT_SPACE_ON_RESOURCE: RESPONSE_STATUS.INSUFFICIENT_SPACE_ON_RESOURCE,\n METHOD_FAILURE: RESPONSE_STATUS.METHOD_FAILURE,\n MISDIRECTED_REQUEST: RESPONSE_STATUS.MISDIRECTED_REQUEST,\n UNPROCESSABLE_ENTITY: RESPONSE_STATUS.UNPROCESSABLE_ENTITY,\n LOCKED: RESPONSE_STATUS.LOCKED,\n FAILED_DEPENDENCY: RESPONSE_STATUS.FAILED_DEPENDENCY,\n PRECONDITION_REQUIRED: RESPONSE_STATUS.PRECONDITION_REQUIRED,\n TOO_MANY_REQUESTS: RESPONSE_STATUS.TOO_MANY_REQUESTS,\n REQUEST_HEADER_FIELDS_TOO_LARGE: RESPONSE_STATUS.REQUEST_HEADER_FIELDS_TOO_LARGE,\n UNAVAILABLE_FOR_LEGAL_REASONS: RESPONSE_STATUS.UNAVAILABLE_FOR_LEGAL_REASONS,\n INTERNAL_SERVER_ERROR: RESPONSE_STATUS.INTERNAL_SERVER_ERROR,\n NOT_IMPLEMENTED: RESPONSE_STATUS.NOT_IMPLEMENTED,\n BAD_GATEWAY: RESPONSE_STATUS.BAD_GATEWAY,\n SERVICE_UNAVAILABLE: RESPONSE_STATUS.SERVICE_UNAVAILABLE,\n GATEWAY_TIMEOUT: RESPONSE_STATUS.GATEWAY_TIMEOUT,\n HTTP_VERSION_NOT_SUPPORTED: RESPONSE_STATUS.HTTP_VERSION_NOT_SUPPORTED,\n INSUFFICIENT_STORAGE: RESPONSE_STATUS.INSUFFICIENT_STORAGE,\n NETWORK_AUTHENTICATION_REQUIRED: RESPONSE_STATUS.NETWORK_AUTHENTICATION_REQUIRED,\n} as const satisfies Record<string, { readonly CODE: number; readonly MESSAGE: string }>;\n"],"mappings":"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"}
|
|
@@ -36,6 +36,12 @@ export declare function createCors<T extends T_CorsType>(options: T_CorsOptions<
|
|
|
36
36
|
* This function creates an Express session middleware that can be used to handle user sessions
|
|
37
37
|
* with the provided session options including secret, cookie settings, and storage configuration.
|
|
38
38
|
*
|
|
39
|
+
* @remarks
|
|
40
|
+
* **CSRF Warning:** This middleware sets `SameSite=Lax` by default, which mitigates but does NOT
|
|
41
|
+
* fully prevent CSRF attacks for non-GET state-changing requests via top-level navigations.
|
|
42
|
+
* Applications should integrate a dedicated CSRF token middleware (e.g., `csrf-csrf` or
|
|
43
|
+
* `csrf-sync`) in addition to this session middleware for complete protection.
|
|
44
|
+
*
|
|
39
45
|
* @param options - Session configuration options including secret, cookie settings, and storage.
|
|
40
46
|
* @returns A session middleware function ready to be used in Express applications.
|
|
41
47
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.util.js","names":[],"sources":["../../../src/node/express/express.util.ts"],"sourcesContent":["import type { INestApplication } from '@nestjs/common';\nimport type { Application, RequestHandler } from 'express';\nimport type { SessionOptions } from 'express-session';\n\nimport { NestFactory } from '@nestjs/core';\nimport bodyParser from 'body-parser';\nimport compression from 'compression';\nimport cookieParser from 'cookie-parser';\nimport cors from 'cors';\nimport express from 'express';\nimport rateLimit from 'express-rate-limit';\nimport session from 'express-session';\nimport { express as useragent } from 'express-useragent';\nimport graphqlUploadExpress from 'graphql-upload/graphqlUploadExpress.mjs';\nimport helmet from 'helmet';\nimport process from 'node:process';\n\nimport type { I_ExpressOptions, I_NestOptions, T_CorsOptions, T_CorsType } from './express.type.js';\n\n/**\n * Creates CORS options with environment-specific configuration.\n * This function generates CORS options based on the development environment,\n * including whitelist configuration for allowed origins.\n *\n * @param options - CORS configuration options.\n * @param options.isDev - Whether the application is running in development mode.\n * @param options.whiteList - Array of allowed origins for CORS requests.\n * @returns CORS options object configured for the specified environment.\n */\nexport function createCorsOptions<T extends T_CorsType>({ isDev, whiteList, ...rest }: T_CorsOptions<T>) {\n // Safety net: warn loudly if isDev is mistakenly true in production\n if (isDev && process.env['NODE_ENV'] === 'production') {\n console.warn('[CORS] WARNING: isDev is true but NODE_ENV is \"production\". CORS restrictions are relaxed. This is likely a misconfiguration.');\n }\n\n return {\n origin: (origin: string | undefined, callback: (err: Error | null, allow?: boolean) => void) => {\n // Allow requests without Origin header only in development mode.\n // In production, undefined origin (e.g., curl, server-to-server) is rejected.\n if (isDev && !origin) {\n callback(null, true);\n return;\n }\n\n if (origin && whiteList?.includes(origin)) {\n callback(null, true);\n }\n else {\n callback(new Error('Not allowed by CORS'), false);\n }\n },\n credentials: true,\n ...rest,\n };\n}\n\n/**\n * Creates a CORS middleware function with the specified configuration.\n * This function creates a CORS middleware that can be used with both Express and NestJS applications,\n * applying the configured CORS options for origin validation and credential handling.\n *\n * @param options - CORS configuration options to apply to the middleware.\n * @returns A CORS middleware function ready to be used in Express or NestJS applications.\n */\nexport function createCors<T extends T_CorsType>(options: T_CorsOptions<T>) {\n return cors<cors.CorsRequest>(createCorsOptions(options));\n}\n\n/**\n * Creates a session middleware function with the specified configuration.\n * This function creates an Express session middleware that can be used to handle user sessions\n * with the provided session options including secret, cookie settings, and storage configuration.\n *\n * @param options - Session configuration options including secret, cookie settings, and storage.\n * @returns A session middleware function ready to be used in Express applications.\n */\nexport function createSession(options: SessionOptions): RequestHandler {\n if (!options.secret) {\n throw new Error('Session secret is required. Provide a strong secret string.');\n }\n\n if (!options.store && process.env['NODE_ENV'] === 'production') {\n console.warn('[Session] WARNING: No session store configured in production. The default MemoryStore leaks memory and loses sessions on restart. Use connect-redis, connect-mongo, or another production store.');\n }\n\n const secureDefaults: Partial<SessionOptions> = {\n resave: false,\n saveUninitialized: false,\n cookie: {\n httpOnly: true,\n sameSite: 'lax',\n secure: process.env['NODE_ENV'] === 'production',\n maxAge: 24 * 60 * 60 * 1000, // 24 hours\n },\n };\n\n return session({\n ...secureDefaults,\n ...options,\n cookie: { ...secureDefaults.cookie, ...options.cookie },\n });\n}\n\n/**\n * Sets up common middleware for Express applications.\n * This function configures essential middleware including:\n * - Trust proxy settings for proper IP handling\n * - Cookie parsing for request cookies\n * - URL-encoded body parsing for form data\n * - Compression for response optimization\n * - User agent parsing for device/browser detection\n *\n * @param app - The Express application instance to configure with middleware.\n * @param isDev - Whether the application is running in development mode.\n * @param jsonLimit - Maximum request body size for JSON payloads.\n * @param trustProxy - Trust proxy setting; pass a truthy value to enable.\n * @param rateLimitOptions - Rate limit configuration, or `false` to disable.\n */\nfunction setupMiddleware(\n app: Application,\n isDev = false,\n jsonLimit = '1mb',\n trustProxy: boolean | number | string | string[] = 1,\n rateLimitOptions: false | import('./express.type.js').I_RateLimitOptions = {},\n) {\n if (trustProxy) {\n app.set('trust proxy', trustProxy);\n }\n\n app.use(\n helmet({\n crossOriginEmbedderPolicy: isDev ? false : undefined,\n contentSecurityPolicy: isDev ? false : undefined,\n }),\n );\n\n if (rateLimitOptions !== false) {\n app.use(\n rateLimit({\n windowMs: rateLimitOptions.windowMs ?? 15 * 60 * 1000,\n limit: rateLimitOptions.limit ?? 1000,\n standardHeaders: true,\n legacyHeaders: false,\n ...(rateLimitOptions.store !== undefined && { store: rateLimitOptions.store }),\n ...(rateLimitOptions.skip !== undefined && { skip: rateLimitOptions.skip }),\n }),\n );\n }\n app.use(cookieParser());\n app.use(express.json({ limit: jsonLimit }));\n app.use(express.urlencoded({ extended: true, limit: jsonLimit }));\n app.use(compression());\n app.use(useragent());\n}\n\n/**\n * Sets up static file serving for Express applications.\n * This function configures static file serving for the specified folders,\n * making files in those directories accessible via HTTP requests.\n *\n * @param app - The Express application instance to configure with static file serving.\n * @param staticFolders - A string or array of strings representing the paths to serve statically.\n */\nfunction setupStaticFolders(app: Application, staticFolders?: string | string[]) {\n if (staticFolders) {\n const statics = Array.isArray(staticFolders) ? staticFolders : [staticFolders];\n statics.forEach((folder) => {\n app.use(`/${folder}`, express.static(folder));\n });\n }\n}\n\n/**\n * Creates and configures an Express application with common middleware and settings.\n * This function sets up a complete Express application with:\n * - Essential middleware (cookies, body parsing, compression, user agent)\n * - Static file serving for specified folders\n * - GraphQL upload support for file uploads\n *\n * @remarks\n * **Requires Express 5.x** — This module uses Express 5 APIs and is not compatible with Express 4.\n * The peer dependency requires `express >= 5.0.0`.\n *\n * @param options - Optional configuration for the Express application including static folder paths.\n * @returns A configured Express application instance ready for use.\n */\nexport function createExpress(options?: I_ExpressOptions): Application {\n const app = express();\n\n setupMiddleware(app, options?.isDev, options?.jsonLimit, options?.trustProxy, options?.rateLimit);\n setupStaticFolders(app, options?.static);\n const uploadMiddleware = graphqlUploadExpress({\n maxFileSize: options?.maxFileSize ?? 10_000_000,\n maxFiles: options?.maxFiles ?? 10,\n });\n app.use(options?.uploadPath ?? '/graphql', uploadMiddleware);\n\n return app;\n}\n\n/**\n * Creates and configures a NestJS application with Express integration.\n * This function sets up a NestJS application with:\n * - Express HTTP adapter configuration\n * - Common middleware (cookies, body parsing, compression, user agent)\n * - Static file serving for specified folders\n * - Global filters and pipes if provided\n *\n * @param options - Configuration options for the NestJS application including module, static folders, filters, and pipes.\n * @returns A promise that resolves to a configured NestJS application instance.\n */\nexport async function createNest(options: I_NestOptions): Promise<INestApplication> {\n const app = await NestFactory.create(options.module);\n\n setupMiddleware(app.getHttpAdapter().getInstance(), options.isDev, options.jsonLimit, options.trustProxy, options.rateLimit);\n setupStaticFolders(app.getHttpAdapter().getInstance(), options.static);\n\n if (options.filters) {\n app.useGlobalFilters(...options.filters);\n }\n\n if (options.pipes) {\n app.useGlobalPipes(...options.pipes);\n }\n\n return app;\n}\n\nexport { bodyParser, express };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"express.util.js","names":[],"sources":["../../../src/node/express/express.util.ts"],"sourcesContent":["import type { INestApplication } from '@nestjs/common';\nimport type { Application, RequestHandler } from 'express';\nimport type { SessionOptions } from 'express-session';\n\nimport { NestFactory } from '@nestjs/core';\nimport bodyParser from 'body-parser';\nimport compression from 'compression';\nimport cookieParser from 'cookie-parser';\nimport cors from 'cors';\nimport express from 'express';\nimport rateLimit from 'express-rate-limit';\nimport session from 'express-session';\nimport { express as useragent } from 'express-useragent';\nimport graphqlUploadExpress from 'graphql-upload/graphqlUploadExpress.mjs';\nimport helmet from 'helmet';\nimport process from 'node:process';\n\nimport type { I_ExpressOptions, I_NestOptions, T_CorsOptions, T_CorsType } from './express.type.js';\n\n/**\n * Creates CORS options with environment-specific configuration.\n * This function generates CORS options based on the development environment,\n * including whitelist configuration for allowed origins.\n *\n * @param options - CORS configuration options.\n * @param options.isDev - Whether the application is running in development mode.\n * @param options.whiteList - Array of allowed origins for CORS requests.\n * @returns CORS options object configured for the specified environment.\n */\nexport function createCorsOptions<T extends T_CorsType>({ isDev, whiteList, ...rest }: T_CorsOptions<T>) {\n // Safety net: warn loudly if isDev is mistakenly true in production\n if (isDev && process.env['NODE_ENV'] === 'production') {\n console.warn('[CORS] WARNING: isDev is true but NODE_ENV is \"production\". CORS restrictions are relaxed. This is likely a misconfiguration.');\n }\n\n return {\n origin: (origin: string | undefined, callback: (err: Error | null, allow?: boolean) => void) => {\n // Allow requests without Origin header only in development mode.\n // In production, undefined origin (e.g., curl, server-to-server) is rejected.\n if (isDev && !origin) {\n callback(null, true);\n return;\n }\n\n if (origin && whiteList?.includes(origin)) {\n callback(null, true);\n }\n else {\n callback(new Error('Not allowed by CORS'), false);\n }\n },\n credentials: true,\n ...rest,\n };\n}\n\n/**\n * Creates a CORS middleware function with the specified configuration.\n * This function creates a CORS middleware that can be used with both Express and NestJS applications,\n * applying the configured CORS options for origin validation and credential handling.\n *\n * @param options - CORS configuration options to apply to the middleware.\n * @returns A CORS middleware function ready to be used in Express or NestJS applications.\n */\nexport function createCors<T extends T_CorsType>(options: T_CorsOptions<T>) {\n return cors<cors.CorsRequest>(createCorsOptions(options));\n}\n\n/**\n * Creates a session middleware function with the specified configuration.\n * This function creates an Express session middleware that can be used to handle user sessions\n * with the provided session options including secret, cookie settings, and storage configuration.\n *\n * @remarks\n * **CSRF Warning:** This middleware sets `SameSite=Lax` by default, which mitigates but does NOT\n * fully prevent CSRF attacks for non-GET state-changing requests via top-level navigations.\n * Applications should integrate a dedicated CSRF token middleware (e.g., `csrf-csrf` or\n * `csrf-sync`) in addition to this session middleware for complete protection.\n *\n * @param options - Session configuration options including secret, cookie settings, and storage.\n * @returns A session middleware function ready to be used in Express applications.\n */\nexport function createSession(options: SessionOptions): RequestHandler {\n if (!options.secret) {\n throw new Error('Session secret is required. Provide a strong secret string.');\n }\n\n if (!options.store && process.env['NODE_ENV'] === 'production') {\n console.warn('[Session] WARNING: No session store configured in production. The default MemoryStore leaks memory and loses sessions on restart. Use connect-redis, connect-mongo, or another production store.');\n }\n\n const secureDefaults: Partial<SessionOptions> = {\n resave: false,\n saveUninitialized: false,\n cookie: {\n httpOnly: true,\n sameSite: 'lax',\n secure: process.env['NODE_ENV'] === 'production',\n maxAge: 24 * 60 * 60 * 1000, // 24 hours\n },\n };\n\n return session({\n ...secureDefaults,\n ...options,\n cookie: { ...secureDefaults.cookie, ...options.cookie },\n });\n}\n\n/**\n * Sets up common middleware for Express applications.\n * This function configures essential middleware including:\n * - Trust proxy settings for proper IP handling\n * - Cookie parsing for request cookies\n * - URL-encoded body parsing for form data\n * - Compression for response optimization\n * - User agent parsing for device/browser detection\n *\n * @param app - The Express application instance to configure with middleware.\n * @param isDev - Whether the application is running in development mode.\n * @param jsonLimit - Maximum request body size for JSON payloads.\n * @param trustProxy - Trust proxy setting; pass a truthy value to enable.\n * @param rateLimitOptions - Rate limit configuration, or `false` to disable.\n */\nfunction setupMiddleware(\n app: Application,\n isDev = false,\n jsonLimit = '1mb',\n trustProxy: boolean | number | string | string[] = 1,\n rateLimitOptions: false | import('./express.type.js').I_RateLimitOptions = {},\n) {\n if (trustProxy) {\n app.set('trust proxy', trustProxy);\n }\n\n app.use(\n helmet({\n crossOriginEmbedderPolicy: isDev ? false : undefined,\n contentSecurityPolicy: isDev ? false : undefined,\n }),\n );\n\n if (rateLimitOptions !== false) {\n app.use(\n rateLimit({\n windowMs: rateLimitOptions.windowMs ?? 15 * 60 * 1000,\n limit: rateLimitOptions.limit ?? 1000,\n standardHeaders: true,\n legacyHeaders: false,\n ...(rateLimitOptions.store !== undefined && { store: rateLimitOptions.store }),\n ...(rateLimitOptions.skip !== undefined && { skip: rateLimitOptions.skip }),\n }),\n );\n }\n app.use(cookieParser());\n app.use(express.json({ limit: jsonLimit }));\n app.use(express.urlencoded({ extended: true, limit: jsonLimit }));\n app.use(compression());\n app.use(useragent());\n}\n\n/**\n * Sets up static file serving for Express applications.\n * This function configures static file serving for the specified folders,\n * making files in those directories accessible via HTTP requests.\n *\n * @param app - The Express application instance to configure with static file serving.\n * @param staticFolders - A string or array of strings representing the paths to serve statically.\n */\nfunction setupStaticFolders(app: Application, staticFolders?: string | string[]) {\n if (staticFolders) {\n const statics = Array.isArray(staticFolders) ? staticFolders : [staticFolders];\n statics.forEach((folder) => {\n app.use(`/${folder}`, express.static(folder));\n });\n }\n}\n\n/**\n * Creates and configures an Express application with common middleware and settings.\n * This function sets up a complete Express application with:\n * - Essential middleware (cookies, body parsing, compression, user agent)\n * - Static file serving for specified folders\n * - GraphQL upload support for file uploads\n *\n * @remarks\n * **Requires Express 5.x** — This module uses Express 5 APIs and is not compatible with Express 4.\n * The peer dependency requires `express >= 5.0.0`.\n *\n * @param options - Optional configuration for the Express application including static folder paths.\n * @returns A configured Express application instance ready for use.\n */\nexport function createExpress(options?: I_ExpressOptions): Application {\n const app = express();\n\n setupMiddleware(app, options?.isDev, options?.jsonLimit, options?.trustProxy, options?.rateLimit);\n setupStaticFolders(app, options?.static);\n const uploadMiddleware = graphqlUploadExpress({\n maxFileSize: options?.maxFileSize ?? 10_000_000,\n maxFiles: options?.maxFiles ?? 10,\n });\n app.use(options?.uploadPath ?? '/graphql', uploadMiddleware);\n\n return app;\n}\n\n/**\n * Creates and configures a NestJS application with Express integration.\n * This function sets up a NestJS application with:\n * - Express HTTP adapter configuration\n * - Common middleware (cookies, body parsing, compression, user agent)\n * - Static file serving for specified folders\n * - Global filters and pipes if provided\n *\n * @param options - Configuration options for the NestJS application including module, static folders, filters, and pipes.\n * @returns A promise that resolves to a configured NestJS application instance.\n */\nexport async function createNest(options: I_NestOptions): Promise<INestApplication> {\n const app = await NestFactory.create(options.module);\n\n setupMiddleware(app.getHttpAdapter().getInstance(), options.isDev, options.jsonLimit, options.trustProxy, options.rateLimit);\n setupStaticFolders(app.getHttpAdapter().getInstance(), options.static);\n\n if (options.filters) {\n app.useGlobalFilters(...options.filters);\n }\n\n if (options.pipes) {\n app.useGlobalPipes(...options.pipes);\n }\n\n return app;\n}\n\nexport { bodyParser, express };\n"],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { I_Return } from '../../typescript/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Shared helper functions for MongoDB controllers.
|
|
4
|
+
*
|
|
5
|
+
* These helpers standardize response formatting and error patterns
|
|
6
|
+
* across both the Mongoose and native MongoDB controllers, reducing
|
|
7
|
+
* code duplication and ensuring consistency.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Creates a standardized success response wrapper.
|
|
11
|
+
*
|
|
12
|
+
* @param result - The operation result to wrap.
|
|
13
|
+
* @returns A standardized success response.
|
|
14
|
+
*/
|
|
15
|
+
export declare function wrapSuccess<T>(result: T): I_Return<T>;
|
|
16
|
+
/**
|
|
17
|
+
* Creates a standardized success response with a "truncated" flag.
|
|
18
|
+
*
|
|
19
|
+
* @param result - The operation result to wrap.
|
|
20
|
+
* @returns A standardized success response with truncated: true.
|
|
21
|
+
*/
|
|
22
|
+
export declare function wrapTruncated<T>(result: T): I_Return<T>;
|
|
23
|
+
/**
|
|
24
|
+
* Creates a standardized "not found" failure response.
|
|
25
|
+
*
|
|
26
|
+
* @param modelName - The model/collection name for the error message.
|
|
27
|
+
* @returns A standardized not-found failure response.
|
|
28
|
+
*/
|
|
29
|
+
export declare function wrapNotFound<T>(modelName: string): I_Return<T>;
|
|
30
|
+
/**
|
|
31
|
+
* Creates a standardized internal error failure response.
|
|
32
|
+
*
|
|
33
|
+
* @param message - The error message.
|
|
34
|
+
* @returns A standardized internal error failure response.
|
|
35
|
+
*/
|
|
36
|
+
export declare function wrapError<T>(message: string): I_Return<T>;
|
|
37
|
+
/**
|
|
38
|
+
* Creates a standardized "bad request" failure response.
|
|
39
|
+
*
|
|
40
|
+
* @param message - The error message.
|
|
41
|
+
* @returns A standardized bad request failure response.
|
|
42
|
+
*/
|
|
43
|
+
export declare function wrapBadRequest<T>(message: string): I_Return<T>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { RESPONSE_STATUS as e } from "../../constant/response-status.js";
|
|
2
|
+
//#region src/node/mongo/mongo.controller.helpers.ts
|
|
3
|
+
function t(t) {
|
|
4
|
+
return {
|
|
5
|
+
success: !1,
|
|
6
|
+
message: `${t} not found`,
|
|
7
|
+
code: e.NOT_FOUND.CODE
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function n(t) {
|
|
11
|
+
return {
|
|
12
|
+
success: !1,
|
|
13
|
+
message: t,
|
|
14
|
+
code: e.INTERNAL_SERVER_ERROR.CODE
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { n as wrapError, t as wrapNotFound };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=mongo.controller.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongo.controller.helpers.js","names":[],"sources":["../../../src/node/mongo/mongo.controller.helpers.ts"],"sourcesContent":["import type { I_Return } from '#typescript/index.js';\n\nimport { RESPONSE_STATUS } from '#constant/index.js';\n\n/**\n * Shared helper functions for MongoDB controllers.\n *\n * These helpers standardize response formatting and error patterns\n * across both the Mongoose and native MongoDB controllers, reducing\n * code duplication and ensuring consistency.\n */\n\n/**\n * Creates a standardized success response wrapper.\n *\n * @param result - The operation result to wrap.\n * @returns A standardized success response.\n */\nexport function wrapSuccess<T>(result: T): I_Return<T> {\n return {\n success: true,\n result,\n };\n}\n\n/**\n * Creates a standardized success response with a \"truncated\" flag.\n *\n * @param result - The operation result to wrap.\n * @returns A standardized success response with truncated: true.\n */\nexport function wrapTruncated<T>(result: T): I_Return<T> {\n return {\n success: true,\n result,\n truncated: true,\n };\n}\n\n/**\n * Creates a standardized \"not found\" failure response.\n *\n * @param modelName - The model/collection name for the error message.\n * @returns A standardized not-found failure response.\n */\nexport function wrapNotFound<T>(modelName: string): I_Return<T> {\n return {\n success: false,\n message: `${modelName} not found`,\n code: RESPONSE_STATUS.NOT_FOUND.CODE,\n };\n}\n\n/**\n * Creates a standardized internal error failure response.\n *\n * @param message - The error message.\n * @returns A standardized internal error failure response.\n */\nexport function wrapError<T>(message: string): I_Return<T> {\n return {\n success: false,\n message,\n code: RESPONSE_STATUS.INTERNAL_SERVER_ERROR.CODE,\n };\n}\n\n/**\n * Creates a standardized \"bad request\" failure response.\n *\n * @param message - The error message.\n * @returns A standardized bad request failure response.\n */\nexport function wrapBadRequest<T>(message: string): I_Return<T> {\n return {\n success: false,\n message,\n code: RESPONSE_STATUS.BAD_REQUEST.CODE,\n };\n}\n"],"mappings":";;AA6CA,SAAgB,EAAgB,GAAgC;AAC5D,QAAO;EACH,SAAS;EACT,SAAS,GAAG,EAAU;EACtB,MAAM,EAAgB,UAAU;EACnC;;AASL,SAAgB,EAAa,GAA8B;AACvD,QAAO;EACH,SAAS;EACT;EACA,MAAM,EAAgB,sBAAsB;EAC/C"}
|
|
@@ -1,159 +1,131 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { catchError as e, log as t } from "../log/log.util.js";
|
|
2
|
+
import { mongo as n } from "./mongo.util.js";
|
|
3
|
+
import { wrapError as r, wrapNotFound as i } from "./mongo.controller.helpers.js";
|
|
4
4
|
//#region src/node/mongo/mongo.controller.native.ts
|
|
5
|
-
var
|
|
5
|
+
var a = class {
|
|
6
6
|
collection;
|
|
7
7
|
defaultLimit;
|
|
8
8
|
collectionName;
|
|
9
9
|
constructor(e, t, n) {
|
|
10
10
|
this.collection = e.collection(t), this.collectionName = t, this.defaultLimit = n?.defaultLimit ?? 1e3;
|
|
11
11
|
}
|
|
12
|
-
async createOne(
|
|
12
|
+
async createOne(t) {
|
|
13
13
|
try {
|
|
14
|
-
let
|
|
15
|
-
...
|
|
16
|
-
...
|
|
14
|
+
let e = {
|
|
15
|
+
...n.createGenericFields(),
|
|
16
|
+
...t
|
|
17
17
|
};
|
|
18
|
-
return (await this.collection.insertOne(
|
|
18
|
+
return (await this.collection.insertOne(e)).acknowledged ? {
|
|
19
19
|
success: !0,
|
|
20
20
|
message: "Document created successfully",
|
|
21
|
-
result:
|
|
22
|
-
} :
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
code: e.INTERNAL_SERVER_ERROR.CODE
|
|
26
|
-
};
|
|
27
|
-
} catch (e) {
|
|
28
|
-
return t(e);
|
|
21
|
+
result: e
|
|
22
|
+
} : r("Document creation failed");
|
|
23
|
+
} catch (t) {
|
|
24
|
+
return e(t);
|
|
29
25
|
}
|
|
30
26
|
}
|
|
31
|
-
async createMany(
|
|
27
|
+
async createMany(t) {
|
|
32
28
|
try {
|
|
33
|
-
let
|
|
34
|
-
...
|
|
29
|
+
let e = t.map((e) => ({
|
|
30
|
+
...n.createGenericFields(),
|
|
35
31
|
...e
|
|
36
|
-
})), i = await this.collection.insertMany(
|
|
37
|
-
return i.insertedCount === 0 ? {
|
|
38
|
-
success: !1,
|
|
39
|
-
message: "No documents were inserted",
|
|
40
|
-
code: e.INTERNAL_SERVER_ERROR.CODE
|
|
41
|
-
} : {
|
|
32
|
+
})), i = await this.collection.insertMany(e);
|
|
33
|
+
return i.insertedCount === 0 ? r("No documents were inserted") : {
|
|
42
34
|
success: !0,
|
|
43
35
|
message: `${i.insertedCount} documents created successfully`,
|
|
44
|
-
result:
|
|
36
|
+
result: e
|
|
45
37
|
};
|
|
46
|
-
} catch (
|
|
47
|
-
return t
|
|
38
|
+
} catch (t) {
|
|
39
|
+
return e(t);
|
|
48
40
|
}
|
|
49
41
|
}
|
|
50
|
-
async findOne(
|
|
42
|
+
async findOne(t) {
|
|
51
43
|
try {
|
|
52
|
-
let
|
|
53
|
-
return
|
|
44
|
+
let e = await this.collection.findOne(t, { maxTimeMS: 3e4 });
|
|
45
|
+
return e ? {
|
|
54
46
|
success: !0,
|
|
55
47
|
message: "Document found",
|
|
56
|
-
result:
|
|
57
|
-
} :
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
code: e.NOT_FOUND.CODE
|
|
61
|
-
};
|
|
62
|
-
} catch (e) {
|
|
63
|
-
return t(e);
|
|
48
|
+
result: e
|
|
49
|
+
} : i("Document");
|
|
50
|
+
} catch (t) {
|
|
51
|
+
return e(t);
|
|
64
52
|
}
|
|
65
53
|
}
|
|
66
|
-
async findAll(
|
|
54
|
+
async findAll(n = {}) {
|
|
67
55
|
try {
|
|
68
|
-
let
|
|
69
|
-
return r &&
|
|
56
|
+
let e = await this.collection.find(n).limit(this.defaultLimit).maxTimeMS(3e4).toArray(), r = e.length === this.defaultLimit;
|
|
57
|
+
return r && t.warn(`[${this.collectionName}] findAll returned exactly ${this.defaultLimit} documents (the default limit). Results may be truncated. Consider using pagination or setting an explicit limit.`), {
|
|
70
58
|
success: !0,
|
|
71
59
|
message: "Documents retrieved successfully",
|
|
72
|
-
result:
|
|
60
|
+
result: e,
|
|
73
61
|
truncated: r
|
|
74
62
|
};
|
|
75
|
-
} catch (
|
|
76
|
-
return t
|
|
63
|
+
} catch (t) {
|
|
64
|
+
return e(t);
|
|
77
65
|
}
|
|
78
66
|
}
|
|
79
|
-
async count(
|
|
67
|
+
async count(t = {}) {
|
|
80
68
|
try {
|
|
81
|
-
let
|
|
69
|
+
let e = await this.collection.countDocuments(t);
|
|
82
70
|
return {
|
|
83
71
|
success: !0,
|
|
84
|
-
message: `${
|
|
85
|
-
result:
|
|
72
|
+
message: `${e} documents counted successfully`,
|
|
73
|
+
result: e
|
|
86
74
|
};
|
|
87
|
-
} catch (
|
|
88
|
-
return t
|
|
75
|
+
} catch (t) {
|
|
76
|
+
return e(t);
|
|
89
77
|
}
|
|
90
78
|
}
|
|
91
|
-
async updateOne(
|
|
79
|
+
async updateOne(t, n) {
|
|
92
80
|
try {
|
|
93
|
-
let
|
|
94
|
-
return
|
|
95
|
-
success: !1,
|
|
96
|
-
message: "No documents matched the filter",
|
|
97
|
-
code: e.NOT_FOUND.CODE
|
|
98
|
-
} : {
|
|
81
|
+
let e = await this.collection.updateOne(t, { $set: n });
|
|
82
|
+
return e.matchedCount === 0 ? i("No documents matched the filter") : {
|
|
99
83
|
success: !0,
|
|
100
84
|
message: "Document updated successfully",
|
|
101
|
-
result:
|
|
85
|
+
result: e
|
|
102
86
|
};
|
|
103
|
-
} catch (
|
|
104
|
-
return t
|
|
87
|
+
} catch (t) {
|
|
88
|
+
return e(t);
|
|
105
89
|
}
|
|
106
90
|
}
|
|
107
|
-
async updateMany(
|
|
91
|
+
async updateMany(t, n) {
|
|
108
92
|
try {
|
|
109
|
-
let
|
|
110
|
-
return
|
|
111
|
-
success: !1,
|
|
112
|
-
message: "No documents matched the filter",
|
|
113
|
-
code: e.NOT_FOUND.CODE
|
|
114
|
-
} : {
|
|
93
|
+
let e = await this.collection.updateMany(t, { $set: n });
|
|
94
|
+
return e.matchedCount === 0 ? i("No documents matched the filter") : {
|
|
115
95
|
success: !0,
|
|
116
96
|
message: "Documents updated successfully",
|
|
117
|
-
result:
|
|
97
|
+
result: e
|
|
118
98
|
};
|
|
119
|
-
} catch (
|
|
120
|
-
return t
|
|
99
|
+
} catch (t) {
|
|
100
|
+
return e(t);
|
|
121
101
|
}
|
|
122
102
|
}
|
|
123
|
-
async deleteOne(
|
|
103
|
+
async deleteOne(t) {
|
|
124
104
|
try {
|
|
125
|
-
let
|
|
126
|
-
return
|
|
127
|
-
success: !1,
|
|
128
|
-
message: "No documents matched the filter",
|
|
129
|
-
code: e.NOT_FOUND.CODE
|
|
130
|
-
} : {
|
|
105
|
+
let e = await this.collection.deleteOne(t);
|
|
106
|
+
return e.deletedCount === 0 ? i("No documents matched the filter") : {
|
|
131
107
|
success: !0,
|
|
132
108
|
message: "Document deleted successfully",
|
|
133
|
-
result:
|
|
109
|
+
result: e
|
|
134
110
|
};
|
|
135
|
-
} catch (
|
|
136
|
-
return t
|
|
111
|
+
} catch (t) {
|
|
112
|
+
return e(t);
|
|
137
113
|
}
|
|
138
114
|
}
|
|
139
|
-
async deleteMany(
|
|
115
|
+
async deleteMany(t) {
|
|
140
116
|
try {
|
|
141
|
-
let
|
|
142
|
-
return
|
|
143
|
-
success: !1,
|
|
144
|
-
message: "No documents matched the filter",
|
|
145
|
-
code: e.NOT_FOUND.CODE
|
|
146
|
-
} : {
|
|
117
|
+
let e = await this.collection.deleteMany(t);
|
|
118
|
+
return e.deletedCount === 0 ? i("No documents matched the filter") : {
|
|
147
119
|
success: !0,
|
|
148
120
|
message: "Documents deleted successfully",
|
|
149
|
-
result:
|
|
121
|
+
result: e
|
|
150
122
|
};
|
|
151
|
-
} catch (
|
|
152
|
-
return t
|
|
123
|
+
} catch (t) {
|
|
124
|
+
return e(t);
|
|
153
125
|
}
|
|
154
126
|
}
|
|
155
127
|
};
|
|
156
128
|
//#endregion
|
|
157
|
-
export {
|
|
129
|
+
export { a as MongoController };
|
|
158
130
|
|
|
159
131
|
//# sourceMappingURL=mongo.controller.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongo.controller.native.js","names":[],"sources":["../../../src/node/mongo/mongo.controller.native.ts"],"sourcesContent":["import type { I_Return } from '#typescript/index.js';\n\nimport { RESPONSE_STATUS } from '#constant/index.js';\n\nimport type { C_Collection, C_Db, C_Document, T_DeleteResult, T_Filter, T_OptionalUnlessRequiredId, T_UpdateResult, T_WithId } from './mongo.type.js';\n\nimport { catchError, log } from '../log/index.js';\nimport { mongo } from './mongo.util.js';\n\n/**\n * MongoDB native driver controller for direct database operations.\n * This class provides a simplified interface for MongoDB operations using the native driver,\n * with automatic generic field generation and standardized response formatting.\n *\n * @see I_MongoController for the shared polymorphic interface (use via type assertion when needed).\n */\nexport class MongoController<D extends Partial<C_Document>> {\n private collection: C_Collection<D>;\n private defaultLimit: number;\n private collectionName: string;\n\n /**\n * Creates a new MongoDB controller instance.\n *\n * @param db - The MongoDB database instance.\n * @param collectionName - The name of the collection to operate on.\n * @param options - Optional configuration for the controller.\n * @param options.defaultLimit - Maximum documents returned by findAll when no limit is specified (default: 1,000).\n */\n constructor(db: C_Db, collectionName: string, options?: { defaultLimit?: number }) {\n this.collection = db.collection<D>(collectionName);\n this.collectionName = collectionName;\n this.defaultLimit = options?.defaultLimit ?? 1_000;\n }\n\n /**\n * Creates a single document in the collection.\n * This method adds generic fields (id, isDel, timestamps) to the document before insertion.\n *\n * @param document - The document to create, with or without generic fields.\n * @returns A promise that resolves to a standardized response with the created document.\n */\n async createOne(document: D | Partial<D>): Promise<I_Return<D | Partial<D>>> {\n try {\n const finalDocument = {\n ...mongo.createGenericFields(),\n ...document,\n };\n\n const result = await this.collection.insertOne(finalDocument as unknown as T_OptionalUnlessRequiredId<D>);\n\n if (!result.acknowledged) {\n return {\n success: false,\n message: 'Document creation failed',\n code: RESPONSE_STATUS.INTERNAL_SERVER_ERROR.CODE,\n };\n }\n\n return {\n success: true,\n message: 'Document created successfully',\n result: finalDocument,\n };\n }\n catch (error) {\n return catchError<(D | Partial<D>)>(error);\n }\n }\n\n /**\n * Creates multiple documents in the collection.\n * This method adds generic fields to each document before bulk insertion.\n *\n * @param documents - An array of documents to create.\n * @returns A promise that resolves to a standardized response with the created documents.\n */\n async createMany(documents: (D | Partial<D>)[]): Promise<I_Return<(D | Partial<D>)[]>> {\n try {\n const finalDocuments = documents.map(document => ({\n ...mongo.createGenericFields(),\n ...document,\n }));\n\n const result = await this.collection.insertMany(finalDocuments as unknown as T_OptionalUnlessRequiredId<D>[]);\n\n if (result.insertedCount === 0) {\n return {\n success: false,\n message: 'No documents were inserted',\n code: RESPONSE_STATUS.INTERNAL_SERVER_ERROR.CODE,\n };\n }\n\n return {\n success: true,\n message: `${result.insertedCount} documents created successfully`,\n result: finalDocuments,\n };\n }\n catch (error) {\n return catchError<(D | Partial<D>)[]>(error);\n }\n }\n\n /**\n * Finds a single document by filter criteria.\n *\n * @param filter - The filter criteria to find the document.\n * @returns A promise that resolves to a standardized response with the found document.\n */\n async findOne(filter: T_Filter<D>): Promise<I_Return<T_WithId<D>>> {\n try {\n const result = await this.collection.findOne(filter, { maxTimeMS: 30_000 });\n\n if (!result) {\n return { success: false, message: 'Document not found', code: RESPONSE_STATUS.NOT_FOUND.CODE };\n }\n\n return { success: true, message: 'Document found', result };\n }\n catch (error) {\n return catchError<T_WithId<D>>(error);\n }\n }\n\n /**\n * Finds all documents matching the filter criteria.\n *\n * @param filter - The filter criteria to find documents (defaults to empty object for all documents).\n * @returns A promise that resolves to a standardized response with the found documents.\n */\n async findAll(\n filter: T_Filter<D> = {},\n ): Promise<I_Return<T_WithId<D>[]>> {\n try {\n const result = await this.collection.find(filter).limit(this.defaultLimit).maxTimeMS(30_000).toArray();\n\n const truncated = result.length === this.defaultLimit;\n\n if (truncated) {\n log.warn(`[${this.collectionName}] findAll returned exactly ${this.defaultLimit} documents (the default limit). Results may be truncated. Consider using pagination or setting an explicit limit.`);\n }\n\n return {\n success: true,\n message: 'Documents retrieved successfully',\n result,\n truncated,\n };\n }\n catch (error) {\n return catchError<T_WithId<D>[]>(error);\n }\n }\n\n /**\n * Counts documents matching the filter criteria.\n *\n * @param filter - The filter criteria to count documents (defaults to empty object for all documents).\n * @returns A promise that resolves to a standardized response with the document count.\n */\n async count(\n filter: T_Filter<D> = {},\n ): Promise<I_Return<number>> {\n try {\n const result = await this.collection.countDocuments(filter);\n\n return {\n success: true,\n message: `${result} documents counted successfully`,\n result,\n };\n }\n catch (error) {\n return catchError<number>(error);\n }\n }\n\n /**\n * Updates a single document matching the filter criteria.\n *\n * @param filter - The filter criteria to find the document to update.\n * @param update - The update data to apply to the document.\n * @returns A promise that resolves to a standardized response with the update result.\n */\n async updateOne(\n filter: T_Filter<D>,\n update: Partial<D>,\n ): Promise<I_Return<T_UpdateResult>> {\n try {\n const result = await this.collection.updateOne(filter, {\n $set: update,\n });\n\n if (result.matchedCount === 0) {\n return {\n success: false,\n message: 'No documents matched the filter',\n code: RESPONSE_STATUS.NOT_FOUND.CODE,\n };\n }\n return {\n success: true,\n message: 'Document updated successfully',\n result,\n };\n }\n catch (error) {\n return catchError<T_UpdateResult>(error);\n }\n }\n\n /**\n * Updates multiple documents matching the filter criteria.\n *\n * @param filter - The filter criteria to find documents to update.\n * @param update - The update data to apply to the documents.\n * @returns A promise that resolves to a standardized response with the update result.\n */\n async updateMany(\n filter: T_Filter<D>,\n update: Partial<D>,\n ): Promise<I_Return<T_UpdateResult>> {\n try {\n const result = await this.collection.updateMany(filter, {\n $set: update,\n });\n\n if (result.matchedCount === 0) {\n return {\n success: false,\n message: 'No documents matched the filter',\n code: RESPONSE_STATUS.NOT_FOUND.CODE,\n };\n }\n\n return {\n success: true,\n message: 'Documents updated successfully',\n result,\n };\n }\n catch (error) {\n return catchError<T_UpdateResult>(error);\n }\n }\n\n /**\n * Deletes a single document matching the filter criteria.\n *\n * @param filter - The filter criteria to find the document to delete.\n * @returns A promise that resolves to a standardized response with the delete result.\n */\n async deleteOne(\n filter: T_Filter<D>,\n ): Promise<I_Return<T_DeleteResult>> {\n try {\n const result = await this.collection.deleteOne(filter);\n\n if (result.deletedCount === 0) {\n return {\n success: false,\n message: 'No documents matched the filter',\n code: RESPONSE_STATUS.NOT_FOUND.CODE,\n };\n }\n return {\n success: true,\n message: 'Document deleted successfully',\n result,\n };\n }\n catch (error) {\n return catchError<T_DeleteResult>(error);\n }\n }\n\n /**\n * Deletes multiple documents matching the filter criteria.\n *\n * @param filter - The filter criteria to find documents to delete.\n * @returns A promise that resolves to a standardized response with the delete result.\n */\n async deleteMany(\n filter: T_Filter<D>,\n ): Promise<I_Return<T_DeleteResult>> {\n try {\n const result = await this.collection.deleteMany(filter);\n\n if (result.deletedCount === 0) {\n return {\n success: false,\n message: 'No documents matched the filter',\n code: RESPONSE_STATUS.NOT_FOUND.CODE,\n };\n }\n\n return {\n success: true,\n message: 'Documents deleted successfully',\n result,\n };\n }\n catch (error) {\n return catchError<T_DeleteResult>(error);\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mongo.controller.native.js","names":[],"sources":["../../../src/node/mongo/mongo.controller.native.ts"],"sourcesContent":["import type { I_Return } from '#typescript/index.js';\n\nimport type { C_Collection, C_Db, C_Document, T_DeleteResult, T_Filter, T_OptionalUnlessRequiredId, T_UpdateResult, T_WithId } from './mongo.type.js';\n\nimport { catchError, log } from '../log/index.js';\nimport { wrapError, wrapNotFound } from './mongo.controller.helpers.js';\nimport { mongo } from './mongo.util.js';\n\n/**\n * MongoDB native driver controller for direct database operations.\n * This class provides a simplified interface for MongoDB operations using the native driver,\n * with automatic generic field generation and standardized response formatting.\n *\n * @see I_MongoController for the shared polymorphic interface (use via type assertion when needed).\n */\nexport class MongoController<D extends Partial<C_Document>> {\n private collection: C_Collection<D>;\n private defaultLimit: number;\n private collectionName: string;\n\n /**\n * Creates a new MongoDB controller instance.\n *\n * @param db - The MongoDB database instance.\n * @param collectionName - The name of the collection to operate on.\n * @param options - Optional configuration for the controller.\n * @param options.defaultLimit - Maximum documents returned by findAll when no limit is specified (default: 1,000).\n */\n constructor(db: C_Db, collectionName: string, options?: { defaultLimit?: number }) {\n this.collection = db.collection<D>(collectionName);\n this.collectionName = collectionName;\n this.defaultLimit = options?.defaultLimit ?? 1_000;\n }\n\n /**\n * Creates a single document in the collection.\n * This method adds generic fields (id, isDel, timestamps) to the document before insertion.\n *\n * @param document - The document to create, with or without generic fields.\n * @returns A promise that resolves to a standardized response with the created document.\n */\n async createOne(document: D | Partial<D>): Promise<I_Return<D | Partial<D>>> {\n try {\n const finalDocument = {\n ...mongo.createGenericFields(),\n ...document,\n };\n\n const result = await this.collection.insertOne(finalDocument as unknown as T_OptionalUnlessRequiredId<D>);\n\n if (!result.acknowledged) {\n return wrapError('Document creation failed');\n }\n\n return {\n success: true,\n message: 'Document created successfully',\n result: finalDocument,\n };\n }\n catch (error) {\n return catchError<(D | Partial<D>)>(error);\n }\n }\n\n /**\n * Creates multiple documents in the collection.\n * This method adds generic fields to each document before bulk insertion.\n *\n * @param documents - An array of documents to create.\n * @returns A promise that resolves to a standardized response with the created documents.\n */\n async createMany(documents: (D | Partial<D>)[]): Promise<I_Return<(D | Partial<D>)[]>> {\n try {\n const finalDocuments = documents.map(document => ({\n ...mongo.createGenericFields(),\n ...document,\n }));\n\n const result = await this.collection.insertMany(finalDocuments as unknown as T_OptionalUnlessRequiredId<D>[]);\n\n if (result.insertedCount === 0) {\n return wrapError('No documents were inserted');\n }\n\n return {\n success: true,\n message: `${result.insertedCount} documents created successfully`,\n result: finalDocuments,\n };\n }\n catch (error) {\n return catchError<(D | Partial<D>)[]>(error);\n }\n }\n\n /**\n * Finds a single document by filter criteria.\n *\n * @param filter - The filter criteria to find the document.\n * @returns A promise that resolves to a standardized response with the found document.\n */\n async findOne(filter: T_Filter<D>): Promise<I_Return<T_WithId<D>>> {\n try {\n const result = await this.collection.findOne(filter, { maxTimeMS: 30_000 });\n\n if (!result) {\n return wrapNotFound('Document');\n }\n\n return { success: true, message: 'Document found', result };\n }\n catch (error) {\n return catchError<T_WithId<D>>(error);\n }\n }\n\n /**\n * Finds all documents matching the filter criteria.\n *\n * @param filter - The filter criteria to find documents (defaults to empty object for all documents).\n * @returns A promise that resolves to a standardized response with the found documents.\n */\n async findAll(\n filter: T_Filter<D> = {},\n ): Promise<I_Return<T_WithId<D>[]>> {\n try {\n const result = await this.collection.find(filter).limit(this.defaultLimit).maxTimeMS(30_000).toArray();\n\n const truncated = result.length === this.defaultLimit;\n\n if (truncated) {\n log.warn(`[${this.collectionName}] findAll returned exactly ${this.defaultLimit} documents (the default limit). Results may be truncated. Consider using pagination or setting an explicit limit.`);\n }\n\n return {\n success: true,\n message: 'Documents retrieved successfully',\n result,\n truncated,\n };\n }\n catch (error) {\n return catchError<T_WithId<D>[]>(error);\n }\n }\n\n /**\n * Counts documents matching the filter criteria.\n *\n * @param filter - The filter criteria to count documents (defaults to empty object for all documents).\n * @returns A promise that resolves to a standardized response with the document count.\n */\n async count(\n filter: T_Filter<D> = {},\n ): Promise<I_Return<number>> {\n try {\n const result = await this.collection.countDocuments(filter);\n\n return {\n success: true,\n message: `${result} documents counted successfully`,\n result,\n };\n }\n catch (error) {\n return catchError<number>(error);\n }\n }\n\n /**\n * Updates a single document matching the filter criteria.\n *\n * @param filter - The filter criteria to find the document to update.\n * @param update - The update data to apply to the document.\n * @returns A promise that resolves to a standardized response with the update result.\n */\n async updateOne(\n filter: T_Filter<D>,\n update: Partial<D>,\n ): Promise<I_Return<T_UpdateResult>> {\n try {\n const result = await this.collection.updateOne(filter, {\n $set: update,\n });\n\n if (result.matchedCount === 0) {\n return wrapNotFound('No documents matched the filter');\n }\n return {\n success: true,\n message: 'Document updated successfully',\n result,\n };\n }\n catch (error) {\n return catchError<T_UpdateResult>(error);\n }\n }\n\n /**\n * Updates multiple documents matching the filter criteria.\n *\n * @param filter - The filter criteria to find documents to update.\n * @param update - The update data to apply to the documents.\n * @returns A promise that resolves to a standardized response with the update result.\n */\n async updateMany(\n filter: T_Filter<D>,\n update: Partial<D>,\n ): Promise<I_Return<T_UpdateResult>> {\n try {\n const result = await this.collection.updateMany(filter, {\n $set: update,\n });\n\n if (result.matchedCount === 0) {\n return wrapNotFound('No documents matched the filter');\n }\n\n return {\n success: true,\n message: 'Documents updated successfully',\n result,\n };\n }\n catch (error) {\n return catchError<T_UpdateResult>(error);\n }\n }\n\n /**\n * Deletes a single document matching the filter criteria.\n *\n * @param filter - The filter criteria to find the document to delete.\n * @returns A promise that resolves to a standardized response with the delete result.\n */\n async deleteOne(\n filter: T_Filter<D>,\n ): Promise<I_Return<T_DeleteResult>> {\n try {\n const result = await this.collection.deleteOne(filter);\n\n if (result.deletedCount === 0) {\n return wrapNotFound('No documents matched the filter');\n }\n return {\n success: true,\n message: 'Document deleted successfully',\n result,\n };\n }\n catch (error) {\n return catchError<T_DeleteResult>(error);\n }\n }\n\n /**\n * Deletes multiple documents matching the filter criteria.\n *\n * @param filter - The filter criteria to find documents to delete.\n * @returns A promise that resolves to a standardized response with the delete result.\n */\n async deleteMany(\n filter: T_Filter<D>,\n ): Promise<I_Return<T_DeleteResult>> {\n try {\n const result = await this.collection.deleteMany(filter);\n\n if (result.deletedCount === 0) {\n return wrapNotFound('No documents matched the filter');\n }\n\n return {\n success: true,\n message: 'Documents deleted successfully',\n result,\n };\n }\n catch (error) {\n return catchError<T_DeleteResult>(error);\n }\n }\n}\n"],"mappings":"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"}
|