taon 19.0.60 → 19.0.61

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 (90) hide show
  1. package/README.md +160 -160
  2. package/bin/start.js +281 -279
  3. package/bin/taon +6 -6
  4. package/bin/taon-debug +5 -5
  5. package/bin/taon-debug-brk +5 -5
  6. package/browser/README.md +24 -24
  7. package/browser/fesm2022/taon.mjs +81 -24
  8. package/browser/fesm2022/taon.mjs.map +1 -1
  9. package/browser/lib/base-classes/base-context.d.ts +1 -6
  10. package/browser/lib/base-classes/base-controller.d.ts +18 -2
  11. package/browser/lib/base-classes/base-repository.d.ts +1 -1
  12. package/browser/lib/base-classes/base.d.ts +1 -6
  13. package/browser/lib/create-context.d.ts +2 -12
  14. package/browser/lib/endpoint-context.d.ts +3 -0
  15. package/browser/lib/index.d.ts +5 -18
  16. package/browser/lib/models.d.ts +6 -0
  17. package/browser/lib/realtime/realtime-client.d.ts +2 -2
  18. package/browser/package.json +1 -1
  19. package/lib/base-classes/base-context.d.ts +1 -6
  20. package/lib/base-classes/base-controller.d.ts +18 -2
  21. package/lib/base-classes/base-controller.js +25 -5
  22. package/lib/base-classes/base-controller.js.map +1 -1
  23. package/lib/base-classes/base-repository.d.ts +1 -1
  24. package/lib/base-classes/base-repository.js +12 -6
  25. package/lib/base-classes/base-repository.js.map +1 -1
  26. package/lib/base-classes/base.d.ts +1 -6
  27. package/lib/build-info._auto-generated_.d.ts +1 -1
  28. package/lib/build-info._auto-generated_.js +1 -1
  29. package/lib/create-context.d.ts +2 -12
  30. package/lib/create-context.js +21 -11
  31. package/lib/create-context.js.map +1 -1
  32. package/lib/decorators/classes/controller-config.d.ts +0 -20
  33. package/lib/decorators/classes/controller-config.js +2 -18
  34. package/lib/decorators/classes/controller-config.js.map +1 -1
  35. package/lib/decorators/classes/controller-options.d.ts +0 -16
  36. package/lib/decorators/classes/controller-options.js +2 -17
  37. package/lib/decorators/classes/controller-options.js.map +1 -1
  38. package/lib/endpoint-context.d.ts +3 -0
  39. package/lib/endpoint-context.js +24 -6
  40. package/lib/endpoint-context.js.map +1 -1
  41. package/lib/env/env.angular-node-app.d.ts +2 -0
  42. package/lib/env/env.angular-node-app.js +4 -2
  43. package/lib/env/env.angular-node-app.js.map +1 -1
  44. package/lib/env/env.docs-webapp.d.ts +2 -0
  45. package/lib/env/env.docs-webapp.js +4 -2
  46. package/lib/env/env.docs-webapp.js.map +1 -1
  47. package/lib/env/env.electron-app.d.ts +2 -0
  48. package/lib/env/env.electron-app.js +4 -2
  49. package/lib/env/env.electron-app.js.map +1 -1
  50. package/lib/env/env.mobile-app.d.ts +2 -0
  51. package/lib/env/env.mobile-app.js +4 -2
  52. package/lib/env/env.mobile-app.js.map +1 -1
  53. package/lib/env/env.npm-lib-and-cli-tool.d.ts +2 -0
  54. package/lib/env/env.npm-lib-and-cli-tool.js +4 -2
  55. package/lib/env/env.npm-lib-and-cli-tool.js.map +1 -1
  56. package/lib/env/env.vscode-plugin.d.ts +2 -0
  57. package/lib/env/env.vscode-plugin.js +4 -2
  58. package/lib/env/env.vscode-plugin.js.map +1 -1
  59. package/lib/env.d.ts +2 -0
  60. package/lib/env.js +7 -0
  61. package/lib/env.js.map +1 -0
  62. package/lib/index.d.ts +5 -18
  63. package/lib/index.js +3 -1
  64. package/lib/index.js.map +1 -1
  65. package/lib/models.d.ts +6 -0
  66. package/lib/models.js.map +1 -1
  67. package/lib/realtime/realtime-client.d.ts +2 -2
  68. package/lib/realtime/realtime-client.js +13 -7
  69. package/lib/realtime/realtime-client.js.map +1 -1
  70. package/lib/realtime/realtime-server.js +17 -14
  71. package/lib/realtime/realtime-server.js.map +1 -1
  72. package/lib/storage.d.ts +1 -0
  73. package/lib/storage.js +6 -0
  74. package/lib/storage.js.map +1 -0
  75. package/lib/ui/index.js +2 -2
  76. package/lib/ui/taon-admin-mode-configuration/index.js +2 -2
  77. package/package.json +1 -1
  78. package/websql/README.md +24 -24
  79. package/websql/fesm2022/taon.mjs +75 -20
  80. package/websql/fesm2022/taon.mjs.map +1 -1
  81. package/websql/lib/base-classes/base-context.d.ts +1 -6
  82. package/websql/lib/base-classes/base-controller.d.ts +18 -2
  83. package/websql/lib/base-classes/base-repository.d.ts +1 -1
  84. package/websql/lib/base-classes/base.d.ts +1 -6
  85. package/websql/lib/create-context.d.ts +2 -12
  86. package/websql/lib/endpoint-context.d.ts +3 -0
  87. package/websql/lib/index.d.ts +5 -18
  88. package/websql/lib/models.d.ts +6 -0
  89. package/websql/lib/realtime/realtime-client.d.ts +2 -2
  90. package/websql/package.json +1 -1
