monorepotime 1.1.14 → 1.1.16

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/dist/index.js CHANGED
@@ -57302,6 +57302,62 @@ var import_express17 = __toESM(require_express2());
57302
57302
  var import_fs_extra12 = __toESM(require_lib4());
57303
57303
  var import_path14 = __toESM(require("path"));
57304
57304
  var router15 = (0, import_express17.Router)();
57305
+ var defaultmonrepotime = {
57306
+ notes: "",
57307
+ crudtest: [
57308
+ {
57309
+ category: "Internal CRUD Test",
57310
+ devurl: "",
57311
+ produrl: "",
57312
+ items: [
57313
+ {
57314
+ label: "Ping the Tool Server",
57315
+ route: "/ping",
57316
+ methods: "GET",
57317
+ description: "Ping the tool server to check if it is running.",
57318
+ sampleInput: "{}",
57319
+ suggested: [],
57320
+ expectedOutcome: '# You should see the word "pong" as a message \n\n{\n "message": "pong"\n}'
57321
+ },
57322
+ {
57323
+ label: "Check Post",
57324
+ route: "/post",
57325
+ methods: "POST",
57326
+ description: "Send a POST request to check if it sending correctly",
57327
+ sampleInput: '{\n "data": "test",\n "message": "test"\n}',
57328
+ suggested: [
57329
+ {
57330
+ name: "Customer Data",
57331
+ urlparams: "",
57332
+ content: '{\n "name": "Demo Customer",\n "email": "demo@test.com",\n "phone": "123456789",\n "icon": "test icon"\n}'
57333
+ }
57334
+ ],
57335
+ expectedOutcome: "# Note \nYou should see the mirror of your inputs"
57336
+ },
57337
+ {
57338
+ label: "Check Stream",
57339
+ route: "/stream",
57340
+ methods: "STREAM",
57341
+ description: "Send a stream request to check if it sending correctly",
57342
+ sampleInput: "{ }",
57343
+ suggested: [
57344
+ {
57345
+ name: "I Wandered Lonely as a Cloud",
57346
+ "urlparams": "poem=I Wandered Lonely as a Cloud",
57347
+ "content": "{}"
57348
+ },
57349
+ {
57350
+ name: "The Sun Has Long Been Set",
57351
+ urlparams: "poem=The Sun Has Long Been Set",
57352
+ content: "{}"
57353
+ }
57354
+ ],
57355
+ expectedOutcome: "# Note \nYou should see the stream of words"
57356
+ }
57357
+ ]
57358
+ }
57359
+ ]
57360
+ };
57305
57361
  router15.get("/", async (req, res) => {
57306
57362
  try {
57307
57363
  const sourcePath = import_path14.default.join(__dirname, "scaffold", "monorepotime.json");
@@ -57311,7 +57367,7 @@ router15.get("/", async (req, res) => {
57311
57367
  return;
57312
57368
  }
57313
57369
  if (!import_fs_extra12.default.existsSync(sourcePath)) {
57314
- await import_fs_extra12.default.writeJson(destPath, { notes: "", crudtest: [] }, { spaces: 4 });
57370
+ await import_fs_extra12.default.writeJson(destPath, defaultmonrepotime, { spaces: 4 });
57315
57371
  res.json({ success: true, message: "Created monorepotime.json with default content (scaffold missing)" });
57316
57372
  return;
57317
57373
  }
@@ -57704,7 +57760,7 @@ const EDITOR_URL = 'http://localhost/phpmyadmin'; // Change this to your preferr
57704
57760
  var PostgreSQL = {
57705
57761
  name: "PostgreSQL",
57706
57762
  description: "PostgreSQL Database (Docker Compose)",
57707
- notes: "Requires Docker installed.",
57763
+ notes: "Requires Docker installed. Data stored in ./postgres-data folder.",
57708
57764
  templating: [
57709
57765
  {
57710
57766
  action: "file",
@@ -57715,6 +57771,7 @@ services:
57715
57771
  postgres:
57716
57772
  image: postgres:16-alpine
57717
57773
  restart: unless-stopped
57774
+ user: "1000:1000"
57718
57775
  environment:
57719
57776
  POSTGRES_USER: user
57720
57777
  POSTGRES_PASSWORD: password
@@ -57722,7 +57779,7 @@ services:
57722
57779
  ports:
57723
57780
  - "0:5432"
57724
57781
  volumes:
57725
- - postgres-data:/var/lib/postgresql/data
57782
+ - ./postgres-data:/var/lib/postgresql/data
57726
57783
  healthcheck:
57727
57784
  test: ["CMD-SHELL", "pg_isready -U user -d mydatabase"]
57728
57785
  interval: 5s
@@ -57737,10 +57794,17 @@ services:
57737
57794
  ports:
57738
57795
  - "0:80"
57739
57796
  depends_on:
57740
- - postgres
57797
+ - postgres`
57798
+ },
57799
+ {
57800
+ action: "file",
57801
+ file: ".gitignore",
57802
+ filecontent: `# Database data folder
57803
+ postgres-data/
57741
57804
 
57742
- volumes:
57743
- postgres-data:`
57805
+ # Runtime file
57806
+ .runtime.json
57807
+ `
57744
57808
  },
57745
57809
  {
57746
57810
  action: "file",
@@ -57940,7 +58004,7 @@ var Supabase = {
57940
58004
  var Redis = {
57941
58005
  name: "Redis",
57942
58006
  description: "Redis (Docker Compose)",
57943
- notes: "Requires Docker installed.",
58007
+ notes: "Requires Docker installed. Data stored in ./redis-data folder.",
57944
58008
  templating: [
57945
58009
  {
57946
58010
  action: "file",
@@ -57951,10 +58015,11 @@ services:
57951
58015
  redis:
57952
58016
  image: redis:7.2-alpine
57953
58017
  restart: unless-stopped
58018
+ user: "1000:1000"
57954
58019
  ports:
57955
58020
  - "0:6379"
57956
58021
  volumes:
57957
- - redis-data:/data
58022
+ - ./redis-data:/data
57958
58023
  command: >
57959
58024
  redis-server
57960
58025
  --appendonly yes
@@ -57964,10 +58029,17 @@ services:
57964
58029
  test: ["CMD", "redis-cli", "ping"]
57965
58030
  interval: 5s
57966
58031
  timeout: 3s
57967
- retries: 5
58032
+ retries: 5`
58033
+ },
58034
+ {
58035
+ action: "file",
58036
+ file: ".gitignore",
58037
+ filecontent: `# Database data folder
58038
+ redis-data/
57968
58039
 
57969
- volumes:
57970
- redis-data:`
58040
+ # Runtime file
58041
+ .runtime.json
58042
+ `
57971
58043
  },
57972
58044
  {
57973
58045
  action: "file",
@@ -58100,7 +58172,7 @@ process.on('SIGTERM', cleanup);`
58100
58172
  var MongoDB = {
58101
58173
  name: "MongoDB",
58102
58174
  description: "MongoDB (Docker Compose)",
58103
- notes: "Requires Docker installed.",
58175
+ notes: "Requires Docker installed. Data stored in ./mongo-data folder.",
58104
58176
  templating: [
58105
58177
  {
58106
58178
  action: "file",
@@ -58109,13 +58181,14 @@ var MongoDB = {
58109
58181
  mongodb:
58110
58182
  image: mongo:7.0
58111
58183
  restart: unless-stopped
58184
+ user: "1000:1000"
58112
58185
  environment:
58113
58186
  MONGO_INITDB_ROOT_USERNAME: admin
58114
58187
  MONGO_INITDB_ROOT_PASSWORD: password
58115
58188
  ports:
58116
58189
  - "0:27017"
58117
58190
  volumes:
58118
- - mongo-data:/data/db
58191
+ - ./mongo-data:/data/db
58119
58192
  command: ["mongod", "--quiet"]
58120
58193
  logging:
58121
58194
  driver: "none"
@@ -58123,10 +58196,17 @@ var MongoDB = {
58123
58196
  test: echo "db.runCommand('ping').ok" | mongosh localhost:27017/test --quiet
58124
58197
  interval: 10s
58125
58198
  timeout: 10s
58126
- retries: 5
58199
+ retries: 5`
58200
+ },
58201
+ {
58202
+ action: "file",
58203
+ file: ".gitignore",
58204
+ filecontent: `# Database data folder
58205
+ mongo-data/
58127
58206
 
58128
- volumes:
58129
- mongo-data:`
58207
+ # Runtime file
58208
+ .runtime.json
58209
+ `
58130
58210
  },
58131
58211
  {
58132
58212
  action: "file",
@@ -58263,7 +58343,7 @@ process.on('SIGTERM', cleanup);`
58263
58343
  var Meilisearch = {
58264
58344
  name: "Meilisearch",
58265
58345
  description: "Meilisearch (Docker Compose)",
58266
- notes: "Requires Docker installed. Fast, open-source search engine.",
58346
+ notes: "Requires Docker installed. Data stored in ./meili-data folder.",
58267
58347
  templating: [
58268
58348
  {
58269
58349
  action: "file",
@@ -58272,21 +58352,29 @@ var Meilisearch = {
58272
58352
  meilisearch:
58273
58353
  image: getmeili/meilisearch:v1.10
58274
58354
  restart: unless-stopped
58355
+ user: "1000:1000"
58275
58356
  environment:
58276
58357
  - MEILI_MASTER_KEY=masterKey
58277
58358
  - MEILI_ENV=development
58278
58359
  ports:
58279
58360
  - "0:7700"
58280
58361
  volumes:
58281
- - meili-data:/meili_data
58362
+ - ./meili-data:/meili_data
58282
58363
  healthcheck:
58283
58364
  test: ["CMD", "curl", "-f", "http://localhost:7700/health"]
58284
58365
  interval: 10s
58285
58366
  timeout: 5s
58286
- retries: 5
58367
+ retries: 5`
58368
+ },
58369
+ {
58370
+ action: "file",
58371
+ file: ".gitignore",
58372
+ filecontent: `# Search engine data folder
58373
+ meili-data/
58287
58374
 
58288
- volumes:
58289
- meili-data:`
58375
+ # Runtime file
58376
+ .runtime.json
58377
+ `
58290
58378
  },
58291
58379
  {
58292
58380
  action: "file",
@@ -58425,7 +58513,7 @@ process.on('SIGTERM', cleanup);`
58425
58513
  var MinIO = {
58426
58514
  name: "MinIO",
58427
58515
  description: "MinIO Object Storage (S3 Compatible)",
58428
- notes: "Requires Docker installed. S3-compatible object storage.",
58516
+ notes: "Requires Docker installed. Data stored in ./minio-data folder.",
58429
58517
  templating: [
58430
58518
  {
58431
58519
  action: "file",
@@ -58435,6 +58523,7 @@ var MinIO = {
58435
58523
  image: minio/minio
58436
58524
  command: server /data --console-address ":9001"
58437
58525
  restart: unless-stopped
58526
+ user: "1000:1000"
58438
58527
  environment:
58439
58528
  - MINIO_ROOT_USER=minioadmin
58440
58529
  - MINIO_ROOT_PASSWORD=minioadmin
@@ -58442,15 +58531,22 @@ var MinIO = {
58442
58531
  - "0:9000"
58443
58532
  - "0:9001"
58444
58533
  volumes:
58445
- - minio-data:/data
58534
+ - ./minio-data:/data
58446
58535
  healthcheck:
58447
58536
  test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
58448
58537
  interval: 30s
58449
58538
  timeout: 20s
58450
- retries: 3
58539
+ retries: 3`
58540
+ },
58541
+ {
58542
+ action: "file",
58543
+ file: ".gitignore",
58544
+ filecontent: `# Object storage data folder
58545
+ minio-data/
58451
58546
 
58452
- volumes:
58453
- minio-data:`
58547
+ # Runtime file
58548
+ .runtime.json
58549
+ `
58454
58550
  },
58455
58551
  {
58456
58552
  action: "file",
@@ -60370,46 +60466,174 @@ var templates3 = [
60370
60466
  ];
60371
60467
  var projecttemplate_default = templates3;
60372
60468
 
60469
+ // ../../packages/template/services_list/n8n/dockerCompose.ts
60470
+ var dockerCompose = `services:
60471
+ n8n:
60472
+ image: n8nio/n8n:latest
60473
+ restart: unless-stopped
60474
+ user: "1000:1000"
60475
+ environment:
60476
+ - N8N_BASIC_AUTH_ACTIVE=true
60477
+ - N8N_BASIC_AUTH_USER=admin
60478
+ - N8N_BASIC_AUTH_PASSWORD=admin
60479
+ - N8N_HOST=localhost
60480
+ - N8N_PORT=5678
60481
+ - N8N_PROTOCOL=http
60482
+ - WEBHOOK_URL=http://localhost:5678/
60483
+ ports:
60484
+ - "5678:5678"
60485
+ volumes:
60486
+ - ./n8n-data:/home/node/.n8n
60487
+ healthcheck:
60488
+ test: ["CMD-SHELL", "wget --spider -q http://localhost:5678/healthz || exit 1"]
60489
+ interval: 10s
60490
+ timeout: 5s
60491
+ retries: 5`;
60492
+
60493
+ // ../../packages/template/services_list/n8n/gitignore.ts
60494
+ var gitignoreContent = `# N8N data folder (contains credentials and workflows)
60495
+ n8n-data/
60496
+
60497
+ # Runtime file
60498
+ .runtime.json
60499
+ `;
60500
+
60501
+ // ../../packages/template/services_list/n8n/server.ts
60502
+ var serverJs = `const http = require('http');
60503
+ const { spawn, exec } = require('child_process');
60504
+ const fs = require('fs');
60505
+ const path = require('path');
60506
+
60507
+ const RUNTIME_FILE = path.join(__dirname, '.runtime.json');
60508
+
60509
+ console.log('Starting N8N...');
60510
+
60511
+ // Start Docker Compose
60512
+ const child = spawn('docker', ['compose', 'up'], { stdio: 'inherit' });
60513
+
60514
+ child.on('close', (code) => {
60515
+ process.exit(code || 0);
60516
+ });
60517
+
60518
+ // Setup Control Server
60519
+ const server = http.createServer((req, res) => {
60520
+ if (req.url === '/stop') {
60521
+ res.writeHead(200);
60522
+ res.end('Stopping...');
60523
+ cleanup();
60524
+ } else {
60525
+ res.writeHead(404);
60526
+ res.end();
60527
+ }
60528
+ });
60529
+
60530
+ server.listen(0, () => {
60531
+ const port = server.address().port;
60532
+ // We update runtime file later when we get the container ID
60533
+ });
60534
+
60535
+ // Check status loop
60536
+ const checkStatus = () => {
60537
+ exec('docker compose port n8n 5678', (err, stdout, stderr) => {
60538
+ if (err || stderr || !stdout) {
60539
+ setTimeout(checkStatus, 2000);
60540
+ return;
60541
+ }
60542
+ const n8nPort = stdout.trim().split(':')[1];
60543
+ if (!n8nPort) {
60544
+ setTimeout(checkStatus, 2000);
60545
+ return;
60546
+ }
60547
+
60548
+ // Verify N8N is actually responding to HTTP
60549
+ http.get(\`http://localhost:\${n8nPort}/healthz\`, (res) => {
60550
+ // Capture Container IDs
60551
+ exec('docker compose ps -q', (err2, stdout2) => {
60552
+ const containerIds = stdout2 ? stdout2.trim().split('\\n') : [];
60553
+
60554
+ try {
60555
+ fs.writeFileSync(RUNTIME_FILE, JSON.stringify({
60556
+ port: server.address().port,
60557
+ pid: process.pid,
60558
+ containerIds: containerIds
60559
+ }));
60560
+ } catch(e) {
60561
+ console.error('Failed to write runtime file:', e);
60562
+ }
60563
+ console.clear();
60564
+ });
60565
+ }).on('error', (e) => {
60566
+ // Connection failed (ECONNREFUSED usually), retry
60567
+ setTimeout(checkStatus, 2000);
60568
+ });
60569
+ });
60570
+ };
60571
+
60572
+ setTimeout(checkStatus, 3000);
60573
+
60574
+ const cleanup = () => {
60575
+ console.log('Stopping N8N...');
60576
+ try {
60577
+ const runtime = JSON.parse(fs.readFileSync(RUNTIME_FILE));
60578
+ if (runtime.containerIds) {
60579
+ console.log(\`Stopping \${runtime.containerIds.length} containers...\`);
60580
+ runtime.containerIds.forEach(id => {
60581
+ exec(\`docker stop \${id}\`, () => {
60582
+ exec(\`docker rm -f \${id}\`);
60583
+ });
60584
+ });
60585
+ }
60586
+ } catch(e) {}
60587
+ try { fs.unlinkSync(RUNTIME_FILE); } catch(e) {}
60588
+
60589
+ exec('docker compose stop', () => {
60590
+ process.exit(0);
60591
+ });
60592
+ };
60593
+
60594
+ process.on('SIGINT', cleanup);
60595
+ process.on('SIGTERM', cleanup);`;
60596
+
60373
60597
  // ../../packages/template/services_list/n8n.ts
60374
60598
  var N8NLocal = {
60375
- name: "N8N Local",
60376
- description: "N8N (Local)",
60377
- notes: "Requires Node.js installed in your system.",
60599
+ name: "N8N Local Dockerized",
60600
+ description: "N8N Workflow Automation",
60601
+ notes: "Requires Docker installed. Data is stored in ./n8n-data folder.",
60378
60602
  templating: [
60379
60603
  {
60380
- action: "command",
60381
- cmd: "npm",
60382
- args: ["install", "n8n"]
60604
+ action: "file",
60605
+ file: "docker-compose.yml",
60606
+ filecontent: dockerCompose
60383
60607
  },
60384
60608
  {
60385
- action: "command",
60386
- cmd: "npm",
60387
- args: ["pkg", "set", "scripts.dev=npx n8n"]
60609
+ action: "file",
60610
+ file: ".gitignore",
60611
+ filecontent: gitignoreContent
60388
60612
  },
60389
60613
  {
60390
- action: "command",
60391
- cmd: "npm",
60392
- args: ["pkg", "set", "scripts.start=npx n8n"]
60614
+ action: "file",
60615
+ file: "index.js",
60616
+ filecontent: serverJs
60393
60617
  },
60394
60618
  {
60395
60619
  action: "command",
60396
60620
  cmd: "npm",
60397
- args: ["pkg", "set", "scripts.stop=npx kill-port 5678"]
60621
+ args: ["pkg", "set", "scripts.start=node index.js"]
60398
60622
  },
60399
60623
  {
60400
60624
  action: "command",
60401
60625
  cmd: "npm",
60402
- args: ["pkg", "set", "fontawesomeIcon=fas fa-project-diagram text-red-500"]
60626
+ args: ["pkg", "set", `scripts.stop=node -e 'const fs=require("fs"); try{const p=JSON.parse(fs.readFileSync(".runtime.json")).port; fetch("http://localhost:"+p+"/stop").catch(e=>{})}catch(e){}'`]
60403
60627
  },
60404
60628
  {
60405
60629
  action: "command",
60406
60630
  cmd: "npm",
60407
- args: ["pkg", "set", "description=N8N (Local)"]
60631
+ args: ["pkg", "set", "description=N8N Workflow Automation (Docker)"]
60408
60632
  },
60409
60633
  {
60410
60634
  action: "command",
60411
60635
  cmd: "npm",
60412
- args: ["pkg", "set", "name=$(basename $PWD)"]
60636
+ args: ["pkg", "set", "fontawesomeIcon=fas fa-project-diagram text-red-500"]
60413
60637
  }
60414
60638
  ]
60415
60639
  };
@@ -60593,9 +60817,10 @@ module.exports = {
60593
60817
  };`;
60594
60818
 
60595
60819
  // ../../packages/template/services_list/aws/dockerCompose.ts
60596
- var dockerCompose = `services:
60820
+ var dockerCompose2 = `services:
60597
60821
  localstack:
60598
60822
  image: localstack/localstack
60823
+ user: "1000:1000"
60599
60824
  ports:
60600
60825
  - "127.0.0.1:4566:4566" # LocalStack Gateway
60601
60826
  - "127.0.0.1:4510-4559:4510-4559" # External services port range
@@ -60605,7 +60830,7 @@ var dockerCompose = `services:
60605
60830
  - DOCKER_HOST=unix:///var/run/docker.sock
60606
60831
  - AWS_DEFAULT_REGION=us-east-1
60607
60832
  volumes:
60608
- - localstack-data:/var/lib/localstack
60833
+ - ./localstack-data:/var/lib/localstack
60609
60834
  - /var/run/docker.sock:/var/run/docker.sock
60610
60835
  networks:
60611
60836
  - cloud-net
@@ -60639,13 +60864,18 @@ var dockerCompose = `services:
60639
60864
  networks:
60640
60865
  - cloud-net
60641
60866
 
60642
- volumes:
60643
- localstack-data: {}
60644
-
60645
60867
  networks:
60646
60868
  cloud-net:
60647
60869
  driver: bridge`;
60648
60870
 
60871
+ // ../../packages/template/services_list/aws/gitignore.ts
60872
+ var gitignoreContent2 = `# LocalStack data folder
60873
+ localstack-data/
60874
+
60875
+ # Runtime file
60876
+ .runtime.json
60877
+ `;
60878
+
60649
60879
  // ../../packages/template/services_list/aws/indexHtml.ts
60650
60880
  var indexHtml2 = `<!DOCTYPE html>
60651
60881
  <html lang="en" class="dark">
@@ -60856,7 +61086,7 @@ dynamodb.createTable(params, function(err, data) {
60856
61086
  </html>`;
60857
61087
 
60858
61088
  // ../../packages/template/services_list/aws/server.ts
60859
- var serverJs = `const http = require('http');
61089
+ var serverJs2 = `const http = require('http');
60860
61090
  const fs = require('fs');
60861
61091
  const path = require('path');
60862
61092
  const { spawn, exec } = require('child_process');
@@ -60985,12 +61215,17 @@ spawn('docker', ['compose', 'down'], { stdio: 'inherit' });`;
60985
61215
  var AWSTemplate = {
60986
61216
  name: "Localstack (Experimental)",
60987
61217
  description: "AWS LocalStack Environment with Manager",
60988
- notes: "Requires Docker, Node.js, and AWS CLI installed.",
61218
+ notes: "Requires Docker, Node.js, and AWS CLI. Data stored in ./localstack-data folder.",
60989
61219
  templating: [
60990
61220
  {
60991
61221
  action: "file",
60992
61222
  file: "docker-compose.yml",
60993
- filecontent: dockerCompose
61223
+ filecontent: dockerCompose2
61224
+ },
61225
+ {
61226
+ action: "file",
61227
+ file: ".gitignore",
61228
+ filecontent: gitignoreContent2
60994
61229
  },
60995
61230
  {
60996
61231
  action: "file",
@@ -61000,7 +61235,7 @@ var AWSTemplate = {
61000
61235
  {
61001
61236
  action: "file",
61002
61237
  file: "server.js",
61003
- filecontent: serverJs
61238
+ filecontent: serverJs2
61004
61239
  },
61005
61240
  {
61006
61241
  action: "file",
@@ -61027,6 +61262,11 @@ var AWSTemplate = {
61027
61262
  file: "examples/nodeserver/index.js",
61028
61263
  filecontent: 'exports.handler = async (event) => { return { statusCode: 200, body: JSON.stringify("Hello from Lambda!") }; };'
61029
61264
  },
61265
+ {
61266
+ action: "command",
61267
+ cmd: "npm",
61268
+ args: ["pkg", "set", "scripts.start=node server.js"]
61269
+ },
61030
61270
  {
61031
61271
  action: "command",
61032
61272
  cmd: "npm",
@@ -61055,8 +61295,8 @@ var AWSTemplate = {
61055
61295
  ]
61056
61296
  };
61057
61297
 
61058
- // ../../packages/template/services_list/stripe.ts
61059
- var dockerCompose2 = `services:
61298
+ // ../../packages/template/services_list/stripe/dockerCompose.ts
61299
+ var dockerCompose3 = `services:
61060
61300
  stripe-mock:
61061
61301
  image: stripe/stripe-mock:latest
61062
61302
  container_name: stripe-mock
@@ -61069,7 +61309,14 @@ var dockerCompose2 = `services:
61069
61309
  timeout: 5s
61070
61310
  retries: 5
61071
61311
  `;
61072
- var serverJs2 = `const http = require('http');
61312
+
61313
+ // ../../packages/template/services_list/stripe/gitignore.ts
61314
+ var gitignoreContent3 = `# Runtime file
61315
+ .runtime.json
61316
+ `;
61317
+
61318
+ // ../../packages/template/services_list/stripe/server.ts
61319
+ var serverJs3 = `const http = require('http');
61073
61320
  const fs = require('fs');
61074
61321
  const path = require('path');
61075
61322
  const { spawn, exec } = require('child_process');
@@ -61149,9 +61396,9 @@ const cleanup = () => {
61149
61396
  try {
61150
61397
  const runtime = JSON.parse(fs.readFileSync(RUNTIME_FILE));
61151
61398
  if (runtime.containerIds) {
61152
- console.log(\\\`Stopping \\\${runtime.containerIds.length} containers...\\\`);
61399
+ console.log(\`Stopping \${runtime.containerIds.length} containers...\`);
61153
61400
  runtime.containerIds.forEach(id => {
61154
- exec(\\\`docker stop \\\${id}\\\`);
61401
+ exec(\`docker stop \${id}\`);
61155
61402
  });
61156
61403
  }
61157
61404
  } catch(e) {}
@@ -61164,6 +61411,8 @@ const cleanup = () => {
61164
61411
  // Handle cleanup
61165
61412
  process.on('SIGINT', cleanup);
61166
61413
  process.on('SIGTERM', cleanup);`;
61414
+
61415
+ // ../../packages/template/services_list/stripe/test.ts
61167
61416
  var testJs = `const Stripe = require('stripe');
61168
61417
 
61169
61418
  // Initialize with a fake key and point to the mock server
@@ -61225,6 +61474,8 @@ const stripe = new Stripe('sk_test_mock_123', {
61225
61474
  }
61226
61475
  })();
61227
61476
  `;
61477
+
61478
+ // ../../packages/template/services_list/stripe.ts
61228
61479
  var StripeTemplate = {
61229
61480
  name: "Stripe Mock (Experimental)",
61230
61481
  description: "Stripe API Mock Server",
@@ -61233,12 +61484,17 @@ var StripeTemplate = {
61233
61484
  {
61234
61485
  action: "file",
61235
61486
  file: "docker-compose.yml",
61236
- filecontent: dockerCompose2
61487
+ filecontent: dockerCompose3
61488
+ },
61489
+ {
61490
+ action: "file",
61491
+ file: ".gitignore",
61492
+ filecontent: gitignoreContent3
61237
61493
  },
61238
61494
  {
61239
61495
  action: "file",
61240
61496
  file: "server.js",
61241
- filecontent: serverJs2
61497
+ filecontent: serverJs3
61242
61498
  },
61243
61499
  {
61244
61500
  action: "file",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monorepotime",
3
- "version": "1.1.14",
3
+ "version": "1.1.16",
4
4
  "description": "monorepo gui tool",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -98,7 +98,7 @@ WARNING: This link could potentially be dangerous`)){const d=window.open();if(d)
98
98
  `,children:W.name}),B.jsx("span",{className:`
99
99
  text-[12px] font-mono truncate block w-full transition-opacity duration-300
100
100
  ${W.disabled?"text-gray-600":W.bg?"text-white/70":"text-gray-500 group-hover:text-gray-400"}
101
- `,style:{lineHeight:1},children:W.description})]})]})]},W.name)}function t0({onClose:W}){return B.jsxs(er,{width:"900px",children:[B.jsx(Jn,{title:"CI/CD Tutorial with Vercel",description:"Mastering Continuous Integration & Deployment",icon:"fas fa-infinity",close:W}),B.jsxs("div",{className:"flex flex-col h-[70vh] overflow-hidden text-sm",children:[B.jsxs("div",{className:"flex-1 overflow-y-auto p-8 space-y-12 text-gray-300 custom-scrollbar",children:[B.jsxs("section",{id:"intro",className:"space-y-4",children:[B.jsxs("div",{className:"flex items-center gap-3 mb-6",children:[B.jsx("div",{className:"w-12 h-12 rounded-xl bg-gradient-to-br from-blue-500 to-indigo-600 flex items-center justify-center shadow-lg shadow-blue-500/20",children:B.jsx("i",{className:"fas fa-infinity text-2xl text-white"})}),B.jsxs("div",{children:[B.jsx("h2",{className:"text-2xl font-bold text-white",children:"What is CI/CD?"}),B.jsx("p",{className:"text-blue-400 text-sm",children:"Continuous Integration & Continuous Delivery"})]})]}),B.jsx("div",{className:"bg-white/5 p-6 rounded-xl border border-white/10",children:B.jsxs("p",{className:"leading-relaxed",children:[B.jsx("strong",{className:"text-white",children:"CI (Continuous Integration)"})," is the practice of automating the integration of code changes from multiple contributors into a single software project.",B.jsx("br",{}),B.jsx("br",{}),B.jsx("strong",{className:"text-white",children:"CD (Continuous Delivery/Deployment)"})," ensures that your code is always in a deployable state and automatically releases it to production when ready."]})})]}),B.jsxs("section",{id:"why",className:"space-y-6",children:[B.jsxs("h2",{className:"text-xl font-bold text-white flex items-center gap-3",children:[B.jsx("i",{className:"fas fa-lightbulb text-yellow-500"}),"Why use CI/CD?"]}),B.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[{title:"Speed",desc:"Ship code faster with automated testing and building.",icon:"fa-rocket",color:"text-green-400"},{title:"Reliability",desc:"Catch bugs early before they reach production.",icon:"fa-shield-alt",color:"text-blue-400"},{title:"Efficiency",desc:"Stop wasting time on manual deployments.",icon:"fa-clock",color:"text-orange-400"},{title:"Consistency",desc:"Ensure every environment matches production.",icon:"fa-sync",color:"text-purple-400"}].map(G=>B.jsxs("div",{className:"p-4 rounded-xl bg-white/5 border border-white/10 hover:border-white/20 transition-colors",children:[B.jsx("i",{className:`fas ${G.icon} ${G.color} text-xl mb-3`}),B.jsx("h3",{className:"text-white font-bold mb-1",children:G.title}),B.jsx("p",{className:"text-sm text-gray-400",children:G.desc})]},G.title))})]}),B.jsxs("section",{id:"turbo-vercel",className:"space-y-6",children:[B.jsx("div",{className:"flex items-center justify-between border-b border-white/10 pb-4",children:B.jsxs("h2",{className:"text-xl font-bold text-white flex items-center gap-3",children:[B.jsx("i",{className:"fas fa-layer-group text-pink-500"}),"Turborepo + Vercel"]})}),B.jsxs("div",{className:"flex items-center gap-8 justify-center py-8",children:[B.jsxs("div",{className:"text-center",children:[B.jsx("div",{className:"w-16 h-16 mx-auto rounded-full bg-[#1e1e1e] flex items-center justify-center border border-white/20 mb-3",children:B.jsx("i",{className:"fas fa-cube text-3xl text-transparent bg-clip-text bg-gradient-to-r from-red-500 to-orange-500"})}),B.jsx("span",{className:"font-bold text-white",children:"Turborepo"})]}),B.jsxs("div",{className:"flex flex-col items-center gap-1",children:[B.jsx("span",{className:"text-xs text-green-400 font-bold",children:"CACHE HIT!"}),B.jsx("div",{className:"h-[2px] w-24 bg-gradient-to-r from-red-500 to-white"}),B.jsx("i",{className:"fas fa-arrow-right text-white"})]}),B.jsxs("div",{className:"text-center",children:[B.jsx("div",{className:"w-16 h-16 mx-auto rounded-full bg-black flex items-center justify-center border border-white/20 mb-3",children:B.jsx("i",{className:"fas fa-triangle text-3xl text-white"})}),B.jsx("span",{className:"font-bold text-white",children:"Vercel"})]})]}),B.jsxs("p",{className:"bg-blue-500/10 border-l-4 border-blue-500 p-4 rounded text-sm",children:["Combining ",B.jsx("strong",{children:"Turborepo's"})," intelligent caching with ",B.jsx("strong",{children:"Vercel's"})," global edge network gives you the fastest build times and deployments possible. Vercel automatically understands your Turborepo structure."]})]}),B.jsxs("section",{id:"guide",className:"space-y-8",children:[B.jsxs("h2",{className:"text-xl font-bold text-white flex items-center gap-3",children:[B.jsx("i",{className:"fas fa-tasks text-green-500"}),"Step-by-Step Setup"]}),B.jsx("div",{className:"space-y-6",children:[{step:1,title:"Login with Vercel",desc:"Ensure you have a Vercel account and are logged in via the CLI or Dashboard to authorize deployments.",icon:"fa-sign-in-alt"},{step:2,title:"Connect to GitHub",desc:"Link your Monorepo to a GitHub repository. Vercel uses this to trigger automatic deployments on push.",icon:"fa-code-branch"},{step:3,title:"Add Projects in Vercel",desc:"In the Vercel Dashboard, import your repository. Vercel detects Turborepo and asks which workspace (app) you want to deploy. Add each app (e.g., 'web', 'docs') as a separate Vercel project linked to the same repo.",icon:"fa-plus-circle"},{step:4,title:"Deployment",desc:"Push to 'main' to deploy. Vercel will build only what has changed.",icon:"fa-cloud-upload-alt"}].map(G=>B.jsxs("div",{className:"flex gap-4",children:[B.jsx("div",{className:"flex-none w-8 h-8 rounded-full bg-white/10 flex items-center justify-center font-bold text-white border border-white/20",children:G.step}),B.jsxs("div",{className:"space-y-2",children:[B.jsxs("h3",{className:"text-white font-bold flex items-center gap-2",children:[G.title,B.jsx("i",{className:`fas ${G.icon} text-gray-500 text-sm`})]}),B.jsx("p",{className:"text-sm text-gray-400",children:G.desc})]})]},G.step))}),B.jsxs("div",{className:"mt-8 p-5 bg-gradient-to-r from-purple-900/30 to-blue-900/30 rounded-xl border border-purple-500/30",children:[B.jsxs("h3",{className:"text-lg font-bold text-white mb-2 flex items-center gap-2",children:[B.jsx("i",{className:"fas fa-magic text-purple-400"}),'Pro Tip: The "Turbo Build" Button']}),B.jsxs("p",{className:"text-sm text-gray-300",children:["When you use the ",B.jsx("span",{className:"px-2 py-0.5 rounded bg-white/10 text-white font-mono text-xs",children:"turbo build"})," command or button in this dashboard, it can be configured to upload your ",B.jsx("strong",{children:"pre-compiled dist/build artifacts"})," directly to Vercel's cache."]}),B.jsxs("div",{className:"mt-3 flex items-start gap-3 text-xs text-purple-200 bg-purple-500/10 p-3 rounded-lg",children:[B.jsx("i",{className:"fas fa-info-circle mt-0.5"}),B.jsxs("span",{children:["This means Vercel ",B.jsx("strong",{children:"doesn't have to rebuild"})," everything from scratch. It pulls the artifacts you just built locally (or in CI), saving massive amounts of build minutes and time!"]})]})]})]})]}),B.jsxs("div",{className:"p-4 border-t border-white/10 bg-black/40 flex justify-between items-center text-xs text-gray-500",children:[B.jsx("span",{children:"Learn more at:"}),B.jsxs("div",{className:"flex gap-4",children:[B.jsxs("a",{href:"https://vercel.com/docs",target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 hover:text-white transition-colors",children:[B.jsx("i",{className:"fas fa-triangle text-white"})," Vercel Docs"]}),B.jsxs("a",{href:"https://turbo.build/repo/docs",target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 hover:text-white transition-colors",children:[B.jsx("i",{className:"fas fa-cube text-red-500"})," Turborepo Docs"]})]})]})]})]})}const i0=[{label:"Install",cmd:"npm install",icon:"fa-download",color:"blueIndigo"},{label:"Build",cmd:"turbo build",icon:"fa-hammer",color:"emeraldTeal"},{label:"Lint",cmd:"turbo lint",icon:"fa-check-double",color:"yellowOrange"},{label:"Test",cmd:"turbo test",icon:"fa-vial",color:"pinkRose"},{label:"Clean",cmd:"turbo clean",icon:"fa-broom",color:"gray"},{label:"Summary",cmd:"turbo run build --dry-run",icon:"fa-list-alt"},{label:"Prune",cmd:"turbo prune",icon:"fa-scissors",color:"red"},{label:"Docker",cmd:"turbo prune --docker",icon:"fa-docker",color:"skyBlue"},{label:"Remote",cmd:"npx turbo link",icon:"fa-cloud",color:"cyanBlue"},{label:"Cache",cmd:"rm -rf node_modules/.cache/turbo .turbo",icon:"fa-trash-alt",color:"darkRed"}];function n0(W){const G=_e.useRef(null),$=Et.use.rootDir(),[D,V]=_e.useState(!1),[R,x]=_e.useState(!1);_e.useEffect(()=>()=>{G.current&&G.current.disconnect()},[]);const p=Xn.use.showModal(),c=Fe.use.workspace();function h(r){G.current&&(G.current.clear(),G.current.disconnect(),G.current.connect($,r),G.current.fit(),G.current.onClose(()=>{V(!1)}),G.current.onCrash(()=>{V(!1)}),V(!0))}function a(r){if(r==="turbo prune"||r==="turbo prune --docker"){p("selection","Select Workspace","Choose a workspace to prune / dockerize",null,o=>{if(o){const s=r.includes("--docker"),l=`turbo prune ${o.info.name}${s?" --docker":""}`;h(l)}},c);return}h(r)}function i(){G.current&&(G.current.disconnect(),V(!1))}return B.jsxs("div",{className:`h-[92%] w-full p-4 gap-4 ${W.isVisible?"flex":"hidden"}`,children:[B.jsxs("div",{className:"w-[500px] flex-none h-full flex flex-col align-center",children:[B.jsxs("button",{onClick:()=>x(!0),className:"mb-6 text-sm w-full text-blue-200 flex items-center justify-center gap-2 transition-all group",children:[B.jsx("div",{className:"w-8 h-8 rounded-lg bg-blue-500/20 flex items-center justify-center group-hover:scale-110 transition-transform",children:B.jsx("i",{className:"fas fa-book-reader text-blue-400 text-sm"})}),"CI/CD Tutorial with Vercel"]}),B.jsx("div",{className:"grid grid-cols-2 gap-3",children:i0.map(r=>B.jsx(Jv,{onClick:()=>a(r.cmd),name:r.label,description:r.cmd,color:r.color,icon:r.icon,disabled:D},r.label))})]}),B.jsx("div",{className:"relative flex-1 h-full min-h-0 min-w-0 flex flex-col p-[1px] rounded overflow-hidden shadow-[0_0_100px_-20px_rgba(168,85,247,0.3)]",children:B.jsxs("div",{className:"relative flex-1 h-full flex flex-col rounded-xl overflow-hidden",children:[B.jsxs("header",{className:"px-4 py-2 border-b border-white/10 flex justify-between items-center bg-black/20 flex-none backdrop-blur-sm",children:[B.jsxs("div",{className:"text-md font-bold text-white flex items-center gap-4",children:[B.jsx("div",{className:"w-8 h-8 rounded-lg bg-gradient-to-br from-red-500 to-orange-600 flex items-center justify-center shadow-lg shadow-orange-500/20",children:B.jsx("i",{className:"fas fa-rocket text-white text-sm"})}),B.jsxs("div",{className:"flex flex-col",children:[B.jsx("span",{className:"text-xl bg-clip-text text-transparent bg-gradient-to-r from-blue-400 to-purple-400 font-bold",children:"Non Interactive Terminal"}),B.jsxs("span",{className:"text-gray-400 font-normal text-sm truncate w-full text-xs",children:["Execute",B.jsx("a",{href:"https://turborepo.org/",target:"_blank",rel:"noopener noreferrer",className:"p-1 text-blue-500 hover:underline",children:"Turborepo.js"}),"commands"]})]})]}),B.jsxs("button",{onClick:i,className:`text-gray-400 transition-colors flex items-center gap-2 ${D?"text-red-500":"text-gray-400"}`,children:[B.jsx("li",{className:"fas fa-stop text-lg"}),"STOP"]})]}),B.jsx("div",{className:"w-full flex-1 min-h-0 p-1",children:B.jsx(co,{ref:G,isInteractive:!1,className:"h-full w-full",socketUrl:Ke.serverPath,onExit:()=>{V(!1)},onCrash:()=>{V(!1)}})})]})}),R&&B.jsx(t0,{onClose:()=>x(!1)})]})}const r0=qn()((W,G)=>({noData:!0,crudData:[],currentCategoryIndex:-1,currentCrudIndex:-1,useDevURL:!0,devURL:"",prodURL:"",params:"",method:"GET",requestStartTime:0,isFetching:!1,executionTime:0,header:`{
101
+ `,style:{lineHeight:1},children:W.description})]})]})]},W.name)}function t0({onClose:W}){return B.jsxs(er,{width:"900px",children:[B.jsx(Jn,{title:"CI/CD Tutorial with Vercel",description:"Mastering Continuous Integration & Deployment",icon:"fas fa-infinity",close:W}),B.jsxs("div",{className:"flex flex-col h-[70vh] overflow-hidden text-sm",children:[B.jsxs("div",{className:"flex-1 overflow-y-auto p-8 space-y-12 text-gray-300 custom-scrollbar",children:[B.jsxs("section",{id:"intro",className:"space-y-4",children:[B.jsxs("div",{className:"flex items-center gap-3 mb-6",children:[B.jsx("div",{className:"w-12 h-12 rounded-xl bg-gradient-to-br from-blue-500 to-indigo-600 flex items-center justify-center shadow-lg shadow-blue-500/20",children:B.jsx("i",{className:"fas fa-infinity text-2xl text-white"})}),B.jsxs("div",{children:[B.jsx("h2",{className:"text-2xl font-bold text-white",children:"What is CI/CD?"}),B.jsx("p",{className:"text-blue-400 text-sm",children:"Continuous Integration & Continuous Delivery"})]})]}),B.jsx("div",{className:"bg-white/5 p-6 rounded-xl border border-white/10",children:B.jsxs("p",{className:"leading-relaxed",children:[B.jsx("strong",{className:"text-white",children:"CI (Continuous Integration)"})," is the practice of automating the integration of code changes from multiple contributors into a single software project.",B.jsx("br",{}),B.jsx("br",{}),B.jsx("strong",{className:"text-white",children:"CD (Continuous Delivery/Deployment)"})," ensures that your code is always in a deployable state and automatically releases it to production when ready."]})})]}),B.jsxs("section",{id:"why",className:"space-y-6",children:[B.jsxs("h2",{className:"text-xl font-bold text-white flex items-center gap-3",children:[B.jsx("i",{className:"fas fa-lightbulb text-yellow-500"}),"Why use CI/CD?"]}),B.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[{title:"Speed",desc:"Ship code faster with automated testing and building.",icon:"fa-rocket",color:"text-green-400"},{title:"Reliability",desc:"Catch bugs early before they reach production.",icon:"fa-shield-alt",color:"text-blue-400"},{title:"Efficiency",desc:"Stop wasting time on manual deployments.",icon:"fa-clock",color:"text-orange-400"},{title:"Consistency",desc:"Ensure every environment matches production.",icon:"fa-sync",color:"text-purple-400"}].map(G=>B.jsxs("div",{className:"p-4 rounded-xl bg-white/5 border border-white/10 hover:border-white/20 transition-colors",children:[B.jsx("i",{className:`fas ${G.icon} ${G.color} text-xl mb-3`}),B.jsx("h3",{className:"text-white font-bold mb-1",children:G.title}),B.jsx("p",{className:"text-sm text-gray-400",children:G.desc})]},G.title))})]}),B.jsxs("section",{id:"turbo-vercel",className:"space-y-6",children:[B.jsx("div",{className:"flex items-center justify-between border-b border-white/10 pb-4",children:B.jsxs("h2",{className:"text-xl font-bold text-white flex items-center gap-3",children:[B.jsx("i",{className:"fas fa-layer-group text-pink-500"}),"Turborepo + Vercel"]})}),B.jsxs("div",{className:"flex items-center gap-8 justify-center py-8",children:[B.jsxs("div",{className:"text-center",children:[B.jsx("div",{className:"w-16 h-16 mx-auto rounded-full bg-[#1e1e1e] flex items-center justify-center border border-white/20 mb-3",children:B.jsx("i",{className:"fas fa-cube text-3xl text-transparent bg-clip-text bg-gradient-to-r from-red-500 to-orange-500"})}),B.jsx("span",{className:"font-bold text-white",children:"Turborepo"})]}),B.jsxs("div",{className:"flex flex-col items-center gap-1",children:[B.jsx("span",{className:"text-xs text-green-400 font-bold",children:"CACHE HIT!"}),B.jsx("div",{className:"h-[2px] w-24 bg-gradient-to-r from-red-500 to-white"}),B.jsx("i",{className:"fas fa-arrow-right text-white"})]}),B.jsxs("div",{className:"text-center",children:[B.jsx("div",{className:"w-16 h-16 mx-auto rounded-full bg-black flex items-center justify-center border border-white/20 mb-3",children:B.jsx("i",{className:"fas fa-triangle text-3xl text-white"})}),B.jsx("span",{className:"font-bold text-white",children:"Vercel"})]})]}),B.jsxs("p",{className:"bg-blue-500/10 border-l-4 border-blue-500 p-4 rounded text-sm",children:["Combining ",B.jsx("strong",{children:"Turborepo's"})," intelligent caching with ",B.jsx("strong",{children:"Vercel's"})," global edge network gives you the fastest build times and deployments possible. Vercel automatically understands your Turborepo structure."]})]}),B.jsxs("section",{id:"guide",className:"space-y-8",children:[B.jsxs("h2",{className:"text-xl font-bold text-white flex items-center gap-3",children:[B.jsx("i",{className:"fas fa-tasks text-green-500"}),"Step-by-Step Setup"]}),B.jsx("div",{className:"space-y-6",children:[{step:1,title:"Login with Vercel",desc:"Ensure you have a Vercel account and are logged in via the CLI or Dashboard to authorize deployments.",icon:"fa-sign-in-alt"},{step:2,title:"Connect to GitHub",desc:"Link your Monorepo to a GitHub repository. Vercel uses this to trigger automatic deployments on push.",icon:"fa-code-branch"},{step:3,title:"Add Projects in Vercel",desc:"In the Vercel Dashboard, import your repository. Vercel detects Turborepo and asks which workspace (app) you want to deploy. Add each app (e.g., 'web', 'docs') as a separate Vercel project linked to the same repo.",icon:"fa-plus-circle"},{step:4,title:"Deployment",desc:"Push to 'main' to deploy. Vercel will build only what has changed.",icon:"fa-cloud-upload-alt"}].map(G=>B.jsxs("div",{className:"flex gap-4",children:[B.jsx("div",{className:"flex-none w-8 h-8 rounded-full bg-white/10 flex items-center justify-center font-bold text-white border border-white/20",children:G.step}),B.jsxs("div",{className:"space-y-2",children:[B.jsxs("h3",{className:"text-white font-bold flex items-center gap-2",children:[G.title,B.jsx("i",{className:`fas ${G.icon} text-gray-500 text-sm`})]}),B.jsx("p",{className:"text-sm text-gray-400",children:G.desc})]})]},G.step))}),B.jsxs("div",{className:"mt-8 p-5 bg-gradient-to-r from-purple-900/30 to-blue-900/30 rounded-xl border border-purple-500/30",children:[B.jsxs("h3",{className:"text-lg font-bold text-white mb-2 flex items-center gap-2",children:[B.jsx("i",{className:"fas fa-magic text-purple-400"}),'Pro Tip: The "Turbo Build" Button']}),B.jsxs("p",{className:"text-sm text-gray-300",children:["When you use the ",B.jsx("span",{className:"px-2 py-0.5 rounded bg-white/10 text-white font-mono text-xs",children:"turbo build"})," command or button in this dashboard, it can be configured to upload your ",B.jsx("strong",{children:"pre-compiled dist/build artifacts"})," directly to Vercel's cache."]}),B.jsxs("div",{className:"mt-3 flex items-start gap-3 text-xs text-purple-200 bg-purple-500/10 p-3 rounded-lg",children:[B.jsx("i",{className:"fas fa-info-circle mt-0.5"}),B.jsxs("span",{children:["This means Vercel ",B.jsx("strong",{children:"doesn't have to rebuild"})," everything from scratch. It pulls the artifacts you just built locally (or in CI), saving massive amounts of build minutes and time!"]})]})]})]})]}),B.jsxs("div",{className:"p-4 border-t border-white/10 bg-black/40 flex justify-between items-center text-xs text-gray-500",children:[B.jsx("span",{children:"Learn more at:"}),B.jsxs("div",{className:"flex gap-4",children:[B.jsxs("a",{href:"https://vercel.com/docs",target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 hover:text-white transition-colors",children:[B.jsx("i",{className:"fas fa-triangle text-white"})," Vercel Docs"]}),B.jsxs("a",{href:"https://turbo.build/repo/docs",target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 hover:text-white transition-colors",children:[B.jsx("i",{className:"fas fa-cube text-red-500"})," Turborepo Docs"]})]})]})]})]})}const i0=[{label:"Install",cmd:"npm install",icon:"fa-download",color:"blueIndigo"},{label:"Build",cmd:"turbo build",icon:"fa-hammer",color:"emeraldTeal"},{label:"Lint",cmd:"turbo lint",icon:"fa-check-double",color:"yellowOrange"},{label:"Test",cmd:"turbo test",icon:"fa-vial",color:"pinkRose"},{label:"Clean",cmd:"turbo clean",icon:"fa-broom",color:"gray"},{label:"Summary",cmd:"turbo run build --dry-run",icon:"fa-list-alt"},{label:"Prune",cmd:"turbo prune",icon:"fa-scissors",color:"red"},{label:"Docker",cmd:"turbo prune --docker",icon:"fa-docker",color:"skyBlue"},{label:"Remote",cmd:"npx turbo link",icon:"fa-cloud",color:"cyanBlue"},{label:"Cache",cmd:"rm -rf node_modules/.cache/turbo .turbo",icon:"fa-trash-alt",color:"darkRed"}];function n0(W){const G=_e.useRef(null),$=Et.use.rootDir(),[D,V]=_e.useState(!1),[R,x]=_e.useState(!1);_e.useEffect(()=>()=>{G.current&&G.current.disconnect()},[]);const p=Xn.use.showModal(),c=Fe.use.workspace();function h(r){G.current&&(G.current.clear(),G.current.disconnect(),G.current.onClose(()=>{V(!1)}),G.current.onCrash(()=>{V(!1)}),V(!0),G.current.connect($,r),G.current.fit())}function a(r){if(r==="turbo prune"||r==="turbo prune --docker"){p("selection","Select Workspace","Choose a workspace to prune / dockerize",null,o=>{if(o){const s=r.includes("--docker"),l=`turbo prune ${o.info.name}${s?" --docker":""}`;h(l)}},c);return}h(r)}function i(){G.current&&(G.current.disconnect(),V(!1))}return B.jsxs("div",{className:`h-[92%] w-full p-4 gap-4 ${W.isVisible?"flex":"hidden"}`,children:[B.jsxs("div",{className:"w-[500px] flex-none h-full flex flex-col align-center",children:[B.jsxs("button",{onClick:()=>x(!0),className:"mb-6 text-sm w-full text-blue-200 flex items-center justify-center gap-2 transition-all group",children:[B.jsx("div",{className:"w-8 h-8 rounded-lg bg-blue-500/20 flex items-center justify-center group-hover:scale-110 transition-transform",children:B.jsx("i",{className:"fas fa-book-reader text-blue-400 text-sm"})}),"CI/CD Tutorial with Vercel"]}),B.jsx("div",{className:"grid grid-cols-2 gap-3",children:i0.map(r=>B.jsx(Jv,{onClick:()=>a(r.cmd),name:r.label,description:r.cmd,color:r.color,icon:r.icon,disabled:D},r.label))})]}),B.jsx("div",{className:"relative flex-1 h-full min-h-0 min-w-0 flex flex-col p-[1px] rounded overflow-hidden shadow-[0_0_100px_-20px_rgba(168,85,247,0.3)]",children:B.jsxs("div",{className:"relative flex-1 h-full flex flex-col rounded-xl overflow-hidden",children:[B.jsxs("header",{className:"px-4 py-2 border-b border-white/10 flex justify-between items-center bg-black/20 flex-none backdrop-blur-sm",children:[B.jsxs("div",{className:"text-md font-bold text-white flex items-center gap-4",children:[B.jsx("div",{className:"w-8 h-8 rounded-lg bg-gradient-to-br from-red-500 to-orange-600 flex items-center justify-center shadow-lg shadow-orange-500/20",children:B.jsx("i",{className:"fas fa-rocket text-white text-sm"})}),B.jsxs("div",{className:"flex flex-col",children:[B.jsx("span",{className:"text-xl bg-clip-text text-transparent bg-gradient-to-r from-blue-400 to-purple-400 font-bold",children:"Non Interactive Terminal"}),B.jsxs("span",{className:"text-gray-400 font-normal text-sm truncate w-full text-xs",children:["Execute",B.jsx("a",{href:"https://turborepo.org/",target:"_blank",rel:"noopener noreferrer",className:"p-1 text-blue-500 hover:underline",children:"Turborepo.js"}),"commands"]})]})]}),B.jsxs("button",{onClick:i,className:`text-gray-400 transition-colors flex items-center gap-2 ${D?"text-red-500":"text-gray-400"}`,children:[B.jsx("li",{className:"fas fa-stop text-lg"}),"STOP"]})]}),B.jsx("div",{className:"w-full flex-1 min-h-0 p-1",children:B.jsx(co,{ref:G,isInteractive:!1,className:"h-full w-full",socketUrl:Ke.serverPath,onExit:()=>{V(!1)},onCrash:()=>{V(!1)}})})]})}),R&&B.jsx(t0,{onClose:()=>x(!1)})]})}const r0=qn()((W,G)=>({noData:!0,crudData:[],currentCategoryIndex:-1,currentCrudIndex:-1,useDevURL:!0,devURL:"",prodURL:"",params:"",method:"GET",requestStartTime:0,isFetching:!1,executionTime:0,header:`{
102
102
  "Content-Type": "application/json",
103
103
  "Accept": "application/json",
104
104
  "Authorization": "Bearer token",
package/public/index.html CHANGED
@@ -21,7 +21,7 @@
21
21
  <meta property="twitter:image" content="/og-image.png" />
22
22
 
23
23
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
24
- <script type="module" crossorigin src="/assets/index-E4KP24S5.js"></script>
24
+ <script type="module" crossorigin src="/assets/index-BLMIZzXp.js"></script>
25
25
  <link rel="stylesheet" crossorigin href="/assets/index-BQZjOvwC.css">
26
26
  </head>
27
27
  <body class="bg-gray-900 text-gray-100 font-sans overflow-hidden">