pinme 2.0.0 → 2.0.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +232 -11
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1523,7 +1523,7 @@ var import_chalk23 = __toESM(require("chalk"));
1523
1523
  var import_figlet5 = __toESM(require("figlet"));
1524
1524
 
1525
1525
  // package.json
1526
- var version = "2.0.0";
1526
+ var version = "2.0.1-beta.1";
1527
1527
 
1528
1528
  // bin/upload.ts
1529
1529
  var import_path7 = __toESM(require("path"));
@@ -7300,6 +7300,7 @@ var API_BASE = "https://pinme.dev/api/v4";
7300
7300
  var TEMPLATE_REPO = "glitternetwork/pinme-worker-template";
7301
7301
  var TEMPLATE_ZIP_URL = `https://github.com/${TEMPLATE_REPO}/archive/refs/heads/main.zip`;
7302
7302
  async function createCmd(options) {
7303
+ var _a, _b;
7303
7304
  try {
7304
7305
  const headers = getAuthHeaders();
7305
7306
  if (!headers["authentication-tokens"] || !headers["token-address"]) {
@@ -7370,7 +7371,6 @@ Directory "${projectName}" already exists.`));
7370
7371
  console.log(import_chalk17.default.gray(` API Response: ${JSON.stringify(workerData)}`));
7371
7372
  console.log(import_chalk17.default.green(` API Domain: ${workerData.api_domain}`));
7372
7373
  console.log(import_chalk17.default.green(` Project Name: ${workerData.project_name}`));
7373
- console.log(import_chalk17.default.green(` D1 UUID: ${workerData.uuid}`));
7374
7374
  } catch (error) {
7375
7375
  throw createApiError("project creation", error, [
7376
7376
  `Project name: ${normalizedProjectName}`,
@@ -7410,6 +7410,24 @@ Directory "${projectName}" already exists.`));
7410
7410
  import_fs_extra6.default.removeSync(subDir);
7411
7411
  }
7412
7412
  import_fs_extra6.default.removeSync(zipPath);
7413
+ const nodeModulesPath = import_path11.default.join(targetDir, "node_modules");
7414
+ const packageLockPath = import_path11.default.join(targetDir, "package-lock.json");
7415
+ if (import_fs_extra6.default.existsSync(nodeModulesPath)) {
7416
+ console.log(import_chalk17.default.gray(" Removing existing node_modules..."));
7417
+ import_fs_extra6.default.removeSync(nodeModulesPath);
7418
+ }
7419
+ if (import_fs_extra6.default.existsSync(packageLockPath)) {
7420
+ console.log(import_chalk17.default.gray(" Removing existing package-lock.json..."));
7421
+ import_fs_extra6.default.removeSync(packageLockPath);
7422
+ }
7423
+ const frontendNodeModules = import_path11.default.join(targetDir, "frontend", "node_modules");
7424
+ const backendNodeModules = import_path11.default.join(targetDir, "backend", "node_modules");
7425
+ const frontendPackageLock = import_path11.default.join(targetDir, "frontend", "package-lock.json");
7426
+ const backendPackageLock = import_path11.default.join(targetDir, "backend", "package-lock.json");
7427
+ if (import_fs_extra6.default.existsSync(frontendNodeModules)) import_fs_extra6.default.removeSync(frontendNodeModules);
7428
+ if (import_fs_extra6.default.existsSync(backendNodeModules)) import_fs_extra6.default.removeSync(backendNodeModules);
7429
+ if (import_fs_extra6.default.existsSync(frontendPackageLock)) import_fs_extra6.default.removeSync(frontendPackageLock);
7430
+ if (import_fs_extra6.default.existsSync(backendPackageLock)) import_fs_extra6.default.removeSync(backendPackageLock);
7413
7431
  console.log(import_chalk17.default.green(` Template downloaded to: ${targetDir}`));
