org-core-js 0.0.1

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 (63) hide show
  1. package/README.md +446 -0
  2. package/babel.config.json +13 -0
  3. package/cjs/core/driverCore.js +37 -0
  4. package/cjs/core/drivers/bull.js +56 -0
  5. package/cjs/core/drivers/fogu.js +14 -0
  6. package/cjs/core/drivers/mq.js +50 -0
  7. package/cjs/core/drivers/nats.js +161 -0
  8. package/cjs/core/drivers/osone.js +14 -0
  9. package/cjs/core/drivers/rabbitmq.js +68 -0
  10. package/cjs/core/drivers/redis.js +68 -0
  11. package/cjs/core/drivers/socket.js +36 -0
  12. package/cjs/core/entityCore.js +22 -0
  13. package/cjs/core/eventCore.js +26 -0
  14. package/cjs/core/index.js +477 -0
  15. package/cjs/core/libCore.js +22 -0
  16. package/cjs/core/repositoryCore.js +30 -0
  17. package/cjs/core/serverCore.js +142 -0
  18. package/cjs/core/serviceCore.js +26 -0
  19. package/cjs/core/utilCore.js +22 -0
  20. package/cjs/core/workerCore.js +27 -0
  21. package/cjs/fileCore.js +27 -0
  22. package/cjs/forawait.js +55 -0
  23. package/cjs/index.js +117 -0
  24. package/cjs/package.json +3 -0
  25. package/esm/core/driverCore.js +33 -0
  26. package/esm/core/drivers/bull.js +49 -0
  27. package/esm/core/drivers/fogu.js +12 -0
  28. package/esm/core/drivers/nats.js +160 -0
  29. package/esm/core/drivers/rabbitmq.js +64 -0
  30. package/esm/core/drivers/redis.js +71 -0
  31. package/esm/core/drivers/socket.js +28 -0
  32. package/esm/core/entityCore.js +12 -0
  33. package/esm/core/eventCore.js +17 -0
  34. package/esm/core/index.js +440 -0
  35. package/esm/core/libCore.js +13 -0
  36. package/esm/core/repositoryCore.js +25 -0
  37. package/esm/core/serverCore.js +155 -0
  38. package/esm/core/serviceCore.js +17 -0
  39. package/esm/core/utilCore.js +12 -0
  40. package/esm/core/workerCore.js +20 -0
  41. package/esm/fileCore.js +19 -0
  42. package/esm/forawait.js +48 -0
  43. package/esm/index.js +128 -0
  44. package/esm/package.json +3 -0
  45. package/lib/index.html +1021 -0
  46. package/package.json +73 -0
  47. package/src/app/events/test/app.js +13 -0
  48. package/src/app/events/test/ws.js +14 -0
  49. package/src/app/services/test/app.js +14 -0
  50. package/src/app/services/test/app1.js +11 -0
  51. package/src/core/entities/user.js +14 -0
  52. package/src/core/libs/hash.js +10 -0
  53. package/src/core/utils/auth.js +19 -0
  54. package/src/index.js +11 -0
  55. package/src/infra/db/index.js +7 -0
  56. package/src/infra/repositories/test/app.js +6 -0
  57. package/src/infra/web/http.js +15 -0
  58. package/src/infra/web/routers/auth.js +30 -0
  59. package/src/infra/web/routers/test.js +26 -0
  60. package/src/infra/web/ws/test.js +35 -0
  61. package/src/infra/workers/test/test.md +14 -0
  62. package/src/start.js +39 -0
  63. package/test/core.test.js +46 -0
