@cyberskill/shared 3.9.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.
Files changed (52) hide show
  1. package/dist/config/env/env.util.js.map +1 -1
  2. package/dist/config/lint-staged/index.js +1 -1
  3. package/dist/config/lint-staged/index.js.map +1 -1
  4. package/dist/config/vitest/vitest.e2e.js +1 -1
  5. package/dist/config/vitest/vitest.unit.js +1 -1
  6. package/dist/constant/response-status.d.ts +4 -0
  7. package/dist/constant/response-status.js.map +1 -1
  8. package/dist/node/express/express.util.d.ts +6 -0
  9. package/dist/node/express/express.util.js +3 -4
  10. package/dist/node/express/express.util.js.map +1 -1
  11. package/dist/node/fs/fs.util.js +14 -14
  12. package/dist/node/mongo/index.js +5 -5
  13. package/dist/node/mongo/mongo.controller.helpers.d.ts +43 -0
  14. package/dist/node/mongo/mongo.controller.helpers.js +20 -0
  15. package/dist/node/mongo/mongo.controller.helpers.js.map +1 -0
  16. package/dist/node/mongo/mongo.controller.mongoose.js +86 -85
  17. package/dist/node/mongo/mongo.controller.mongoose.js.map +1 -1
  18. package/dist/node/mongo/mongo.controller.native.js +65 -93
  19. package/dist/node/mongo/mongo.controller.native.js.map +1 -1
  20. package/dist/node/mongo/mongo.dynamic-populate.d.ts +0 -4
  21. package/dist/node/mongo/mongo.dynamic-populate.js +14 -17
  22. package/dist/node/mongo/mongo.dynamic-populate.js.map +1 -1
  23. package/dist/node/mongo/mongo.util.js +2 -0
  24. package/dist/node/mongo/mongo.util.js.map +1 -1
  25. package/dist/node/storage/index.js +3 -3
  26. package/dist/node/storage/storage.constant.d.ts +0 -3
  27. package/dist/node/storage/storage.constant.js +2 -2
  28. package/dist/node/storage/storage.constant.js.map +1 -1
  29. package/dist/node/storage/storage.type.d.ts +0 -11
  30. package/dist/node/storage/storage.util.d.ts +1 -1
  31. package/dist/node/storage/storage.util.js +65 -67
  32. package/dist/node/storage/storage.util.js.map +1 -1
  33. package/dist/node/upload/upload.type.d.ts +2 -0
  34. package/dist/node/upload/upload.type.js.map +1 -1
  35. package/dist/node/upload/upload.util.js +42 -28
  36. package/dist/node/upload/upload.util.js.map +1 -1
  37. 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
  38. 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.0_@types_nod_53aa4254f295b3c40bb8f17b6ab226b5 → 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
  39. package/dist/react/storage/storage.hook.d.ts +1 -1
  40. package/dist/react/storage/storage.hook.js.map +1 -1
  41. package/dist/react/storage/storage.util.d.ts +6 -7
  42. package/dist/react/storage/storage.util.js +15 -10
  43. package/dist/react/storage/storage.util.js.map +1 -1
  44. package/dist/util/common/common.util.d.ts +15 -2
  45. package/dist/util/common/common.util.js +22 -9
  46. package/dist/util/common/common.util.js.map +1 -1
  47. package/dist/util/common/index.js +2 -2
  48. package/dist/util/index.js +7 -7
  49. package/dist/util/object/object.util.d.ts +7 -3
  50. package/dist/util/object/object.util.js.map +1 -1
  51. package/package.json +11 -12
  52. 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.0_@types_nod_53aa4254f295b3c40bb8f17b6ab226b5/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 // @ts-expect-error ignore type error\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;AAE1B,CAAI,EAAQ,IAAI,aAAa,EAAc,cAAc,CAAC,MACtD,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
+ {"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,6 +1,6 @@
1
1
  //#region src/config/lint-staged/index.ts
2
2
  var e = {
3
- "*.ts": () => "tsc --noEmit",
3
+ "*.ts": () => "tsc --noEmit --incremental",
4
4
  "*": ["eslint --fix --no-cache"]
5
5
  };
6
6
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/config/lint-staged/index.ts"],"sourcesContent":["export default {\n '*.ts': () => 'tsc --noEmit',\n '*': ['eslint --fix --no-cache'],\n};\n"],"mappings":";AAAA,IAAA,IAAe;CACX,cAAc;CACd,KAAK,CAAC,0BAA0B;CACnC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/config/lint-staged/index.ts"],"sourcesContent":["export default {\n '*.ts': () => 'tsc --noEmit --incremental',\n '*': ['eslint --fix --no-cache'],\n};\n"],"mappings":";AAAA,IAAA,IAAe;CACX,cAAc;CACd,KAAK,CAAC,0BAA0B;CACnC"}
@@ -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.0_@noble_hashes@1.8.0__vite@8.0.0_@types_nod_53aa4254f295b3c40bb8f17b6ab226b5/node_modules/vitest/dist/config.js";
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.0_@noble_hashes@1.8.0__vite@8.0.0_@types_nod_53aa4254f295b3c40bb8f17b6ab226b5/node_modules/vitest/dist/config.js";
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
  */
@@ -49,8 +49,8 @@ function m(t) {
49
49
  }
50
50
  });
51
51
  }