7414
7432
  } catch (error) {
7415
7433
  throw createCommandError("template extraction", `unzip -o "${zipPath}" -d "${PROJECT_DIR}"`, error, [
@@ -7458,7 +7476,7 @@ Directory "${projectName}" already exists.`));
7458
7476
  import_fs_extra6.default.writeFileSync(envPath, envContent);
7459
7477
  console.log(import_chalk17.default.green(` Created frontend/.env file`));
7460
7478
  }
7461
- console.log(import_chalk17.default.blue("\n4. Building frontend..."));
7479
+ console.log(import_chalk17.default.blue("\n4. Installing dependencies..."));
7462
7480
  try {
7463
7481
  (0, import_child_process2.execSync)("npm install", {
7464
7482
  cwd: targetDir,
@@ -7466,11 +7484,135 @@ Directory "${projectName}" already exists.`));
7466
7484
  });
7467
7485
  console.log(import_chalk17.default.green(" Project dependencies installed"));
7468
7486
  } catch (error) {
7487
+ const errorMsg = error.message || "";
7488
+ if (errorMsg.includes("EACCES") || errorMsg.includes("EPERM") || errorMsg.includes("permission denied")) {
7489
+ throw createCommandError("project dependency install", "npm install", error, [
7490
+ "Permission error detected. Here are some solutions:",
7491
+ "",
7492
+ "Option 1: Fix npm permissions (Recommended)",
7493
+ " mkdir -p ~/.npm-global",
7494
+ " npm config set prefix ~/.npm-global",
7495
+ " Then add ~/.npm-global/bin to your PATH in ~/.bashrc or ~/.zshrc",
7496
+ "",
7497
+ "Option 2: Use npx to avoid global installs",
7498
+ " npx npm install",
7499
+ "",
7500
+ "Option 3: Check if you have write permissions",
7501
+ " ls -la " + targetDir,
7502
+ "",
7503
+ "For more help: https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally"
7504
+ ]);
7505
+ }
7506
+ if (errorMsg.includes("ENOTFOUND") || errorMsg.includes("ETIMEDOUT") || errorMsg.includes("network")) {
7507
+ throw createCommandError("project dependency install", "npm install", error, [
7508
+ "Network error detected. Please check:",
7509
+ " 1. Internet connection is available",
7510
+ " 2. npm registry is accessible (https://registry.npmjs.org)",
7511
+ " 3. Try using a mirror: npm config set registry https://registry.npmmirror.com"
7512
+ ]);
7513
+ }
7469
7514
  throw createCommandError("project dependency install", "npm install", error, [
7515
+ "Dependency installation failed.",
7470
7516
  "Check network connectivity and npm registry availability.",
7471
- "Inspect the generated workspace `package.json` files for dependency conflicts."
7517
+ "Inspect the generated workspace `package.json` files for dependency conflicts.",
7518
+ "",
7519
+ "If this is a permission issue, try:",
7520
+ " sudo chown -R $(whoami) ~/.npm",
7521
+ " sudo chown -R $(whoami) " + targetDir + "/node_modules"
7522
+ ]);
7523
+ }
7524
+ console.log(import_chalk17.default.blue("\n5. Building backend worker..."));
7525
+ try {
7526
+ (0, import_child_process2.execSync)("npm run build:worker", {
7527
+ cwd: targetDir,
7528
+ stdio: "inherit"
7529
+ });
7530
+ console.log(import_chalk17.default.green(" Worker built"));
7531
+ } catch (error) {
7532
+ throw createCommandError("worker build", "npm run build:worker", error, [
7533
+ "Fix the build error shown above, then rerun `pinme create`."
7534
+ ]);
7535
+ }
7536
+ const distWorkerDir = import_path11.default.join(targetDir, "dist-worker");
7537
+ const workerJsPath = import_path11.default.join(distWorkerDir, "worker.js");
7538
+ if (!import_fs_extra6.default.existsSync(distWorkerDir) || !import_fs_extra6.default.existsSync(workerJsPath)) {
7539
+ throw createConfigError("Built worker output not found: `dist-worker/worker.js`.", [
7540
+ "Make sure `npm run build:worker` completed successfully."
7541
+ ]);
7542
+ }
7543
+ const modulePaths = [];
7544
+ const files = import_fs_extra6.default.readdirSync(distWorkerDir);
7545
+ for (const file of files) {
7546
+ if (file.endsWith(".js") && file !== "worker.js") {
7547
+ modulePaths.push(import_path11.default.join(distWorkerDir, file));
7548
+ }
7549
+ }
7550
+ const sqlDir = import_path11.default.join(targetDir, "db");
7551
+ const sqlFiles = [];
7552
+ if (import_fs_extra6.default.existsSync(sqlDir)) {
7553
+ const sqlFileNames = import_fs_extra6.default.readdirSync(sqlDir).filter((f) => f.endsWith(".sql")).sort();
7554
+ for (const filename of sqlFileNames) {
7555
+ sqlFiles.push(import_path11.default.join(sqlDir, filename));
7556
+ console.log(import_chalk17.default.gray(` Including SQL: ${filename}`));
7557
+ }
7558
+ }
7559
+ console.log(import_chalk17.default.blue("\n6. Deploying backend worker..."));
7560
+ const saveApiUrl = `${API_BASE}/save_worker?project_name=${encodeURIComponent(workerData.project_name)}`;
7561
+ console.log(import_chalk17.default.gray(` API URL: ${saveApiUrl}`));
7562
+ try {
7563
+ const FormData4 = (await import("formdata-node")).FormData;
7564
+ const Blob2 = (await import("formdata-node")).Blob;
7565
+ const formData = new FormData4();
7566
+ const metadataContent = typeof workerData.metadata === "string" ? workerData.metadata : JSON.stringify(workerData.metadata, null, 2);
7567
+ formData.append("metadata", new Blob2([metadataContent], {
7568
+ type: "application/json"
7569
+ }), "metadata.json");
7570
+ const workerCode = import_fs_extra6.default.readFileSync(workerJsPath, "utf-8");
7571
+ formData.append("worker.js", new Blob2([workerCode], {
7572
+ type: "application/javascript+module"
7573
+ }), "worker.js");
7574
+ for (const modulePath of modulePaths) {
7575
+ const filename = import_path11.default.basename(modulePath);
7576
+ const content = import_fs_extra6.default.readFileSync(modulePath, "utf-8");
7577
+ formData.append(filename, new Blob2([content], {
7578
+ type: "application/javascript+module"
7579
+ }), filename);
7580
+ }
7581
+ for (const sqlFile of sqlFiles) {
7582
+ const filename = import_path11.default.basename(sqlFile);
7583
+ const content = import_fs_extra6.default.readFileSync(sqlFile, "utf-8");
7584
+ formData.append("sql_file", new Blob2([content], {
7585
+ type: "application/sql"
7586
+ }), filename);
7587
+ }
7588
+ const response = await axios_default.put(saveApiUrl, formData, {
7589
+ headers: { ...headers },
7590
+ timeout: 12e4
7591
+ });
7592
+ if (response.data) {
7593
+ console.log(import_chalk17.default.green(" Worker deployed"));
7594
+ if ((_b = (_a = response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.sql_results) {
7595
+ for (const result of response.data.data.sql_results) {
7596
+ console.log(import_chalk17.default.gray(` SQL ${result.filename}: ${result.status}`));
7597
+ }
7598
+ }
7599
+ } else {
7600
+ throw createApiError("worker save", { response: { data: response.data } }, [
7601
+ `Project: ${workerData.project_name}`,
7602
+ `Endpoint: ${saveApiUrl}`
7603
+ ], [
7604
+ "Verify the project exists and your account has permission to update it."
7605
+ ]);
7606
+ }
7607
+ } catch (error) {
7608
+ throw createApiError("worker save", error, [
7609
+ `Project: ${workerData.project_name}`,
7610
+ `Endpoint: ${saveApiUrl}`
7611
+ ], [
7612
+ "Check whether backend metadata, SQL files, or worker bundle contains invalid content."
7472
7613
  ]);
7473
7614
  }
7615
+ console.log(import_chalk17.default.blue("\n7. Building frontend..."));
7474
7616
  const frontendDir = import_path11.default.join(targetDir, "frontend");
7475
7617
  if (import_fs_extra6.default.existsSync(frontendDir)) {
7476
7618
  try {
@@ -7485,16 +7627,40 @@ Directory "${projectName}" already exists.`));
7485
7627
  ]);
7486
7628
  }
7487
7629
  console.log(import_chalk17.default.blue(" Uploading to IPFS..."));
7630
+ let frontendUrl = "";
7488
7631
  try {
7489
- (0, import_child_process2.execSync)("pinme upload ./dist", {
7632
+ const uploadOutput = (0, import_child_process2.execSync)("pinme upload ./dist", {
7490
7633
  cwd: frontendDir,
7491
- stdio: "inherit",
7634
+ encoding: "utf-8",
7492
7635
  env: {
7493
7636
  ...process.env,
7494
7637
  PINME_PROJECT_NAME: workerData.project_name
7495
7638
  }
7496
7639
  });
7497
- console.log(import_chalk17.default.green(" Frontend uploaded to IPFS"));
7640
+ console.log(uploadOutput);
7641
+ const urlMatch = uploadOutput.match(/https:\/\/[\w-]+\.pinme\.dev/);
7642
+ if (urlMatch) {
7643
+ frontendUrl = urlMatch[0];
7644
+ console.log(import_chalk17.default.green(` Frontend uploaded to IPFS: ${frontendUrl}`));
7645
+ const configPath2 = import_path11.default.join(targetDir, "pinme.toml");
7646
+ let config2 = import_fs_extra6.default.readFileSync(configPath2, "utf-8");
7647
+ if (config2.includes("frontend_url")) {
7648
+ config2 = config2.replace(
7649
+ /frontend_url\s*=\s*"[^"]*"/,
7650
+ `frontend_url = "${frontendUrl}"`
7651
+ );
7652
+ } else {
7653
+ config2 = config2.replace(
7654
+ /(project_name\s*=\s*"[^"]*"\n)/,
7655
+ `$1frontend_url = "${frontendUrl}"
7656
+ `
7657
+ );
7658
+ }
7659
+ import_fs_extra6.default.writeFileSync(configPath2, config2);
7660
+ console.log(import_chalk17.default.green(" Updated pinme.toml with frontend URL"));
7661
+ } else {
7662
+ console.log(import_chalk17.default.green(" Frontend uploaded to IPFS"));
7663
+ }
7498
7664
  } catch (error) {
7499
7665
  console.log(import_chalk17.default.yellow(" Warning: IPFS upload failed, you can upload manually later"));
7500
7666
  }
@@ -7567,9 +7733,41 @@ function installDependencies() {
7567
7733
  });
7568
7734
  console.log(import_chalk18.default.green("Project dependencies installed"));
7569
7735
  } catch (error) {
7736
+ const errorMsg = error.message || "";
7737
+ if (errorMsg.includes("EACCES") || errorMsg.includes("EPERM") || errorMsg.includes("permission denied")) {
7738
+ throw createCommandError("project dependency install", "npm install", error, [
7739
+ "Permission error detected. Here are some solutions:",
7740
+ "",
7741
+ "Option 1: Fix npm permissions (Recommended)",
7742
+ " mkdir -p ~/.npm-global",
7743
+ " npm config set prefix ~/.npm-global",
7744
+ " Then add ~/.npm-global/bin to your PATH in ~/.bashrc or ~/.zshrc",
7745
+ "",
7746
+ "Option 2: Use npx to avoid global installs",
7747
+ " npx npm install",
7748
+ "",
7749
+ "Option 3: Check if you have write permissions",
7750
+ " ls -la " + PROJECT_DIR2,
7751
+ "",
7752
+ "For more help: https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally"
7753
+ ]);
7754
+ }
7755
+ if (errorMsg.includes("ENOTFOUND") || errorMsg.includes("ETIMEDOUT") || errorMsg.includes("network")) {
7756
+ throw createCommandError("project dependency install", "npm install", error, [
7757
+ "Network error detected. Please check:",
7758
+ " 1. Internet connection is available",
7759
+ " 2. npm registry is accessible (https://registry.npmjs.org)",
7760
+ " 3. Try using a mirror: npm config set registry https://registry.npmmirror.com"
7761
+ ]);
7762
+ }
7570
7763
  throw createCommandError("project dependency install", "npm install", error, [
7764
+ "Dependency installation failed.",
7571
7765
  "Check network connectivity and npm registry availability.",
7572
- "If `package-lock.json` is stale or conflicted, resolve that before retrying."
7766
+ "If `package-lock.json` is stale or conflicted, resolve that before retrying.",
7767
+ "",
7768
+ "If this is a permission issue, try:",
7769
+ " sudo chown -R $(whoami) ~/.npm",
7770
+ " sudo chown -R $(whoami) " + PROJECT_DIR2 + "/node_modules"
7573
7771
  ]);
7574
7772
  }
7575
7773
  }
@@ -7686,15 +7884,38 @@ function buildFrontend() {
7686
7884
  function deployFrontend(projectName) {
7687
7885
  console.log(import_chalk18.default.blue("Deploying frontend to IPFS..."));
7688
7886
  try {
7689
- (0, import_child_process3.execSync)("pinme upload ./frontend/dist", {
7887
+ const uploadOutput = (0, import_child_process3.execSync)("pinme upload ./frontend/dist", {
7690
7888
  cwd: PROJECT_DIR2,
7691
- stdio: "inherit",
7889
+ encoding: "utf-8",
7692
7890
  env: {
7693
7891
  ...process.env,
7694
7892
  PINME_PROJECT_NAME: projectName
7695
7893
  }
7696
7894
  });
7697
- console.log(import_chalk18.default.green("Frontend deployed to IPFS"));
7895
+ console.log(uploadOutput);
7896
+ const urlMatch = uploadOutput.match(/https:\/\/[\w-]+\.pinme\.dev/);
7897
+ if (urlMatch) {
7898
+ const frontendUrl = urlMatch[0];
7899
+ console.log(import_chalk18.default.green(`Frontend deployed to IPFS: ${frontendUrl}`));
7900
+ const configPath = import_path12.default.join(PROJECT_DIR2, "pinme.toml");
7901
+ let config = import_fs_extra7.default.readFileSync(configPath, "utf-8");
7902
+ if (config.includes("frontend_url")) {
7903
+ config = config.replace(
7904
+ /frontend_url\s*=\s*"[^"]*"/,
7905
+ `frontend_url = "${frontendUrl}"`
7906
+ );
7907
+ } else {
7908
+ config = config.replace(
7909
+ /(project_name\s*=\s*"[^"]*"\n)/,
7910
+ `$1frontend_url = "${frontendUrl}"
7911
+ `
7912
+ );
7913
+ }
7914
+ import_fs_extra7.default.writeFileSync(configPath, config);
7915
+ console.log(import_chalk18.default.green("Updated pinme.toml with frontend URL"));
7916
+ } else {
7917
+ console.log(import_chalk18.default.green("Frontend deployed to IPFS"));
7918
+ }
7698
7919
  } catch (error) {
7699
7920
  throw createCommandError("frontend deploy", "pinme upload ./frontend/dist", error, [
7700
7921
  "Make sure `frontend/dist` exists and `pinme upload` works in this environment."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pinme",
3
- "version": "2.0.0",
3
+ "version": "2.0.1-beta.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },