@lytical/app 1.0.1 → 1.0.3

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 (3) hide show
  1. package/README.md +14 -8
  2. package/index.js +1 -1
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -2,15 +2,21 @@
2
2
 
3
3
  a typescript api server library built for your express project, with dependency injection support and auto router registration
4
4
 
5
- ## Features
5
+ ## features
6
6
 
7
7
  - router handler dependency injection
8
8
  - auto `app.use()` router registration
9
9
  - use middleware, only for routes that require it
10
10
 
11
- ## Getting Started
11
+ ## getting started
12
12
 
13
- after installing `@lytical/app` to your express project, configure your `tsconfig.json` file to enable decorators.
13
+ install packages:
14
+
15
+ ```bash
16
+ npm install @lytical/app @lytical/ioc express
17
+ ```
18
+
19
+ after installing, configure your `tsconfig.json` file to enable decorators.
14
20
 
15
21
  ```json
16
22
  // tsconfig.json
@@ -22,7 +28,7 @@ after installing `@lytical/app` to your express project, configure your `tsconfi
22
28
  }
23
29
  ```
24
30
 
25
- if this is a new project, we recommended installing `express@5.2..`, and the following project structure:
31
+ if this is a new project, we recommended the following project structure:
26
32
 
27
33
  ```
28
34
  project
@@ -66,9 +72,9 @@ for the above project structure:
66
72
  }
67
73
  ```
68
74
 
69
- a simple project template can be found in github (https://....)
75
+ a simple project template / example can be found in github (https://github.com/lytical/ts-app-example)
70
76
 
71
- ## Usage
77
+ ## usage
72
78
 
73
79
  create your injectable service class(es) to implement the business logic.
74
80
 
@@ -224,10 +230,10 @@ app.once(app_evt.server_started, () => {
224
230
  app.start();
225
231
  ```
226
232
 
227
- ## Documentation
233
+ ## documentation
228
234
 
229
235
  todo: working on this right now...
230
236
 
231
- Stay tuned! I have more packages to come.`
237
+ stay tuned! i have more packages to come.`
232
238
 
233
239
  _lytical(r) is a registered trademark of lytical, inc. all rights are reserved._
package/index.js CHANGED
@@ -3,4 +3,4 @@
3
3
  (c) 2025 lytical, inc. all rights are reserved.
4
4
  lytical(r) is a registered trademark of lytical, inc.
5
5
  please refer to your license agreement on the use of this file.