package/websql/README.md CHANGED
@@ -1,24 +1,24 @@
1
- # MyLib
2
-
3
- This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.2.0.
4
-
5
- ## Code scaffolding
6
-
7
- Run `ng generate component component-name --project my-lib` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project my-lib`.
8
- > Note: Don't forget to add `--project my-lib` or else it will be added to the default project in your `angular.json` file.
9
-
10
- ## Build
11
-
12
- Run `ng build my-lib` to build the project. The build artifacts will be stored in the `dist/` directory.
13
-
14
- ## Publishing
15
-
16
- After building your library with `ng build my-lib`, go to the dist folder `cd dist/my-lib` and run `npm publish`.
17
-
18
- ## Running unit tests
19
-
20
- Run `ng test my-lib` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
-
22
- ## Further help
23
-
24
- To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
1
+ # MyLib
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.2.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project my-lib` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project my-lib`.
8
+ > Note: Don't forget to add `--project my-lib` or else it will be added to the default project in your `angular.json` file.
9
+
10
+ ## Build
11
+
12
+ Run `ng build my-lib` to build the project. The build artifacts will be stored in the `dist/` directory.
13
+
14
+ ## Publishing
15
+
16
+ After building your library with `ng build my-lib`, go to the dist folder `cd dist/my-lib` and run `npm publish`.
17
+
18
+ ## Running unit tests
19
+
20
+ Run `ng test my-lib` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
+
22
+ ## Further help
23
+
24
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
@@ -1554,9 +1554,7 @@ class RealtimeClient {
1554
1554
  this.subsManagers = {};
1555
1555
  this.core = core;
1556
1556
  if (!core.ctx.disabledRealtime) {
1557
- //#region @browser
1558
1557
  this.init();
1559
- //#endregion
1560
1558
  }
1561
1559
  }
1562
1560
  //#region methods & getters / init
@@ -1570,12 +1568,12 @@ class RealtimeClient {
1570
1568
  if (this.core.ctx.config.frontendHost &&
1571
1569
  this.core.ctx.config.frontendHost !== '' &&
1572
1570
  this.core.ctx.isRunningInsideDocker) {
1573
- console.log(`[${this.core.ctx.contextName}] USING FRONTEND HOST ${this.core.ctx.config.frontendHost}`);
1571
+ Helpers.logInfo(`[${this.core.ctx.contextName}] USING FRONTEND HOST ${this.core.ctx.config.frontendHost}`);
1574
1572
  nspPath.global = new URL(`${this.core.ctx.frontendHostUri.origin}${nspPath.global.pathname}`);
1575
1573
  nspPath.realtime = new URL(`${this.core.ctx.frontendHostUri.origin}${nspPath.realtime.pathname}`);
1576
1574
  }
1577
1575
  else {
1578
- console.log(`[${this.core.ctx.contextName}] NOT USING FRONTEND HOST`);
1576
+ Helpers.logInfo(`[${this.core.ctx.contextName}] NOT USING FRONTEND HOST`);
1579
1577
  }
1580
1578
  this.core.ctx.logRealtime &&
1581
1579
  console.info('[CLIENT] NAMESPACE GLOBAL ', nspPath.global.href + ` host: ${this.core.ctx.host}`);
@@ -1720,7 +1718,13 @@ to use socket realtime connection;
1720
1718
  //#endregion
1721
1719
  //#region methods & getters / get room id from
1722
1720
  getUniqueIdentifierForConnection(options) {
1723
- const url = new URL(options.core.ctx.host);
1721
+ let url;
1722
+ if (UtilsOs.isBrowser) {
1723
+ url = new URL(options.core.ctx.host);
1724
+ }
1725
+ else {
1726
+ url = new URL(options.core.ctx.remoteHost); // backend-to-backend use remote host
1727
+ }
1724
1728
  return `${this.core.ctx.contextName}:${url.origin}|${options.roomName}|${options.property}|${options.customEvent}`;
1725
1729
  }
1726
1730
  }
@@ -1741,7 +1745,7 @@ class RealtimeServer {
1741
1745
  }
1742
1746
  //#region methods & getters / init
1743
1747
  init() {
1744
- //#region @websql
1748
+ //#region @browser
1745
1749
  if (!this.core.ctx.config.frontendHost) {
1746
1750
  console.warn(`[Taon][Realtime]
