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,
|
|
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
|
-
|
|
57743
|
-
|
|
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
|
-
|
|
57970
|
-
|
|
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
|
-
|
|
58129
|
-
|
|
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.
|
|
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
|
-
|
|
58289
|
-
|
|
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.
|
|
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
|
-
|
|
58453
|
-
|
|
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
|
|
60377
|
-
notes: "Requires
|
|
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: "
|
|
60381
|
-
|
|
60382
|
-
|
|
60604
|
+
action: "file",
|
|
60605
|
+
file: "docker-compose.yml",
|
|
60606
|
+
filecontent: dockerCompose
|
|
60383
60607
|
},
|
|
60384
60608
|
{
|
|
60385
|
-
action: "
|
|
60386
|
-
|
|
60387
|
-
|
|
60609
|
+
action: "file",
|
|
60610
|
+
file: ".gitignore",
|
|
60611
|
+
filecontent: gitignoreContent
|
|
60388
60612
|
},
|
|
60389
60613
|
{
|
|
60390
|
-
action: "
|
|
60391
|
-
|
|
60392
|
-
|
|
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.
|
|
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",
|
|
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 (
|
|
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", "
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
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
|
|
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
|
-
|
|
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(
|
|
61399
|
+
console.log(\`Stopping \${runtime.containerIds.length} containers...\`);
|
|
61153
61400
|
runtime.containerIds.forEach(id => {
|
|
61154
|
-
exec(
|
|
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:
|
|
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:
|
|
61497
|
+
filecontent: serverJs3
|
|
61242
61498
|
},
|
|
61243
61499
|
{
|
|
61244
61500
|
action: "file",
|
package/package.json
CHANGED
|
@@ -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-
|
|
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">
|