expressed-core 1.0.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/README-es.md +42 -0
- package/README-es.md.backup +44 -0
- package/README.md +41 -0
- package/README.md.backup +43 -0
- package/hooked/LICENSE +204 -0
- package/hooked/README.es.md +238 -0
- package/hooked/README.md +238 -0
- package/hooked/advanced-example.js +240 -0
- package/hooked/express-hooked.js +206 -0
- package/hooked/hooks.js +584 -0
- package/hooked/package.json +30 -0
- package/index.js +25 -0
- package/package.json +36 -0
- package/queued/LICENSE +201 -0
- package/queued/QueueSystem.js +451 -0
- package/queued/README.es.md +335 -0
- package/queued/README.md +335 -0
- package/queued/express-example.js +143 -0
- package/queued/express-integration.js +115 -0
- package/queued/package.json +33 -0
- package/router/ExpressRouter.js +247 -0
- package/router/ExpressRouterIntegration.js +129 -0
- package/router/LICENSE +201 -0
- package/router/README.es.md +142 -0
- package/router/README.md +142 -0
- package/router/RouteDirectoryLoader.js +299 -0
- package/router/RouteLoader.js +245 -0
- package/router/RouteMatcher.js +361 -0
- package/router/node_modules/.package-lock.json +876 -0
- package/router/node_modules/accepts/HISTORY.md +243 -0
- package/router/node_modules/accepts/LICENSE +23 -0
- package/router/node_modules/accepts/README.md +140 -0
- package/router/node_modules/accepts/index.js +238 -0
- package/router/node_modules/accepts/package.json +47 -0
- package/router/node_modules/array-flatten/LICENSE +21 -0
- package/router/node_modules/array-flatten/README.md +43 -0
- package/router/node_modules/array-flatten/array-flatten.js +64 -0
- package/router/node_modules/array-flatten/package.json +39 -0
- package/router/node_modules/body-parser/HISTORY.md +680 -0
- package/router/node_modules/body-parser/LICENSE +23 -0
- package/router/node_modules/body-parser/README.md +476 -0
- package/router/node_modules/body-parser/index.js +156 -0
- package/router/node_modules/body-parser/lib/read.js +205 -0
- package/router/node_modules/body-parser/lib/types/json.js +247 -0
- package/router/node_modules/body-parser/lib/types/raw.js +101 -0
- package/router/node_modules/body-parser/lib/types/text.js +121 -0
- package/router/node_modules/body-parser/lib/types/urlencoded.js +300 -0
- package/router/node_modules/body-parser/package.json +55 -0
- package/router/node_modules/bytes/History.md +97 -0
- package/router/node_modules/bytes/LICENSE +23 -0
- package/router/node_modules/bytes/Readme.md +152 -0
- package/router/node_modules/bytes/index.js +170 -0
- package/router/node_modules/bytes/package.json +42 -0
- package/router/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
- package/router/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
- package/router/node_modules/call-bind-apply-helpers/LICENSE +21 -0
- package/router/node_modules/call-bind-apply-helpers/README.md +62 -0
- package/router/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
- package/router/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
- package/router/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
- package/router/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
- package/router/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
- package/router/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
- package/router/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
- package/router/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
- package/router/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
- package/router/node_modules/call-bind-apply-helpers/index.js +15 -0
- package/router/node_modules/call-bind-apply-helpers/package.json +85 -0
- package/router/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
- package/router/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
- package/router/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
- package/router/node_modules/call-bound/.github/FUNDING.yml +12 -0
- package/router/node_modules/call-bound/CHANGELOG.md +42 -0
- package/router/node_modules/call-bound/LICENSE +21 -0
- package/router/node_modules/call-bound/README.md +53 -0
- package/router/node_modules/call-bound/index.d.ts +94 -0
- package/router/node_modules/call-bound/index.js +19 -0
- package/router/node_modules/call-bound/package.json +99 -0
- package/router/node_modules/call-bound/tsconfig.json +10 -0
- package/router/node_modules/content-disposition/HISTORY.md +60 -0
- package/router/node_modules/content-disposition/LICENSE +22 -0
- package/router/node_modules/content-disposition/README.md +142 -0
- package/router/node_modules/content-disposition/index.js +458 -0
- package/router/node_modules/content-disposition/package.json +44 -0
- package/router/node_modules/content-type/HISTORY.md +29 -0
- package/router/node_modules/content-type/LICENSE +22 -0
- package/router/node_modules/content-type/README.md +94 -0
- package/router/node_modules/content-type/index.js +225 -0
- package/router/node_modules/content-type/package.json +42 -0
- package/router/node_modules/cookie/LICENSE +24 -0
- package/router/node_modules/cookie/README.md +317 -0
- package/router/node_modules/cookie/SECURITY.md +25 -0
- package/router/node_modules/cookie/index.js +335 -0
- package/router/node_modules/cookie/package.json +44 -0
- package/router/node_modules/cookie-signature/History.md +42 -0
- package/router/node_modules/cookie-signature/Readme.md +42 -0
- package/router/node_modules/cookie-signature/index.js +51 -0
- package/router/node_modules/cookie-signature/package.json +18 -0
- package/router/node_modules/debug/.coveralls.yml +1 -0
- package/router/node_modules/debug/CHANGELOG.md +362 -0
- package/router/node_modules/debug/LICENSE +19 -0
- package/router/node_modules/debug/Makefile +50 -0
- package/router/node_modules/debug/README.md +312 -0
- package/router/node_modules/debug/component.json +19 -0
- package/router/node_modules/debug/karma.conf.js +70 -0
- package/router/node_modules/debug/node.js +1 -0
- package/router/node_modules/debug/package.json +49 -0
- package/router/node_modules/debug/src/browser.js +185 -0
- package/router/node_modules/debug/src/debug.js +202 -0
- package/router/node_modules/debug/src/index.js +10 -0
- package/router/node_modules/debug/src/inspector-log.js +15 -0
- package/router/node_modules/debug/src/node.js +248 -0
- package/router/node_modules/depd/History.md +103 -0
- package/router/node_modules/depd/LICENSE +22 -0
- package/router/node_modules/depd/Readme.md +280 -0
- package/router/node_modules/depd/index.js +538 -0
- package/router/node_modules/depd/lib/browser/index.js +77 -0
- package/router/node_modules/depd/package.json +45 -0
- package/router/node_modules/destroy/LICENSE +23 -0
- package/router/node_modules/destroy/README.md +63 -0
- package/router/node_modules/destroy/index.js +209 -0
- package/router/node_modules/destroy/package.json +48 -0
- package/router/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
- package/router/node_modules/dunder-proto/CHANGELOG.md +24 -0
- package/router/node_modules/dunder-proto/LICENSE +21 -0
- package/router/node_modules/dunder-proto/README.md +54 -0
- package/router/node_modules/dunder-proto/get.d.ts +5 -0
- package/router/node_modules/dunder-proto/get.js +30 -0
- package/router/node_modules/dunder-proto/package.json +76 -0
- package/router/node_modules/dunder-proto/set.d.ts +5 -0
- package/router/node_modules/dunder-proto/set.js +35 -0
- package/router/node_modules/dunder-proto/tsconfig.json +9 -0
- package/router/node_modules/ee-first/LICENSE +22 -0
- package/router/node_modules/ee-first/README.md +80 -0
- package/router/node_modules/ee-first/index.js +95 -0
- package/router/node_modules/ee-first/package.json +29 -0
- package/router/node_modules/encodeurl/LICENSE +22 -0
- package/router/node_modules/encodeurl/README.md +109 -0
- package/router/node_modules/encodeurl/index.js +60 -0
- package/router/node_modules/encodeurl/package.json +40 -0
- package/router/node_modules/es-define-property/.github/FUNDING.yml +12 -0
- package/router/node_modules/es-define-property/CHANGELOG.md +29 -0
- package/router/node_modules/es-define-property/LICENSE +21 -0
- package/router/node_modules/es-define-property/README.md +49 -0
- package/router/node_modules/es-define-property/index.d.ts +3 -0
- package/router/node_modules/es-define-property/index.js +14 -0
- package/router/node_modules/es-define-property/package.json +81 -0
- package/router/node_modules/es-define-property/tsconfig.json +10 -0
- package/router/node_modules/es-errors/.github/FUNDING.yml +12 -0
- package/router/node_modules/es-errors/CHANGELOG.md +40 -0
- package/router/node_modules/es-errors/LICENSE +21 -0
- package/router/node_modules/es-errors/README.md +55 -0
- package/router/node_modules/es-errors/eval.d.ts +3 -0
- package/router/node_modules/es-errors/eval.js +4 -0
- package/router/node_modules/es-errors/index.d.ts +3 -0
- package/router/node_modules/es-errors/index.js +4 -0
- package/router/node_modules/es-errors/package.json +80 -0
- package/router/node_modules/es-errors/range.d.ts +3 -0
- package/router/node_modules/es-errors/range.js +4 -0
- package/router/node_modules/es-errors/ref.d.ts +3 -0
- package/router/node_modules/es-errors/ref.js +4 -0
- package/router/node_modules/es-errors/syntax.d.ts +3 -0
- package/router/node_modules/es-errors/syntax.js +4 -0
- package/router/node_modules/es-errors/tsconfig.json +49 -0
- package/router/node_modules/es-errors/type.d.ts +3 -0
- package/router/node_modules/es-errors/type.js +4 -0
- package/router/node_modules/es-errors/uri.d.ts +3 -0
- package/router/node_modules/es-errors/uri.js +4 -0
- package/router/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
- package/router/node_modules/es-object-atoms/CHANGELOG.md +37 -0
- package/router/node_modules/es-object-atoms/LICENSE +21 -0
- package/router/node_modules/es-object-atoms/README.md +63 -0
- package/router/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
- package/router/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
- package/router/node_modules/es-object-atoms/ToObject.d.ts +7 -0
- package/router/node_modules/es-object-atoms/ToObject.js +10 -0
- package/router/node_modules/es-object-atoms/index.d.ts +3 -0
- package/router/node_modules/es-object-atoms/index.js +4 -0
- package/router/node_modules/es-object-atoms/isObject.d.ts +3 -0
- package/router/node_modules/es-object-atoms/isObject.js +6 -0
- package/router/node_modules/es-object-atoms/package.json +80 -0
- package/router/node_modules/es-object-atoms/tsconfig.json +6 -0
- package/router/node_modules/escape-html/LICENSE +24 -0
- package/router/node_modules/escape-html/Readme.md +43 -0
- package/router/node_modules/escape-html/index.js +78 -0
- package/router/node_modules/escape-html/package.json +24 -0
- package/router/node_modules/etag/HISTORY.md +83 -0
- package/router/node_modules/etag/LICENSE +22 -0
- package/router/node_modules/etag/README.md +159 -0
- package/router/node_modules/etag/index.js +131 -0
- package/router/node_modules/etag/package.json +47 -0
- package/router/node_modules/express/History.md +3667 -0
- package/router/node_modules/express/LICENSE +24 -0
- package/router/node_modules/express/Readme.md +260 -0
- package/router/node_modules/express/index.js +11 -0
- package/router/node_modules/express/lib/application.js +661 -0
- package/router/node_modules/express/lib/express.js +116 -0
- package/router/node_modules/express/lib/middleware/init.js +43 -0
- package/router/node_modules/express/lib/middleware/query.js +47 -0
- package/router/node_modules/express/lib/request.js +525 -0
- package/router/node_modules/express/lib/response.js +1179 -0
- package/router/node_modules/express/lib/router/index.js +673 -0
- package/router/node_modules/express/lib/router/layer.js +181 -0
- package/router/node_modules/express/lib/router/route.js +230 -0
- package/router/node_modules/express/lib/utils.js +303 -0
- package/router/node_modules/express/lib/view.js +182 -0
- package/router/node_modules/express/package.json +102 -0
- package/router/node_modules/express-hooked/LICENSE +204 -0
- package/router/node_modules/express-hooked/README.es.md +123 -0
- package/router/node_modules/express-hooked/README.md +123 -0
- package/router/node_modules/express-hooked/express-hooked.js +206 -0
- package/router/node_modules/express-hooked/hooks.js +584 -0
- package/router/node_modules/express-hooked/package.json +30 -0
- package/router/node_modules/finalhandler/HISTORY.md +216 -0
- package/router/node_modules/finalhandler/LICENSE +22 -0
- package/router/node_modules/finalhandler/README.md +147 -0
- package/router/node_modules/finalhandler/SECURITY.md +25 -0
- package/router/node_modules/finalhandler/index.js +341 -0
- package/router/node_modules/finalhandler/package.json +47 -0
- package/router/node_modules/forwarded/HISTORY.md +21 -0
- package/router/node_modules/forwarded/LICENSE +22 -0
- package/router/node_modules/forwarded/README.md +57 -0
- package/router/node_modules/forwarded/index.js +90 -0
- package/router/node_modules/forwarded/package.json +45 -0
- package/router/node_modules/fresh/HISTORY.md +70 -0
- package/router/node_modules/fresh/LICENSE +23 -0
- package/router/node_modules/fresh/README.md +119 -0
- package/router/node_modules/fresh/index.js +137 -0
- package/router/node_modules/fresh/package.json +46 -0
- package/router/node_modules/function-bind/.github/FUNDING.yml +12 -0
- package/router/node_modules/function-bind/.github/SECURITY.md +3 -0
- package/router/node_modules/function-bind/CHANGELOG.md +136 -0
- package/router/node_modules/function-bind/LICENSE +20 -0
- package/router/node_modules/function-bind/README.md +46 -0
- package/router/node_modules/function-bind/implementation.js +84 -0
- package/router/node_modules/function-bind/index.js +5 -0
- package/router/node_modules/function-bind/package.json +87 -0
- package/router/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
- package/router/node_modules/get-intrinsic/CHANGELOG.md +186 -0
- package/router/node_modules/get-intrinsic/LICENSE +21 -0
- package/router/node_modules/get-intrinsic/README.md +71 -0
- package/router/node_modules/get-intrinsic/index.js +378 -0
- package/router/node_modules/get-intrinsic/package.json +97 -0
- package/router/node_modules/get-proto/.github/FUNDING.yml +12 -0
- package/router/node_modules/get-proto/CHANGELOG.md +21 -0
- package/router/node_modules/get-proto/LICENSE +21 -0
- package/router/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
- package/router/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
- package/router/node_modules/get-proto/README.md +50 -0
- package/router/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
- package/router/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
- package/router/node_modules/get-proto/index.d.ts +5 -0
- package/router/node_modules/get-proto/index.js +27 -0
- package/router/node_modules/get-proto/package.json +81 -0
- package/router/node_modules/get-proto/tsconfig.json +9 -0
- package/router/node_modules/gopd/.github/FUNDING.yml +12 -0
- package/router/node_modules/gopd/CHANGELOG.md +45 -0
- package/router/node_modules/gopd/LICENSE +21 -0
- package/router/node_modules/gopd/README.md +40 -0
- package/router/node_modules/gopd/gOPD.d.ts +1 -0
- package/router/node_modules/gopd/gOPD.js +4 -0
- package/router/node_modules/gopd/index.d.ts +5 -0
- package/router/node_modules/gopd/index.js +15 -0
- package/router/node_modules/gopd/package.json +77 -0
- package/router/node_modules/gopd/tsconfig.json +9 -0
- package/router/node_modules/has-symbols/.github/FUNDING.yml +12 -0
- package/router/node_modules/has-symbols/CHANGELOG.md +91 -0
- package/router/node_modules/has-symbols/LICENSE +21 -0
- package/router/node_modules/has-symbols/README.md +46 -0
- package/router/node_modules/has-symbols/index.d.ts +3 -0
- package/router/node_modules/has-symbols/index.js +14 -0
- package/router/node_modules/has-symbols/package.json +111 -0
- package/router/node_modules/has-symbols/shams.d.ts +3 -0
- package/router/node_modules/has-symbols/shams.js +45 -0
- package/router/node_modules/has-symbols/tsconfig.json +10 -0
- package/router/node_modules/hasown/.github/FUNDING.yml +12 -0
- package/router/node_modules/hasown/CHANGELOG.md +40 -0
- package/router/node_modules/hasown/LICENSE +21 -0
- package/router/node_modules/hasown/README.md +40 -0
- package/router/node_modules/hasown/index.d.ts +3 -0
- package/router/node_modules/hasown/index.js +8 -0
- package/router/node_modules/hasown/package.json +92 -0
- package/router/node_modules/hasown/tsconfig.json +6 -0
- package/router/node_modules/http-errors/HISTORY.md +186 -0
- package/router/node_modules/http-errors/LICENSE +23 -0
- package/router/node_modules/http-errors/README.md +169 -0
- package/router/node_modules/http-errors/index.js +290 -0
- package/router/node_modules/http-errors/package.json +54 -0
- package/router/node_modules/iconv-lite/Changelog.md +162 -0
- package/router/node_modules/iconv-lite/LICENSE +21 -0
- package/router/node_modules/iconv-lite/README.md +156 -0
- package/router/node_modules/iconv-lite/encodings/dbcs-codec.js +555 -0
- package/router/node_modules/iconv-lite/encodings/dbcs-data.js +176 -0
- package/router/node_modules/iconv-lite/encodings/index.js +22 -0
- package/router/node_modules/iconv-lite/encodings/internal.js +188 -0
- package/router/node_modules/iconv-lite/encodings/sbcs-codec.js +72 -0
- package/router/node_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
- package/router/node_modules/iconv-lite/encodings/sbcs-data.js +174 -0
- package/router/node_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
- package/router/node_modules/iconv-lite/encodings/tables/cp936.json +264 -0
- package/router/node_modules/iconv-lite/encodings/tables/cp949.json +273 -0
- package/router/node_modules/iconv-lite/encodings/tables/cp950.json +177 -0
- package/router/node_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
- package/router/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
- package/router/node_modules/iconv-lite/encodings/tables/gbk-added.json +55 -0
- package/router/node_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
- package/router/node_modules/iconv-lite/encodings/utf16.js +177 -0
- package/router/node_modules/iconv-lite/encodings/utf7.js +290 -0
- package/router/node_modules/iconv-lite/lib/bom-handling.js +52 -0
- package/router/node_modules/iconv-lite/lib/extend-node.js +217 -0
- package/router/node_modules/iconv-lite/lib/index.d.ts +24 -0
- package/router/node_modules/iconv-lite/lib/index.js +153 -0
- package/router/node_modules/iconv-lite/lib/streams.js +121 -0
- package/router/node_modules/iconv-lite/package.json +46 -0
- package/router/node_modules/inherits/LICENSE +16 -0
- package/router/node_modules/inherits/README.md +42 -0
- package/router/node_modules/inherits/inherits.js +9 -0
- package/router/node_modules/inherits/inherits_browser.js +27 -0
- package/router/node_modules/inherits/package.json +29 -0
- package/router/node_modules/ipaddr.js/LICENSE +19 -0
- package/router/node_modules/ipaddr.js/README.md +233 -0
- package/router/node_modules/ipaddr.js/ipaddr.min.js +1 -0
- package/router/node_modules/ipaddr.js/lib/ipaddr.js +673 -0
- package/router/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +68 -0
- package/router/node_modules/ipaddr.js/package.json +35 -0
- package/router/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
- package/router/node_modules/math-intrinsics/CHANGELOG.md +24 -0
- package/router/node_modules/math-intrinsics/LICENSE +21 -0
- package/router/node_modules/math-intrinsics/README.md +50 -0
- package/router/node_modules/math-intrinsics/abs.d.ts +1 -0
- package/router/node_modules/math-intrinsics/abs.js +4 -0
- package/router/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
- package/router/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
- package/router/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
- package/router/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
- package/router/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
- package/router/node_modules/math-intrinsics/constants/maxValue.js +5 -0
- package/router/node_modules/math-intrinsics/floor.d.ts +1 -0
- package/router/node_modules/math-intrinsics/floor.js +4 -0
- package/router/node_modules/math-intrinsics/isFinite.d.ts +3 -0
- package/router/node_modules/math-intrinsics/isFinite.js +12 -0
- package/router/node_modules/math-intrinsics/isInteger.d.ts +3 -0
- package/router/node_modules/math-intrinsics/isInteger.js +16 -0
- package/router/node_modules/math-intrinsics/isNaN.d.ts +1 -0
- package/router/node_modules/math-intrinsics/isNaN.js +6 -0
- package/router/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
- package/router/node_modules/math-intrinsics/isNegativeZero.js +6 -0
- package/router/node_modules/math-intrinsics/max.d.ts +1 -0
- package/router/node_modules/math-intrinsics/max.js +4 -0
- package/router/node_modules/math-intrinsics/min.d.ts +1 -0
- package/router/node_modules/math-intrinsics/min.js +4 -0
- package/router/node_modules/math-intrinsics/mod.d.ts +3 -0
- package/router/node_modules/math-intrinsics/mod.js +9 -0
- package/router/node_modules/math-intrinsics/package.json +86 -0
- package/router/node_modules/math-intrinsics/pow.d.ts +1 -0
- package/router/node_modules/math-intrinsics/pow.js +4 -0
- package/router/node_modules/math-intrinsics/round.d.ts +1 -0
- package/router/node_modules/math-intrinsics/round.js +4 -0
- package/router/node_modules/math-intrinsics/sign.d.ts +3 -0
- package/router/node_modules/math-intrinsics/sign.js +11 -0
- package/router/node_modules/math-intrinsics/tsconfig.json +3 -0
- package/router/node_modules/media-typer/HISTORY.md +22 -0
- package/router/node_modules/media-typer/LICENSE +22 -0
- package/router/node_modules/media-typer/README.md +81 -0
- package/router/node_modules/media-typer/index.js +270 -0
- package/router/node_modules/media-typer/package.json +26 -0
- package/router/node_modules/merge-descriptors/HISTORY.md +21 -0
- package/router/node_modules/merge-descriptors/LICENSE +23 -0
- package/router/node_modules/merge-descriptors/README.md +49 -0
- package/router/node_modules/merge-descriptors/index.js +60 -0
- package/router/node_modules/merge-descriptors/package.json +39 -0
- package/router/node_modules/methods/HISTORY.md +29 -0
- package/router/node_modules/methods/LICENSE +24 -0
- package/router/node_modules/methods/README.md +51 -0
- package/router/node_modules/methods/index.js +69 -0
- package/router/node_modules/methods/package.json +36 -0
- package/router/node_modules/mime/CHANGELOG.md +164 -0
- package/router/node_modules/mime/LICENSE +21 -0
- package/router/node_modules/mime/README.md +90 -0
- package/router/node_modules/mime/cli.js +8 -0
- package/router/node_modules/mime/mime.js +108 -0
- package/router/node_modules/mime/package.json +44 -0
- package/router/node_modules/mime/src/build.js +53 -0
- package/router/node_modules/mime/src/test.js +60 -0
- package/router/node_modules/mime/types.json +1 -0
- package/router/node_modules/mime-db/HISTORY.md +507 -0
- package/router/node_modules/mime-db/LICENSE +23 -0
- package/router/node_modules/mime-db/README.md +100 -0
- package/router/node_modules/mime-db/db.json +8519 -0
- package/router/node_modules/mime-db/index.js +12 -0
- package/router/node_modules/mime-db/package.json +60 -0
- package/router/node_modules/mime-types/HISTORY.md +397 -0
- package/router/node_modules/mime-types/LICENSE +23 -0
- package/router/node_modules/mime-types/README.md +113 -0
- package/router/node_modules/mime-types/index.js +188 -0
- package/router/node_modules/mime-types/package.json +44 -0
- package/router/node_modules/ms/index.js +152 -0
- package/router/node_modules/ms/license.md +21 -0
- package/router/node_modules/ms/package.json +37 -0
- package/router/node_modules/ms/readme.md +51 -0
- package/router/node_modules/negotiator/HISTORY.md +108 -0
- package/router/node_modules/negotiator/LICENSE +24 -0
- package/router/node_modules/negotiator/README.md +203 -0
- package/router/node_modules/negotiator/index.js +82 -0
- package/router/node_modules/negotiator/lib/charset.js +169 -0
- package/router/node_modules/negotiator/lib/encoding.js +184 -0
- package/router/node_modules/negotiator/lib/language.js +179 -0
- package/router/node_modules/negotiator/lib/mediaType.js +294 -0
- package/router/node_modules/negotiator/package.json +42 -0
- package/router/node_modules/object-inspect/.github/FUNDING.yml +12 -0
- package/router/node_modules/object-inspect/CHANGELOG.md +424 -0
- package/router/node_modules/object-inspect/LICENSE +21 -0
- package/router/node_modules/object-inspect/example/all.js +23 -0
- package/router/node_modules/object-inspect/example/circular.js +6 -0
- package/router/node_modules/object-inspect/example/fn.js +5 -0
- package/router/node_modules/object-inspect/example/inspect.js +10 -0
- package/router/node_modules/object-inspect/index.js +544 -0
- package/router/node_modules/object-inspect/package-support.json +20 -0
- package/router/node_modules/object-inspect/package.json +105 -0
- package/router/node_modules/object-inspect/readme.markdown +84 -0
- package/router/node_modules/object-inspect/test-core-js.js +26 -0
- package/router/node_modules/object-inspect/util.inspect.js +1 -0
- package/router/node_modules/on-finished/HISTORY.md +98 -0
- package/router/node_modules/on-finished/LICENSE +23 -0
- package/router/node_modules/on-finished/README.md +162 -0
- package/router/node_modules/on-finished/index.js +234 -0
- package/router/node_modules/on-finished/package.json +39 -0
- package/router/node_modules/parseurl/HISTORY.md +58 -0
- package/router/node_modules/parseurl/LICENSE +24 -0
- package/router/node_modules/parseurl/README.md +133 -0
- package/router/node_modules/parseurl/index.js +158 -0
- package/router/node_modules/parseurl/package.json +40 -0
- package/router/node_modules/path-to-regexp/LICENSE +21 -0
- package/router/node_modules/path-to-regexp/Readme.md +35 -0
- package/router/node_modules/path-to-regexp/index.js +156 -0
- package/router/node_modules/path-to-regexp/package.json +30 -0
- package/router/node_modules/proxy-addr/HISTORY.md +161 -0
- package/router/node_modules/proxy-addr/LICENSE +22 -0
- package/router/node_modules/proxy-addr/README.md +139 -0
- package/router/node_modules/proxy-addr/index.js +327 -0
- package/router/node_modules/proxy-addr/package.json +47 -0
- package/router/node_modules/qs/.github/FUNDING.yml +12 -0
- package/router/node_modules/qs/.github/SECURITY.md +11 -0
- package/router/node_modules/qs/.github/THREAT_MODEL.md +78 -0
- package/router/node_modules/qs/CHANGELOG.md +644 -0
- package/router/node_modules/qs/LICENSE.md +29 -0
- package/router/node_modules/qs/README.md +740 -0
- package/router/node_modules/qs/dist/qs.js +141 -0
- package/router/node_modules/qs/eslint.config.mjs +56 -0
- package/router/node_modules/qs/lib/formats.js +23 -0
- package/router/node_modules/qs/lib/index.js +11 -0
- package/router/node_modules/qs/lib/parse.js +371 -0
- package/router/node_modules/qs/lib/stringify.js +356 -0
- package/router/node_modules/qs/lib/utils.js +340 -0
- package/router/node_modules/qs/package.json +94 -0
- package/router/node_modules/range-parser/HISTORY.md +56 -0
- package/router/node_modules/range-parser/LICENSE +23 -0
- package/router/node_modules/range-parser/README.md +84 -0
- package/router/node_modules/range-parser/index.js +162 -0
- package/router/node_modules/range-parser/package.json +44 -0
- package/router/node_modules/raw-body/LICENSE +22 -0
- package/router/node_modules/raw-body/README.md +223 -0
- package/router/node_modules/raw-body/index.d.ts +87 -0
- package/router/node_modules/raw-body/index.js +336 -0
- package/router/node_modules/raw-body/package.json +47 -0
- package/router/node_modules/safe-buffer/LICENSE +21 -0
- package/router/node_modules/safe-buffer/README.md +584 -0
- package/router/node_modules/safe-buffer/index.d.ts +187 -0
- package/router/node_modules/safe-buffer/index.js +65 -0
- package/router/node_modules/safe-buffer/package.json +51 -0
- package/router/node_modules/safer-buffer/LICENSE +21 -0
- package/router/node_modules/safer-buffer/Porting-Buffer.md +268 -0
- package/router/node_modules/safer-buffer/Readme.md +156 -0
- package/router/node_modules/safer-buffer/dangerous.js +58 -0
- package/router/node_modules/safer-buffer/package.json +34 -0
- package/router/node_modules/safer-buffer/safer.js +77 -0
- package/router/node_modules/safer-buffer/tests.js +406 -0
- package/router/node_modules/send/HISTORY.md +538 -0
- package/router/node_modules/send/LICENSE +23 -0
- package/router/node_modules/send/README.md +327 -0
- package/router/node_modules/send/SECURITY.md +24 -0
- package/router/node_modules/send/index.js +1142 -0
- package/router/node_modules/send/node_modules/ms/index.js +162 -0
- package/router/node_modules/send/node_modules/ms/license.md +21 -0
- package/router/node_modules/send/node_modules/ms/package.json +38 -0
- package/router/node_modules/send/node_modules/ms/readme.md +59 -0
- package/router/node_modules/send/package.json +62 -0
- package/router/node_modules/serve-static/HISTORY.md +493 -0
- package/router/node_modules/serve-static/LICENSE +25 -0
- package/router/node_modules/serve-static/README.md +257 -0
- package/router/node_modules/serve-static/index.js +209 -0
- package/router/node_modules/serve-static/package.json +42 -0
- package/router/node_modules/setprototypeof/LICENSE +13 -0
- package/router/node_modules/setprototypeof/README.md +31 -0
- package/router/node_modules/setprototypeof/index.d.ts +2 -0
- package/router/node_modules/setprototypeof/index.js +17 -0
- package/router/node_modules/setprototypeof/package.json +38 -0
- package/router/node_modules/side-channel/.github/FUNDING.yml +12 -0
- package/router/node_modules/side-channel/CHANGELOG.md +110 -0
- package/router/node_modules/side-channel/LICENSE +21 -0
- package/router/node_modules/side-channel/README.md +61 -0
- package/router/node_modules/side-channel/index.d.ts +14 -0
- package/router/node_modules/side-channel/index.js +43 -0
- package/router/node_modules/side-channel/package.json +85 -0
- package/router/node_modules/side-channel/tsconfig.json +9 -0
- package/router/node_modules/side-channel-list/.github/FUNDING.yml +12 -0
- package/router/node_modules/side-channel-list/CHANGELOG.md +15 -0
- package/router/node_modules/side-channel-list/LICENSE +21 -0
- package/router/node_modules/side-channel-list/README.md +62 -0
- package/router/node_modules/side-channel-list/index.d.ts +13 -0
- package/router/node_modules/side-channel-list/index.js +113 -0
- package/router/node_modules/side-channel-list/list.d.ts +14 -0
- package/router/node_modules/side-channel-list/package.json +77 -0
- package/router/node_modules/side-channel-list/tsconfig.json +9 -0
- package/router/node_modules/side-channel-map/.github/FUNDING.yml +12 -0
- package/router/node_modules/side-channel-map/CHANGELOG.md +22 -0
- package/router/node_modules/side-channel-map/LICENSE +21 -0
- package/router/node_modules/side-channel-map/README.md +62 -0
- package/router/node_modules/side-channel-map/index.d.ts +15 -0
- package/router/node_modules/side-channel-map/index.js +68 -0
- package/router/node_modules/side-channel-map/package.json +80 -0
- package/router/node_modules/side-channel-map/tsconfig.json +9 -0
- package/router/node_modules/side-channel-weakmap/.github/FUNDING.yml +12 -0
- package/router/node_modules/side-channel-weakmap/CHANGELOG.md +28 -0
- package/router/node_modules/side-channel-weakmap/LICENSE +21 -0
- package/router/node_modules/side-channel-weakmap/README.md +62 -0
- package/router/node_modules/side-channel-weakmap/index.d.ts +15 -0
- package/router/node_modules/side-channel-weakmap/index.js +84 -0
- package/router/node_modules/side-channel-weakmap/package.json +87 -0
- package/router/node_modules/side-channel-weakmap/tsconfig.json +9 -0
- package/router/node_modules/statuses/HISTORY.md +87 -0
- package/router/node_modules/statuses/LICENSE +23 -0
- package/router/node_modules/statuses/README.md +139 -0
- package/router/node_modules/statuses/codes.json +65 -0
- package/router/node_modules/statuses/index.js +146 -0
- package/router/node_modules/statuses/package.json +49 -0
- package/router/node_modules/toidentifier/HISTORY.md +9 -0
- package/router/node_modules/toidentifier/LICENSE +21 -0
- package/router/node_modules/toidentifier/README.md +61 -0
- package/router/node_modules/toidentifier/index.js +32 -0
- package/router/node_modules/toidentifier/package.json +38 -0
- package/router/node_modules/type-is/HISTORY.md +259 -0
- package/router/node_modules/type-is/LICENSE +23 -0
- package/router/node_modules/type-is/README.md +170 -0
- package/router/node_modules/type-is/index.js +266 -0
- package/router/node_modules/type-is/package.json +45 -0
- package/router/node_modules/unpipe/HISTORY.md +4 -0
- package/router/node_modules/unpipe/LICENSE +22 -0
- package/router/node_modules/unpipe/README.md +43 -0
- package/router/node_modules/unpipe/index.js +69 -0
- package/router/node_modules/unpipe/package.json +27 -0
- package/router/node_modules/utils-merge/LICENSE +20 -0
- package/router/node_modules/utils-merge/README.md +34 -0
- package/router/node_modules/utils-merge/index.js +23 -0
- package/router/node_modules/utils-merge/package.json +40 -0
- package/router/node_modules/vary/HISTORY.md +39 -0
- package/router/node_modules/vary/LICENSE +22 -0
- package/router/node_modules/vary/README.md +101 -0
- package/router/node_modules/vary/index.js +149 -0
- package/router/node_modules/vary/package.json +43 -0
- package/router/package.json +36 -0
package/hooked/README.md
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# Express-Hooked
|
|
2
|
+
|
|
3
|
+
Express-Hooked is a powerful extension for Express.js that brings a comprehensive hooks and filters system to your applications. Inspired by WordPress hooks system, it allows developers to extend functionality at various points in the request lifecycle without modifying core code.
|
|
4
|
+
|
|
5
|
+
## Why Choose Express-Hooked?
|
|
6
|
+
|
|
7
|
+
- **Flexible Architecture**: Hook into request processing at multiple stages
|
|
8
|
+
- **Non-Intrusive**: Extend functionality without modifying existing code
|
|
9
|
+
- **Priority System**: Control execution order with priority levels
|
|
10
|
+
- **Namespace Support**: Organize hooks with namespaces for better maintainability
|
|
11
|
+
- **Easy Integration**: Simple setup with minimal configuration
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install express-hooked
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
const express = require('express');
|
|
23
|
+
const ExpressHooked = require('express-hooked');
|
|
24
|
+
|
|
25
|
+
const app = express();
|
|
26
|
+
const port = 3000;
|
|
27
|
+
|
|
28
|
+
// Initialize ExpressHooked
|
|
29
|
+
const expressHooks = new ExpressHooked(app);
|
|
30
|
+
|
|
31
|
+
// Register an action hook
|
|
32
|
+
expressHooks.addAction('request_started', (req, res, next) => {
|
|
33
|
+
console.log(`Request received: ${req.method} ${req.url}`);
|
|
34
|
+
next();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// Register a filter hook
|
|
38
|
+
expressHooks.addFilter('modify_response_data', (data) => {
|
|
39
|
+
return {
|
|
40
|
+
...data,
|
|
41
|
+
processedBy: 'ExpressHooked',
|
|
42
|
+
timestamp: new Date().toISOString()
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Example route using filters
|
|
47
|
+
app.get('/', (req, res) => {
|
|
48
|
+
let responseData = { message: 'Hello World!' };
|
|
49
|
+
responseData = expressHooks.applyFilters('modify_response_data', responseData);
|
|
50
|
+
|
|
51
|
+
res.json(responseData);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Initialize hooks integration
|
|
55
|
+
expressHooks.init();
|
|
56
|
+
|
|
57
|
+
app.listen(port, () => {
|
|
58
|
+
console.log(`Server running at http://localhost:${port}`);
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Key Features
|
|
63
|
+
|
|
64
|
+
### Actions
|
|
65
|
+
Actions allow you to execute code at specific points without modifying data:
|
|
66
|
+
|
|
67
|
+
```javascript
|
|
68
|
+
expressHooks.addAction('request_started', (req, res, next) => {
|
|
69
|
+
// Do something when request starts
|
|
70
|
+
next();
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Filters
|
|
75
|
+
Filters allow you to modify data flowing through your application:
|
|
76
|
+
|
|
77
|
+
```javascript
|
|
78
|
+
expressHooks.addFilter('modify_response_data', (data) => {
|
|
79
|
+
// Modify and return the data
|
|
80
|
+
return { ...data, customField: 'value' };
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Priority System
|
|
85
|
+
Control execution order with priority levels (lower numbers execute first):
|
|
86
|
+
|
|
87
|
+
```javascript
|
|
88
|
+
// This executes first (higher priority)
|
|
89
|
+
expressHooks.addAction('request_started', callback, 5);
|
|
90
|
+
|
|
91
|
+
// This executes later (lower priority)
|
|
92
|
+
expressHooks.addAction('request_started', callback, 15);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Namespaces
|
|
96
|
+
Organize your hooks with namespaces:
|
|
97
|
+
|
|
98
|
+
```javascript
|
|
99
|
+
// Register hook with namespace
|
|
100
|
+
expressHooks.addAction('myplugin::before_request', callback);
|
|
101
|
+
|
|
102
|
+
// Execute namespaced hook
|
|
103
|
+
expressHooks.doAction('myplugin::before_request', req, res);
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Advanced Methods
|
|
107
|
+
|
|
108
|
+
#### Removing Hooks and Filters
|
|
109
|
+
You can remove specific hooks or filters using the following methods:
|
|
110
|
+
|
|
111
|
+
```javascript
|
|
112
|
+
// Remove a specific action
|
|
113
|
+
expressHooks.removeAction('request_started', callback);
|
|
114
|
+
|
|
115
|
+
// Remove an action by identifier
|
|
116
|
+
expressHooks.removeAction('request_started', 'my-action-id');
|
|
117
|
+
|
|
118
|
+
// Remove all actions for a hook
|
|
119
|
+
expressHooks.removeAllActions('request_started');
|
|
120
|
+
|
|
121
|
+
// Remove a specific filter
|
|
122
|
+
expressHooks.removeFilter('modify_response_data', callback);
|
|
123
|
+
|
|
124
|
+
// Remove a filter by identifier
|
|
125
|
+
expressHooks.removeFilter('modify_response_data', 'my-filter-id');
|
|
126
|
+
|
|
127
|
+
// Remove all filters for a hook
|
|
128
|
+
expressHooks.removeAllFilters('modify_response_data');
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
#### Checking for Hooks and Filters
|
|
132
|
+
Check if hooks or filters exist for a specific hook name:
|
|
133
|
+
|
|
134
|
+
```javascript
|
|
135
|
+
// Check if an action exists
|
|
136
|
+
const hasAction = expressHooks.hasAction('request_started');
|
|
137
|
+
|
|
138
|
+
// Check if a filter exists
|
|
139
|
+
const hasFilter = expressHooks.hasFilter('modify_response_data');
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
#### Counting Hooks and Filters
|
|
143
|
+
Get the number of registered hooks or filters for a specific hook name:
|
|
144
|
+
|
|
145
|
+
```javascript
|
|
146
|
+
// Count actions for a hook
|
|
147
|
+
const actionCount = expressHooks.actionsCount('request_started');
|
|
148
|
+
|
|
149
|
+
// Count filters for a hook
|
|
150
|
+
const filterCount = expressHooks.filtersCount('modify_response_data');
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
#### Asynchronous Hooks and Filters
|
|
154
|
+
Execute hooks and filters asynchronously:
|
|
155
|
+
|
|
156
|
+
```javascript
|
|
157
|
+
// Execute actions asynchronously
|
|
158
|
+
await expressHooks.doActionAsync('request_started', req, res, next);
|
|
159
|
+
|
|
160
|
+
// Apply filters asynchronously
|
|
161
|
+
const filteredData = await expressHooks.applyFiltersAsync('modify_response_data', data);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Additional Parameters
|
|
165
|
+
When registering hooks, you can specify additional parameters:
|
|
166
|
+
|
|
167
|
+
```javascript
|
|
168
|
+
// acceptedArgs: Number of arguments the callback accepts
|
|
169
|
+
expressHooks.addAction('request_started', callback, priority, acceptedArgs);
|
|
170
|
+
|
|
171
|
+
// identifier: Optional identifier for the callback (useful for removal)
|
|
172
|
+
expressHooks.addAction('request_started', callback, priority, acceptedArgs, 'my-action-id');
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Error Handling
|
|
176
|
+
Errors within hooks are caught and logged to prevent crashing the application:
|
|
177
|
+
|
|
178
|
+
```javascript
|
|
179
|
+
expressHooks.addAction('request_started', (req, res, next) => {
|
|
180
|
+
// If an error occurs here, it will be caught and logged
|
|
181
|
+
problematicFunction();
|
|
182
|
+
next();
|
|
183
|
+
});
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Route-Specific Hooks
|
|
187
|
+
Register hooks for specific routes:
|
|
188
|
+
|
|
189
|
+
```javascript
|
|
190
|
+
// Register a hook to run before a specific route
|
|
191
|
+
expressHooks.addRouteHook('/api/users', 'before', (req, res, next) => {
|
|
192
|
+
console.log('Before /api/users route');
|
|
193
|
+
next();
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
// Register a hook to run after a specific route
|
|
197
|
+
expressHooks.addRouteHook('/api/users', 'after', (req, res, data) => {
|
|
198
|
+
console.log('After /api/users route');
|
|
199
|
+
});
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Extending Express Methods
|
|
203
|
+
Extend Express methods with custom functionality:
|
|
204
|
+
|
|
205
|
+
```javascript
|
|
206
|
+
// Extend an Express method with custom functionality
|
|
207
|
+
expressHooks.extendExpressMethod('use', (originalUse) => {
|
|
208
|
+
return function(path, ...middlewares) {
|
|
209
|
+
// Custom logic before calling the original method
|
|
210
|
+
console.log(`Registering middleware for path: ${path}`);
|
|
211
|
+
|
|
212
|
+
// Call the original method
|
|
213
|
+
return originalUse.call(this, path, ...middlewares);
|
|
214
|
+
};
|
|
215
|
+
});
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Version Compatibility
|
|
219
|
+
The current version of Express-Hooked follows semantic versioning. Breaking changes will be documented in the changelog.
|
|
220
|
+
|
|
221
|
+
## Use Cases
|
|
222
|
+
|
|
223
|
+
- **Authentication & Authorization**: Hook into request processing to validate credentials
|
|
224
|
+
- **Logging & Analytics**: Track requests, responses, and performance metrics
|
|
225
|
+
- **Caching**: Implement caching strategies at different levels
|
|
226
|
+
- **API Transformation**: Modify API responses before sending to clients
|
|
227
|
+
- **Error Handling**: Centralized error handling with custom logic
|
|
228
|
+
- **Rate Limiting**: Implement rate limiting based on custom criteria
|
|
229
|
+
|
|
230
|
+
## Contributing
|
|
231
|
+
|
|
232
|
+
We welcome contributions! Please see our contributing guidelines for more information.
|
|
233
|
+
|
|
234
|
+
## License
|
|
235
|
+
|
|
236
|
+
Apache 2.0
|
|
237
|
+
|
|
238
|
+
Repository: https://gitlab.com/bytedogssyndicate1/express-hooked
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ejemplo avanzado de uso del sistema de hooks para Express
|
|
3
|
+
*
|
|
4
|
+
* Este archivo demuestra cómo utilizar las características avanzadas del sistema de hooks,
|
|
5
|
+
* incluyendo namespaces, identificadores, métodos asíncronos y manejo de rutas específicas.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Importar Express
|
|
9
|
+
const express = require('express');
|
|
10
|
+
|
|
11
|
+
// Importar el sistema de hooks para Express
|
|
12
|
+
const ExpressHooked = require('./express-hooked');
|
|
13
|
+
|
|
14
|
+
// Crear una aplicación Express
|
|
15
|
+
const app = express();
|
|
16
|
+
const port = 3032;
|
|
17
|
+
|
|
18
|
+
// Inicializar ExpressHooked con la aplicación
|
|
19
|
+
const expressHooks = new ExpressHooked(app);
|
|
20
|
+
|
|
21
|
+
// 1. USO DE NAMESPACES
|
|
22
|
+
console.log('1. Registrando hooks con namespaces...');
|
|
23
|
+
|
|
24
|
+
// Registrar hooks en diferentes namespaces
|
|
25
|
+
// En lugar de registrarlos como middlewares, los registramos para ser llamados por doAction
|
|
26
|
+
expressHooks.addAction('authentication::before_request', (req, res, next) => {
|
|
27
|
+
console.log('[NAMESPACE AUTH] Validando autenticación...');
|
|
28
|
+
req.user = { id: 1, name: 'John Doe' }; // Simulando un usuario autenticado
|
|
29
|
+
// No llamamos a next() aquí porque se llama desde doAction
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
expressHooks.addAction('logging::after_request', (req, res) => {
|
|
33
|
+
console.log(`[NAMESPACE LOGGING] Petición ${req.method} ${req.url} procesada por ${req.user?.name || 'Anónimo'}`);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
expressHooks.addFilter('data::transform_response', (data) => {
|
|
37
|
+
console.log('[NAMESPACE DATA] Transformando respuesta...');
|
|
38
|
+
return {
|
|
39
|
+
...data,
|
|
40
|
+
transformed: true,
|
|
41
|
+
timestamp: new Date().toISOString()
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// 2. USO DE IDENTIFICADORES
|
|
46
|
+
console.log('2. Registrando hooks con identificadores...');
|
|
47
|
+
|
|
48
|
+
expressHooks.addAction('request_started', (req, res, next) => {
|
|
49
|
+
console.log('[IDENTIFIER EXAMPLE] Primer hook registrado con identificador');
|
|
50
|
+
next();
|
|
51
|
+
}, 10, 3, 'first_hook');
|
|
52
|
+
|
|
53
|
+
expressHooks.addAction('request_started', (req, res, next) => {
|
|
54
|
+
console.log('[IDENTIFIER EXAMPLE] Segundo hook registrado con identificador');
|
|
55
|
+
next();
|
|
56
|
+
}, 15, 3, 'second_hook');
|
|
57
|
+
|
|
58
|
+
// 3. MÉTODOS ASÍNCRONOS
|
|
59
|
+
console.log('3. Registrando hooks y filtros asíncronos...');
|
|
60
|
+
|
|
61
|
+
// Hook asíncrono para simular una operación que toma tiempo
|
|
62
|
+
expressHooks.addAction('async_operation', async (req, res, next) => {
|
|
63
|
+
console.log('[ASYNC HOOK] Iniciando operación asíncrona...');
|
|
64
|
+
|
|
65
|
+
// Simular operación asíncrona (por ejemplo, acceso a base de datos)
|
|
66
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
67
|
+
|
|
68
|
+
console.log('[ASYNC HOOK] Operación asíncrona completada');
|
|
69
|
+
req.asyncData = 'Datos obtenidos de operación asíncrona';
|
|
70
|
+
next();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// Filtro asíncrono para transformar datos
|
|
74
|
+
expressHooks.addFilter('async_transform', async (data) => {
|
|
75
|
+
console.log('[ASYNC FILTER] Transformando datos de forma asíncrona...');
|
|
76
|
+
|
|
77
|
+
// Simular operación asíncrona
|
|
78
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
...data,
|
|
82
|
+
asyncProcessed: true,
|
|
83
|
+
extraInfo: 'Información adicional procesada asíncronamente'
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// 4. MANEJO DE RUTAS ESPECÍFICAS
|
|
88
|
+
console.log('4. Registrando hooks para rutas específicas...');
|
|
89
|
+
|
|
90
|
+
// Hook antes de procesar la ruta /api/users
|
|
91
|
+
expressHooks.addRouteHook('/api/users', 'before', (req, res, next) => {
|
|
92
|
+
console.log('[ROUTE HOOK] Antes de procesar /api/users');
|
|
93
|
+
req.routeStartTime = Date.now();
|
|
94
|
+
next();
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// Hook después de procesar la ruta /api/users
|
|
98
|
+
expressHooks.addRouteHook('/api/users', 'after', (req, res, data) => {
|
|
99
|
+
const duration = Date.now() - req.routeStartTime;
|
|
100
|
+
console.log(`[ROUTE HOOK] Después de procesar /api/users. Duración: ${duration}ms`);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Agregar middleware específico para la ruta /api/users para disparar los hooks
|
|
104
|
+
app.use('/api/users', (req, res, next) => {
|
|
105
|
+
expressHooks.doAction('before_route_api_users', req, res, next);
|
|
106
|
+
next(); // Asegurar que se continúa con el siguiente middleware
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// 5. VERIFICACIÓN Y CONTABILIZACIÓN DE HOOKS
|
|
110
|
+
console.log('5. Verificando y contabilizando hooks registrados...');
|
|
111
|
+
|
|
112
|
+
console.log('¿Existe el hook authentication::before_request?', expressHooks.hasAction('authentication::before_request'));
|
|
113
|
+
console.log('¿Existe el filtro data::transform_response?', expressHooks.hasFilter('data::transform_response'));
|
|
114
|
+
console.log('Cantidad de acciones para request_started:', expressHooks.actionsCount('request_started'));
|
|
115
|
+
|
|
116
|
+
// 6. USO DE MIDDLEWARE PARA DISPARAR HOOKS AVANZADOS
|
|
117
|
+
app.use((req, res, next) => {
|
|
118
|
+
// Disparar el hook asíncrono
|
|
119
|
+
expressHooks.doActionAsync('async_operation', req, res, next).then(() => {
|
|
120
|
+
next();
|
|
121
|
+
}).catch(next);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// Middleware para disparar hooks de logging después de la respuesta
|
|
125
|
+
app.use((req, res, next) => {
|
|
126
|
+
const originalSend = res.send;
|
|
127
|
+
|
|
128
|
+
res.send = function(body) {
|
|
129
|
+
// Disparar el hook de logging después de la respuesta
|
|
130
|
+
expressHooks.doAction('logging::after_request', req, res);
|
|
131
|
+
|
|
132
|
+
return originalSend.call(this, body);
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
next();
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// Agregamos un hook al sistema predeterminado para que se ejecute al inicio de cada solicitud
|
|
139
|
+
expressHooks.addAction('request_started', (req, res, next) => {
|
|
140
|
+
// Disparar hooks de autenticación antes de la lógica de negocio
|
|
141
|
+
expressHooks.doAction('authentication::before_request', req, res, () => {});
|
|
142
|
+
next(); // Llamamos a next aquí para continuar con la cadena de Express
|
|
143
|
+
}, 4); // Mayor prioridad que el hook predeterminado (que es 5)
|
|
144
|
+
|
|
145
|
+
// Middleware para parsear JSON
|
|
146
|
+
app.use(express.json());
|
|
147
|
+
|
|
148
|
+
// Ruta de ejemplo que utiliza filtros y namespaces
|
|
149
|
+
app.get('/', async (req, res) => {
|
|
150
|
+
// Aplicar filtro del namespace
|
|
151
|
+
let responseData = { message: 'Hola Mundo desde ejemplo avanzado!' };
|
|
152
|
+
responseData = expressHooks.applyFilters('data::transform_response', responseData);
|
|
153
|
+
|
|
154
|
+
// Aplicar filtro asíncrono
|
|
155
|
+
responseData = await expressHooks.applyFiltersAsync('async_transform', responseData);
|
|
156
|
+
|
|
157
|
+
res.json(responseData);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
// Ruta que utiliza hooks específicos para la ruta
|
|
161
|
+
app.get('/api/users', (req, res) => {
|
|
162
|
+
const users = [
|
|
163
|
+
{ id: 1, name: 'John', email: 'john@example.com' },
|
|
164
|
+
{ id: 2, name: 'Jane', email: 'jane@example.com' }
|
|
165
|
+
];
|
|
166
|
+
|
|
167
|
+
// Aplicar filtro del namespace
|
|
168
|
+
const responseData = expressHooks.applyFilters('data::transform_response', { users });
|
|
169
|
+
|
|
170
|
+
// Disparar el hook 'after' antes de enviar la respuesta
|
|
171
|
+
expressHooks.doAction('after_route_api_users', req, res, responseData);
|
|
172
|
+
|
|
173
|
+
res.json(responseData);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// Ruta para demostrar remoción de hooks por identificador
|
|
177
|
+
app.get('/remove-hooks', (req, res) => {
|
|
178
|
+
console.log('6. Removiendo hooks por identificador...');
|
|
179
|
+
|
|
180
|
+
// Remover el primer hook por su identificador
|
|
181
|
+
const removed = expressHooks.removeAction('request_started', 'first_hook');
|
|
182
|
+
console.log('Hook con identificador "first_hook" removido:', removed);
|
|
183
|
+
|
|
184
|
+
// Contar acciones nuevamente
|
|
185
|
+
console.log('Cantidad de acciones para request_started después de remover:', expressHooks.actionsCount('request_started'));
|
|
186
|
+
|
|
187
|
+
res.json({
|
|
188
|
+
message: 'Hook removido',
|
|
189
|
+
hooksRemaining: expressHooks.actionsCount('request_started'),
|
|
190
|
+
asyncData: req.asyncData
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
// Ruta para probar la extensión de métodos de Express
|
|
195
|
+
app.get('/extended-method', (req, res) => {
|
|
196
|
+
res.json({ message: 'Ruta con método extendido' });
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// Extender un método de Express para registrar middleware automáticamente
|
|
200
|
+
expressHooks.extendExpressMethod('get', (originalGet) => {
|
|
201
|
+
return function(path, ...handlers) {
|
|
202
|
+
console.log(`[EXTENDED METHOD] Registrando ruta GET: ${path}`);
|
|
203
|
+
// Agregar un middleware antes de la ruta
|
|
204
|
+
this.use(path, (req, res, next) => {
|
|
205
|
+
console.log(`[EXTENDED METHOD] Middleware ejecutado para ruta: ${path}`);
|
|
206
|
+
next();
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// Llamar al método original
|
|
210
|
+
return originalGet.call(this, path, ...handlers);
|
|
211
|
+
};
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
// Registrar hooks predeterminados para que se vean en los logs
|
|
215
|
+
expressHooks.addAction('request_started', (req, res, next) => {
|
|
216
|
+
console.log('[DEFAULT HOOK] request_started ejecutado');
|
|
217
|
+
next();
|
|
218
|
+
}, 5); // Alta prioridad
|
|
219
|
+
|
|
220
|
+
expressHooks.addAction('request_processed', (req, res) => {
|
|
221
|
+
console.log('[DEFAULT HOOK] request_processed ejecutado');
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
expressHooks.addAction('response_sent', (req, res) => {
|
|
225
|
+
console.log('[DEFAULT HOOK] response_sent ejecutado');
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// Iniciar la integración de hooks
|
|
229
|
+
expressHooks.init();
|
|
230
|
+
|
|
231
|
+
// Iniciar el servidor
|
|
232
|
+
app.listen(port, () => {
|
|
233
|
+
console.log(`\nServidor Express avanzado corriendo en http://localhost:${port}`);
|
|
234
|
+
console.log('Características avanzadas del sistema de hooks integradas correctamente.');
|
|
235
|
+
console.log('\nPrueba las siguientes rutas:');
|
|
236
|
+
console.log('- GET http://localhost:' + port + '/');
|
|
237
|
+
console.log('- GET http://localhost:' + port + '/api/users');
|
|
238
|
+
console.log('- GET http://localhost:' + port + '/remove-hooks');
|
|
239
|
+
console.log('- GET http://localhost:' + port + '/extended-method');
|
|
240
|
+
});
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sistema de Hooks para Express
|
|
3
|
+
* Basado en el sistema de hooks independiente
|
|
4
|
+
*
|
|
5
|
+
* @author Benjamin Sanchez Cardenas
|
|
6
|
+
* @license Apache 2.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
// Importar el sistema de hooks independiente
|
|
10
|
+
const HookSystem = require('./hooks');
|
|
11
|
+
|
|
12
|
+
class ExpressHooked extends HookSystem {
|
|
13
|
+
constructor(app) {
|
|
14
|
+
super();
|
|
15
|
+
|
|
16
|
+
// Almacenar la aplicación Express
|
|
17
|
+
this.app = app;
|
|
18
|
+
|
|
19
|
+
// Registrar hooks predeterminados para eventos de Express
|
|
20
|
+
this._registerDefaultHooks();
|
|
21
|
+
|
|
22
|
+
// Añadir el sistema de hooks a la aplicación Express
|
|
23
|
+
if (this.app) {
|
|
24
|
+
this.app.locals.hooks = this;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Registra hooks predeterminados para eventos de Express
|
|
30
|
+
* @private
|
|
31
|
+
*/
|
|
32
|
+
_registerDefaultHooks() {
|
|
33
|
+
// Hooks para eventos de solicitud
|
|
34
|
+
this.addAction('request_started', (req, res, next) => {
|
|
35
|
+
// Este hook se ejecuta al inicio de cada solicitud
|
|
36
|
+
req.startTime = Date.now();
|
|
37
|
+
req.hookData = {}; // Objeto para almacenar datos entre hooks
|
|
38
|
+
next();
|
|
39
|
+
}, 5); // Alta prioridad para inicialización temprana
|
|
40
|
+
|
|
41
|
+
this.addAction('request_processed', (req, res) => {
|
|
42
|
+
// Este hook se ejecuta después de procesar la solicitud
|
|
43
|
+
if (req.startTime) {
|
|
44
|
+
const duration = Date.now() - req.startTime;
|
|
45
|
+
req.duration = duration;
|
|
46
|
+
console.log(`Request ${req.method} ${req.url} took ${duration}ms`);
|
|
47
|
+
}
|
|
48
|
+
}, 15); // Baja prioridad para ejecución tardía
|
|
49
|
+
|
|
50
|
+
this.addAction('response_sent', (req, res) => {
|
|
51
|
+
// Este hook se ejecuta después de enviar la respuesta
|
|
52
|
+
console.log(`Response sent for ${req.method} ${req.url}. Status: ${res.statusCode}`);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Middleware para disparar hooks al inicio de la solicitud
|
|
58
|
+
* @returns {Function} Middleware de Express
|
|
59
|
+
*/
|
|
60
|
+
requestStartedMiddleware() {
|
|
61
|
+
return (req, res, next) => {
|
|
62
|
+
// Disparar hook al inicio de la solicitud
|
|
63
|
+
this.doAction('request_started', req, res, next);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Middleware para disparar hooks al finalizar la solicitud
|
|
69
|
+
* @returns {Function} Middleware de Express
|
|
70
|
+
*/
|
|
71
|
+
requestProcessedMiddleware() {
|
|
72
|
+
return (req, res, next) => {
|
|
73
|
+
// Guardar la función original de res.end
|
|
74
|
+
const originalEnd = res.end;
|
|
75
|
+
|
|
76
|
+
// Sobrescribir res.end para capturar cuando se envía la respuesta
|
|
77
|
+
res.end = function(chunk, encoding, callback) {
|
|
78
|
+
// Disparar hook antes de enviar la respuesta
|
|
79
|
+
this.doAction('request_processed', req, res);
|
|
80
|
+
|
|
81
|
+
// Llamar a la función original
|
|
82
|
+
const result = originalEnd.call(res, chunk, encoding, callback);
|
|
83
|
+
|
|
84
|
+
// Disparar hook después de enviar la respuesta
|
|
85
|
+
setImmediate(() => {
|
|
86
|
+
this.doAction('response_sent', req, res);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
return result;
|
|
90
|
+
}.bind(this);
|
|
91
|
+
|
|
92
|
+
next();
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Middleware para manejar errores y disparar hooks correspondientes
|
|
98
|
+
* @returns {Function} Middleware de Express
|
|
99
|
+
*/
|
|
100
|
+
errorHandlerMiddleware() {
|
|
101
|
+
return (err, req, res, next) => {
|
|
102
|
+
// Disparar hook cuando ocurre un error
|
|
103
|
+
this.doAction('error_occurred', err, req, res, next);
|
|
104
|
+
|
|
105
|
+
// Continuar con el manejo de errores de Express
|
|
106
|
+
next(err);
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Middleware para disparar hooks antes de procesar la ruta
|
|
112
|
+
* @param {string} route - Ruta específica
|
|
113
|
+
* @returns {Function} Middleware de Express
|
|
114
|
+
*/
|
|
115
|
+
routeProcessingMiddleware(route) {
|
|
116
|
+
return (req, res, next) => {
|
|
117
|
+
// Disparar hook antes de procesar la ruta específica
|
|
118
|
+
this.doAction(`before_route_${route}`, req, res, next);
|
|
119
|
+
next();
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Middleware para disparar hooks después de procesar la ruta
|
|
125
|
+
* @param {string} route - Ruta específica
|
|
126
|
+
* @returns {Function} Middleware de Express
|
|
127
|
+
*/
|
|
128
|
+
routeProcessedMiddleware(route) {
|
|
129
|
+
return (req, res, next) => {
|
|
130
|
+
// Guardar la función original de res.send
|
|
131
|
+
const originalSend = res.send;
|
|
132
|
+
|
|
133
|
+
// Sobrescribir res.send para capturar cuando se envía la respuesta para una ruta específica
|
|
134
|
+
res.send = function(data) {
|
|
135
|
+
// Disparar hook antes de enviar la respuesta para la ruta específica
|
|
136
|
+
this.doAction(`after_route_${route}`, req, res, data);
|
|
137
|
+
|
|
138
|
+
// Llamar a la función original
|
|
139
|
+
return originalSend.call(res, data);
|
|
140
|
+
}.bind(this);
|
|
141
|
+
|
|
142
|
+
next();
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Método para iniciar la integración con Express
|
|
148
|
+
*/
|
|
149
|
+
init() {
|
|
150
|
+
// Añadir middleware para hooks al inicio de la solicitud
|
|
151
|
+
this.app.use(this.requestStartedMiddleware());
|
|
152
|
+
|
|
153
|
+
// Añadir middleware para hooks al procesar la solicitud
|
|
154
|
+
this.app.use(this.requestProcessedMiddleware());
|
|
155
|
+
|
|
156
|
+
// Añadir middleware para manejo de errores
|
|
157
|
+
this.app.use(this.errorHandlerMiddleware());
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Método para registrar un hook específico para una ruta
|
|
162
|
+
* @param {string} route - Ruta específica
|
|
163
|
+
* @param {string} hookType - Tipo de hook ('before' o 'after')
|
|
164
|
+
* @param {Function} callback - Callback a ejecutar
|
|
165
|
+
* @param {number} priority - Prioridad del callback
|
|
166
|
+
* @param {number} acceptedArgs - Número de argumentos aceptados
|
|
167
|
+
* @param {string} [identifier] - Identificador opcional
|
|
168
|
+
*/
|
|
169
|
+
addRouteHook(route, hookType, callback, priority = 10, acceptedArgs = 1, identifier = null) {
|
|
170
|
+
if (!['before', 'after'].includes(hookType)) {
|
|
171
|
+
throw new Error('hookType debe ser "before" o "after"');
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Determinar el nombre del hook según el tipo
|
|
175
|
+
const hookName = hookType === 'before'
|
|
176
|
+
? `before_route_${route.replace(/\//g, '_')}`
|
|
177
|
+
: `after_route_${route.replace(/\//g, '_')}`;
|
|
178
|
+
|
|
179
|
+
this.addAction(hookName, callback, priority, acceptedArgs, identifier);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Método para registrar un middleware específico para una ruta
|
|
184
|
+
* @param {string} method - Método HTTP (GET, POST, etc.)
|
|
185
|
+
* @param {string} route - Ruta específica
|
|
186
|
+
* @param {...Function} middlewares - Middlewares a aplicar
|
|
187
|
+
*/
|
|
188
|
+
addRouteMiddleware(method, route, ...middlewares) {
|
|
189
|
+
// Añadir middlewares antes de la ruta específica
|
|
190
|
+
this.app[method.toLowerCase()](route, ...middlewares);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Método para extender la funcionalidad de Express con hooks
|
|
195
|
+
* @param {string} methodName - Nombre del método a extender
|
|
196
|
+
* @param {Function} wrapperFn - Función que envuelve la funcionalidad original
|
|
197
|
+
*/
|
|
198
|
+
extendExpressMethod(methodName, wrapperFn) {
|
|
199
|
+
if (this.app && typeof this.app[methodName] === 'function') {
|
|
200
|
+
const originalMethod = this.app[methodName];
|
|
201
|
+
this.app[methodName] = wrapperFn(originalMethod);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
module.exports = ExpressHooked;
|