52
- function h(e, n = !1, r = "1mb", o = !1, c = {}) {
53
- o !== !1 && e.set("trust proxy", o), e.use(d({
52
+ function h(e, n = !1, r = "1mb", o = 1, c = {}) {
53
+ o && e.set("trust proxy", o), e.use(d({
54
54
  crossOriginEmbedderPolicy: n ? !1 : void 0,
55
55
  contentSecurityPolicy: n ? !1 : void 0
56
56
  })), c !== !1 && e.use(s({
@@ -59,8 +59,7 @@ function h(e, n = !1, r = "1mb", o = !1, c = {}) {
59
59
  standardHeaders: !0,
60
60
  legacyHeaders: !1,
61
61
  ...c.store !== void 0 && { store: c.store },
62
- ...c.skip !== void 0 && { skip: c.skip },
63
- ...!o && { validate: { xForwardedForHeader: !1 } }
62
+ ...c.skip !== void 0 && { skip: c.skip }
64
63
  })), e.use(a()), e.use(t.json({ limit: r })), e.use(t.urlencoded({
65
64
  extended: !0,
66
65
  limit: r
@@ -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[] = false,\n rateLimitOptions: false | import('./express.type.js').I_RateLimitOptions = {},\n) {\n if (trustProxy !== false) {\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 // When trustProxy is not explicitly set, suppress the\n // ERR_ERL_UNEXPECTED_X_FORWARDED_FOR validation that crashes on\n // X-Forwarded-For headers behind a reverse proxy.\n ...(!trustProxy && { validate: { xForwardedForHeader: false } }),\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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"}
@@ -1,25 +1,25 @@
1
- import e from "fs-extra";
2
- import t from "node:path";
1
+ import e from "node:path";
2
+ import t from "fs-extra";
3
3
  //#region src/node/fs/fs.util.ts
4
- var n = e, { lstatSync: r, readdirSync: i, mkdirSync: a, readFileSync: o, unlinkSync: s, statSync: c, createWriteStream: l } = e, u = e.readJsonSync;
5
- function d(t, n, r) {
6
- e.writeFileSync(t, n, r ?? "utf-8");
4
+ var n = t, { lstatSync: r, readdirSync: i, mkdirSync: a, readFileSync: o, unlinkSync: s, statSync: c, createWriteStream: l } = t, u = t.readJsonSync;
5
+ function d(e, n, r) {
6
+ t.writeFileSync(e, n, r ?? "utf-8");
7
7
  }
8
- function f(t, n, r) {
9
- e.appendFileSync(t, n, r ?? "utf-8");
8
+ function f(e, n, r) {
9
+ t.appendFileSync(e, n, r ?? "utf-8");
10
10
  }
11
- function p(...t) {
12
- return t.every((t) => e.pathExistsSync(t));
11
+ function p(...e) {
12
+ return e.every((e) => t.pathExistsSync(e));
13
13
  }
14
- function m(...t) {
15
- t.forEach((t) => {
16
- p(t) && e.removeSync(t);
14
+ function m(...e) {
15
+ e.forEach((e) => {
16
+ p(e) && t.removeSync(e);
17
17
  });
18
18
  }
19
19
  function h(n, r, i = {}) {
20
20
  let { extensions: a, ...o } = i;
21
- e.copySync(n, r, {
22
- filter: (e) => c(e).isDirectory() || !a || a.length === 0 ? !0 : a.includes(t.extname(e)),
21
+ t.copySync(n, r, {
22
+ filter: (t) => c(t).isDirectory() || !a || a.length === 0 ? !0 : a.includes(e.extname(t)),
23
23
  ...o
24
24
  });
25
25
  }
@@ -1,8 +1,8 @@
1
1
  import { MONGO_MIGRATE_OPTIONS as e, MONGO_SLUG_MAX_ATTEMPTS as t } from "./mongo.constant.js";
2
2
  import { convertEnumToModelName as n, mongo as r } from "./mongo.util.js";
3
3
  import { applyNestedPopulate as i } from "./mongo.populate.js";
4
- import { filterDynamicVirtualsFromPopulate as a, isMongooseDoc as o, isObject as s, populateDynamicVirtuals as c, remapDynamicPopulate as l } from "./mongo.dynamic-populate.js";
5
- import { MongooseController as u } from "./mongo.controller.mongoose.js";
6
- import { MongoController as d } from "./mongo.controller.native.js";
7
- import { C_Collection as f, C_Db as p, C_Document as m, C_Model as h } from "./mongo.type.js";
8
- export { f as C_Collection, p as C_Db, m as C_Document, h as C_Model, e as MONGO_MIGRATE_OPTIONS, t as MONGO_SLUG_MAX_ATTEMPTS, d as MongoController, u as MongooseController, i as applyNestedPopulate, n as convertEnumToModelName, a as filterDynamicVirtualsFromPopulate, o as isMongooseDoc, s as isObject, r as mongo, c as populateDynamicVirtuals, l as remapDynamicPopulate };
4
+ import { filterDynamicVirtualsFromPopulate as a, isMongooseDoc as o, populateDynamicVirtuals as s, remapDynamicPopulate as c } from "./mongo.dynamic-populate.js";
5
+ import { MongooseController as l } from "./mongo.controller.mongoose.js";
6
+ import { MongoController as u } from "./mongo.controller.native.js";
7
+ import { C_Collection as d, C_Db as f, C_Document as p, C_Model as m } from "./mongo.type.js";
8
+ export { d as C_Collection, f as C_Db, p as C_Document, m as C_Model, e as MONGO_MIGRATE_OPTIONS, t as MONGO_SLUG_MAX_ATTEMPTS, u as MongoController, l as MongooseController, i as applyNestedPopulate, n as convertEnumToModelName, a as filterDynamicVirtualsFromPopulate, o as isMongooseDoc, r as mongo, s as populateDynamicVirtuals, c as remapDynamicPopulate };
@@ -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"}