package/README.md ADDED
@@ -0,0 +1,446 @@
1
+ # 🧩 create-org-app
2
+
3
+ **`create-org-app`** é um *framework modular e orientado a eventos* para construção de aplicações escaláveis, distribuídas e multi-driver.
4
+
5
+ Suporta **HTTP**, **WebSocket**, **NATS**, **Redis**, **BullMQ**, **gRPC** e muito mais — oferecendo um ecossistema completo para desenvolvimento de **microserviços**, **SaaS**, **sistemas reativos** e **plataformas de automação**.
6
+
7
+ ---
8
+
9
+ ## 🚀 Visão Geral
10
+
11
+ A biblioteca fornece uma estrutura unificada para organizar e executar:
12
+
13
+ * **Serviços** (`app/services`)
14
+ * **Eventos** (`app/events`)
15
+ * **Entidades e DTOs** (`core/entities`)
16
+ * **Bibliotecas internas** (`core/libs`)
17
+ * **Utilitários globais** (`core/utils`)
18
+ * **Infraestrutura (DB, Web, Workers, etc.)** (`infra/*`)
19
+ * **Fluxo de inicialização e encerramento controlado** (`index.js` e `start.js`)
20
+
21
+ ---
22
+
23
+ ## 📦 Instalação
24
+
25
+ ```bash
26
+ npm install create-org-app
27
+ ```
28
+
29
+ ---
30
+
31
+ ## 📁 Estrutura Geral
32
+
33
+ ```
34
+ src/
35
+ ├── app/
36
+ │ ├── services/
37
+ │ │ └── test/app.js
38
+ │ └── events/
39
+ │ └── test/app.js
40
+
41
+ ├── core/
42
+ │ ├── entities/
43
+ │ │ └── user.js
44
+ │ ├── libs/
45
+ │ │ └── password.js
46
+ │ └── utils/
47
+ │ └── auth.js
48
+
49
+ ├── infra/
50
+ │ ├── db/
51
+ │ │ └── index.js
52
+ │ ├── repositories/
53
+ │ │ └── test/app.js
54
+ │ ├── web/
55
+ │ │ ├── http.js
56
+ │ │ ├── routers/
57
+ │ │ │ └── test.js
58
+ │ │ └── ws/
59
+ │ │ └── test.js
60
+ │ └── workers/
61
+ │ └── worker.js
62
+
63
+ ├── start.js
64
+ └── index.js
65
+ ```
66
+
67
+ ---
68
+
69
+ ## ⚙️ Ciclo de Vida da Aplicação
70
+
71
+ ### `index.js`
72
+
73
+ ```js
74
+ export default {
75
+ async bootstrap({ core }) {
76
+ core.service("test.app").execute({});
77
+ /*
78
+ core.driver("nats").command("test.app1", { name: "ssssss" }, {
79
+ apiKey: "sssss"
80
+ });
81
+ */
82
+ },
83
+
84
+ async distroy(core) {
85
+ console.log("close", e);
86
+ }
87
+ };
88
+ ```
89
+
90
+ | Método | Momento | Descrição |
91
+ | --------------------- | -------- | -------------------------------------------------------------------------------------- |
92
+ | `bootstrap({ core })` | Startup | Executado na inicialização. Ideal para pré-carregar serviços, listeners e integrações. |
93
+ | `distroy(core)` | Shutdown | Executado no encerramento da aplicação, para limpar conexões e recursos. |
94
+
95
+ ---
96
+
97
+ ## 🚀 start.js
98
+
99
+ ```js
100
+ import { app } from "../esm/index.js";
101
+ // import { app } from "create-org-app";
102
+
103
+ await app.run({
104
+ drivers: [
105
+ /* { type: "nats", name: "nats", config: { servers: process.env.NATS_URL } }, */
106
+ ],
107
+ servers: [
108
+ { type: "http", rootPath: "" },
109
+ /* { type: "nats", driver: "nats", services: ["test.*"] } */
110
+ ]
111
+ });
112
+ ```
113
+
114
+ ---
115
+
116
+ ## 🧩 Estrutura Avançada — Exemplo Completo
117
+
118
+ A seguir, um exemplo de integração entre todos os módulos principais, com suporte a **eventos, serviços, entidades, DB, Web, WS e Workers**.
119
+
120
+ ---
121
+
122
+ ### 🧠 Eventos (`app/events/test/app.js`)
123
+
124
+ ```js
125
+ // Evento interno (Node)
126
+ export default () => ({
127
+ event: {
128
+ method: "node"
129
+ },
130
+ execute: (data) => {
131
+ console.log(data, "event");
132
+ }
133
+ });
134
+ ```
135
+
136
+ ```js
137
+ // Evento WebSocket
138
+ export default () => ({
139
+ event: {
140
+ method: "ws",
141
+ route: "/test",
142
+ topic: "test.app"
143
+ },
144
+ execute: (data) => {
145
+ console.log(data, "event");
146
+ }
147
+ });
148
+ ```
149
+
150
+ ---
151
+
152
+ ### ⚙️ Serviço (`app/services/test/app.js`)
153
+
154
+ ```js
155
+ export default ({ entity, repository }) => ({
156
+ driver: {
157
+ node: true
158
+ },
159
+ async execute(data) {
160
+ console.log(data);
161
+ const app = await entity("user").entity(data);
162
+ const res = await repository("test.app").execute(app.id || "ddddddddddd");
163
+ return { data: res };
164
+ }
165
+ });
166
+ ```
167
+
168
+ ---
169
+
170
+ ### 🧱 Entidades (`core/entities/user.js`)
171
+
172
+ ```js
173
+ import { z } from "zod";
174
+
175
+ export default () => ({
176
+ entity(data) {
177
+ const schema = z.object({
178
+ id: z.string().optional(),
179
+ name: z.string().min(2)
180
+ });
181
+ return schema.parse(data);
182
+ },
183
+ dto() {
184
+ return { name: "sss" };
185
+ }
186
+ });
187
+ ```
188
+
189
+ ---
190
+
191
+ ### 🔐 Libs (`core/libs/password.js`)
192
+
193
+ ```js
194
+ export default () => ({
195
+ password(text) {
196
+ return text;
197
+ },
198
+ compare(password, hash) {
199
+ return password === hash;
200
+ }
201
+ });
202
+ ```
203
+
204
+ ---
205
+
206
+ ### 🧩 Utils (`core/utils/auth.js`)
207
+
208
+ ```js
209
+ export default () => ({
210
+ apiKey(headers) {
211
+ console.log(headers);
212
+ return false;
213
+ }
214
+ });
215
+ ```
216
+
217
+ ---
218
+
219
+ ### 🧭 DB (`infra/db/index.js`)
220
+
221
+ ```js
222
+ export default () => ({
223
+ app: {
224
+ findUnique(id) {
225
+ return id;
226
+ }
227
+ }
228
+ });
229
+ ```
230
+
231
+ ---
232
+
233
+ ### 💾 Repositório (`infra/repositories/test/app.js`)
234
+
235
+ ```js
236
+ export default ({ db }) => ({
237
+ async execute(id) {
238
+ return await db.app.findUnique(id);
239
+ }
240
+ });
241
+ ```
242
+
243
+ ---
244
+
245
+ ### 🌐 HTTP — Routers (`infra/web/routers/test.js`)
246
+
247
+ ```js
248
+ export default ({ util }) => ([
249
+ {
250
+ url: "/api/test",
251
+ method: "get",
252
+ middlewares: [util("auth").apiKey([])],
253
+ async handler(request, reply) {
254
+ const { user } = request;
255
+ try {
256
+ reply.send({ data: user });
257
+ } catch (error) {
258
+ reply.status(500).send({ error: error.message });
259
+ }
260
+ }
261
+ }
262
+ ]);
263
+ ```
264
+
265
+ ---
266
+
267
+ ### 🔌 WebSocket (`infra/web/ws/test.js`)
268
+
269
+ ```js
270
+ import forawait from "../../../../esm/forawait.js";
271
+
272
+ export default ({ events }) => ({
273
+ route: "/test",
274
+
275
+ async auth(socket, next) {
276
+ try {
277
+ next();
278
+ } catch (error) {
279
+ next(error);
280
+ }
281
+ },
282
+
283
+ async connection(socket) {
284
+ console.info("Socket connected!", socket.id);
285
+ socket.join("test");
286
+
287
+ forawait.generate(events, (io) => {
288
+ socket.on(io.event.topic, (input, cb) => {
289
+ io.execute({ input, cb }, { socket, io: this });
290
+ });
291
+ });
292
+
293
+ socket.on("disconnect", async () => {
294
+ console.log("disconnect:" + socket.id);
295
+ });
296
+ }
297
+ });
298
+ ```
299
+
300
+ ---
301
+
302
+ ### 🧰 Servidor HTTP Base (`infra/web/http.js`)
303
+
304
+ ```js
305
+ export default ({ routers = [], ws = [] }) => ({
306
+ io: null,
307
+
308
+ async start() {
309
+ console.log(routers, ws);
310
+ },
311
+
312
+ async stop() {}
313
+ });
314
+ ```
315
+
316
+ ---
317
+
318
+ ### ⚙️ Worker (`infra/workers/worker.js`)
319
+
320
+ ```js
321
+ export default ({ service }) => ({
322
+ job: {
323
+ name: "test.app",
324
+ method: "node"
325
+ },
326
+ async execute({ data }) {
327
+ await service("test.app").execute(data);
328
+ return {};
329
+ }
330
+ });
331
+ ```
332
+
333
+ ---
334
+
335
+ ## 🧪 Testes Automatizados (`vitest`)
336
+
337
+ ```js
338
+ import { expect, describe, beforeAll, afterEach, test } from "vitest";
339
+ import { testApp } from "../esm/index.js";
340
+
341
+ let core = {};
342
+
343
+ beforeAll(async () => {
344
+ const { core: Core } = await testApp.run({
345
+ db: {
346
+ app: {
347
+ async findUnique(id) {
348
+ return { id, name: "dddd", desc: "ddddddd" };
349
+ }
350
+ }
351
+ }
352
+ });
353
+
354
+ core = Core;
355
+
356
+ Core.event("node").sub({ topic: "service::test.app" }, ({ data }) => {
357
+ console.log(data);
358
+ Core.event("node").pub({ topic: "test.app" }, { id: data.id });
359
+ });
360
+ });
361
+
362
+ describe("core", () => {
363
+ test("executa serviço principal", async () => {
364
+ const res = await core.service("test.app").execute({ name: "ddd" }, "node");
365
+
366
+ expect(res.data).toBeDefined();
367
+ expect(res.error).toBeUndefined();
368
+ expect(res.data.id).toBeDefined();
369
+ });
370
+ });
371
+ ```
372
+
373
+ ---
374
+
375
+ ## 🧩 Configuração Avançada — Multi-Drivers e Servidores
376
+
377
+ ```js
378
+ await app.run({
379
+ drivers: [
380
+ {
381
+ type: "nats",
382
+ name: "nats",
383
+ config: { servers: "nats://localhost:4222" }
384
+ },
385
+ {
386
+ type: "redis",
387
+ name: "redis",
388
+ config: { url: "redis://localhost:6379" }
389
+ },
390
+ {
391
+ type: "bull",
392
+ name: "bull",
393
+ config: { url: "redis://localhost:6379" }
394
+ }
395
+ ],
396
+ servers: [
397
+ {
398
+ type: "http",
399
+ rootPath: "/api"
400
+ },
401
+ {
402
+ type: "ws",
403
+ route: "/ws",
404
+ driver: "nats"
405
+ },
406
+ {
407
+ type: "nats",
408
+ driver: "nats",
409
+ services: [
410
+ "test.app",
411
+ { name: "test.app1", auth: "util:auth.apiKey" }
412
+ ]
413
+ }
414
+ ]
415
+ });
416
+ ```
417
+
418
+ ---
419
+
420
+ ## 🧠 Fluxo de Inicialização
421
+
422
+ ```
423
+ start.js
424
+
425
+ app.run(config)
426
+
427
+ index.js → bootstrap({ core })
428
+
429
+ core.service("test.app").execute({})
430
+
431
+ Serviço → Entidade → Repositório → DB
432
+
433
+ Eventos → Workers → Web → WS
434
+ ```
435
+
436
+ ---
437
+
438
+ ## ✅ Conclusão
439
+
440
+ A integração de `create-org-app` com `index.js` e `start.js` fornece:
441
+
442
+ ✔️ **Arquitetura limpa e modular**
443
+ ✔️ **Ciclo de vida controlado (bootstrap/destroy)**
444
+ ✔️ **Suporte nativo a múltiplos drivers e servidores**
445
+ ✔️ **Eventos reativos, workers e WebSockets**
446
+ ✔️ **Perfeita para microserviços e SaaS distribuídos**
@@ -0,0 +1,13 @@
1
+ {
2
+ "presets": [
3
+ [
4
+ "@babel/preset-env",
5
+ {
6
+ "targets": {
7
+ "node": "current"
8
+ }
9
+ },
10
+ "@babel/preset-typescript"
11
+ ]
12
+ ]
13
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _default = ({
8
+ core
9
+ }) => {
10
+ return {
11
+ async "nats"(driver) {
12
+ const file = core.fileCore.bin + '/core/drivers/nats.js';
13
+ await core.addMethodCore(driver, file);
14
+ },
15
+ async "redis"(driver) {
16
+ const file = core.fileCore.bin + '/core/drivers/redis.js';
17
+ await core.addMethodCore(driver, file);
18
+ },
19
+ async "bull"(driver) {
20
+ const file = core.fileCore.bin + '/core/drivers/bull.js';
21
+ await core.addMethodCore(driver, file);
22
+ },
23
+ async "socket"(driver) {
24
+ const file = core.fileCore.bin + '/core/drivers/socket.js';
25
+ await core.addMethodCore(driver, file);
26
+ },
27
+ async "rabbitmq"(driver) {
28
+ const file = core.fileCore.bin + '/core/drivers/rabbitmq.js';
29
+ await core.addMethodCore(driver, file);
30
+ },
31
+ async "fogu"(driver) {
32
+ const file = core.fileCore.bin + '/core/drivers/fogu.js';
33
+ await core.addMethodCore(driver, file);
34
+ }
35
+ };
36
+ };
37
+ exports.default = _default;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _bullmq = require("bullmq");
8
+ let url;
9
+ const jobs = {};
10
+ var _default = async ({
11
+ connection = {
12
+ host: process.env.REDIS_HOST,
13
+ port: process.env.REDIS_PORT,
14
+ password: process.env.REDIS_PASSWORD
15
+ }
16
+ }) => {
17
+ return {
18
+ async close() {},
19
+ async connect({
20
+ url: url3
21
+ }) {
22
+ url = url3;
23
+ },
24
+ job(name_job) {
25
+ return {
26
+ async cmd(name, data, config) {
27
+ await jobs[name_job].add(name, data);
28
+ }
29
+ };
30
+ },
31
+ addJob: ({
32
+ name
33
+ }) => {
34
+ jobs[name] = new _bullmq.Queue(name, {
35
+ connection
36
+ });
37
+ },
38
+ worker: ({
39
+ name,
40
+ fn,
41
+ completed = job => {
42
+ console.log(`${job.id} has completed!`);
43
+ },
44
+ failed = (job, err) => {
45
+ console.log(`${job.id} has failed with ${err.message}`);
46
+ }
47
+ }) => {
48
+ const myWorker = new _bullmq.Worker(name, fn, {
49
+ connection
50
+ });
51
+ myWorker.on('completed', completed);
52
+ myWorker.on('failed', failed);
53
+ }
54
+ };
55
+ };
56
+ exports.default = _default;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _fmpJs = require("fmp-js");
8
+ var _default = async config => {
9
+ // Or create a new instance explicitly:
10
+ const client = new _fmpJs.Fogu();
11
+ await client.connect(config.url);
12
+ return client;
13
+ };
14
+ exports.default = _default;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _mqClient = require("mq-client.js");
8
+ var _default = async config => {
9
+ const MQ = (0, _mqClient.createMQ)();
10
+ await MQ.connect(config.url);
11
+ return {
12
+ async connect() {
13
+ await MQ.connect(config.url);
14
+ },
15
+ service(name, fn) {
16
+ MQ.service(name, async (data, reply) => {
17
+ try {
18
+ const res = await fn(data);
19
+ reply(null, res);
20
+ } catch (err) {
21
+ reply(err.message || "internal error", "");
22
+ }
23
+ });
24
+ },
25
+ async request(name, data, timeout = 5 * 1000) {
26
+ const res = await MQ.request(name, data, timeout);
27
+ try {
28
+ return JSON.parse(res);
29
+ } catch (error) {
30
+ return res;
31
+ }
32
+ },
33
+ subscribe({
34
+ topic: name
35
+ }, fn) {
36
+ MQ.subscribe(name, async (topic, data) => {
37
+ await fn({
38
+ topic,
39
+ data
40
+ });
41
+ });
42
+ },
43
+ publish({
44
+ topic: name
45
+ }, data) {
46
+ MQ.publish(name, data);
47
+ }
48
+ };
49
+ };
50
+ exports.default = _default;