1747
1751
 
@@ -1752,6 +1756,8 @@ class RealtimeServer {
1752
1756
 
1753
1757
  `);
1754
1758
  }
1759
+ //#endregion
1760
+ //#region @websql
1755
1761
  //#region prepare namespaces pathes
1756
1762
  const nspPathGlobal = this.core.pathFor();
1757
1763
  const nspPathRealtime = this.core.pathFor(Symbols.REALTIME.NAMESPACE(this.core.ctx.contextName));
@@ -1773,8 +1779,9 @@ class RealtimeServer {
1773
1779
  console.info(`[backend] CREATE GLOBAL NAMESPACE: '${this.core.connectSocketBE.path()}'` +
1774
1780
  ` , path: '${nspPathGlobal.pathname}'`);
1775
1781
  this.core.connectSocketBE.on('connection', clientSocket => {
1776
- console.info(`[backend] client connected to namespace "${nspPathGlobal.pathname}", ` +
1777
- ` host: ${this.core.ctx.host}`);
1782
+ this.core.ctx.logRealtime &&
1783
+ console.info(`[backend] client connected to namespace "${nspPathGlobal.pathname}", ` +
1784
+ ` host: ${this.core.ctx.host}`);
1778
1785
  });
1779
1786
  //#endregion
1780
1787
  //#region prepare realtime BE socket
@@ -1789,8 +1796,9 @@ class RealtimeServer {
1789
1796
  console.info(`[backend] CREATE REALTIME NAMESPACE: '${this.core.socketBE.path()}'` +
1790
1797
  ` , path: '${nspPathRealtime.pathname}' `);
1791
1798
  this.core.socketBE.on('connection', backendSocketForClient => {
1792
- console.info(`[backend] client connected to namespace "${nspPathRealtime.pathname}", ` +
1793
- ` host: ${this.core.ctx.host}`);
1799
+ this.core.ctx.logRealtime &&
1800
+ console.info(`[backend] client connected to namespace "${nspPathRealtime.pathname}", ` +
1801
+ ` host: ${this.core.ctx.host}`);
1794
1802
  backendSocketForClient.on(Symbols.REALTIME.ROOM_SUBSCRIBE_CUSTOM(this.core.ctx.contextName), roomName => {
1795
1803
  this.core.ctx.logRealtime &&
1796
1804
  console.info(`Joining room ${roomName} in namespace REALTIME` +
@@ -2919,6 +2927,7 @@ class EndpointContext {
2919
2927
  !this.config.remoteHost.startsWith('https://')) {
2920
2928
  Helpers.throw(`[taon-config] Your 'remoteHost' must start with http:// or https://`);
2921
2929
  }
2930
+ // console.log(`config for ${this.contextName}`, this.config);
2922
2931
  //#region resolve if skipping writing server routes
