@restforgejs/platform 4.1.0 → 4.2.8
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/LICENSE.md +5 -1
- package/README.md +30 -14
- package/bin/sdf-tools.exe +0 -0
- package/build-info.json +2 -2
- package/cli/consumer-deploy.js +1 -1
- package/cli/consumer.js +1 -1
- package/generators/cli/endpoint/create.js +42 -3
- package/generators/cli/schema/apply.js +525 -0
- package/generators/cli/schema/diff.js +321 -0
- package/generators/cli/schema/generate-ddl.js +7 -10
- package/generators/cli/schema/init.js +95 -172
- package/generators/cli/schema/migrate.js +10 -16
- package/generators/cli/schema/models.js +8 -12
- package/generators/cli/schema/template.js +222 -0
- package/generators/cli/schema/validate.js +8 -12
- package/generators/cli-entry.js +17 -2
- package/generators/lib/dbschema-kit/apply-engine.js +582 -0
- package/generators/lib/dbschema-kit/diff-engine.js +703 -0
- package/generators/lib/dbschema-kit/diff-reporter.js +272 -0
- package/generators/lib/dbschema-kit/emitters/alter-table.js +275 -0
- package/generators/lib/payload/endpoint-schema-validator.js +171 -0
- package/generators/lib/payload/payload-runner.js +137 -220
- package/generators/lib/payload/schema-diff.js +277 -0
- package/generators/lib/utils/audit-columns.js +181 -0
- package/generators/lib/utils/cli-output.js +17 -0
- package/generators/lib/utils/database-introspector.js +16 -13
- package/integrity-manifest.json +8 -8
- package/package.json +4 -4
- package/scripts/check-install.js +45 -45
- package/scripts/verify-integrity.js +1 -1
- package/server.js +1 -1
- package/src/components/handlers/adjust_handler.js +1 -1
- package/src/components/handlers/audit_handler.js +1 -1
- package/src/components/handlers/delete_handler.js +1 -1
- package/src/components/handlers/export_handler.js +1 -1
- package/src/components/handlers/import_handler.js +1 -1
- package/src/components/handlers/insert_handler.js +1 -1
- package/src/components/handlers/update_handler.js +1 -1
- package/src/components/handlers/upload_handler.js +1 -1
- package/src/components/handlers/workflow_handler.js +1 -1
- package/src/components/integrations/webhook.js +1 -1
- package/src/consumers/baseConsumer.js +1 -1
- package/src/consumers/declarativeMapper.js +1 -1
- package/src/consumers/handlers/apiHandler.js +1 -1
- package/src/consumers/handlers/consoleHandler.js +1 -1
- package/src/consumers/handlers/databaseHandler.js +1 -1
- package/src/consumers/handlers/index.js +1 -1
- package/src/consumers/handlers/kafkaHandler.js +1 -1
- package/src/consumers/index.js +1 -1
- package/src/consumers/messageTransformer.js +1 -1
- package/src/consumers/validator.js +1 -1
- package/src/core/db/dialect/base-dialect.js +1 -1
- package/src/core/db/dialect/index.js +1 -1
- package/src/core/db/dialect/mysql-dialect.js +1 -1
- package/src/core/db/dialect/oracle-dialect.js +1 -1
- package/src/core/db/dialect/postgres-dialect.js +1 -1
- package/src/core/db/dialect/sqlite-dialect.js +1 -1
- package/src/core/db/flatten-helper.js +1 -1
- package/src/core/db/query-builder-error.js +1 -1
- package/src/core/db/query-builder.js +1 -1
- package/src/core/db/relation-helper.js +1 -1
- package/src/core/handlers/delete_handler.js +1 -1
- package/src/core/handlers/insert_handler.js +1 -1
- package/src/core/handlers/update_handler.js +1 -1
- package/src/core/models/base-model.js +1 -1
- package/src/core/utils/cache-manager.js +1 -1
- package/src/core/utils/component-engine.js +1 -1
- package/src/core/utils/context-builder.js +1 -1
- package/src/core/utils/datetime-formatter.js +1 -1
- package/src/core/utils/datetime-parser.js +1 -1
- package/src/core/utils/db.js +1 -1
- package/src/core/utils/logger.js +1 -1
- package/src/core/utils/payload-loader.js +1 -1
- package/src/core/utils/security-checks.js +1 -1
- package/src/middleware/body-options.js +1 -1
- package/src/middleware/cors.js +1 -1
- package/src/middleware/idempotency.js +1 -1
- package/src/middleware/rate-limiter.js +1 -1
- package/src/middleware/request-logger.js +1 -1
- package/src/middleware/security-headers.js +1 -1
- package/src/models/base-model-mysql.js +1 -1
- package/src/models/base-model-oracle.js +1 -1
- package/src/models/base-model-sqlite.js +1 -1
- package/src/models/base-model.js +1 -1
- package/src/pro/caching/redis-client.js +1 -1
- package/src/pro/caching/redis-helper.js +1 -1
- package/src/pro/consumers/baseConsumer.js +1 -1
- package/src/pro/consumers/declarativeMapper.js +1 -1
- package/src/pro/consumers/handlers/apiHandler.js +1 -1
- package/src/pro/consumers/handlers/consoleHandler.js +1 -1
- package/src/pro/consumers/handlers/databaseHandler.js +1 -1
- package/src/pro/consumers/handlers/index.js +1 -1
- package/src/pro/consumers/handlers/kafkaHandler.js +1 -1
- package/src/pro/consumers/index.js +1 -1
- package/src/pro/consumers/messageTransformer.js +1 -1
- package/src/pro/consumers/validator.js +1 -1
- package/src/pro/database/base-model-mysql.js +1 -1
- package/src/pro/database/base-model-oracle.js +1 -1
- package/src/pro/database/base-model-sqlite.js +1 -1
- package/src/pro/database/db-mysql.js +1 -1
- package/src/pro/database/db-oracle.js +1 -1
- package/src/pro/database/db-sqlite.js +1 -1
- package/src/pro/excel/excel-generator.js +1 -1
- package/src/pro/excel/excel-parser.js +1 -1
- package/src/pro/excel/export-service.js +1 -1
- package/src/pro/excel/export_handler.js +1 -1
- package/src/pro/excel/import-service.js +1 -1
- package/src/pro/excel/import-validator.js +1 -1
- package/src/pro/excel/import_handler.js +1 -1
- package/src/pro/excel/upsert-builder.js +1 -1
- package/src/pro/idgen/idgen-routes.js +1 -1
- package/src/pro/integrations/lookup-resolver.js +1 -1
- package/src/pro/integrations/upload-handler-v2.js +1 -1
- package/src/pro/integrations/upload-handler.js +1 -1
- package/src/pro/integrations/webhook.js +1 -1
- package/src/pro/locking/lock-routes.js +1 -1
- package/src/pro/locking/resource-lock-manager.js +1 -1
- package/src/pro/messaging/kafkaConsumerService.js +1 -1
- package/src/pro/messaging/kafkaService.js +1 -1
- package/src/pro/messaging/messagehubService.js +1 -1
- package/src/pro/messaging/rabbitmqService.js +1 -1
- package/src/pro/scheduler/job-manager.js +1 -1
- package/src/pro/scheduler/job-routes.js +1 -1
- package/src/pro/scheduler/job-validator.js +1 -1
- package/src/pro/storage/base-storage-provider.js +1 -1
- package/src/pro/storage/file-metadata-helper.js +1 -1
- package/src/pro/storage/index.js +1 -1
- package/src/pro/storage/local-storage-provider.js +1 -1
- package/src/pro/storage/s3-storage-provider.js +1 -1
- package/src/pro/storage/upload-cleanup-job.js +1 -1
- package/src/pro/storage/upload-cleanup-scheduler.js +1 -1
- package/src/pro/storage/upload-pending-tracker.js +1 -1
- package/src/pro/websocket/broadcast-helper.js +1 -1
- package/src/pro/websocket/index.js +1 -1
- package/src/pro/websocket/livesync-server.js +1 -1
- package/src/pro/websocket/ws-broadcaster.js +1 -1
- package/src/services/export-service.js +1 -1
- package/src/services/import-service.js +1 -1
- package/src/services/kafkaConsumerService.js +1 -1
- package/src/services/kafkaService.js +1 -1
- package/src/services/messagehubService.js +1 -1
- package/src/services/rabbitmqService.js +1 -1
- package/src/utils/cache-invalidation-registry.js +1 -1
- package/src/utils/cache-manager.js +1 -1
- package/src/utils/component-engine.js +1 -1
- package/src/utils/config-extractor.js +1 -1
- package/src/utils/consumerLogger.js +1 -1
- package/src/utils/context-builder.js +1 -1
- package/src/utils/dashboard-helpers.js +1 -1
- package/src/utils/dateHelper.js +1 -1
- package/src/utils/datetime-formatter.js +1 -1
- package/src/utils/datetime-parser.js +1 -1
- package/src/utils/db-bootstrap.js +1 -1
- package/src/utils/db-mysql.js +1 -1
- package/src/utils/db-oracle.js +1 -1
- package/src/utils/db-sqlite.js +1 -1
- package/src/utils/db.js +1 -1
- package/src/utils/demo-generator.js +1 -1
- package/src/utils/excel-generator.js +1 -1
- package/src/utils/excel-parser.js +1 -1
- package/src/utils/file-watcher.js +1 -1
- package/src/utils/id-generator.js +1 -1
- package/src/utils/idempotency-manager.js +1 -1
- package/src/utils/import-validator.js +1 -1
- package/src/utils/license-client.js +1 -1
- package/src/utils/lock-manager.js +1 -1
- package/src/utils/logger.js +1 -1
- package/src/utils/lookup-resolver.js +1 -1
- package/src/utils/payload-loader.js +1 -1
- package/src/utils/processor-response.js +1 -1
- package/src/utils/rabbitmq.js +1 -1
- package/src/utils/redis-client.js +1 -1
- package/src/utils/redis-helper.js +1 -1
- package/src/utils/request-scope.js +1 -1
- package/src/utils/security-checks.js +1 -1
- package/src/utils/service-resolver.js +1 -1
- package/src/utils/shutdown-coordinator.js +1 -1
- package/src/utils/trusted-keys.js +1 -1
- package/src/utils/upload-handler.js +1 -1
- package/src/utils/upsert-builder.js +1 -1
- package/src/utils/workflow-hook-executor.js +1 -1
package/LICENSE.md
CHANGED
|
@@ -17,7 +17,7 @@ The Software is proprietary commercial software. It is not open-source software,
|
|
|
17
17
|
|
|
18
18
|
For the purposes of this Agreement, the following terms shall have the meanings set forth below:
|
|
19
19
|
|
|
20
|
-
1.1. **"Software"** means the RESTForge framework, including all of its components, source code, compiled binaries, libraries, command-line tools, configuration files, documentation, templates, and any associated assets distributed by the Licensor under the package name "restforgejs" or under any other name or channel controlled by the Licensor.
|
|
20
|
+
1.1. **"Software"** means the RESTForge framework, a schema-driven backend platform and code generator for full-stack Node.js applications, including all of its components, source code, compiled binaries, libraries, command-line tools, configuration files, documentation, templates, and any associated assets distributed by the Licensor under the package name "restforgejs" or under any other name or channel controlled by the Licensor. The Software is a platform builder and backend runtime, and is not an API testing tool, API client, or HTTP request inspection utility.
|
|
21
21
|
|
|
22
22
|
1.2. **"Licensor"** means the RESTForge Development Team, the owner and copyright holder of the Software.
|
|
23
23
|
|
|
@@ -178,6 +178,10 @@ This Agreement and the licenses granted hereunder remain in effect until termina
|
|
|
178
178
|
|
|
179
179
|
The Software is owned by the Licensor and is protected by copyright, trademark, and other applicable intellectual property laws and treaties. This Agreement does not transfer any ownership rights in the Software to the Licensee. All rights not expressly granted to the Licensee under this Agreement are reserved by the Licensor.
|
|
180
180
|
|
|
181
|
+
### 8.1. Trademark
|
|
182
|
+
|
|
183
|
+
"RESTForge" and the names of its component products (Runtime Server, CLI, Designer) are trademarks of the Licensor and identify the schema-driven backend platform and code generator described in section 1.1 of this Agreement. Nothing in this Agreement grants the Licensee any right to use the Licensor's trademarks, trade names, or product names, except as required for accurate factual reference to the Software. The Licensor's trademarks identify products in the category of platform builder, backend runtime, and code generation tooling, and shall not be construed as referring to products in unrelated categories such as API testing tools, API clients, or HTTP request inspection utilities.
|
|
184
|
+
|
|
181
185
|
---
|
|
182
186
|
|
|
183
187
|
## 9. Governing Law
|
package/README.md
CHANGED
|
@@ -9,19 +9,21 @@
|
|
|
9
9
|
|
|
10
10
|
RESTForge is the schema-driven platform for building full-stack applications from a single source of truth. As an umbrella brand, RESTForge brings together complementary products: **RESTForge Runtime Server**, the deterministic backend infrastructure platform; **RESTForge CLI**, the backend API generator; and **RESTForge Designer**, the frontend generator.
|
|
11
11
|
|
|
12
|
-
This package is the **RESTForge Runtime Server**. It executes the JavaScript modules produced from schema configuration, providing routing, validation, caching, distributed locking, idempotency, and other reliability primitives required by production-grade
|
|
12
|
+
This package is the **RESTForge Runtime Server**. It executes the JavaScript modules produced from schema configuration, providing routing, validation, caching, distributed locking, idempotency, and other reliability primitives required by production-grade backend APIs.
|
|
13
|
+
|
|
14
|
+
> **Scope Notice:** RESTForge Platform is a backend framework and code generator for full-stack Node.js applications. It is not an API testing tool, API client, request inspector, or HTTP debugging utility. The platform's purpose is to generate and run production backend APIs from schema configuration, not to consume or test third-party APIs.
|
|
13
15
|
|
|
14
16
|
---
|
|
15
17
|
|
|
16
18
|
## Access & Availability
|
|
17
19
|
|
|
18
|
-
RESTForge is currently in **closed evaluation** with a select group of early adopters. The platform is
|
|
20
|
+
RESTForge is currently in **closed evaluation** with a select group of early adopters. The platform is feature-complete and currently being evaluated by early adopters.
|
|
19
21
|
|
|
20
22
|
Access requires a valid license key:
|
|
21
23
|
|
|
22
|
-
- **Early Access Program**
|
|
23
|
-
- **Commercial Trial**
|
|
24
|
-
- **Commercial License**
|
|
24
|
+
- **Early Access Program** — Limited slots for volunteer evaluators providing structured feedback. [Apply at restforge.dev](https://restforge.dev)
|
|
25
|
+
- **Commercial Trial** — Coming soon. Register interest at [restforge.dev](https://restforge.dev) to be notified when trial licenses open to the public.
|
|
26
|
+
- **Commercial License** — Available upon general release.
|
|
25
27
|
|
|
26
28
|
> **Note:** Installing this package without a valid license key will not grant runtime access. The package is published on npm to simplify distribution for authorized evaluators.
|
|
27
29
|
|
|
@@ -39,10 +41,10 @@ Access requires a valid license key:
|
|
|
39
41
|
|
|
40
42
|
## Why RESTForge
|
|
41
43
|
|
|
42
|
-
RESTForge is built for engineering teams that value time and want **full control over generated code**. Unlike ORMs that hide SQL or low-code platforms that constrain flexibility, RESTForge generates standard JavaScript that can be read, debugged, and extended with familiar Node.js tooling. Generated code runs on the RESTForge runtime
|
|
44
|
+
RESTForge is built for engineering teams that value time and want **full control over generated code**. Unlike ORMs that hide SQL or low-code platforms that constrain flexibility, RESTForge generates standard JavaScript that can be read, debugged, and extended with familiar Node.js tooling. Generated code runs on the RESTForge runtime, which is an intentional infrastructure component rather than an abstraction that obscures how the application works.
|
|
43
45
|
|
|
44
46
|
- **Auto-generated endpoints** from schema configuration handle CRUD scaffolding, letting teams focus on business rules
|
|
45
|
-
- **Equal multi-database support** across PostgreSQL, MySQL, and Oracle
|
|
47
|
+
- **Equal multi-database support** across PostgreSQL, MySQL, and Oracle
|
|
46
48
|
- **Consistent API standard** through a universal URL pattern and unified response envelope
|
|
47
49
|
- **Production-grade primitives** for cache, distributed lock, idempotency, and rate limiting
|
|
48
50
|
- **Readable generated code** that works with standard debuggers, profilers, and linters
|
|
@@ -60,6 +62,9 @@ All operations follow a universal pattern `POST /api/{project}/{endpoint}/{actio
|
|
|
60
62
|
### Declarative Validation
|
|
61
63
|
Field validation is defined in the schema, keeping rules centralized and easy to maintain. Supports rich data types, flexible constraints, automatic sanitization, custom error messages, and integrity helpers such as bcrypt password hashing and UUID auto-generation.
|
|
62
64
|
|
|
65
|
+
### Database Schema Lifecycle
|
|
66
|
+
Schema management is supported end-to-end through dedicated CLI commands: `schema init` for scaffolding new definitions, `schema validate` for static checks, `schema generate-ddl` for SQL output, `schema migrate` for applying changes to live databases, and `schema introspect` for reverse-engineering existing databases. Schema definitions serve as the same source of truth that feeds endpoint generation, keeping the data model and API surface consistent.
|
|
67
|
+
|
|
63
68
|
### Built-in Reliability Primitives
|
|
64
69
|
Redis-backed components integrated at the framework level: automatic caching with invalidation, per-record distributed locks, idempotency protection on mutations, configurable rate limiting, and unique ID generation with a reservation lifecycle. The `fieldPolicy` mechanism adds row-locking and audit logging for critical columns through declarative configuration.
|
|
65
70
|
|
|
@@ -70,10 +75,10 @@ Job scheduler based on BullMQ for cron and manual triggers, Excel export as asyn
|
|
|
70
75
|
Atomic master-detail transactions, workflow state machine with rule-validated transitions, and automatic scope filters for multi-tenant or business-context isolation.
|
|
71
76
|
|
|
72
77
|
### Security & Access Control
|
|
73
|
-
Built-in row-level security via Request Scope, applying per-request filters derived from JWT context (such as `app_id`, `branch_id`, or `company_id`) for multi-tenant, multi-branch, and multi-company scenarios. HTTP security headers (Helmet integration) are available without external dependencies. Enforcement happens at the backend
|
|
78
|
+
Built-in row-level security via Request Scope, applying per-request filters derived from JWT context (such as `app_id`, `branch_id`, or `company_id`) for multi-tenant, multi-branch, and multi-company scenarios. HTTP security headers (Helmet integration) are available without external dependencies. Enforcement happens at the backend rather than the client side, applying consistently across all endpoints.
|
|
74
79
|
|
|
75
80
|
### Real-time Data Synchronization
|
|
76
|
-
Live Sync broadcasts data-change notifications over WebSocket pub/sub on every successful CREATE, UPDATE, or DELETE operation. Subscribed clients receive notifications automatically without polling. The dedicated Live Sync process runs separately from the
|
|
81
|
+
Live Sync broadcasts data-change notifications over WebSocket pub/sub on every successful CREATE, UPDATE, or DELETE operation. Subscribed clients receive notifications automatically without polling. The dedicated Live Sync process runs separately from the backend API, is cluster-ready via Redis pub/sub, and requires API Key authentication for connection.
|
|
77
82
|
|
|
78
83
|
---
|
|
79
84
|
|
|
@@ -83,7 +88,7 @@ Live Sync broadcasts data-change notifications over WebSocket pub/sub on every s
|
|
|
83
88
|
Schema configuration is translated into JavaScript source code at build time. The runtime executes already-prepared code, avoiding parsing overhead on every request and keeping stack traces readable in the team's own modules.
|
|
84
89
|
|
|
85
90
|
### Action-Based Endpoint Pattern
|
|
86
|
-
Action-based endpoints replace the traditional HTTP-verb dispatch. This trade-off is deliberate: the practical needs of engineering teams take precedence over strict
|
|
91
|
+
Action-based endpoints replace the traditional HTTP-verb dispatch. This trade-off is deliberate: the practical needs of engineering teams take precedence over strict architectural conformity, especially for complex queries, large payloads, and composite operations.
|
|
87
92
|
|
|
88
93
|
### Equal Multi-Database Support
|
|
89
94
|
Each supported database has its own template generator and dialect adapter. Teams get SQL optimized for their database of choice (PostgreSQL, MySQL, Oracle) rather than a lowest-common-denominator abstraction.
|
|
@@ -109,7 +114,12 @@ RESTForge is designed stateless, so horizontal scaling is the primary path for c
|
|
|
109
114
|
|
|
110
115
|
## Out of Scope
|
|
111
116
|
|
|
112
|
-
Understanding the platform's boundaries is as important as understanding its capabilities. The following are intentionally not part of RESTForge and should be provided separately:
|
|
117
|
+
Understanding the platform's boundaries is as important as understanding its capabilities. The following are intentionally not part of RESTForge and should be provided separately:
|
|
118
|
+
|
|
119
|
+
- OAuth or OIDC identity provider
|
|
120
|
+
- GraphQL endpoints
|
|
121
|
+
- Service mesh or API gateway functionality
|
|
122
|
+
- API testing, API client, or HTTP request inspection tooling — RESTForge is a backend runtime that produces and serves backend APIs, not a client that consumes or tests them
|
|
113
123
|
|
|
114
124
|
---
|
|
115
125
|
|
|
@@ -117,8 +127,8 @@ Understanding the platform's boundaries is as important as understanding its cap
|
|
|
117
127
|
|
|
118
128
|
RESTForge is proprietary commercial software.
|
|
119
129
|
|
|
120
|
-
- **Trial / Evaluation**
|
|
121
|
-
- **Commercial Use**
|
|
130
|
+
- **Trial / Evaluation** — permitted for non-commercial evaluation, learning, and proof-of-concept purposes.
|
|
131
|
+
- **Commercial Use** — production deployment, revenue-generating applications, and internal business use require a valid commercial license.
|
|
122
132
|
|
|
123
133
|
Redistribution, reverse engineering, and removal of copyright notices are prohibited.
|
|
124
134
|
|
|
@@ -126,7 +136,13 @@ For licensing inquiries, visit [restforge.dev/licensing.html](https://restforge.
|
|
|
126
136
|
|
|
127
137
|
See the `LICENSE.md` file included in this package for the full license agreement.
|
|
128
138
|
|
|
129
|
-
Copyright
|
|
139
|
+
Copyright © 2026 RESTForge Development Team. All rights reserved.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Trademark Notice
|
|
144
|
+
|
|
145
|
+
"RESTForge" and the names of its component products (Runtime Server, CLI, Designer) refer to the schema-driven backend platform and full-stack code generator distributed through the npm packages under the `@restforgejs/*` scope by the RESTForge Development Team. The mark identifies a platform builder, backend runtime, and code generation framework. It is not associated with products in unrelated categories such as API testing tools, API clients, or HTTP request inspection utilities.
|
|
130
146
|
|
|
131
147
|
---
|
|
132
148
|
|
|
Binary file
|
package/build-info.json
CHANGED
package/cli/consumer-deploy.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
const a0_0xaa9431=a0_0xbc2f;(function(_0x43a443,_0x466e5d){const _0x55d1c5=a0_0xbc2f,_0x1ab629=_0x43a443();while(!![]){try{const _0x5cc9db=parseInt(_0x55d1c5(0x14e))/0x1+-parseInt(_0x55d1c5(0x146))/0x2+-parseInt(_0x55d1c5(0x16d))/0x3*(-parseInt(_0x55d1c5(0x175))/0x4)+-parseInt(_0x55d1c5(0x17b))/0x5*(-parseInt(_0x55d1c5(0x193))/0x6)+parseInt(_0x55d1c5(0x15f))/0x7+parseInt(_0x55d1c5(0x174))/0x8+parseInt(_0x55d1c5(0x1b8))/0x9*(-parseInt(_0x55d1c5(0x182))/0xa);if(_0x5cc9db===_0x466e5d)break;else _0x1ab629['push'](_0x1ab629['shift']());}catch(_0xf48ea0){_0x1ab629['push'](_0x1ab629['shift']());}}}(a0_0x2021,0x86bd8));const path=require('path'),fs=require('fs'),readline=require(a0_0xaa9431(0x187));require(a0_0xaa9431(0x151))[a0_0xaa9431(0x17f)]();function prompt(_0x27aa04){const _0x2b6e3f=a0_0xaa9431,_0x3c03a6=readline[_0x2b6e3f(0x154)]({'input':process['stdin'],'output':process['stdout']});return new Promise(_0x19ea64=>{_0x3c03a6['question'](_0x27aa04,_0x43a8d4=>{const _0x3d041e=a0_0xbc2f;_0x3c03a6[_0x3d041e(0x159)](),_0x19ea64(_0x43a8d4[_0x3d041e(0x180)]());});});}const args=parseArgs(process[a0_0xaa9431(0x167)]['slice'](0x2));function parseArgs(_0x10856d){const _0x379867=a0_0xaa9431,_0x277416={'ZbWql':function(_0x4a833d,_0x494e3a){return _0x4a833d===_0x494e3a;},'ZDCWN':'--project=','uwwGk':'--module=','byKdv':'--consumer=','sgMUG':'--config=','Btrfx':'--license=','YfDwk':function(_0x178422,_0x252ac0,_0x54b838){return _0x178422(_0x252ac0,_0x54b838);},'azVtc':function(_0x58d28b,_0x2ede90){return _0x58d28b===_0x2ede90;},'rIcTZ':function(_0x3e8884,_0x40cc7a){return _0x3e8884===_0x40cc7a;}},_0x421264={'project':null,'consumer':null,'config':null,'license':null,'port':0xbb9,'output':null,'force':![],'help':![],'version':![]};for(const _0x3f235a of _0x10856d){if(_0x3f235a===_0x379867(0x148)||_0x277416[_0x379867(0x169)](_0x3f235a,'-h'))_0x421264['help']=!![];else{if(_0x277416['ZbWql'](_0x3f235a,'--version')||_0x3f235a==='-v')_0x421264['version']=!![];else{if(_0x3f235a[_0x379867(0x14c)](_0x277416[_0x379867(0x155)]))_0x421264['project']=_0x3f235a['split']('=')[0x1];else{if(_0x3f235a['startsWith'](_0x277416[_0x379867(0x181)]))_0x421264[_0x379867(0x19a)]=_0x3f235a[_0x379867(0x152)]('=')[0x1];else{if(_0x3f235a[_0x379867(0x14c)](_0x277416['byKdv']))_0x421264['consumer']=_0x3f235a[_0x379867(0x152)]('=')[0x1];else{if(_0x3f235a['startsWith'](_0x277416['sgMUG']))_0x421264['config']=_0x3f235a['split']('=')[0x1];else{if(_0x3f235a[_0x379867(0x14c)](_0x277416['Btrfx']))_0x421264['license']=_0x3f235a[_0x379867(0x152)]('=')[0x1];else{if(_0x3f235a['startsWith']('--port='))_0x421264[_0x379867(0x1a3)]=_0x277416[_0x379867(0x1b6)](parseInt,_0x3f235a['split']('=')[0x1],0xa)||0xbb9;else{if(_0x3f235a['startsWith']('--output='))_0x421264['output']=_0x3f235a[_0x379867(0x152)]('=')[0x1];else(_0x277416['azVtc'](_0x3f235a,_0x379867(0x19e))||_0x277416['rIcTZ'](_0x3f235a,'-f'))&&(_0x421264['force']=!![]);}}}}}}}}}return _0x421264;}function printHelp(){const _0x20cef7=a0_0xaa9431;console[_0x20cef7(0x1b5)](_0x20cef7(0x19f));}function a0_0xbc2f(_0x1340bb,_0x3602c0){_0x1340bb=_0x1340bb-0x146;const _0x202157=a0_0x2021();let _0xbc2f8a=_0x202157[_0x1340bb];if(a0_0xbc2f['wNpyyN']===undefined){var _0x4231eb=function(_0x3be09d){const _0x2b55a4='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2ddfaa='',_0x301fa5='';for(let _0x1c5f2b=0x0,_0xce5fda,_0x58f9b4,_0x46cb2c=0x0;_0x58f9b4=_0x3be09d['charAt'](_0x46cb2c++);~_0x58f9b4&&(_0xce5fda=_0x1c5f2b%0x4?_0xce5fda*0x40+_0x58f9b4:_0x58f9b4,_0x1c5f2b++%0x4)?_0x2ddfaa+=String['fromCharCode'](0xff&_0xce5fda>>(-0x2*_0x1c5f2b&0x6)):0x0){_0x58f9b4=_0x2b55a4['indexOf'](_0x58f9b4);}for(let _0x24c45b=0x0,_0x17d309=_0x2ddfaa['length'];_0x24c45b<_0x17d309;_0x24c45b++){_0x301fa5+='%'+('00'+_0x2ddfaa['charCodeAt'](_0x24c45b)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x301fa5);};a0_0xbc2f['usPBXN']=_0x4231eb,a0_0xbc2f['vNoHGW']={},a0_0xbc2f['wNpyyN']=!![];}const _0x412d48=_0x202157[0x0],_0x5b909d=_0x1340bb+_0x412d48,_0x3a686f=a0_0xbc2f['vNoHGW'][_0x5b909d];return!_0x3a686f?(_0xbc2f8a=a0_0xbc2f['usPBXN'](_0xbc2f8a),a0_0xbc2f['vNoHGW'][_0x5b909d]=_0xbc2f8a):_0xbc2f8a=_0x3a686f,_0xbc2f8a;}function printVersion(){const _0x17ee97=a0_0xaa9431;console['log'](_0x17ee97(0x190));}function scanConsumers(_0x314345,_0x54fe27){const _0x2c314c=a0_0xaa9431,_0x214f8d={'BIyfa':'src'},_0x40943c=path[_0x2c314c(0x18a)](_0x314345,_0x214f8d[_0x2c314c(0x1b2)],'consumers',_0x54fe27);if(!fs[_0x2c314c(0x19c)](_0x40943c))return[];const _0x31c2cf=fs[_0x2c314c(0x178)](_0x40943c,{'withFileTypes':!![]}),_0x37068a=[];for(const _0x3e70c5 of _0x31c2cf){if(_0x3e70c5['isDirectory']()){const _0x5c540d=path[_0x2c314c(0x18a)](_0x40943c,_0x3e70c5[_0x2c314c(0x166)],_0x2c314c(0x179));fs[_0x2c314c(0x19c)](_0x5c540d)&&_0x37068a['push'](_0x3e70c5[_0x2c314c(0x166)]);}}return _0x37068a;}function generateEcosystemConfig(_0x2e9f44){const _0x3dd244=a0_0xaa9431,_0x440232={'MReLo':function(_0x251ac0,_0x489ff6){return _0x251ac0===_0x489ff6;},'xOjIY':'npx','BeaiP':_0x3dd244(0x1a9),'pexvR':'production','fCoMb':'YYYY-MM-DD\x20HH:mm:ss\x20Z'},{projectName:_0x24f7a2,consumers:_0x59bd84,configFile:_0x323a8c,license:_0x277a50,port:_0x51055e,projectDir:_0x1d7cf8}=_0x2e9f44,_0x76efcf=[];if(_0x440232['MReLo'](_0x59bd84['length'],0x1)){const _0x43258d=_0x59bd84[0x0];_0x76efcf['push']({'name':'consumer-'+_0x24f7a2+'-'+_0x43258d,'script':_0x440232['xOjIY'],'args':'restforge-consumer\x20--project='+_0x24f7a2+'\x20--config='+_0x323a8c+'\x20--consumer='+_0x43258d+(_0x277a50?'\x20--license='+_0x277a50:'')+'\x20--port='+_0x51055e,'cwd':_0x1d7cf8,'instances':0x1,'autorestart':!![],'watch':![],'maxMemoryRestart':_0x440232['BeaiP'],'env':{'NODE_ENV':_0x440232[_0x3dd244(0x1af)]},'errorFile':'./logs/pm2/'+_0x43258d+'-error.log','outFile':_0x3dd244(0x14d)+_0x43258d+'-out.log','logDateFormat':_0x440232[_0x3dd244(0x1b4)]});}else{let _0x30db1d=_0x51055e;for(const _0x2ab068 of _0x59bd84){_0x76efcf[_0x3dd244(0x1a2)]({'name':_0x3dd244(0x192)+_0x24f7a2+'-'+_0x2ab068,'script':_0x440232[_0x3dd244(0x158)],'args':_0x3dd244(0x199)+_0x24f7a2+_0x3dd244(0x18e)+_0x323a8c+_0x3dd244(0x163)+_0x2ab068+(_0x277a50?'\x20--license='+_0x277a50:'')+'\x20--port='+_0x30db1d,'cwd':_0x1d7cf8,'instances':0x1,'autorestart':!![],'watch':![],'maxMemoryRestart':_0x3dd244(0x1a9),'env':{'NODE_ENV':_0x440232[_0x3dd244(0x1af)]},'errorFile':_0x3dd244(0x14d)+_0x2ab068+'-error.log','outFile':_0x3dd244(0x14d)+_0x2ab068+_0x3dd244(0x17a),'logDateFormat':'YYYY-MM-DD\x20HH:mm:ss\x20Z'}),_0x30db1d++;}}const _0x58ce31='/**\x0a\x20*\x20PM2\x20Ecosystem\x20Configuration\x0a\x20*\x20Project:\x20'+_0x24f7a2+_0x3dd244(0x149)+_0x59bd84[_0x3dd244(0x18a)](',\x20')+'\x0a\x20*\x0a\x20*\x20Generated\x20by:\x20RESTForge\x20Consumer\x20Deploy\x20CLI\x0a\x20*\x20Generated\x20at:\x20'+new Date()[_0x3dd244(0x197)]()+'\x0a\x20*\x0a\x20*\x20Usage:\x0a\x20*\x20\x20\x20pm2\x20start\x20ecosystem.config.js\x0a\x20*\x20\x20\x20pm2\x20stop\x20ecosystem.config.js\x0a\x20*\x20\x20\x20pm2\x20restart\x20ecosystem.config.js\x0a\x20*\x20\x20\x20pm2\x20delete\x20ecosystem.config.js\x0a\x20*/\x0a\x0amodule.exports\x20=\x20{\x0a\x20\x20apps:\x20'+JSON[_0x3dd244(0x156)](_0x76efcf,null,0x4)[_0x3dd244(0x17e)](/"(\w+)":/g,_0x3dd244(0x15a))+'\x0a};\x0a';return _0x58ce31;}function a0_0x2021(){const _0x5c5d02=['lI9SB2DZl3bTmI8','otmXntm1EMD0se1I','q29UC3vTzxjZoIa','y29UC3vTzxi','zg90zw52','C3bSAxq','A21IsLu','y3jLyxrLsw50zxjMywnL','wKrdv04','C3rYAw5NAwz5','q3jLyxrLzcbKAxjLy3rVCNK6ia','Ee9QsvK','y2XVC2u','jde6','icbBmL0Gq2fUy2vS','D3jPDgvgAwXLu3LUyW','zwnVC3LZDgvTlMnVBMzPzY5QCW','icaGicbWBtiGC3rHCNqGzwnVC3LZDgvTlMnVBMzPzY5QCW','ntm2nZq1m0DIz3vYsa','cImkiYbhzw5LCMf0zwqGyNK6ifjfu1rgB3jNzsbdB25ZDw1LCIbezxbSB3KGq0XjcImGr2vUzxjHDgvKigf0oIa','EhvnuhO','icbhzw5LCMf0Aw9UignVBxbSzxrLzcbZDwnJzxnZzNvSBhKH','ic0Ty29UC3vTzxi9','icaTia','tw9KztOGu2LUz2XLignVBNn1BwvYicG','BMfTzq','yxjNDG','r3fSCwq','wMjxCwW','tfDuswi','vxnLic0TAgvSCcbMB3iGDxnHz2uGAw5MB3jTyxrPB24','sMLZsLa','mtCZotfwDvr4zxe','y2HTB2rtEw5J','DxLQyLm','r2vUzxjHDgvKigzPBgvZoG','C1HRyLC','rhjzq0O','icaGicbUCg0GAw5ZDgfSBcaTzYbWBti','ntGYnZK3nM9SquHnrW','mJq0zKvqDgDj','rxjYB3i6ie5VignVBNn1BwvYCYbMB3vUzcbPBIbWCM9Qzwn0oIa','icaXlIbdB3b5ihbYB2PLy3qGDg8GChjVzhvJDgLVBIbZzxj2zxi','CMvHzgrPCLn5BMm','Aw5KzxGUANm','lw91Dc5SB2C','mJmWsxn3yKnT','icbdCMvHDgvKoIa','icaZlIbtDgfYDcbJB25ZDw1LCNmGD2L0Acbqtti6','CMvWBgfJzq','y29UzMLN','DhjPBq','DxD3r2S','ndbzyvnWqNG','nZu1','rxjYB3i6ic0TChjVAMvJDd08tKfnrt4GAxmGCMvXDwLYzwq','rMf0ywWGzxjYB3i6ia','y21RD00','CMvHzgXPBMu','Fe5HBwv84PsaksikicaGigvJAg8GiIikFqOkiYbtDgfYDcbHBgWGy29UC3vTzxjZcNn0yxj0x2fSBcGPihSkicaGigvJAg8GlwuGiIr7r1jfru59u3rHCNrPBMCGywXSignVBNn1BwvYCY4UlIr7tKn9iGOGicaGCg0Yihn0yxj0icrfq09twvnuru1FrKLmrqOGicaGzwnOBYaIiGOGicaGC2HVD19ZDgf0DxmkFqOkiYbtDg9WigfSBcbJB25ZDw1LCNmkC3rVCf9HBgWOksb7cIaGicbLy2HVic1LiciKE1LfteXpv31tDg9WCgLUzYbHBgWGy29UC3vTzxjZlI4UjhToq30IcIaGicbMB3iGyxbWigLUicrbufbFtKfnrvm7igrVcIaGicaGicaGCg0Yihn0B3aGjgfWCcaYpI9KzxyVBNvSBaOGicaGzg9UzqOGicaGzwnOBYaIiGOGicaGC2HVD19ZDgf0DxmkFqOkiYbszxn0yxj0igfSBcbJB25ZDw1LCNmkCMvZDgfYDf9HBgWOksb7cIaGicbLy2HVic1LiciKE1LfteXpv31szxn0yxj0Aw5NigfSBcbJB25ZDw1LCNmUlI4KE05dFsikicaGigzVCIbHChaGAw4Gjefquf9oqu1fuZSGzg8kicaGicaGicbWBtiGCMvZDgfYDcaKyxbWidi+l2rLDI9UDwXScIaGicbKB25LcIaGicbLy2HViciIcIaGicbZAg93x3n0yxr1CWP9cGOJierLBgv0zsbHBgWGzNjVBsbqttikzgvSzxrLx2fSBcGPihSkicaGigvJAg8GlwuGiIr7uKveFurLBgv0Aw5NigfSBcbJB25ZDw1LCNmGzNjVBsbqttiUlI4KE05dFsikicaGigzVCIbHChaGAw4Gjefquf9oqu1fuZSGzg8kicaGicaGicbWBtiGzgvSzxrLicrHChaGmJ4Vzgv2l251BgWkicaGigrVBMukicaGigvJAg8GiIikicaGihnOB3DFC3rHDhvZcN0kcImGu2HVDYbSB2DZcNnOB3DFBg9NCYGPihSkicaGigvJAg8GlwuGiIr7qKXvrx1tzwXLy3qGy29UC3vTzxiGDg8GDMLLDYbSB2DZoIr7tKn9iGOGicaGzwnOBYaIiGOGicaGBg9JywWGAt0XcIaGicbMB3iGyxbWigLUicrbufbFtKfnrvm7igrVcIaGicaGicaGzwnOBYaIicbBjgLDicrHChaIcIaGicaGicaGkcHPkYSPkqOGicaGzg9UzqOGicaGzwnOBYaIicbByv0GqwXSignVBNn1BwvYCYikicaGigvJAg8GiIaGwZbDiejHy2SGDg8GBwvUDsikicaGigvJAg8GiIikicaGihjLywqGlxaGiLLVDxiGy2HVAwnLoIaIignOB2LJzqOkicaGigLMifSGiIrJAg9Py2uIid09iciWiIbDoYb0AgvUcIaGicaGicaGCMv0DxjUcIaGicbLBgLMifSGiIrJAg9Py2uIid09icjHiIbDihX8ifSGiIrJAg9Py2uIid09icjbiIbDoYb0AgvUcIaGicaGicaGCg0YigXVz3mkicaGigvSC2ukicaGicaGicbSB2nHBcbHChbZx2fYCMf5psGKqvbqx05btuvtkqOGicaGicaGigXVy2fSigLKEd0KkcHJAg9Py2uGlsaXksKkicaGicaGicbPzIbBicrPzhGGlwDLidaGxsaMjIbBicrPzhGGlwX0icr7i2fWChnFyxjYyxLBqf19if07ihrOzw4kicaGicaGicaGicaGCg0YigXVz3mGjhTHChbZx2fYCMf5wYrPzhHDFqOGicaGicaGigvSC2ukicaGicaGicaGicaGzwnOBYaTzsaIjhTsrur9sw52ywXPzcbJAg9Py2uKE05dFsikicaGicaGicbMAqOGicaGzMKkFqOkiYbnB25PDg9YcNnOB3DFBw9UAxrVCIGPihSkicaGihbTmIbTB25PDaP9cGOJifnLDhvWihn0yxj0DxakC2v0DxbFC3rHCNr1CcGPihSkicaGigvJAg8GlwuGiIr7r1jfru59u2v0DgLUzYb1CcbqttiGC3rHCNr1Cc4UlIr7tKn9iGOGicaGzwnOBYaIiGOGicaGzwnOBYaIvgHPCYb3AwXSignVBMzPz3vYzsbqttiGDg8GC3rHCNqGyxv0B21HDgLJywXSEsbVBIbZExn0zw0GyM9VDc4IcIaGicbLy2HViciIcIaGicbYzwfKic1WicjdB250Aw51zt8GkhKVBIK6iciGy29UzMLYBqOkicaGigLMifSGiIrJB25MAxjTiIa9psaIEsiGxsb8FcbBiciKy29UzMLYBsiGpt0GiLKIif07ihrOzw4kicaGicaGicbLy2HViciIcIaGicaGicaGzwnOBYaTzsaIjhTzruXmt1D9u3rLCcaXoIbhzw5LCMf0zsbZDgfYDhvWihnJCMLWDcr7tKn9iGOGicaGicaGihbTmIbZDgfYDhvWcIaGicaGicaGzwnOBYaIiGOGicaGicaGigvJAg8GlwuGiIr7wuvmte9xFvn0zxaGmJOGu2f2zsbJDxjYzw50ihbYB2nLC3mGBgLZDcr7tKn9iGOGicaGicaGihbTmIbZyxzLcIaGicaGicaGzwnOBYaIiGOGicaGicaGigvJAg8GlwuGiIr7r1jfru59u3rHCNr1CcbJB25MAwD1CMf0Aw9UignVBxbSzxrLisr7tKn9iGOGicaGzMKkFqOkiYbszwXVywqGD2L0Acb6zxjVigrVD250Aw1LcNjLBg9Hzf9HBgWOksb7cIaGicbLy2HVic1LiciKE0DsruvoFvjLBg9HzgLUzYbHBgWGy29UC3vTzxjZicH6zxjVigrVD250Aw1Lks4UlIr7tKn9iGOGicaGzM9YigfWCcbPBIaKqvbqx05btuvtoYbKBWOGicaGicaGihbTmIbYzwXVywqGjgfWCcaYpI9KzxyVBNvSBaOGicaGzg9UzqOGicaGzwnOBYaIiGOGicaGC2HVD19ZDgf0DxmkFqOkiYbtAg93igrLDgfPBgvKigLUzM8kC2HVD19PBMzVkcKGEWOGicaGzwnOBYaTzsaIjhTctfvfFvnLBgvJDcbJB25ZDw1LCIb0BYb2Awv3igrLDgfPBhm6jhToq30IcIaGicbLy2HViciIcIaGicbSB2nHBcbPptekicaGigzVCIbHChaGAw4Gjefquf9oqu1fuZSGzg8kicaGicaGicbLy2HViciGifSKAv0GjgfWCcikicaGicaGicaOkgKRkYKPcIaGicbKB25LcIaGicbLy2HViciGifSWxsbcywnRihrVig1LBNuIcIaGicbLy2HViciIcIaGicbYzwfKic1WicjzB3vYignOB2LJztOGiIbJAg9Py2ukcIaGicbPzIbBiciKy2HVAwnLiIa9psaImciGxtSGDgHLBGOGicaGicaGihjLDhvYBGOGicaGzwXZzqOGicaGicaGigXVy2fSigfWChnFyxjYyxK9kcrbufbFtKfnrvmPcIaGicaGicaGBg9JywWGAwr4psqOkgnOB2LJzsaTidePkqOGicaGicaGigLMifSGjgLKEcaTz2uGmcbDicyMifSGjgLKEcaTBhqGjhSJyxbWC19HCNjHEvTaxx0GxtSGDgHLBGOGicaGicaGicaGicbWBtiGC2HVDYaKE2fWChnFyxjYyxLBjgLKEf19cIaGicaGicaGzwXZzqOGicaGicaGicaGicbLy2HVic1LiciKE1jfrh1jBNzHBgLKignOB2LJzsr7tKn9iGOGicaGicaGigzPcIaGicbMAqOGicaGCMvHzcaTCcaIuhjLC3mGrw50zxiGDg8Gy29UDgLUDwuUlI4IcN0kcImGtwfPBIbTzw51cNnOB3DFBwvUDsGPihSkicaGigvJAg8GlwuGiIr7qKXvrx1nzw51oIr7tKn9iGOGicaGzwnOBYaIls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0IcIaGicbLy2HViciGifSXxsbtDgfYDcbHBgWGy29UC3vTzxjZiGOGicaGzwnOBYaIicbBmL0Gu3rVCcbHBgWGy29UC3vTzxjZiGOGicaGzwnOBYaIicbBm10GuMvZDgfYDcbHBgWGy29UC3vTzxjZiGOGicaGzwnOBYaIicbBnf0GuMvSB2fKigfSBcaOEMvYBYbKB3DUDgLTzsKIcIaGicbLy2HViciGifS1xsbezwXLDguGywXSigzYB20Gue0YiGOGicaGzwnOBYaIiGOGicaGzwnOBYaIicbBnL0GvMLLDYbSB2DZiGOGicaGzwnOBYaIicbBn10Gtw9UAxrVCIaOCMvHBc10Aw1LksikicaGigvJAg8GiIaGwZHDifnOB3CGy29UC3vTzxiGzgv0ywLSCYikicaGigvJAg8GiIikicaGigvJAg8GiIaGwZLDifnLDhvWihn0yxj0DxaGkgf1Dg8TC3rHCNqGB24GyM9VDcKIcIaGicbLy2HViciIcIaGicbLy2HViciGifTZxsbtAg93ihn0yxr1CYikicaGigvJAg8GiIaGw3fDiff1AxqIcIaGicbLy2HViciTls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0Tls0TlsikFqOkiYbnywLUigXVB3akBwfPBIGPihSkicaGignOzwnRx3bTmGOkicaGihDOAwXLihrYDwu7igrVcIaGicaGicaGChjPBNrFAgvHzgvYcIaGicaGicaGC2HVD19ZDgf0DxmkicaGicaGicbZAg93x21LBNukicaGicaGicbLy2HViciIcIaGicaGicaGCMvHzcaTCcaIww91CIbJAg9Py2u6iciGy2HVAwnLcIaGicaGicaGzwnOBYaIiGOkicaGicaGicbJyxnLicrJAg9Py2uGAw4kicaGicaGicaGicaGmsKGC3rHCNrFywXSidS7cIaGicaGicaGicaGidiPihn0B3bFywXSidS7cIaGicaGicaGicaGidmPihjLC3rHCNrFywXSidS7cIaGicaGicaGicaGidqPihjLBg9Hzf9HBgWGoZSkicaGicaGicaGicaGnsKkicaGicaGicaGicaGicaGihjLywqGlxaGiKfYzsb5B3uGC3vYzsb5B3uGD2fUDcb0BYbKzwXLDguGywXSpYaOEs9UktOGiIbJB25MAxjTcIaGicaGicaGicaGicaGicbPzIbBiciKy29UzMLYBsiGpt0GiNKIif0GFhWGwYaIjgnVBMzPCM0Iid09icjziIbDoYb0AgvUcIaGicaGicaGicaGicaGicaGicaGzgvSzxrLx2fSBaOGicaGicaGicaGicaGicaGzMKkicaGicaGicaGicaGicaGidS7cIaGicaGicaGicaGidyPihnOB3DFBg9NCYa7oWOGicaGicaGicaGica3ksbZAg93x21VBML0B3iGoZSkicaGicaGicaGicaGocKGC2HVD19PBMzVidS7cIaGicaGicaGicaGidKPihnLDhvWx3n0yxj0DxaGoZSkicaGicaGicaGicaGC3XtksbZAg93x3n0yxr1CYa7oWOGicaGicaGicaGicbXFfePcIaGicaGicaGicaGicaGicbLy2HVic1LiciKE0DsruvoFuDVB2rIEwuHjhToq30IcIaGicaGicaGicaGicaGicbLEgL0idakicaGicaGicaGicaGicaGidS7cIaGicaGicaGicaGicOPcIaGicaGicaGicaGicaGicbLy2HVic1LiciKE1jfrh1jBNzHBgLKignOB2LJzsr7tKn9iGOGicaGicaGicaGicaGicaGoZSkicaGicaGicbLC2fJcGOGicaGicaGigLMifSGiIrJAg9Py2uIice9ici3iIbDoYb0AgvUcIaGicaGicaGicaGihjLywqGlxaGiLbYzxnZievUDgvYihrVignVBNrPBNvLlI4UiGOGicaGicaGigzPcIaGicbKB25LcN0kcImGuNvUig1HAw4kBwfPBGO','uhjVAMvJDdOG','AM9PBG','icaGicaUl2nVBNn1BwvYlw1HBMfNzxiUC2G','BwTKAxjtEw5J','AgvSCa','ic0Ty29UzMLNpq','zM9YrwfJAa','cLjfu1rgB3jNzsbdB25ZDw1LCIbezxbSB3KGq0XjcLzLCNnPB246ideUmc4WcKj1AwXKoIaYmdi2ltaXlteZcIaG','uKvtvezVCMDLienVBNn1BwvYierLCgXVEsbhzw5LCMf0B3i','y29UC3vTzxiT','mJaWmJHLzeXoBgS','icaYlIbjBNn0ywXSifbnmIbNBg9IywXSEsaOAwyGBM90igLUC3rHBgXLzcK6','CMvSyxrPDMu','Efr0Beq','Dg9ju09tDhjPBMC','shrXs3m','CMvZDgzVCMDLlwnVBNn1BwvYic0TChjVAMvJDd0','ChjVAMvJDa','DMvYC2LVBG','zxHPC3rZu3LUyW','wLDLvMG','ls1MB3jJzq','cLjfu1rgB3jNzsbdB25ZDw1LCIbezxbSB3KGq0XjcJ09pt09pt09pt09pt09pt09pt09pt09pt09pt09cGPhzw5LCMf0zsbqttiGzwnVC3LZDgvTignVBMzPzYbHBMqGC2HLBgWGC2nYAxb0igzVCIbWCM9KDwn0Aw9UigrLCgXVEw1LBNqUcGPvC2fNztOkicbUChGGCMvZDgzVCMDLlwnVBNn1BwvYlwrLCgXVEsaTlxbYB2PLy3q9pfbst0Pfq1q+ic0Ty29UzMLNptXgsuXflMvUDJ4Gw29WDgLVBNnDcGPpChrPB25ZoGOGic0TChjVAMvJDd08tKfnrt4GicaGuhjVAMvJDcbUyw1LicHYzxf1AxjLzcKkicaTlw1VzhvSzt08tKfnrt4GicaGiefSAwfZigzVCIaTlxbYB2PLy3qkicaTlwnVBMzPzZ08rKLmrs5LBNy+ievUDMLYB25Tzw50ignVBMzPz3vYyxrPB24GzMLSzsaOCMvXDwLYzwqPcIaGls1JB25ZDw1LCJ08tKfnrt4GicbtCgvJAwzPyYbJB25ZDw1LCIaOB3b0Aw9UywWSigrLzMf1Bhq6igfSBcbJB25ZDw1LCNmPcIaGls1SAwnLBNnLptXlrvK+icaGicbmAwnLBNnLigTLEsaOB3b0Aw9UywWSignHBIbIzsbZzxqGAw4GlMvUDIKkicaTlxbVCNq9pfbpuLq+icaGicaGifbVCNqGzM9YienVBNrYB2WGqvbjicHKzwzHDwX0oIaZmdaXkqOGic0TB3v0Chv0ptXesvi+icaGicaGt3v0Chv0igrPCMvJDg9YEsaOzgvMyxvSDdOGlI9KzxbSB3KVkqOGic0TzM9Yy2uSic1MicaGicaGicaGt3zLCNDYAxrLigv4Axn0Aw5NigzPBgvZcIaGls1OzwXWlcaTAcaGicaGicaGicbtAg93ihrOAxmGAgvSCcbTzxnZywDLcIaGls12zxjZAw9UlcaTDIaGicaGicbtAg93ihzLCNnPB24kcKv4yw1WBgvZoGOGicmGr2vUzxjHDguGzM9YiefmtcbJB25ZDw1LCNmGAw4GysbWCM9Qzwn0cIaGBNb4ihjLC3rMB3jNzs1JB25ZDw1LCI1KzxbSB3KGls1WCM9Qzwn0pwrIEc1TAw5PlwLUDMvUDg9YEsaTlwnVBMzPzZ1TAw5PlwLUDMvUDg9YEs5LBNyGls1SAwnLBNnLpvHywfGTwfHywc1ywfHylvHywfGkcIaGiYbhzw5LCMf0zsbMB3iGysbZCgvJAwzPyYbJB25ZDw1LCIbVBMX5cIaGBNb4ihjLC3rMB3jNzs1JB25ZDw1LCI1KzxbSB3KGls1WCM9Qzwn0pwrIEc1TAw5PlwLUDMvUDg9YEsaTlwnVBMzPzZ1TAw5PlwLUDMvUDg9YEs5LBNyGls1JB25ZDw1LCJ1ZDxbWBgLLCI1JB25ZB2XLic0TBgLJzw5Zzt1ywfHylvHywfGTwfHywc1ywfHycGOGicmGt3v0Chv0ihrVigeGy3vZDg9TigzVBgrLCGOGig5WEcbYzxn0zM9Yz2uTy29UC3vTzxiTzgvWBg95ic0TChjVAMvJDd1KyNGTBwLUAs1PBNzLBNrVCNKGls1JB25MAwC9BwLUAs1PBNzLBNrVCNKUzw52ic0TB3v0Chv0ps4VChjVzhvJDgLVBI8kcK91Dhb1DcbgAwXLCZOkicbKzxbSB3KVcIaG4PsC4Psa4PsaigvJB3n5C3rLBs5JB25MAwCUANmGicaGiYbqttiGzwnVC3LZDgvTignVBMzPz3vYyxrPB24kicdILjtILidILiaGy29UC3vTzxiTBwfUywDLCI5ZAcaGicaJieLUDgvYywn0AxzLihnOzwXSihnJCMLWDcbMB3iGue0Yig1HBMfNzw1LBNqkica','zM9Yy2u','AgfQuMe','ChvZAa','Cg9YDa','rxjYB3i6ic0Ty29UzMLNptXgsuXflMvUDJ4GAxmGCMvXDwLYzwq','Euj4tLC','zxHPDa','iYeVyMLUl2jHC2GkcImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiWOJifjfu1rgB3jNzsbdB25ZDw1LCIbnyw5Hz2vYcImGuhjVAMvJDdOG','q29UzMLNoIa','ntaWtq','BgvUz3rO','txnxCgy','tMv4DcbZDgvWCYbMB3iGzgvWBg95BwvUDdO','igzVDw5Kkq','v0PkEu8','Cgv4DLi','rxHWzwn0zwqGyxq6ihnYyY9JB25ZDw1LCNmV','y29UC3vTzxiTBwfUywDLCI5ZAa','qKL5zMe','pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09','zKnVtwi','Bg9N','wwzeD2S','iGPbufbFtKfnrvm9iG','mZe5mtqXogPrD1PXwa','iGPfq09twvnuru1FrKLmrt0IzwnVC3LZDgvTlMnVBMzPzY5QCYikcImGr2v0ihnJCMLWDcbKAxjLy3rVCNKku0nssvbux0rjuJ0IjcGGy2qGiIqOigrPCM5HBwuGiIr7qKftsf9tt1vsq0vBmf19iIaPiIaMjIbWD2qGksiky2qGiIrtq1jjufrFreLsiGOkiYbdAgvJAYbPzIbqttiGAxmGAw5ZDgfSBgvKcMnOzwnRx3bTmIGPihSkicaGigLMiceGy29TBwfUzcaTDIbWBtiGjJ4Gl2rLDI9UDwXSoYb0AgvUcIaGicaGicaGzwnOBYaTzsaIjhTsrur9rxjYB3i6ifbnmIbPCYbUB3qGAw5ZDgfSBgvKlIr7tKn9iGOGicaGicaGigvJAg8GiKLUC3rHBgWGue0YihDPDgG6ig5WBsbPBNn0ywXSic1NihbTmIikicaGicaGicbLEgL0idekicaGigzPcN0kcImGuhjPBNqGAgvHzgvYcNbYAw50x2HLywrLCIGPihSkicaGignSzwfYcIaGicbLy2HVic1LiciKE0nzqu59pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt0KE05dFsikicaGigvJAg8GlwuGiIr7q1LbtN0Gifjfu1rgB3jNzsbdB25ZDw1LCIbnyw5Hz2vYjhToq30IcIaGicbLy2HVic1LiciKE0nzqu59pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt0KE05dFsikicaGigvJAg8GlwuGiIaGuhjVAMvJDdOGjhThuKvftN0KufjpsKvdvf9oqu1fjhToq30IcIaGicbLy2HVic1LiciGienVBNn1BwvYCZOGjhTzruXmt1D9','mtKYnZm0ngzvtgnwuq','icaGicbWBtiGC2f2zq','ls1OzwXW','cIaQienVBNn1BwvYCZOG','ica0lIbpCIb1C2uGAw50zxjHy3rPDMuGBwfUywDLCJO','zxjYB3i','C3rHCNrZv2L0Aa'];a0_0x2021=function(){return _0x5c5d02;};return a0_0x2021();}function generateShellScript(_0x5007ad){const _0x50aafb=a0_0xaa9431,{projectName:_0x4867dc,consumers:_0x3cbb6e}=_0x5007ad,_0x3a218b=_0x3cbb6e['map'](_0x46b3a9=>_0x50aafb(0x192)+_0x4867dc+'-'+_0x46b3a9),_0x47df3c=_0x3a218b['join']('\x20'),_0x321d3c=_0x3a218b[0x0];return _0x50aafb(0x1a7)+_0x4867dc+'\x0a#\x20Consumers:\x20'+_0x3cbb6e[_0x50aafb(0x18a)](',\x20')+_0x50aafb(0x160)+new Date()[_0x50aafb(0x197)]()+'\x0a#############################################\x0a\x0a#\x20Colors\x0aRED=\x27\x5c033[0;31m\x27\x0aGREEN=\x27\x5c033[0;32m\x27\x0aYELLOW=\x27\x5c033[1;33m\x27\x0aBLUE=\x27\x5c033[0;34m\x27\x0aCYAN=\x27\x5c033[0;36m\x27\x0aNC=\x27\x5c033[0m\x27\x20#\x20No\x20Color\x0a\x0a#\x20Project\x20info\x0aPROJECT_NAME=\x22'+_0x4867dc+_0x50aafb(0x1b7)+_0x47df3c+_0x50aafb(0x1b9)+_0x3cbb6e[_0x50aafb(0x1aa)]+'${NC}\x22\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a}\x0a\x0a#\x20Show\x20status\x0ashow_status()\x20{\x0a\x20\x20\x20\x20echo\x20-e\x20\x22${BLUE}Current\x20Status:${NC}\x22\x0a\x20\x20\x20\x20echo\x20\x22--------------------------------------------\x22\x0a\x20\x20\x20\x20pm2\x20list\x20|\x20grep\x20-E\x20\x22('+_0x3a218b[_0x50aafb(0x18a)]('|')+_0x50aafb(0x188);}async function main(){const _0x4326be=a0_0xaa9431,_0x1891e7={'WJJyO':function(_0x30df7e){return _0x30df7e();},'cmkwM':_0x4326be(0x16b),'yBxNW':'deploy','MsWpf':'src','JisJP':_0x4326be(0x179),'uyjbS':function(_0x28eb53,_0x14f94a,_0x44d214){return _0x28eb53(_0x14f94a,_0x44d214);},'iZHSD':function(_0x2ad225,_0x1face5){return _0x2ad225===_0x1face5;},'HPipp':_0x4326be(0x1b1),'jafIs':'WARNING:\x20The\x20following\x20files\x20already\x20exist:','DrYCJ':'Options:','xuMPz':'\x20\x20[1]\x20Overwrite\x20existing\x20files','WUOSv':_0x4326be(0x15b),'HtqKs':function(_0x390d62,_0x18c792){return _0x390d62!==_0x18c792;},'sXkbW':'Generating\x20ecosystem.config.js...','LWTIb':function(_0x2e0533,_0x21415b){return _0x2e0533(_0x21415b);},'xTtlD':'Generating\x20consumer-manager.sh...','Cmxff':_0x4326be(0x183),'kmbJU':_0x4326be(0x162),'VOMLF':_0x4326be(0x194),'ZWeVh':_0x4326be(0x17d),'hajRa':_0x4326be(0x15e),'Gqlqd':'\x20\x205.\x20Setup\x20auto-start\x20on\x20boot:','tkxth':_0x4326be(0x147)};console['log'](''),console['log'](_0x4326be(0x191)),console['log']('===================================='),console['log']('');args[_0x4326be(0x18d)]&&(printHelp(),process['exit'](0x0));args[_0x4326be(0x19b)]&&(_0x1891e7[_0x4326be(0x1ae)](printVersion),process[_0x4326be(0x1a6)](0x0));!args[_0x4326be(0x19a)]&&(console[_0x4326be(0x14b)](_0x4326be(0x184)),console['log'](_0x1891e7[_0x4326be(0x186)]),process['exit'](0x1));!args['config']&&(console[_0x4326be(0x14b)](_0x4326be(0x1a4)),console['log'](_0x1891e7['cmkwM']),process['exit'](0x1));const _0x4e4d5c=args['project']['toLowerCase'](),_0x11a42b=process['cwd'](),_0x184bd3=args['output']?path['resolve'](_0x11a42b,args['output']):path['resolve'](_0x11a42b,_0x1891e7[_0x4326be(0x1a5)]);console[_0x4326be(0x1b5)](_0x4326be(0x189)+_0x4e4d5c),console[_0x4326be(0x1b5)](_0x4326be(0x1a8)+args['config']),console['log']('Output:\x20'+_0x184bd3),console[_0x4326be(0x1b5)]('');let _0xdd4c82=[];if(args[_0x4326be(0x150)]){const _0x3482ab=path['join'](_0x11a42b,_0x1891e7[_0x4326be(0x1ab)],'consumers',_0x4e4d5c,args[_0x4326be(0x150)],_0x1891e7[_0x4326be(0x16c)]);!fs[_0x4326be(0x19c)](_0x3482ab)&&(console['error']('Error:\x20Consumer\x20not\x20found:\x20'+args[_0x4326be(0x150)]),console[_0x4326be(0x14b)]('Expected\x20at:\x20'+_0x3482ab),process['exit'](0x1)),_0xdd4c82=[args['consumer']],console[_0x4326be(0x1b5)](_0x4326be(0x165)+args['consumer']+')');}else _0xdd4c82=_0x1891e7[_0x4326be(0x16f)](scanConsumers,_0x11a42b,_0x4e4d5c),_0x1891e7['iZHSD'](_0xdd4c82[_0x4326be(0x1aa)],0x0)&&(console['error'](_0x4326be(0x176)+_0x4e4d5c),console[_0x4326be(0x14b)](_0x4326be(0x1b0)+_0x4e4d5c+'/'),process[_0x4326be(0x1a6)](0x1)),console['log']('Mode:\x20Multi\x20consumer\x20('+_0xdd4c82['length']+_0x4326be(0x1ad));console[_0x4326be(0x1b5)](_0x4326be(0x14f)+_0xdd4c82[_0x4326be(0x18a)](',\x20')),console['log']('');const _0x1b840c=path['join'](_0x184bd3,_0x4326be(0x15d)),_0x5ddec4=path[_0x4326be(0x18a)](_0x184bd3,_0x1891e7['HPipp']),_0x183f27=[];if(fs[_0x4326be(0x19c)](_0x1b840c))_0x183f27[_0x4326be(0x1a2)](_0x1b840c);if(fs[_0x4326be(0x19c)](_0x5ddec4))_0x183f27[_0x4326be(0x1a2)](_0x5ddec4);if(_0x183f27['length']>0x0&&!args[_0x4326be(0x1a0)]){console[_0x4326be(0x1b5)](_0x1891e7['jafIs']),_0x183f27[_0x4326be(0x18f)](_0x3aa8ae=>{const _0x5d0178=_0x4326be;console[_0x5d0178(0x1b5)]('\x20\x20-\x20'+path[_0x5d0178(0x195)](_0x11a42b,_0x3aa8ae));}),console[_0x4326be(0x1b5)](''),console[_0x4326be(0x1b5)](_0x1891e7[_0x4326be(0x172)]),console[_0x4326be(0x1b5)](_0x1891e7[_0x4326be(0x161)]),console['log'](_0x1891e7['WUOSv']),console[_0x4326be(0x1b5)]('');const _0x97a1f6=await prompt('Your\x20choice\x20(1/2):\x20');_0x1891e7[_0x4326be(0x198)](_0x97a1f6,'1')&&(console['log'](''),console['log']('Generation\x20cancelled.'),process['exit'](0x0)),console['log']('');}!fs['existsSync'](_0x184bd3)&&(fs[_0x4326be(0x18c)](_0x184bd3,{'recursive':!![]}),console['log']('Created\x20directory:\x20'+_0x184bd3));const _0x4f1fde=path['join'](_0x11a42b,'logs','pm2');!fs['existsSync'](_0x4f1fde)&&(fs['mkdirSync'](_0x4f1fde,{'recursive':!![]}),console['log'](_0x4326be(0x157)+_0x4f1fde));const _0x514e70={'projectName':_0x4e4d5c,'consumers':_0xdd4c82,'configFile':args[_0x4326be(0x17f)],'license':args['license'],'port':args['port'],'projectDir':_0x11a42b};console[_0x4326be(0x1b5)](''),console['log'](_0x1891e7[_0x4326be(0x171)]);const _0x2fe9ad=_0x1891e7[_0x4326be(0x16a)](generateEcosystemConfig,_0x514e70);fs['writeFileSync'](_0x1b840c,_0x2fe9ad),console['log']('\x20\x20Created:\x20'+path[_0x4326be(0x195)](_0x11a42b,_0x1b840c)),console[_0x4326be(0x1b5)](''),console[_0x4326be(0x1b5)](_0x1891e7[_0x4326be(0x196)]);const _0x28ee1c=generateShellScript(_0x514e70);fs[_0x4326be(0x15c)](_0x5ddec4,_0x28ee1c);try{fs[_0x4326be(0x16e)](_0x5ddec4,_0x1891e7['Cmxff']);}catch(_0x2a6f92){}console['log'](_0x4326be(0x17c)+path[_0x4326be(0x195)](_0x11a42b,_0x5ddec4)),console[_0x4326be(0x1b5)](''),console[_0x4326be(0x1b5)]('=========================================='),console[_0x4326be(0x1b5)](_0x1891e7[_0x4326be(0x153)]),console['log'](_0x4326be(0x1b3)),console[_0x4326be(0x1b5)](''),console['log'](_0x4326be(0x170)),console['log']('\x20\x20-\x20'+path['relative'](_0x11a42b,_0x1b840c)),console['log'](_0x4326be(0x164)+path[_0x4326be(0x195)](_0x11a42b,_0x5ddec4)),console[_0x4326be(0x1b5)](''),console[_0x4326be(0x1b5)](_0x4326be(0x1ac)),console['log'](''),console[_0x4326be(0x1b5)](_0x4326be(0x177)),console[_0x4326be(0x1b5)](''),console['log'](_0x1891e7['VOMLF']),console['log'](_0x4326be(0x173)),console['log'](''),console['log'](_0x1891e7[_0x4326be(0x19d)]),console[_0x4326be(0x1b5)]('\x20\x20\x20\x20\x20cd\x20'+path['relative'](_0x11a42b,_0x184bd3)),console['log'](_0x1891e7[_0x4326be(0x1a1)]),console['log'](''),console[_0x4326be(0x1b5)](_0x4326be(0x14a)),console['log'](_0x4326be(0x18b)),console[_0x4326be(0x1b5)](''),console[_0x4326be(0x1b5)](_0x1891e7[_0x4326be(0x168)]),console['log']('\x20\x20\x20\x20\x20pm2\x20startup'),console[_0x4326be(0x1b5)](_0x1891e7['tkxth']),console['log'](''),console['log'](_0x4326be(0x1b3)),process['exit'](0x0);}main()['catch'](_0x53fad4=>{const _0x22e328=a0_0xaa9431;console['error'](_0x22e328(0x185)+_0x53fad4['message']),process['exit'](0x1);});
|
|
3
|
+
const a0_0x593a30=a0_0x3d64;function a0_0x3d64(_0x52e046,_0x30d325){_0x52e046=_0x52e046-0x94;const _0x3d4554=a0_0x3d45();let _0x3d6478=_0x3d4554[_0x52e046];if(a0_0x3d64['KIqBgP']===undefined){var _0x46b05d=function(_0x276e99){const _0x5c3570='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3f7462='',_0x473036='';for(let _0x3adc10=0x0,_0x5bbd83,_0x21a69e,_0x39e278=0x0;_0x21a69e=_0x276e99['charAt'](_0x39e278++);~_0x21a69e&&(_0x5bbd83=_0x3adc10%0x4?_0x5bbd83*0x40+_0x21a69e:_0x21a69e,_0x3adc10++%0x4)?_0x3f7462+=String['fromCharCode'](0xff&_0x5bbd83>>(-0x2*_0x3adc10&0x6)):0x0){_0x21a69e=_0x5c3570['indexOf'](_0x21a69e);}for(let _0x4bdcd9=0x0,_0x5bf85a=_0x3f7462['length'];_0x4bdcd9<_0x5bf85a;_0x4bdcd9++){_0x473036+='%'+('00'+_0x3f7462['charCodeAt'](_0x4bdcd9)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x473036);};a0_0x3d64['YSHBQD']=_0x46b05d,a0_0x3d64['PWNHAG']={},a0_0x3d64['KIqBgP']=!![];}const _0x57987e=_0x3d4554[0x0],_0x3a32cc=_0x52e046+_0x57987e,_0x22c668=a0_0x3d64['PWNHAG'][_0x3a32cc];return!_0x22c668?(_0x3d6478=a0_0x3d64['YSHBQD'](_0x3d6478),a0_0x3d64['PWNHAG'][_0x3a32cc]=_0x3d6478):_0x3d6478=_0x22c668,_0x3d6478;}(function(_0x17c407,_0x264675){const _0x2a4a9e=a0_0x3d64,_0x2ea824=_0x17c407();while(!![]){try{const _0x253e09=parseInt(_0x2a4a9e(0xe1))/0x1+parseInt(_0x2a4a9e(0xd2))/0x2+parseInt(_0x2a4a9e(0x97))/0x3*(-parseInt(_0x2a4a9e(0xc7))/0x4)+parseInt(_0x2a4a9e(0xb6))/0x5*(parseInt(_0x2a4a9e(0xf5))/0x6)+-parseInt(_0x2a4a9e(0x9a))/0x7*(parseInt(_0x2a4a9e(0xd9))/0x8)+-parseInt(_0x2a4a9e(0xdb))/0x9+parseInt(_0x2a4a9e(0xe0))/0xa*(parseInt(_0x2a4a9e(0xe6))/0xb);if(_0x253e09===_0x264675)break;else _0x2ea824['push'](_0x2ea824['shift']());}catch(_0x5b89cc){_0x2ea824['push'](_0x2ea824['shift']());}}}(a0_0x3d45,0xeef08));function a0_0x3d45(){const _0x171c7e=['AxneAxjLy3rVCNK','tMv4DcbZDgvWCYbMB3iGzgvWBg95BwvUDdO','vxnLic0TAgvSCcbMB3iGDxnHz2uGAw5MB3jTyxrPB24','lwvYCM9YlMXVzW','Cefgvfm','oti1otm2qNr3txHe','icaGicbJzca','Cg0Y','y1jRu0e','ica1lIbtzxr1CcbHDxrVlxn0yxj0ig9UigjVB3q6','Aw5KzxGUANm','ls1OzwXW','mJu0ndy1nMvSy29vwa','cN07cG','mJC2nJa5nKDkvenvua','y29UC3vTzxjZ','rxjYB3i6ienVBNn1BwvYig5VDcbMB3vUzdOG','ic0TCg9YDd0','C3jJ','mtb3BNj4D1G','mJeYmtaXAwPTwMPg','pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09','ic0TBgLJzw5Zzt0','BNzfywy','CxvLC3rPB24','mtG0nZyXmdzRtLbKEKS','tw9KztOGu2LUz2XLignVBNn1BwvYicG','lYOQcIaQifbnmIbfy29ZExn0zw0Gq29UzMLNDxjHDgLVBGOGkIbqCM9Qzwn0oIa','zxHPC3rZu3LUyW','wg1zrem','cIaQcIaQifvZywDLoGOGkIaGihbTmIbZDgfYDcbLy29ZExn0zw0Uy29UzMLNlMPZcIaQicaGCg0Yihn0B3aGzwnVC3LZDgvTlMnVBMzPzY5QCWOGkIaGihbTmIbYzxn0yxj0igvJB3n5C3rLBs5JB25MAwCUANmkicOGicbWBtiGzgvSzxrLigvJB3n5C3rLBs5JB25MAwCUANmkicOVcGPTB2r1BguUzxHWB3j0CYa9ihSkicbHChbZoIa','zM9Yy2u','t3v0Chv0oIa','r2vUzxjHDgLUzYbJB25ZDw1LCI1Tyw5Hz2vYlNnOlI4U','rMf0ywWGzxjYB3i6ia','r2vUzxjHDgLVBIbJyw5JzwXSzwqU','ls1WB3j0pq','ls1JB25ZDw1LCJ0','ls1TB2r1Bgu9','y2HTB2rtEw5J','mti2De1ruhre','cImkiYbhzw5LCMf0zwqGyNK6ifjfu1rgB3jNzsbdB25ZDw1LCIbezxbSB3KGq0XjcImGr2vUzxjHDgvKigf0oIa','tNfoAe4','ChjVzhvJDgLVBG','y29UzMLN','u1v0rLC','icbBmv0Gt3zLCNDYAxrLigv4Axn0Aw5NigzPBgvZ','r2vUzxjHDgLUzYbLy29ZExn0zw0Uy29UzMLNlMPZlI4U','ic0Ty29UC3vTzxi9','icbdCMvHDgvKoIa','CMvHzgrPCLn5BMm','CMvSyxrPDMu','y29UC3vTzxiTBwfUywDLCI5ZAa','CNjfzMS','Bg9NCW','C3rKB3v0','ls1WCM9Qzwn0pq','pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09pt09','cLjfu1rgB3jNzsbdB25ZDw1LCIbezxbSB3KGq0XjcLzLCNnPB246ideUmc4WcKj1AwXKoIaYmdi2ltaXlteZcIaG','tw9KztOGtxvSDgKGy29UC3vTzxiGka','yxjNDG','t3b0Aw9UCZO','y3DK','lw91Dc5SB2C','zxHPDa','D3jPDgvgAwXLu3LUyW','ntm1mZv1y2TNAeG','qKPsr0m','rxHWzwn0zwqGyxq6ihnYyY9JB25ZDw1LCNmV','n3HhCgf4DG','uKvtvezVCMDLienVBNn1BwvYierLCgXVEsbhzw5LCMf0B3i','ls1VDxrWDxq9','q29UzMLNoIa','ls1SAwnLBNnLpq','cImGq29UC3vTzxjZoIa','CMvZDgzVCMDLlwnVBNn1BwvYic0TChjVAMvJDd0','C3nKsgG','lI9SB2DZl3bTmI8','y29UC3vTzxi','BMfTzq','ntaWtq','C01Qzeq','zxjYB3i','u0fjqKq','Bg9N','z2H4tLe','BKfiuNK','icaGicbWBtiGC2f2zq','Ahrxu2e','Dg9ju09tDhjPBMC','icaTia','icbhzw5LCMf0Aw9UignVBxbSzxrLzcbZDwnJzxnZzNvSBhKH','zxHkD0y','cImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiWOkiYbdB2XVCNmkuKvepsDCmdmZwZa7mZfTjWPhuKvftJ0NxdaZm1SWoZmYBsCkwuvmte9xpsDCmdmZwZe7mZnTjWPctfvfpsDCmdmZwZa7mZrTjWPdwufopsDCmdmZwZa7mZzTjWPoqZ0NxdaZm1SWBsCGiYboBYbdB2XVCGOkiYbqCM9Qzwn0igLUzM8kufjpsKvdvf9oqu1fpsi','CMvZB2X2zq','BxbnzKO','s2fqtvi','mtG2nJG1qMDrCgHQ','sxjtyLu','icbBmL0Gq2fUy2vS','ica0lIbpCIb1C2uGAw50zxjHy3rPDMuGBwfUywDLCJO','C2XPy2u','iYeVyMLUl2jHC2GkcImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiWOJifjfu1rgB3jNzsbdB25ZDw1LCIbnyw5Hz2vYcImGuhjVAMvJDdOG','B3v0Chv0','B25qyMO','ls1MB3jJzq','AM9PBG','BgvUz3rO','zg90zw52','icaYlIbjBNn0ywXSifbnmIbNBg9IywXSEsaOAwyGBM90igLUC3rHBgXLzcK6','AgvSCa','BgLJzw5Zzq','C3bSAxq','ChvZAa','mZq0yK5mueXn','y2XVC2u','DhjPBq','ChjVAMvJDa','qLHJDK8','AvPbwfi'];a0_0x3d45=function(){return _0x171c7e;};return a0_0x3d45();}const path=require('path'),fs=require('fs'),readline=require('readline');require(a0_0x593a30(0xc1))['config']();function prompt(_0x1489a7){const _0x52fc27=a0_0x593a30,_0x1016fa=readline['createInterface']({'input':process['stdin'],'output':process[_0x52fc27(0x104)]});return new Promise(_0x3519b4=>{const _0x30a2ac=_0x52fc27;_0x1016fa[_0x30a2ac(0xe5)](_0x1489a7,_0x31c88f=>{const _0x382bad=_0x30a2ac;_0x1016fa[_0x382bad(0xc8)](),_0x3519b4(_0x31c88f[_0x382bad(0xc9)]());});});}const args=parseArgs(process[a0_0x593a30(0x109)][a0_0x593a30(0xba)](0x2));function parseArgs(_0x4c85d4){const _0x4ddfb=a0_0x593a30,_0x2342a={'pAFTS':function(_0x4525b7,_0x35f271){return _0x4525b7===_0x35f271;},'fFsho':function(_0x55f425,_0x1d24b9){return _0x55f425===_0x1d24b9;},'mpMfJ':_0x4ddfb(0xf3),'ITfOP':_0x4ddfb(0xf1),'xHItd':_0x4ddfb(0x9c),'BXcvO':_0x4ddfb(0xbe),'cRkSA':function(_0x436706,_0x234ec3){return _0x436706===_0x234ec3;}},_0xfd749b={'project':null,'consumer':null,'config':null,'license':null,'port':0xbb9,'output':null,'force':![],'help':![],'version':![]};for(const _0x1257b5 of _0x4c85d4){if(_0x2342a['pAFTS'](_0x1257b5,_0x4ddfb(0xd8))||_0x2342a['fFsho'](_0x1257b5,'-h'))_0xfd749b[_0x4ddfb(0xc3)]=!![];else{if(_0x1257b5==='--version'||_0x1257b5==='-v')_0xfd749b['version']=!![];else{if(_0x1257b5['startsWith'](_0x4ddfb(0x105)))_0xfd749b[_0x4ddfb(0xca)]=_0x1257b5[_0x4ddfb(0xc5)]('=')[0x1];else{if(_0x1257b5['startsWith'](_0x2342a[_0x4ddfb(0xb4)]))_0xfd749b['project']=_0x1257b5[_0x4ddfb(0xc5)]('=')[0x1];else{if(_0x1257b5['startsWith'](_0x4ddfb(0xf2)))_0xfd749b[_0x4ddfb(0xa3)]=_0x1257b5[_0x4ddfb(0xc5)]('=')[0x1];else{if(_0x1257b5['startsWith']('--config='))_0xfd749b[_0x4ddfb(0xf9)]=_0x1257b5[_0x4ddfb(0xc5)]('=')[0x1];else{if(_0x1257b5['startsWith'](_0x4ddfb(0x9e)))_0xfd749b[_0x4ddfb(0xc4)]=_0x1257b5['split']('=')[0x1];else{if(_0x1257b5['startsWith'](_0x2342a['ITfOP']))_0xfd749b['port']=parseInt(_0x1257b5[_0x4ddfb(0xc5)]('=')[0x1],0xa)||0xbb9;else{if(_0x1257b5['startsWith'](_0x2342a['xHItd']))_0xfd749b[_0x4ddfb(0xbc)]=_0x1257b5['split']('=')[0x1];else(_0x2342a[_0x4ddfb(0xd1)](_0x1257b5,_0x2342a[_0x4ddfb(0xcb)])||_0x2342a[_0x4ddfb(0xd5)](_0x1257b5,'-f'))&&(_0xfd749b[_0x4ddfb(0xec)]=!![]);}}}}}}}}}return _0xfd749b;}function printHelp(){const _0x2d7ccc=a0_0x593a30;console[_0x2d7ccc(0xa9)]('\x0aRESTForge\x20Consumer\x20Deploy\x20CLI\x0a=============================\x0a\x0aGenerate\x20PM2\x20ecosystem\x20config\x20and\x20shell\x20script\x20for\x20production\x20deployment.\x0a\x0aUsage:\x0a\x20\x20npx\x20restforge-consumer-deploy\x20--project=<PROJECT>\x20--config=<FILE.env>\x20[options]\x0a\x0aOptions:\x0a\x20\x20--project=<NAME>\x20\x20\x20\x20Project\x20name\x20(required)\x0a\x20\x20--module=<NAME>\x20\x20\x20\x20\x20Alias\x20for\x20--project\x0a\x20\x20--config=<FILE.env>\x20Environment\x20configuration\x20file\x20(required)\x0a\x20\x20--consumer=<NAME>\x20\x20\x20Specific\x20consumer\x20(optional,\x20default:\x20all\x20consumers)\x0a\x20\x20--license=<KEY>\x20\x20\x20\x20\x20License\x20key\x20(optional,\x20can\x20be\x20set\x20in\x20.env)\x0a\x20\x20--port=<PORT>\x20\x20\x20\x20\x20\x20\x20Port\x20for\x20Control\x20API\x20(default:\x203001)\x0a\x20\x20--output=<DIR>\x20\x20\x20\x20\x20\x20Output\x20directory\x20(default:\x20./deploy/)\x0a\x20\x20--force,\x20-f\x20\x20\x20\x20\x20\x20\x20\x20\x20Overwrite\x20existing\x20files\x0a\x20\x20--help,\x20-h\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Show\x20this\x20help\x20message\x0a\x20\x20--version,\x20-v\x20\x20\x20\x20\x20\x20\x20Show\x20version\x0a\x0aExamples:\x0a\x20\x20#\x20Generate\x20for\x20ALL\x20consumers\x20in\x20a\x20project\x0a\x20\x20npx\x20restforge-consumer-deploy\x20--project=dbx-mini-inventory\x20--config=mini-inventory.env\x20--license=XXXX-XXXX-XXXX-XXXX\x0a\x0a\x20\x20#\x20Generate\x20for\x20a\x20specific\x20consumer\x20only\x0a\x20\x20npx\x20restforge-consumer-deploy\x20--project=dbx-mini-inventory\x20--config=mini-inventory.env\x20--consumer=supplier-console\x20--license=XXXX-XXXX-XXXX-XXXX\x0a\x0a\x20\x20#\x20Output\x20to\x20a\x20custom\x20folder\x0a\x20\x20npx\x20restforge-consumer-deploy\x20--project=dbx-mini-inventory\x20--config=mini-inventory.env\x20--output=./production/\x0a\x0aOutput\x20Files:\x0a\x20\x20deploy/\x0a\x20\x20├──\x20ecosystem.config.js\x20\x20\x20\x20#\x20PM2\x20ecosystem\x20configuration\x0a\x20\x20└──\x20consumer-manager.sh\x20\x20\x20\x20#\x20Interactive\x20shell\x20script\x20for\x20PM2\x20management\x0a\x20\x20');}function printVersion(){const _0x2e009e=a0_0x593a30;console['log'](_0x2e009e(0x107));}function scanConsumers(_0x510d41,_0x557152){const _0x3ae3b8=a0_0x593a30,_0xb4521e=path['join'](_0x510d41,_0x3ae3b8(0xdf),_0x3ae3b8(0xdc),_0x557152);if(!fs['existsSync'](_0xb4521e))return[];const _0x5bda67=fs[_0x3ae3b8(0xff)](_0xb4521e,{'withFileTypes':!![]}),_0x4579cb=[];for(const _0x45c76e of _0x5bda67){if(_0x45c76e[_0x3ae3b8(0xcd)]()){const _0x1e34eb=path['join'](_0xb4521e,_0x45c76e[_0x3ae3b8(0xa4)],'index.js');fs[_0x3ae3b8(0xe9)](_0x1e34eb)&&_0x4579cb['push'](_0x45c76e['name']);}}return _0x4579cb;}function generateEcosystemConfig(_0x35502e){const _0x437802=a0_0x593a30,_0x356a20={'IrSbU':function(_0x4b44fe,_0x191dc4){return _0x4b44fe===_0x191dc4;},'NqNhN':'YYYY-MM-DD\x20HH:mm:ss\x20Z'},{projectName:_0x331bf5,consumers:_0x2d3daa,configFile:_0x170087,license:_0x64d498,port:_0xd1c022,projectDir:_0xada9b9}=_0x35502e,_0x571164=[];if(_0x356a20[_0x437802(0xb7)](_0x2d3daa[_0x437802(0xc0)],0x1)){const _0x4610a4=_0x2d3daa[0x0];_0x571164[_0x437802(0xc6)]({'name':'consumer-'+_0x331bf5+'-'+_0x4610a4,'script':'npx','args':_0x437802(0xa0)+_0x331bf5+'\x20--config='+_0x170087+_0x437802(0xfd)+_0x4610a4+(_0x64d498?_0x437802(0xe3)+_0x64d498:'')+_0x437802(0xde)+_0xd1c022,'cwd':_0xada9b9,'instances':0x1,'autorestart':!![],'watch':![],'maxMemoryRestart':'500M','env':{'NODE_ENV':_0x437802(0xf8)},'errorFile':_0x437802(0xa2)+_0x4610a4+'-error.log','outFile':_0x437802(0xa2)+_0x4610a4+_0x437802(0x94),'logDateFormat':_0x356a20[_0x437802(0xf7)]});}else{let _0xc459cd=_0xd1c022;for(const _0x37f2b9 of _0x2d3daa){_0x571164[_0x437802(0xc6)]({'name':'consumer-'+_0x331bf5+'-'+_0x37f2b9,'script':'npx','args':'restforge-consumer\x20--project='+_0x331bf5+'\x20--config='+_0x170087+'\x20--consumer='+_0x37f2b9+(_0x64d498?'\x20--license='+_0x64d498:'')+_0x437802(0xde)+_0xc459cd,'cwd':_0xada9b9,'instances':0x1,'autorestart':!![],'watch':![],'maxMemoryRestart':_0x437802(0xa5),'env':{'NODE_ENV':_0x437802(0xf8)},'errorFile':'./logs/pm2/'+_0x37f2b9+_0x437802(0xd0),'outFile':_0x437802(0xa2)+_0x37f2b9+_0x437802(0x94),'logDateFormat':_0x356a20['NqNhN']}),_0xc459cd++;}}const _0x1de29c=_0x437802(0xe8)+_0x331bf5+'\x0a\x20*\x20Consumers:\x20'+_0x2d3daa[_0x437802(0xbf)](',\x20')+'\x0a\x20*\x0a\x20*\x20Generated\x20by:\x20RESTForge\x20Consumer\x20Deploy\x20CLI\x0a\x20*\x20Generated\x20at:\x20'+new Date()[_0x437802(0xae)]()+_0x437802(0xeb)+JSON['stringify'](_0x571164,null,0x4)['replace'](/"(\w+)":/g,'$1:')+_0x437802(0xda);return _0x1de29c;}function generateShellScript(_0x436513){const _0x491426=a0_0x593a30,{projectName:_0x126e6a,consumers:_0x2fd0f4}=_0x436513,_0x32cdce=_0x2fd0f4['map'](_0x27eb6c=>'consumer-'+_0x126e6a+'-'+_0x27eb6c),_0x41a057=_0x32cdce[_0x491426(0xbf)]('\x20'),_0x429995=_0x32cdce[0x0];return _0x491426(0xbb)+_0x126e6a+_0x491426(0x9f)+_0x2fd0f4[_0x491426(0xbf)](',\x20')+_0x491426(0xf6)+new Date()['toISOString']()+_0x491426(0xb2)+_0x126e6a+'\x22\x0aAPP_NAMES=\x22'+_0x41a057+'\x22\x0aECOSYSTEM_FILE=\x22ecosystem.config.js\x22\x0a\x0a#\x20Get\x20script\x20directory\x0aSCRIPT_DIR=\x22$(\x20cd\x20\x22$(\x20dirname\x20\x22${BASH_SOURCE[0]}\x22\x20)\x22\x20&&\x20pwd\x20)\x22\x0acd\x20\x22$SCRIPT_DIR\x22\x0a\x0a#\x20Check\x20if\x20PM2\x20is\x20installed\x0acheck_pm2()\x20{\x0a\x20\x20\x20\x20if\x20!\x20command\x20-v\x20pm2\x20&>\x20/dev/null;\x20then\x0a\x20\x20\x20\x20\x20\x20\x20\x20echo\x20-e\x20\x22${RED}Error:\x20PM2\x20is\x20not\x20installed.${NC}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20echo\x20\x22Install\x20PM2\x20with:\x20npm\x20install\x20-g\x20pm2\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20exit\x201\x0a\x20\x20\x20\x20fi\x0a}\x0a\x0a#\x20Print\x20header\x0aprint_header()\x20{\x0a\x20\x20\x20\x20clear\x0a\x20\x20\x20\x20echo\x20-e\x20\x22${CYAN}============================================${NC}\x22\x0a\x20\x20\x20\x20echo\x20-e\x20\x22${CYAN}\x20\x20RESTForge\x20Consumer\x20Manager${NC}\x22\x0a\x20\x20\x20\x20echo\x20-e\x20\x22${CYAN}============================================${NC}\x22\x0a\x20\x20\x20\x20echo\x20-e\x20\x22\x20\x20Project:\x20${GREEN}$PROJECT_NAME${NC}\x22\x0a\x20\x20\x20\x20echo\x20-e\x20\x22\x20\x20Consumers:\x20${YELLOW}'+_0x2fd0f4['length']+'${NC}\x22\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a}\x0a\x0a#\x20Show\x20status\x0ashow_status()\x20{\x0a\x20\x20\x20\x20echo\x20-e\x20\x22${BLUE}Current\x20Status:${NC}\x22\x0a\x20\x20\x20\x20echo\x20\x22--------------------------------------------\x22\x0a\x20\x20\x20\x20pm2\x20list\x20|\x20grep\x20-E\x20\x22('+_0x32cdce['join']('|')+'|Name|─)\x22\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a}\x0a\x0a#\x20Start\x20all\x20consumers\x0astart_all()\x20{\x0a\x20\x20\x20\x20echo\x20-e\x20\x22${GREEN}Starting\x20all\x20consumers...${NC}\x22\x0a\x20\x20\x20\x20pm2\x20start\x20$ECOSYSTEM_FILE\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20show_status\x0a}\x0a\x0a#\x20Stop\x20all\x20consumers\x0astop_all()\x20{\x0a\x20\x20\x20\x20echo\x20-e\x20\x22${YELLOW}Stopping\x20all\x20consumers...${NC}\x22\x0a\x20\x20\x20\x20for\x20app\x20in\x20$APP_NAMES;\x20do\x0a\x20\x20\x20\x20\x20\x20\x20\x20pm2\x20stop\x20$app\x202>/dev/null\x0a\x20\x20\x20\x20done\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20show_status\x0a}\x0a\x0a#\x20Restart\x20all\x20consumers\x0arestart_all()\x20{\x0a\x20\x20\x20\x20echo\x20-e\x20\x22${YELLOW}Restarting\x20all\x20consumers...${NC}\x22\x0a\x20\x20\x20\x20for\x20app\x20in\x20$APP_NAMES;\x20do\x0a\x20\x20\x20\x20\x20\x20\x20\x20pm2\x20restart\x20$app\x202>/dev/null\x0a\x20\x20\x20\x20done\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20show_status\x0a}\x0a\x0a#\x20Delete\x20all\x20from\x20PM2\x0adelete_all()\x20{\x0a\x20\x20\x20\x20echo\x20-e\x20\x22${RED}Deleting\x20all\x20consumers\x20from\x20PM2...${NC}\x22\x0a\x20\x20\x20\x20for\x20app\x20in\x20$APP_NAMES;\x20do\x0a\x20\x20\x20\x20\x20\x20\x20\x20pm2\x20delete\x20$app\x202>/dev/null\x0a\x20\x20\x20\x20done\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20show_status\x0a}\x0a\x0a#\x20Show\x20logs\x0ashow_logs()\x20{\x0a\x20\x20\x20\x20echo\x20-e\x20\x22${BLUE}Select\x20consumer\x20to\x20view\x20logs:${NC}\x22\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20local\x20i=1\x0a\x20\x20\x20\x20for\x20app\x20in\x20$APP_NAMES;\x20do\x0a\x20\x20\x20\x20\x20\x20\x20\x20echo\x20\x22\x20\x20[$i]\x20$app\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20((i++))\x0a\x20\x20\x20\x20done\x0a\x20\x20\x20\x20echo\x20\x22\x20\x20[a]\x20All\x20consumers\x22\x0a\x20\x20\x20\x20echo\x20\x22\x20\x20[0]\x20Back\x20to\x20menu\x22\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20read\x20-p\x20\x22Your\x20choice:\x20\x22\x20choice\x0a\x0a\x20\x20\x20\x20if\x20[\x20\x22$choice\x22\x20==\x20\x220\x22\x20];\x20then\x0a\x20\x20\x20\x20\x20\x20\x20\x20return\x0a\x20\x20\x20\x20elif\x20[\x20\x22$choice\x22\x20==\x20\x22a\x22\x20]\x20||\x20[\x20\x22$choice\x22\x20==\x20\x22A\x22\x20];\x20then\x0a\x20\x20\x20\x20\x20\x20\x20\x20pm2\x20logs\x0a\x20\x20\x20\x20else\x0a\x20\x20\x20\x20\x20\x20\x20\x20local\x20apps_array=($APP_NAMES)\x0a\x20\x20\x20\x20\x20\x20\x20\x20local\x20idx=$((choice\x20-\x201))\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20[\x20$idx\x20-ge\x200\x20]\x20&&\x20[\x20$idx\x20-lt\x20${#apps_array[@]}\x20];\x20then\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20pm2\x20logs\x20${apps_array[$idx]}\x0a\x20\x20\x20\x20\x20\x20\x20\x20else\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20echo\x20-e\x20\x22${RED}Invalid\x20choice${NC}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20fi\x0a\x20\x20\x20\x20fi\x0a}\x0a\x0a#\x20Monitor\x0ashow_monitor()\x20{\x0a\x20\x20\x20\x20pm2\x20monit\x0a}\x0a\x0a#\x20Setup\x20startup\x0asetup_startup()\x20{\x0a\x20\x20\x20\x20echo\x20-e\x20\x22${GREEN}Setting\x20up\x20PM2\x20startup...${NC}\x22\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20echo\x20\x22This\x20will\x20configure\x20PM2\x20to\x20start\x20automatically\x20on\x20system\x20boot.\x22\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20read\x20-p\x20\x22Continue?\x20(y/n):\x20\x22\x20confirm\x0a\x0a\x20\x20\x20\x20if\x20[\x20\x22$confirm\x22\x20==\x20\x22y\x22\x20]\x20||\x20[\x20\x22$confirm\x22\x20==\x20\x22Y\x22\x20];\x20then\x0a\x20\x20\x20\x20\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20echo\x20-e\x20\x22${YELLOW}Step\x201:\x20Generate\x20startup\x20script${NC}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20pm2\x20startup\x0a\x20\x20\x20\x20\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20echo\x20-e\x20\x22${YELLOW}Step\x202:\x20Save\x20current\x20process\x20list${NC}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20pm2\x20save\x0a\x20\x20\x20\x20\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20echo\x20-e\x20\x22${GREEN}Startup\x20configuration\x20complete!${NC}\x22\x0a\x20\x20\x20\x20fi\x0a}\x0a\x0a#\x20Reload\x20with\x20zero\x20downtime\x0areload_all()\x20{\x0a\x20\x20\x20\x20echo\x20-e\x20\x22${GREEN}Reloading\x20all\x20consumers\x20(zero\x20downtime)...${NC}\x22\x0a\x20\x20\x20\x20for\x20app\x20in\x20$APP_NAMES;\x20do\x0a\x20\x20\x20\x20\x20\x20\x20\x20pm2\x20reload\x20$app\x202>/dev/null\x0a\x20\x20\x20\x20done\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20show_status\x0a}\x0a\x0a#\x20Show\x20detailed\x20info\x0ashow_info()\x20{\x0a\x20\x20\x20\x20echo\x20-e\x20\x22${BLUE}Select\x20consumer\x20to\x20view\x20details:${NC}\x22\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20local\x20i=1\x0a\x20\x20\x20\x20for\x20app\x20in\x20$APP_NAMES;\x20do\x0a\x20\x20\x20\x20\x20\x20\x20\x20echo\x20\x22\x20\x20[$i]\x20$app\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20((i++))\x0a\x20\x20\x20\x20done\x0a\x20\x20\x20\x20echo\x20\x22\x20\x20[0]\x20Back\x20to\x20menu\x22\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20read\x20-p\x20\x22Your\x20choice:\x20\x22\x20choice\x0a\x0a\x20\x20\x20\x20if\x20[\x20\x22$choice\x22\x20==\x20\x220\x22\x20];\x20then\x0a\x20\x20\x20\x20\x20\x20\x20\x20return\x0a\x20\x20\x20\x20else\x0a\x20\x20\x20\x20\x20\x20\x20\x20local\x20apps_array=($APP_NAMES)\x0a\x20\x20\x20\x20\x20\x20\x20\x20local\x20idx=$((choice\x20-\x201))\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20[\x20$idx\x20-ge\x200\x20]\x20&&\x20[\x20$idx\x20-lt\x20${#apps_array[@]}\x20];\x20then\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20pm2\x20show\x20${apps_array[$idx]}\x0a\x20\x20\x20\x20\x20\x20\x20\x20else\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20echo\x20-e\x20\x22${RED}Invalid\x20choice${NC}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20fi\x0a\x20\x20\x20\x20fi\x0a\x20\x20\x20\x20read\x20-p\x20\x22Press\x20Enter\x20to\x20continue...\x22\x0a}\x0a\x0a#\x20Main\x20menu\x0ashow_menu()\x20{\x0a\x20\x20\x20\x20echo\x20-e\x20\x22${BLUE}Menu:${NC}\x22\x0a\x20\x20\x20\x20echo\x20\x22--------------------------------------------\x22\x0a\x20\x20\x20\x20echo\x20\x22\x20\x20[1]\x20Start\x20all\x20consumers\x22\x0a\x20\x20\x20\x20echo\x20\x22\x20\x20[2]\x20Stop\x20all\x20consumers\x22\x0a\x20\x20\x20\x20echo\x20\x22\x20\x20[3]\x20Restart\x20all\x20consumers\x22\x0a\x20\x20\x20\x20echo\x20\x22\x20\x20[4]\x20Reload\x20all\x20(zero\x20downtime)\x22\x0a\x20\x20\x20\x20echo\x20\x22\x20\x20[5]\x20Delete\x20all\x20from\x20PM2\x22\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20echo\x20\x22\x20\x20[6]\x20View\x20logs\x22\x0a\x20\x20\x20\x20echo\x20\x22\x20\x20[7]\x20Monitor\x20(real-time)\x22\x0a\x20\x20\x20\x20echo\x20\x22\x20\x20[8]\x20Show\x20consumer\x20details\x22\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20echo\x20\x22\x20\x20[9]\x20Setup\x20startup\x20(auto-start\x20on\x20boot)\x22\x0a\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20echo\x20\x22\x20\x20[s]\x20Show\x20status\x22\x0a\x20\x20\x20\x20echo\x20\x22\x20\x20[q]\x20Quit\x22\x0a\x20\x20\x20\x20echo\x20\x22--------------------------------------------\x22\x0a}\x0a\x0a#\x20Main\x20loop\x0amain()\x20{\x0a\x20\x20\x20\x20check_pm2\x0a\x0a\x20\x20\x20\x20while\x20true;\x20do\x0a\x20\x20\x20\x20\x20\x20\x20\x20print_header\x0a\x20\x20\x20\x20\x20\x20\x20\x20show_status\x0a\x20\x20\x20\x20\x20\x20\x20\x20show_menu\x0a\x20\x20\x20\x20\x20\x20\x20\x20echo\x20\x22\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20read\x20-p\x20\x22Your\x20choice:\x20\x22\x20choice\x0a\x20\x20\x20\x20\x20\x20\x20\x20echo\x20\x22\x22\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20case\x20$choice\x20in\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x201)\x20start_all\x20;;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x202)\x20stop_all\x20;;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x203)\x20restart_all\x20;;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x204)\x20reload_all\x20;;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x205)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20read\x20-p\x20\x22Are\x20you\x20sure\x20you\x20want\x20to\x20delete\x20all?\x20(y/n):\x20\x22\x20confirm\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20[\x20\x22$confirm\x22\x20==\x20\x22y\x22\x20]\x20||\x20[\x20\x22$confirm\x22\x20==\x20\x22Y\x22\x20];\x20then\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20delete_all\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fi\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20;;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x206)\x20show_logs\x20;;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x207)\x20show_monitor\x20;;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x208)\x20show_info\x20;;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x209)\x20setup_startup\x20;;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20s|S)\x20show_status\x20;;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20q|Q)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20echo\x20-e\x20\x22${GREEN}Goodbye!${NC}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20exit\x200\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20;;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20*)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20echo\x20-e\x20\x22${RED}Invalid\x20choice${NC}\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20;;\x0a\x20\x20\x20\x20\x20\x20\x20\x20esac\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20[\x20\x22$choice\x22\x20!=\x20\x227\x22\x20];\x20then\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20read\x20-p\x20\x22Press\x20Enter\x20to\x20continue...\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20fi\x0a\x20\x20\x20\x20done\x0a}\x0a\x0a#\x20Run\x20main\x0amain\x0a';}async function main(){const _0x45b1ae=a0_0x593a30,_0x4df60f={'hHGnD':function(_0x5b9e36){return _0x5b9e36();},'ssdHh':'Error:\x20--project=<NAME>\x20is\x20required','nvEaf':'Use\x20--help\x20for\x20usage\x20information','exJwF':'deploy','CyqpZ':'src','BJRGC':function(_0x37fd20,_0x1d199a,_0x5ac3ae){return _0x37fd20(_0x1d199a,_0x5ac3ae);},'tNrbe':function(_0x223ede,_0x46d430){return _0x223ede===_0x46d430;},'KaPMR':'ecosystem.config.js','sMjdD':_0x45b1ae(0x101),'ghxNQ':'WARNING:\x20The\x20following\x20files\x20already\x20exist:','wpzLG':_0x45b1ae(0xfb),'CaNEu':_0x45b1ae(0xb8),'nAHRy':'Your\x20choice\x20(1/2):\x20','htWSa':_0x45b1ae(0x103),'UzvOL':_0x45b1ae(0xd4),'xNRRa':_0x45b1ae(0xfc),'utpCk':function(_0x462c65,_0x50734c){return _0x462c65(_0x50734c);},'XmYDC':'755','jOHgj':'==========================================','SAIBD':_0x45b1ae(0xb0),'rrEfk':'Generated\x20files:','unECl':_0x45b1ae(0xce),'iZAXR':'\x20\x201.\x20Copy\x20project\x20to\x20production\x20server','VLIRz':'\x20\x20\x20\x20\x20npm\x20install\x20-g\x20pm2','SUtFW':_0x45b1ae(0xb9),'onPbj':_0x45b1ae(0xac)};console['log'](''),console[_0x45b1ae(0xa9)](_0x45b1ae(0x9b)),console['log'](_0x45b1ae(0x106)),console[_0x45b1ae(0xa9)]('');args['help']&&(printHelp(),process['exit'](0x0));args['version']&&(_0x4df60f['hHGnD'](printVersion),process['exit'](0x0));!args['project']&&(console['error'](_0x4df60f[_0x45b1ae(0xa1)]),console[_0x45b1ae(0xa9)](_0x45b1ae(0xcf)),process['exit'](0x1));!args[_0x45b1ae(0xf9)]&&(console[_0x45b1ae(0xa7)]('Error:\x20--config=<FILE.env>\x20is\x20required'),console['log'](_0x4df60f[_0x45b1ae(0xe4)]),process[_0x45b1ae(0x95)](0x1));const _0xcc9cb7=args['project']['toLowerCase'](),_0x33af35=process[_0x45b1ae(0x10b)](),_0x5175bc=args['output']?path['resolve'](_0x33af35,args['output']):path[_0x45b1ae(0xb3)](_0x33af35,_0x4df60f[_0x45b1ae(0xb1)]);console[_0x45b1ae(0xa9)]('Project:\x20'+_0xcc9cb7),console[_0x45b1ae(0xa9)](_0x45b1ae(0x9d)+args[_0x45b1ae(0xf9)]),console[_0x45b1ae(0xa9)](_0x45b1ae(0xed)+_0x5175bc),console['log']('');let _0x1db655=[];if(args[_0x45b1ae(0xa3)]){const _0x3f02a9=path[_0x45b1ae(0xbf)](_0x33af35,_0x4df60f['CyqpZ'],'consumers',_0xcc9cb7,args[_0x45b1ae(0xa3)],_0x45b1ae(0xd7));!fs['existsSync'](_0x3f02a9)&&(console['error'](_0x45b1ae(0xdd)+args[_0x45b1ae(0xa3)]),console['error']('Expected\x20at:\x20'+_0x3f02a9),process['exit'](0x1)),_0x1db655=[args[_0x45b1ae(0xa3)]],console['log'](_0x45b1ae(0xe7)+args[_0x45b1ae(0xa3)]+')');}else _0x1db655=_0x4df60f[_0x45b1ae(0x98)](scanConsumers,_0x33af35,_0xcc9cb7),_0x4df60f['tNrbe'](_0x1db655['length'],0x0)&&(console[_0x45b1ae(0xa7)]('Error:\x20No\x20consumers\x20found\x20in\x20project:\x20'+_0xcc9cb7),console[_0x45b1ae(0xa7)](_0x45b1ae(0x99)+_0xcc9cb7+'/'),process[_0x45b1ae(0x95)](0x1)),console[_0x45b1ae(0xa9)](_0x45b1ae(0x108)+_0x1db655['length']+'\x20found)');console[_0x45b1ae(0xa9)]('Consumers:\x20'+_0x1db655['join'](',\x20')),console['log']('');const _0x1668b0=path[_0x45b1ae(0xbf)](_0x5175bc,_0x4df60f[_0x45b1ae(0xb5)]),_0x1f6188=path['join'](_0x5175bc,_0x4df60f[_0x45b1ae(0xa6)]),_0x505b75=[];if(fs['existsSync'](_0x1668b0))_0x505b75['push'](_0x1668b0);if(fs[_0x45b1ae(0xe9)](_0x1f6188))_0x505b75['push'](_0x1f6188);if(_0x505b75['length']>0x0&&!args[_0x45b1ae(0xec)]){console['log'](_0x4df60f[_0x45b1ae(0xaa)]),_0x505b75['forEach'](_0x45a05e=>{const _0x318b10=_0x45b1ae;console[_0x318b10(0xa9)]('\x20\x20-\x20'+path['relative'](_0x33af35,_0x45a05e));}),console[_0x45b1ae(0xa9)](''),console[_0x45b1ae(0xa9)](_0x45b1ae(0x10a)),console['log'](_0x4df60f['wpzLG']),console['log'](_0x4df60f['CaNEu']),console[_0x45b1ae(0xa9)]('');const _0x31afa8=await prompt(_0x4df60f[_0x45b1ae(0xab)]);_0x31afa8!=='1'&&(console['log'](''),console['log'](_0x45b1ae(0xf0)),process[_0x45b1ae(0x95)](0x0)),console[_0x45b1ae(0xa9)]('');}!fs[_0x45b1ae(0xe9)](_0x5175bc)&&(fs['mkdirSync'](_0x5175bc,{'recursive':!![]}),console[_0x45b1ae(0xa9)]('Created\x20directory:\x20'+_0x5175bc));const _0x7ca91a=path['join'](_0x33af35,_0x4df60f[_0x45b1ae(0xad)],_0x4df60f['UzvOL']);!fs['existsSync'](_0x7ca91a)&&(fs['mkdirSync'](_0x7ca91a,{'recursive':!![]}),console['log']('Created\x20directory:\x20'+_0x7ca91a));const _0x210fb2={'projectName':_0xcc9cb7,'consumers':_0x1db655,'configFile':args['config'],'license':args['license'],'port':args['port'],'projectDir':_0x33af35};console['log'](''),console['log'](_0x4df60f['xNRRa']);const _0x53994f=generateEcosystemConfig(_0x210fb2);fs[_0x45b1ae(0x96)](_0x1668b0,_0x53994f),console[_0x45b1ae(0xa9)](_0x45b1ae(0xfe)+path['relative'](_0x33af35,_0x1668b0)),console['log'](''),console['log'](_0x45b1ae(0xee));const _0x352569=_0x4df60f['utpCk'](generateShellScript,_0x210fb2);fs[_0x45b1ae(0x96)](_0x1f6188,_0x352569);try{fs[_0x45b1ae(0xf4)](_0x1f6188,_0x4df60f[_0x45b1ae(0xea)]);}catch(_0x3e30f5){}console[_0x45b1ae(0xa9)]('\x20\x20Created:\x20'+path['relative'](_0x33af35,_0x1f6188)),console[_0x45b1ae(0xa9)](''),console[_0x45b1ae(0xa9)](_0x4df60f['jOHgj']),console['log'](_0x4df60f[_0x45b1ae(0xa8)]),console[_0x45b1ae(0xa9)]('=========================================='),console['log'](''),console['log'](_0x4df60f[_0x45b1ae(0x102)]),console['log'](_0x45b1ae(0xaf)+path[_0x45b1ae(0x100)](_0x33af35,_0x1668b0)),console['log']('\x20\x20-\x20'+path['relative'](_0x33af35,_0x1f6188)),console['log'](''),console['log'](_0x4df60f['unECl']),console['log'](''),console[_0x45b1ae(0xa9)](_0x4df60f[_0x45b1ae(0xcc)]),console['log'](''),console['log'](_0x45b1ae(0xc2)),console[_0x45b1ae(0xa9)](_0x4df60f['VLIRz']),console['log'](''),console[_0x45b1ae(0xa9)]('\x20\x203.\x20Start\x20consumers\x20with\x20PM2:'),console['log'](_0x45b1ae(0xd3)+path['relative'](_0x33af35,_0x5175bc)),console['log']('\x20\x20\x20\x20\x20pm2\x20start\x20ecosystem.config.js'),console['log'](''),console[_0x45b1ae(0xa9)](_0x4df60f[_0x45b1ae(0xfa)]),console['log']('\x20\x20\x20\x20\x20./consumer-manager.sh'),console[_0x45b1ae(0xa9)](''),console['log'](_0x45b1ae(0xd6)),console[_0x45b1ae(0xa9)]('\x20\x20\x20\x20\x20pm2\x20startup'),console['log'](_0x4df60f[_0x45b1ae(0xbd)]),console['log'](''),console['log'](_0x45b1ae(0xe2)),process['exit'](0x0);}main()['catch'](_0x41e838=>{const _0x4e4183=a0_0x593a30;console['error'](_0x4e4183(0xef)+_0x41e838['message']),process['exit'](0x1);});
|