6
- */var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,o,n)}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(){var ownKeys=function(e){return ownKeys=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t},ownKeys(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=ownKeys(e),o=0;o<r.length;o++)"default"!==r[o]&&__createBinding(t,e,r[o]);return __setModuleDefault(t,e),t}}(),__awaiter=this&&this.__awaiter||function(e,t,r,o){return new(r||(r=Promise))(function(n,s){function fulfilled(e){try{step(o.next(e))}catch(e){s(e)}}function rejected(e){try{step(o.throw(e))}catch(e){s(e)}}function step(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(fulfilled,rejected)}step((o=o.apply(e,t||[])).next())})},__asyncValues=this&&this.__asyncValues||function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,r=e[Symbol.asyncIterator];return r?r.call(e):(e="function"==typeof __values?__values(e):e[Symbol.iterator](),t={},verb("next"),verb("throw"),verb("return"),t[Symbol.asyncIterator]=function(){return this},t);function verb(r){t[r]=e[r]&&function(t){return new Promise(function(o,n){(function(e,t,r,o){Promise.resolve(o).then(function(t){e({value:t,done:r})},t)})(o,n,(t=e[r](t)).done,t.value)})}}},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.app=exports.app_evt=void 0,exports.app_middleware_dependency=app_middleware_dependency,exports.app_route=app_route,exports.app_route_handler=app_route_handler;const node_http_1=require("node:http"),node_stream_1=require("node:stream"),promises_1=require("node:fs/promises"),node_path_1=require("node:path"),express_1=__importDefault(require("express")),find_root_1=__importDefault(require("find-root")),ioc_1=require("@lytical/ioc"),collection_1=__importDefault(require("@lytical/ioc/collection"));var app_evt;!function(e){e.create_server="lyt-create-server",e.server_starting="lyt-server-starting",e.server_listening="lyt-server-listening",e.server_started="lyt-server-started"}(app_evt||(exports.app_evt=app_evt={}));const _app=(0,express_1.default)(),_root_route=express_1.default.Router({mergeParams:!0});class app extends node_stream_1.EventEmitter{once(e,t){return super.once(e,t)}start(){return __awaiter(this,void 0,void 0,function*(){var e,t;const r={express:_app,root_route:"/api",wait_for:[]};r.express.use((e,t,r)=>{t.set("X-Powered-By","powered by lytical(r) enterprise solutions, and express"),t.set("X-Lyt-Version","1.0.0"),r()}),console.log("[@lytical/ts-express] creating http server..."),this.emit(app_evt.create_server,r),r.wait_for.length&&(yield Promise.all(r.wait_for)),_app.use(null!==(e=r.root_route)&&void 0!==e?e:"/api",_root_route);const o=null!==(t=r.server)&&void 0!==t?t:(0,node_http_1.createServer)(r.express);yield _register_routes();const n={express:r.express,hostname:process.env.HOSTNAME||"localhost",port:process.env.PORT?parseInt(process.env.PORT,10):3e3,server:o,wait_for:[]};this.emit(app_evt.server_starting,n),n.wait_for.length&&(yield Promise.all(n.wait_for)),yield collection_1.default.create_container(),o.listen(n.port,n.hostname,n.backlog,()=>{this.emit(app_evt.server_listening),console.log(`[@lytical/ts-express] server started on port ${n.port}; hostname ${n.hostname}`)}),this.emit(app_evt.server_started)})}}function _register_routes(){return __awaiter(this,void 0,void 0,function*(){var e,t,r,o,n;const s=process.cwd(),{main:i}=null!==(n=yield Promise.resolve(`${(0,node_path_1.join)((0,find_root_1.default)(s),"package.json")}`).then(e=>__importStar(require(e))))&&void 0!==n?n:{};if(i){const n=yield(0,promises_1.glob)(i);try{for(var a,_=!0,c=__asyncValues(n);!(e=(a=yield c.next()).done);_=!0){o=a.value,_=!1;const e=o;console.log(`[@lytical/ts-express] registering routes in module (${e})...`),yield Promise.resolve(`${(0,node_path_1.join)(s,e)}`).then(e=>__importStar(require(e)))}}catch(e){t={error:e}}finally{try{_||e||!(r=c.return)||(yield r.call(c))}finally{if(t)throw t.error}}}})}exports.app=app;const route_handler_method=Symbol("lyt-app-api-route-handler-method");function app_middleware_dependency(e,...t){return{middleware:e,arg:t}}function app_route({route:e,arg:t}){const r=e;return o=>{var n;const s=express_1.default.Router({mergeParams:!0}),i=null!==(n=o.prototype[route_handler_method])&&void 0!==n?n:{};for(const e of Object.keys(i)){const{route:n,dependency:a,http_method:_}=i[e];if(a.length||_.length>1){const i=express_1.default.Router({mergeParams:!0}),c=[];for(let e of a){if("function"==typeof e){i.use(e),c.push(e.name||"anonymous-middleware");continue}const{middleware:t,arg:r}=e;i.use((e,o,n)=>(0,ioc_1.ioc_create_instance)(t,...null!=r?r:[]).default(e,o,n)),c.push(t.name||"anonymous-middleware")}for(const r of _)i[r.toLowerCase()]?i[r.toLowerCase()](n,(r,n,s)=>{const i=(0,ioc_1.ioc_create_instance)(o,...null!=t?t:[]);(0,ioc_1.ioc_invoke_method)(i[e],i,r,n,s)}):i.use(n,(n,s,i)=>{if(r.toUpperCase()!==n.method)return i();const a=(0,ioc_1.ioc_create_instance)(o,...null!=t?t:[]);(0,ioc_1.ioc_invoke_method)(a[e],a,n,s,i)});console.debug(`[@lytical/ts-express] registered (${_}:${r}${n}) route handler (${o.name}.${e}) with dependencies (${c})`),s.use(i);continue}const[c]=_;c?(s[c.toLowerCase()]?s[c.toLowerCase()](n,(r,n,s)=>{const i=(0,ioc_1.ioc_create_instance)(o,...null!=t?t:[]);(0,ioc_1.ioc_invoke_method)(i[e],i,r,n,s)}):s.use(n,(r,n,s)=>{if(c.toUpperCase()!==r.method)return s();const i=(0,ioc_1.ioc_create_instance)(o,...null!=t?t:[]);(0,ioc_1.ioc_invoke_method)(i[e],i,r,n,s)}),console.debug(`[@lytical/ts-express] registered (${c}:${r}${n}) route handler (${o.name}.${e})`)):(s.use(n,(r,n,s)=>{const i=(0,ioc_1.ioc_create_instance)(o,...null!=t?t:[]);(0,ioc_1.ioc_invoke_method)(i[e],i,r,n,s)}),console.debug(`[@lytical/ts-express] registered (ALL-METHODS:${r}${n}) route handler (${o.name}.${e})`))}return _root_route.use(e,s),o}}function app_route_handler(e){return(t,r,o)=>{var n;switch(e.dependency?Array.isArray(e.dependency)||(e.dependency=[e.dependency]):e.dependency=[],typeof e.http_method){case"undefined":e.http_method=[];break;case"string":e.http_method=[e.http_method]}const s=null!==(n=t[route_handler_method])&&void 0!==n?n:{};return s[r]=e,t[route_handler_method]=s,o}}exports.default=new app;
6
+ */var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,o,n)}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(){var ownKeys=function(e){return ownKeys=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t},ownKeys(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=ownKeys(e),o=0;o<r.length;o++)"default"!==r[o]&&__createBinding(t,e,r[o]);return __setModuleDefault(t,e),t}}(),__awaiter=this&&this.__awaiter||function(e,t,r,o){return new(r||(r=Promise))(function(n,i){function fulfilled(e){try{step(o.next(e))}catch(e){i(e)}}function rejected(e){try{step(o.throw(e))}catch(e){i(e)}}function step(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(fulfilled,rejected)}step((o=o.apply(e,t||[])).next())})},__asyncValues=this&&this.__asyncValues||function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,r=e[Symbol.asyncIterator];return r?r.call(e):(e="function"==typeof __values?__values(e):e[Symbol.iterator](),t={},verb("next"),verb("throw"),verb("return"),t[Symbol.asyncIterator]=function(){return this},t);function verb(r){t[r]=e[r]&&function(t){return new Promise(function(o,n){(function(e,t,r,o){Promise.resolve(o).then(function(t){e({value:t,done:r})},t)})(o,n,(t=e[r](t)).done,t.value)})}}},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.app=exports.app_evt=void 0,exports.app_middleware_dependency=app_middleware_dependency,exports.app_route=app_route,exports.app_route_handler=app_route_handler;const node_http_1=require("node:http"),node_stream_1=require("node:stream"),promises_1=require("node:fs/promises"),node_path_1=require("node:path"),express_1=__importDefault(require("express")),find_root_1=__importDefault(require("find-root")),ioc_1=require("@lytical/ioc"),collection_1=__importDefault(require("@lytical/ioc/collection"));var app_evt;!function(e){e.create_server="lyt-create-server",e.server_starting="lyt-server-starting",e.server_listening="lyt-server-listening",e.server_started="lyt-server-started"}(app_evt||(exports.app_evt=app_evt={}));const _app=(0,express_1.default)(),_root_route=express_1.default.Router({mergeParams:!0});class app extends node_stream_1.EventEmitter{once(e,t){return super.once(e,t)}start(){return __awaiter(this,void 0,void 0,function*(){var e,t;const r={express:_app,root_route:"/api",wait_for:[]};r.express.use((e,t,r)=>{t.set("X-Powered-By","powered by lytical(r) enterprise solutions, and express"),t.set("X-Lyt-Version","1.0.0"),r()}),console.log("[@lytical/app] creating http server..."),this.emit(app_evt.create_server,r),r.wait_for.length&&(yield Promise.all(r.wait_for)),_app.use(null!==(e=r.root_route)&&void 0!==e?e:"/api",_root_route);const o=null!==(t=r.server)&&void 0!==t?t:(0,node_http_1.createServer)(r.express);yield _register_routes();const n={express:r.express,hostname:process.env.HOSTNAME||"localhost",port:process.env.PORT?parseInt(process.env.PORT,10):3e3,server:o,wait_for:[]};this.emit(app_evt.server_starting,n),n.wait_for.length&&(yield Promise.all(n.wait_for)),yield collection_1.default.create_container(),o.listen(n.port,n.hostname,n.backlog,()=>{this.emit(app_evt.server_listening),console.log(`[@lytical/app] server started on port ${n.port}; hostname ${n.hostname}`)}),this.emit(app_evt.server_started)})}}function _register_routes(){return __awaiter(this,void 0,void 0,function*(){var e,t,r,o,n;const i=process.cwd(),{main:a}=null!==(n=yield Promise.resolve(`${(0,node_path_1.join)((0,find_root_1.default)(i),"package.json")}`).then(e=>__importStar(require(e))))&&void 0!==n?n:{};if(a){const n=yield(0,promises_1.glob)(a);try{for(var s,_=!0,c=__asyncValues(n);!(e=(s=yield c.next()).done);_=!0){o=s.value,_=!1;const e=o;console.log(`[@lytical/app] registering routes in module (${e})...`),yield Promise.resolve(`${(0,node_path_1.join)(i,e)}`).then(e=>__importStar(require(e)))}}catch(e){t={error:e}}finally{try{_||e||!(r=c.return)||(yield r.call(c))}finally{if(t)throw t.error}}}})}exports.app=app;const route_handler_method=Symbol("lyt-app-api-route-handler-method");function app_middleware_dependency(e,...t){return{middleware:e,arg:t}}function app_route({route:e,arg:t}){const r=e;return o=>{var n;const i=express_1.default.Router({mergeParams:!0}),a=null!==(n=o.prototype[route_handler_method])&&void 0!==n?n:{};for(const e of Object.keys(a)){const{route:n,dependency:s,http_method:_}=a[e];if(s.length||_.length>1){const a=express_1.default.Router({mergeParams:!0}),c=[];for(let e of s){if("function"==typeof e){a.use(e),c.push(e.name||"anonymous-middleware");continue}const{middleware:t,arg:r}=e;a.use((e,o,n)=>(0,ioc_1.ioc_create_instance)(t,...null!=r?r:[]).default(e,o,n)),c.push(t.name||"anonymous-middleware")}for(const r of _)a[r.toLowerCase()]?a[r.toLowerCase()](n,(r,n,i)=>{const a=(0,ioc_1.ioc_create_instance)(o,...null!=t?t:[]);(0,ioc_1.ioc_invoke_method)(a[e],a,r,n,i)}):a.use(n,(n,i,a)=>{if(r.toUpperCase()!==n.method)return a();const s=(0,ioc_1.ioc_create_instance)(o,...null!=t?t:[]);(0,ioc_1.ioc_invoke_method)(s[e],s,n,i,a)});console.debug(`[@lytical/app] registered (${_}:${r}${n}) route handler (${o.name}.${e}) with dependencies (${c})`),i.use(a);continue}const[c]=_;c?(i[c.toLowerCase()]?i[c.toLowerCase()](n,(r,n,i)=>{const a=(0,ioc_1.ioc_create_instance)(o,...null!=t?t:[]);(0,ioc_1.ioc_invoke_method)(a[e],a,r,n,i)}):i.use(n,(r,n,i)=>{if(c.toUpperCase()!==r.method)return i();const a=(0,ioc_1.ioc_create_instance)(o,...null!=t?t:[]);(0,ioc_1.ioc_invoke_method)(a[e],a,r,n,i)}),console.debug(`[@lytical/app] registered (${c}:${r}${n}) route handler (${o.name}.${e})`)):(i.use(n,(r,n,i)=>{const a=(0,ioc_1.ioc_create_instance)(o,...null!=t?t:[]);(0,ioc_1.ioc_invoke_method)(a[e],a,r,n,i)}),console.debug(`[@lytical/app] registered (ALL-METHODS:${r}${n}) route handler (${o.name}.${e})`))}return _root_route.use(e,i),o}}function app_route_handler(e){return(t,r,o)=>{var n;switch(e.dependency?Array.isArray(e.dependency)||(e.dependency=[e.dependency]):e.dependency=[],typeof e.http_method){case"undefined":e.http_method=[];break;case"string":e.http_method=[e.http_method]}const i=null!==(n=t[route_handler_method])&&void 0!==n?n:{};return i[r]=e,t[route_handler_method]=i,o}}exports.default=new app;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lytical/app",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "a typescript api server library built for your express project, with dependency injection support and auto router registration",
5
5
  "main": "index.js",
6
6
  "private": false,