2923
2932
  //@ts-expect-error overriding readonly
2924
2933
  this.skipWritingServerRoutes = _.isBoolean(this.config.skipWritingServerRoutes)
@@ -2956,7 +2965,9 @@ class EndpointContext {
2956
2965
  // console.log(this.config)
2957
2966
  // }
2958
2967
  if (!this.mode && !this.config.abstract) {
2959
- Helpers.error(`[taon] Context "${this.contextName}": You need to provide host or remoteHost or useIpcWhenElectron`, false, true);
2968
+ const errMsg = `You need to provide host or remoteHost or ` +
2969
+ `useIpcWhenElectron (or mark it as abstract)`;
2970
+ Helpers.error(`[taon] Context "${this.contextName}": ${errMsg}`, false, true);
2960
2971
  /* */
2961
2972
  /* */
2962
2973
  }
@@ -3132,7 +3143,10 @@ class EndpointContext {
3132
3143
  //#endregion
3133
3144
  //#region prepare realtime
3134
3145
  if (!this.config.abstract) {
3135
- this.disabledRealtime = !!this.config.disabledRealtime;
3146
+ this.disabledRealtime = this.config.disabledRealtime;
3147
+ /* */
3148
+ /* */
3149
+ /* */
3136
3150
  /* */
3137
3151
  /* */
3138
3152
  /* */
@@ -3964,6 +3978,18 @@ class EndpointContext {
3964
3978
  });
3965
3979
  }
3966
3980
  //#endregion
3981
+ async initControllersHook(allInitedEndpointContexts) {
3982
+ if (this.isRunOrRevertOnlyMigrationAppStart) {
3983
+ return;
3984
+ }
3985
+ const allControllers = this.getClassFunByArr(Models.ClassType.CONTROLLER);
3986
+ for (const controllerClassFn of allControllers) {
3987
+ const instance = this.getInstanceBy(controllerClassFn);
3988
+ if (_.isFunction(instance.afterAllCtxInited)) {
3989
+ await instance.afterAllCtxInited(allInitedEndpointContexts);
3990
+ }
3991
+ }
3992
+ }
3967
3993
  async initControllers() {
3968
3994
  if (this.isRunOrRevertOnlyMigrationAppStart) {
3969
3995
  return;
@@ -5085,21 +5111,22 @@ const createContext = (configFn) => {
5085
5111
  //#endregion
5086
5112
  await endpointContextRef.initClasses();
5087
5113
  if (endpointContextRef.databaseConfig) {
5088
- let keepWebsqlDbDataAfterReload = false;
5114
+ //#region handle websql reload data
5089
5115
  //#region @browser
5116
+ let keepWebsqlDbDataAfterReload = false;
5090
5117
  keepWebsqlDbDataAfterReload =
5091
5118
  TaonAdminService.Instance?.keepWebsqlDbDataAfterReload;
5092
- //#endregion
5093
- if (!Helpers.isNode && keepWebsqlDbDataAfterReload) {
5119
+ if (keepWebsqlDbDataAfterReload) {
5094
5120
  !UtilsOs.isRunningInCliMode() &&
5095
5121
  Helpers.info(`[taon] Keeping websql data after reload ` +
5096
5122
  `(context=${endpointContextRef.contextName}).`);
5097
5123
  }
5098
5124
  else {
5099
- !UtilsOs.isRunningInCliMode() &&
5100
- Helpers.info(`[taon] Dropping all tables and data ` +
5101
- `(context=${endpointContextRef.contextName}).`);
5125
+ Helpers.info(`[taon] Dropping all tables and data ` +
5126
+ `(context=${endpointContextRef.contextName}).`);
5102
5127
  }
5128
+ //#endregion
5129
+ //#endregion
5103
5130
  //#region TODO this may be usefull but for now
5104
5131
  // 2 separate contexts are fine
5105
5132
  // const shouldStartRemoteHost = endpointContextRef.mode !== 'remote-backend(tcp+udp)';
@@ -5113,15 +5140,20 @@ const createContext = (configFn) => {
5113
5140
  // endpointContextRef.__contextForControllerInstanceAccess = endpointContextRemoteHostRef;
5114
5141
  // }
5115
5142
  //#endregion
5143
+ //#region run migrations tasks
5116
5144
  if (endpointContextRef.onlyMigrationRun) {
5145
+ Helpers.log(`[taon] Running only migrations (context=${endpointContextRef.contextName}).`);
5117
5146
  await endpointContextRef.dbMigrations.runAllNotCompletedMigrations();
5118
5147
  }
5119
5148
  else if (endpointContextRef.onlyMigrationRevertToTimestamp) {
5149
+ Helpers.log(`[taon] Reverting migrations to timestamp ${endpointContextRef.onlyMigrationRevertToTimestamp} (context=${endpointContextRef.contextName}).`);
5120
5150
  await endpointContextRef.dbMigrations.revertMigrationToTimestamp(endpointContextRef.onlyMigrationRevertToTimestamp);
5121
5151
  }
5122
5152
  else {
5153
+ Helpers.log(`[taon] Running all not applied migrations (context=${endpointContextRef.contextName}).`);
5123
5154
  await endpointContextRef.dbMigrations.runAllNotCompletedMigrations();
5124
5155
  }
5156
+ //#endregion
5125
5157
  }
5126
5158
  resolve(endpointContextRef);
5127
5159
  });
@@ -5641,6 +5673,11 @@ let BaseRepository = class BaseRepository extends BaseCustomRepository {
5641
5673
  const deletedEntity = await this.repo.findOne({
5642
5674
  where: { id: idOrEntity },
5643
5675
  });
5676
+ if (!deletedEntity) {
5677
+ Helpers.warn(`[BaseRepository] Entity "${ClassHelpers.getName(this.repo.target)}" ` +
5678
+ `with id ${idOrEntity} not found, cannot remove`);
5679
+ return;
5680
+ }
5644
5681
  const idCopy = deletedEntity.id;
5645
5682
  await this.repo.remove(deletedEntity);
5646
5683
  deletedEntity.id = idCopy;
@@ -6167,6 +6204,11 @@ function Body(name) {
6167
6204
  /* */
6168
6205
  /* */
6169
6206
  let BaseController = class BaseController extends BaseInjector {
6207
+ /**
6208
+ * Hook that is called when taon app is inited
6209
+ * (all contexts are created and inited)
6210
+ */
6211
+ async afterAllCtxInited(allContexts) { }
6170
6212
  //#region upload form data to server
6171
6213
  uploadFormDataToServer(formData) {
6172
6214
  /* */
@@ -6190,11 +6232,24 @@ let BaseController = class BaseController extends BaseInjector {
6190
6232
  /* */
6191
6233
  /* */
6192
6234
  /* */
6235
+ /* */
6236
+ /* */
6237
+ /* */
6238
+ /* */
6239
+ /* */
6193
6240
  return (void 0);
6194
6241
  }
6195
6242
  //#endregion
6243
+ //#region after file upload hook
6244
+ /**
6245
+ * Hook after file is uploaded
6246
+ * through `uploadFormDataToServer` or `uploadLocalFileToServer`
6247
+ */
6248
+ afterFileUploadAction(file) {
6249
+ // empty
6250
+ }
6196
6251
  //#region upload local file to server
6197
- async uploadLocalFileToServer(absFilePath) {
6252
+ async uploadLocalFileToServer(absFilePath, options) {
6198
6253
  /* */
6199
6254
  /* */
6200
6255
  /* */
@@ -6827,5 +6882,5 @@ var Taon;
6827
6882
  * Generated bundle index. Do not edit.
6828
6883
  */
6829
6884
 
6830
- export { BaseContext, BaseController, BaseCustomRepository, BaseEntity, BaseMigration, BaseProvider, BaseRepository, CURRENT_HOST_BACKEND_PORT, CURRENT_HOST_URL, ClassHelpers, EndpointContext, Models, TAON_CONTEXT, Taon, TaonAdminService, TaonEntityKeysToOmitArr, apiPrefix, createContext, inject };
6885
+ export { BaseContext, BaseController, BaseCustomRepository, BaseEntity, BaseFileUploadMiddleware, BaseMigration, BaseProvider, BaseRepository, CURRENT_HOST_BACKEND_PORT, CURRENT_HOST_URL, ClassHelpers, EndpointContext, Models, TAON_CONTEXT, Taon, TaonAdminService, TaonEntityKeysToOmitArr, apiPrefix, createContext, inject };
6831
6886
  //# sourceMappingURL=taon.mjs.map