pinme 2.0.5-beta.1 → 2.0.6-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 +564 -256
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -5978,7 +5978,7 @@ var import_chalk26 = __toESM(require("chalk"));
5978
5978
  var import_figlet5 = __toESM(require("figlet"));
5979
5979
 
5980
5980
  // package.json
5981
- var version = "2.0.5-beta.1";
5981
+ var version = "2.0.6-beta.1";
5982
5982
 
5983
5983
  // bin/upload.ts
5984
5984
  var import_path7 = __toESM(require("path"));
@@ -6025,7 +6025,7 @@ function getUid() {
6025
6025
  // bin/utils/uploadToIpfsSplit.ts
6026
6026
  init_axios2();
6027
6027
  var import_fs_extra4 = __toESM(require("fs-extra"));
6028
- var import_path5 = __toESM(require("path"));
6028
+ var import_path6 = __toESM(require("path"));
6029
6029
  var import_form_data2 = __toESM(require("form-data"));
6030
6030
  var import_ora = __toESM(require("ora"));
6031
6031
  var crypto2 = __toESM(require("crypto"));
@@ -6077,13 +6077,326 @@ init_cliError();
6077
6077
 
6078
6078
  // bin/utils/history.ts
6079
6079
  var import_fs_extra3 = __toESM(require("fs-extra"));
6080
- var import_path4 = __toESM(require("path"));
6081
- var import_os3 = __toESM(require("os"));
6080
+ var import_path5 = __toESM(require("path"));
6081
+ var import_os4 = __toESM(require("os"));
6082
6082
  var import_dayjs = __toESM(require("dayjs"));
6083
6083
  var import_chalk5 = __toESM(require("chalk"));
6084
6084
  init_pinmeApi();
6085
- var HISTORY_DIR = import_path4.default.join(import_os3.default.homedir(), ".pinme");
6086
- var HISTORY_FILE = import_path4.default.join(HISTORY_DIR, "upload-history.json");
6085
+
6086
+ // bin/utils/tracker.ts
6087
+ var import_os3 = __toESM(require("os"));
6088
+ var import_fs2 = __toESM(require("fs"));
6089
+ var import_path4 = __toESM(require("path"));
6090
+ var import_child_process2 = require("child_process");
6091
+ var REQUEST_TIMEOUT_MS = 1500;
6092
+ var DEFAULT_GATEWAY = "https://pinme.dev";
6093
+ var DEFAULT_PRODUCT = "pinme-cli";
6094
+ var ACTION_OVERRIDES = {
6095
+ cli_login_success: "success",
6096
+ cli_login_failed: "fail",
6097
+ appkey_set_success: "success",
6098
+ appkey_set_failed: "fail",
6099
+ appkey_shown_success: "view",
6100
+ appkey_shown_failed: "fail",
6101
+ my_domains_success: "view",
6102
+ my_domains_failed: "fail",
6103
+ wallet_balance_success: "view",
6104
+ wallet_balance_failed: "fail",
6105
+ upload_history_viewed: "view",
6106
+ upload_history_cleared: "click",
6107
+ upload_history_failed: "fail"
6108
+ };
6109
+ var TRACK_CHILD_SCRIPT = `
6110
+ const rawUrl = process.argv[1];
6111
+ if (!rawUrl) process.exit(0);
6112
+ try {
6113
+ const transport = rawUrl.startsWith('https:') ? require('https') : require('http');
6114
+ const req = transport.get(rawUrl, {
6115
+ headers: {
6116
+ 'User-Agent': 'Pinme-CLI-Tracker'
6117
+ }
6118
+ }, (res) => {
6119
+ res.resume();
6120
+ res.on('end', () => process.exit(0));
6121
+ });
6122
+ req.setTimeout(${REQUEST_TIMEOUT_MS}, () => req.destroy());
6123
+ req.on('error', () => process.exit(0));
6124
+ req.on('close', () => process.exit(0));
6125
+ } catch (_) {
6126
+ process.exit(0);
6127
+ }
6128
+ `;
6129
+ function trimTrailingSlash2(value) {
6130
+ return value.replace(/\/+$/, "");
6131
+ }
6132
+ function shouldDisableTracking() {
6133
+ return process.env.PINME_TRACKING_DISABLED === "1" || process.env.DO_NOT_TRACK === "1";
6134
+ }
6135
+ function sanitizeTrackValue(value) {
6136
+ if (value === void 0 || value === null) {
6137
+ return void 0;
6138
+ }
6139
+ return String(value).trim().slice(0, 200);
6140
+ }
6141
+ function getTrackErrorReason(error) {
6142
+ var _a2, _b, _c, _d, _e;
6143
+ const candidate = ((_b = (_a2 = error == null ? void 0 : error.response) == null ? void 0 : _a2.data) == null ? void 0 : _b.msg) || ((_d = (_c = error == null ? void 0 : error.response) == null ? void 0 : _c.data) == null ? void 0 : _d.message) || (error == null ? void 0 : error.message) || ((_e = error == null ? void 0 : error.toString) == null ? void 0 : _e.call(error)) || "unknown_error";
6144
+ return sanitizeTrackValue(candidate) || "unknown_error";
6145
+ }
6146
+ function resolveTrackAction(event, data = {}) {
6147
+ const explicitAction = data.a;
6148
+ if (typeof explicitAction === "string" && explicitAction.trim()) {
6149
+ return explicitAction.trim();
6150
+ }
6151
+ if (ACTION_OVERRIDES[event]) {
6152
+ return ACTION_OVERRIDES[event];
6153
+ }
6154
+ if (event.endsWith("_success")) {
6155
+ return "success";
6156
+ }
6157
+ if (event.endsWith("_failed") || event.endsWith("_fail")) {
6158
+ return "fail";
6159
+ }
6160
+ if (event.includes("click") || event.includes("copied")) {
6161
+ return "click";
6162
+ }
6163
+ if (event.includes("exposure")) {
6164
+ return "exposure";
6165
+ }
6166
+ if (event.includes("view")) {
6167
+ return "view";
6168
+ }
6169
+ if (event.endsWith("_started") || event.endsWith("_submit")) {
6170
+ return "submit";
6171
+ }
6172
+ return "view";
6173
+ }
6174
+ var cachedProjectContext = null;
6175
+ var cachedProjectContextCwd = null;
6176
+ function resolveProjectContext() {
6177
+ const cwd = process.cwd();
6178
+ if (cachedProjectContext && cachedProjectContextCwd === cwd) {
6179
+ return cachedProjectContext;
6180
+ }
6181
+ const context = {};
6182
+ const configPath = import_path4.default.join(cwd, "pinme.toml");
6183
+ if (import_fs2.default.existsSync(configPath)) {
6184
+ try {
6185
+ const configContent = import_fs2.default.readFileSync(configPath, "utf8");
6186
+ const projectNameMatch = configContent.match(
6187
+ /project_name\s*=\s*"([^"]+)"/
6188
+ );
6189
+ context.projectName = sanitizeTrackValue(projectNameMatch == null ? void 0 : projectNameMatch[1]) || sanitizeTrackValue(process.env.PINME_PROJECT_NAME);
6190
+ context.projectDir = sanitizeTrackValue(import_path4.default.basename(cwd));
6191
+ } catch (_) {
6192
+ context.projectName = sanitizeTrackValue(process.env.PINME_PROJECT_NAME);
6193
+ }
6194
+ } else {
6195
+ context.projectName = sanitizeTrackValue(process.env.PINME_PROJECT_NAME);
6196
+ }
6197
+ cachedProjectContext = context;
6198
+ cachedProjectContextCwd = cwd;
6199
+ return context;
6200
+ }
6201
+ function getPathKind(pathValue) {
6202
+ try {
6203
+ const stat = import_fs2.default.statSync(pathValue);
6204
+ if (stat.isDirectory()) {
6205
+ return "directory";
6206
+ }
6207
+ if (stat.isFile()) {
6208
+ return "file";
6209
+ }
6210
+ } catch (_) {
6211
+ return "unknown";
6212
+ }
6213
+ return "unknown";
6214
+ }
6215
+ var Tracker = class _Tracker {
6216
+ static instance;
6217
+ gateway;
6218
+ product;
6219
+ source;
6220
+ disabled;
6221
+ constructor(gateway, product) {
6222
+ this.gateway = trimTrailingSlash2(
6223
+ gateway || process.env.PINME_TRACKER_GATEWAY || DEFAULT_GATEWAY
6224
+ );
6225
+ this.product = product || DEFAULT_PRODUCT;
6226
+ this.source = sanitizeTrackValue(process.env.PINME_TRACK_SOURCE);
6227
+ this.disabled = shouldDisableTracking();
6228
+ }
6229
+ static getInstance(gateway, product) {
6230
+ if (!_Tracker.instance) {
6231
+ _Tracker.instance = new _Tracker(gateway, product);
6232
+ }
6233
+ return _Tracker.instance;
6234
+ }
6235
+ trackEvent(event, page, data = {}) {
6236
+ if (this.disabled || !this.gateway) {
6237
+ return Promise.resolve();
6238
+ }
6239
+ try {
6240
+ const payload = this.buildPayload(event, page, data);
6241
+ const params = new URLSearchParams(payload).toString();
6242
+ const url2 = `${this.gateway}/track.gif?${params}`;
6243
+ this.dispatch(url2);
6244
+ } catch (_) {
6245
+ }
6246
+ return Promise.resolve();
6247
+ }
6248
+ buildPayload(event, page, data) {
6249
+ const projectContext = resolveProjectContext();
6250
+ const action = resolveTrackAction(event, data);
6251
+ const payload = {
6252
+ ...data,
6253
+ u: getUid(),
6254
+ s: this.source,
6255
+ pd: this.product,
6256
+ p: page,
6257
+ a: action,
6258
+ ev: event,
6259
+ event,
6260
+ project_name: projectContext.projectName,
6261
+ project_dir: projectContext.projectDir,
6262
+ cli_version: version,
6263
+ node_version: process.version,
6264
+ os: import_os3.default.platform(),
6265
+ arch: import_os3.default.arch()
6266
+ };
6267
+ const filtered = {};
6268
+ for (const [key, value] of Object.entries(payload)) {
6269
+ const normalized = sanitizeTrackValue(value);
6270
+ if (normalized) {
6271
+ filtered[key] = normalized;
6272
+ }
6273
+ }
6274
+ return filtered;
6275
+ }
6276
+ dispatch(url2) {
6277
+ const child = (0, import_child_process2.spawn)(process.execPath, ["-e", TRACK_CHILD_SCRIPT, url2], {
6278
+ detached: true,
6279
+ stdio: "ignore",
6280
+ windowsHide: true
6281
+ });
6282
+ child.unref();
6283
+ }
6284
+ };
6285
+ var tracker = Tracker.getInstance();
6286
+ var tracker_default = tracker;
6287
+
6288
+ // bin/utils/trackerEvents.ts
6289
+ var TRACK_PAGES = {
6290
+ auth: "cli_auth",
6291
+ login: "cli_login",
6292
+ upload: "cli_upload",
6293
+ import: "cli_import",
6294
+ export: "cli_export",
6295
+ remove: "cli_remove",
6296
+ domain: "cli_domain",
6297
+ wallet: "cli_wallet",
6298
+ project: "cli_project",
6299
+ deploy: "cli_deploy"
6300
+ };
6301
+ var TRACK_EVENTS = {
6302
+ cliLoginSuccess: "cli_login_success",
6303
+ cliLoginFailed: "cli_login_failed",
6304
+ appKeySetSuccess: "appkey_set_success",
6305
+ appKeySetFailed: "appkey_set_failed",
6306
+ logoutSuccess: "logout_success",
6307
+ logoutFailed: "logout_failed",
6308
+ uploadSuccess: "upload_success",
6309
+ uploadFailed: "upload_failed",
6310
+ importSuccess: "import_success",
6311
+ importFailed: "import_failed",
6312
+ exportSuccess: "export_success",
6313
+ exportFailed: "export_failed",
6314
+ removeSuccess: "remove_success",
6315
+ removeFailed: "remove_failed",
6316
+ domainBindSuccess: "domain_bind_success",
6317
+ domainBindFailed: "domain_bind_failed",
6318
+ myDomainsSuccess: "my_domains_success",
6319
+ myDomainsFailed: "my_domains_failed",
6320
+ walletBalanceSuccess: "wallet_balance_success",
6321
+ walletBalanceFailed: "wallet_balance_failed",
6322
+ projectCreateSuccess: "project_create_success",
6323
+ projectCreateFailed: "project_create_failed",
6324
+ projectSaveSuccess: "project_save_success",
6325
+ projectSaveFailed: "project_save_failed",
6326
+ projectUpdateDbSuccess: "project_update_db_success",
6327
+ projectUpdateDbFailed: "project_update_db_failed",
6328
+ projectUpdateWorkerSuccess: "project_update_worker_success",
6329
+ projectUpdateWorkerFailed: "project_update_worker_failed",
6330
+ projectDeleteSuccess: "project_delete_success",
6331
+ projectDeleteFailed: "project_delete_failed",
6332
+ projectUpdateWebSuccess: "project_update_web_success",
6333
+ projectUpdateWebFailed: "project_update_web_failed",
6334
+ appKeyShownSuccess: "appkey_shown_success",
6335
+ appKeyShownFailed: "appkey_shown_failed",
6336
+ uploadHistoryViewed: "upload_history_viewed",
6337
+ uploadHistoryCleared: "upload_history_cleared",
6338
+ uploadHistoryFailed: "upload_history_failed"
6339
+ };
6340
+ var TRACK_ACTIONS = {
6341
+ init: "init",
6342
+ click: "click",
6343
+ view: "view",
6344
+ exposure: "exposure",
6345
+ submit: "submit",
6346
+ success: "success",
6347
+ fail: "fail"
6348
+ };
6349
+ function resolveTrackAction2(event) {
6350
+ switch (event) {
6351
+ case TRACK_EVENTS.uploadHistoryViewed:
6352
+ case TRACK_EVENTS.myDomainsSuccess:
6353
+ case TRACK_EVENTS.walletBalanceSuccess:
6354
+ case TRACK_EVENTS.appKeyShownSuccess:
6355
+ return TRACK_ACTIONS.view;
6356
+ case TRACK_EVENTS.uploadHistoryCleared:
6357
+ return TRACK_ACTIONS.click;
6358
+ case TRACK_EVENTS.uploadSuccess:
6359
+ case TRACK_EVENTS.importSuccess:
6360
+ case TRACK_EVENTS.exportSuccess:
6361
+ case TRACK_EVENTS.removeSuccess:
6362
+ case TRACK_EVENTS.domainBindSuccess:
6363
+ case TRACK_EVENTS.cliLoginSuccess:
6364
+ case TRACK_EVENTS.appKeySetSuccess:
6365
+ case TRACK_EVENTS.logoutSuccess:
6366
+ case TRACK_EVENTS.projectCreateSuccess:
6367
+ case TRACK_EVENTS.projectSaveSuccess:
6368
+ case TRACK_EVENTS.projectUpdateDbSuccess:
6369
+ case TRACK_EVENTS.projectUpdateWorkerSuccess:
6370
+ case TRACK_EVENTS.projectUpdateWebSuccess:
6371
+ case TRACK_EVENTS.projectDeleteSuccess:
6372
+ return TRACK_ACTIONS.success;
6373
+ case TRACK_EVENTS.uploadFailed:
6374
+ case TRACK_EVENTS.importFailed:
6375
+ case TRACK_EVENTS.exportFailed:
6376
+ case TRACK_EVENTS.removeFailed:
6377
+ case TRACK_EVENTS.domainBindFailed:
6378
+ case TRACK_EVENTS.cliLoginFailed:
6379
+ case TRACK_EVENTS.appKeySetFailed:
6380
+ case TRACK_EVENTS.logoutFailed:
6381
+ case TRACK_EVENTS.myDomainsFailed:
6382
+ case TRACK_EVENTS.walletBalanceFailed:
6383
+ case TRACK_EVENTS.projectCreateFailed:
6384
+ case TRACK_EVENTS.projectSaveFailed:
6385
+ case TRACK_EVENTS.projectUpdateDbFailed:
6386
+ case TRACK_EVENTS.projectUpdateWorkerFailed:
6387
+ case TRACK_EVENTS.projectUpdateWebFailed:
6388
+ case TRACK_EVENTS.projectDeleteFailed:
6389
+ case TRACK_EVENTS.appKeyShownFailed:
6390
+ case TRACK_EVENTS.uploadHistoryFailed:
6391
+ return TRACK_ACTIONS.fail;
6392
+ default:
6393
+ return TRACK_ACTIONS.view;
6394
+ }
6395
+ }
6396
+
6397
+ // bin/utils/history.ts
6398
+ var HISTORY_DIR = import_path5.default.join(import_os4.default.homedir(), ".pinme");
6399
+ var HISTORY_FILE = import_path5.default.join(HISTORY_DIR, "upload-history.json");
6087
6400
  var ensureHistoryDir = () => {
6088
6401
  if (!import_fs_extra3.default.existsSync(HISTORY_DIR)) {
6089
6402
  import_fs_extra3.default.mkdirSync(HISTORY_DIR, { recursive: true });
@@ -6100,7 +6413,7 @@ var saveUploadHistory = (uploadData) => {
6100
6413
  timestamp: Date.now(),
6101
6414
  date: (0, import_dayjs.default)().format("YYYY-MM-DD HH:mm:ss"),
6102
6415
  path: uploadData.path,
6103
- filename: uploadData.filename || import_path4.default.basename(uploadData.path),
6416
+ filename: uploadData.filename || import_path5.default.basename(uploadData.path),
6104
6417
  contentHash: uploadData.contentHash,
6105
6418
  previewHash: uploadData.previewHash,
6106
6419
  size: uploadData.size,
@@ -6159,55 +6472,78 @@ async function formatHistoryUrl(value, options) {
6159
6472
  return `https://${normalized}`;
6160
6473
  }
6161
6474
  var displayUploadHistory = async (limit = 10) => {
6162
- const history = getUploadHistory(limit);
6163
- if (history.length === 0) {
6164
- console.log(import_chalk5.default.yellow("No upload history found."));
6165
- return;
6166
- }
6167
- console.log(import_chalk5.default.cyan("Upload History:"));
6168
- console.log(import_chalk5.default.cyan("-".repeat(80)));
6169
- let rootDomain = null;
6170
6475
  try {
6171
- rootDomain = await getRootDomain();
6172
- } catch {
6173
- rootDomain = null;
6174
- }
6175
- const recentHistory = history.slice(-limit);
6176
- for (const [index, item] of recentHistory.entries()) {
6177
- console.log(import_chalk5.default.green(`${index + 1}. ${item.filename}`));
6178
- console.log(import_chalk5.default.white(` Path: ${item.path}`));
6179
- console.log(import_chalk5.default.white(` IPFS CID: ${item.contentHash}`));
6180
- const preferredUrl = await formatHistoryUrl(item.dnsUrl) || await formatHistoryUrl(item.pinmeUrl, {
6181
- appendRootDomain: true,
6182
- rootDomain
6183
- }) || await formatHistoryUrl(item.shortUrl, {
6184
- appendRootDomain: true,
6185
- rootDomain
6476
+ const history = getUploadHistory(limit);
6477
+ void tracker_default.trackEvent(TRACK_EVENTS.uploadHistoryViewed, TRACK_PAGES.upload, {
6478
+ a: resolveTrackAction2(TRACK_EVENTS.uploadHistoryViewed),
6479
+ record_count: history.length,
6480
+ limit
6186
6481
  });
6187
- if (preferredUrl) {
6188
- console.log(import_chalk5.default.white(` URL: ${preferredUrl}`));
6189
- }
6190
- console.log(import_chalk5.default.white(` Size: ${formatSize(item.size)}`));
6191
- console.log(import_chalk5.default.white(` Files: ${item.fileCount}`));
6192
- console.log(import_chalk5.default.white(` Type: ${item.type === "directory" ? "Directory" : "File"}`));
6193
- if (item.timestamp) {
6194
- console.log(import_chalk5.default.white(` Date: ${new Date(item.timestamp).toLocaleString()}`));
6482
+ if (history.length === 0) {
6483
+ console.log(import_chalk5.default.yellow("No upload history found."));
6484
+ return;
6195
6485
  }
6486
+ console.log(import_chalk5.default.cyan("Upload History:"));
6196
6487
  console.log(import_chalk5.default.cyan("-".repeat(80)));
6488
+ let rootDomain = null;
6489
+ try {
6490
+ rootDomain = await getRootDomain();
6491
+ } catch {
6492
+ rootDomain = null;
6493
+ }
6494
+ const recentHistory = history.slice(-limit);
6495
+ for (const [index, item] of recentHistory.entries()) {
6496
+ console.log(import_chalk5.default.green(`${index + 1}. ${item.filename}`));
6497
+ console.log(import_chalk5.default.white(` Path: ${item.path}`));
6498
+ console.log(import_chalk5.default.white(` IPFS CID: ${item.contentHash}`));
6499
+ const preferredUrl = await formatHistoryUrl(item.dnsUrl) || await formatHistoryUrl(item.pinmeUrl, {
6500
+ appendRootDomain: true,
6501
+ rootDomain
6502
+ }) || await formatHistoryUrl(item.shortUrl, {
6503
+ appendRootDomain: true,
6504
+ rootDomain
6505
+ });
6506
+ if (preferredUrl) {
6507
+ console.log(import_chalk5.default.white(` URL: ${preferredUrl}`));
6508
+ }
6509
+ console.log(import_chalk5.default.white(` Size: ${formatSize(item.size)}`));
6510
+ console.log(import_chalk5.default.white(` Files: ${item.fileCount}`));
6511
+ console.log(import_chalk5.default.white(` Type: ${item.type === "directory" ? "Directory" : "File"}`));
6512
+ if (item.timestamp) {
6513
+ console.log(import_chalk5.default.white(` Date: ${new Date(item.timestamp).toLocaleString()}`));
6514
+ }
6515
+ console.log(import_chalk5.default.cyan("-".repeat(80)));
6516
+ }
6517
+ const totalSize = history.reduce((sum, record) => sum + record.size, 0);
6518
+ const totalFiles = history.reduce((sum, record) => sum + record.fileCount, 0);
6519
+ console.log(import_chalk5.default.bold(`Total Uploads: ${history.length}`));
6520
+ console.log(import_chalk5.default.bold(`Total Files: ${totalFiles}`));
6521
+ console.log(import_chalk5.default.bold(`Total Size: ${formatSize(totalSize)}`));
6522
+ } catch (error) {
6523
+ void tracker_default.trackEvent(TRACK_EVENTS.uploadHistoryFailed, TRACK_PAGES.upload, {
6524
+ a: resolveTrackAction2(TRACK_EVENTS.uploadHistoryFailed),
6525
+ action: "view",
6526
+ reason: getTrackErrorReason(error)
6527
+ });
6528
+ throw error;
6197
6529
  }
6198
- const totalSize = history.reduce((sum, record) => sum + record.size, 0);
6199
- const totalFiles = history.reduce((sum, record) => sum + record.fileCount, 0);
6200
- console.log(import_chalk5.default.bold(`Total Uploads: ${history.length}`));
6201
- console.log(import_chalk5.default.bold(`Total Files: ${totalFiles}`));
6202
- console.log(import_chalk5.default.bold(`Total Size: ${formatSize(totalSize)}`));
6203
6530
  };
6204
6531
  var clearUploadHistory = () => {
6205
6532
  try {
6206
6533
  ensureHistoryDir();
6207
6534
  import_fs_extra3.default.writeJsonSync(HISTORY_FILE, { uploads: [] });
6535
+ void tracker_default.trackEvent(TRACK_EVENTS.uploadHistoryCleared, TRACK_PAGES.upload, {
6536
+ a: resolveTrackAction2(TRACK_EVENTS.uploadHistoryCleared),
6537
+ cleared: true
6538
+ });
6208
6539
  console.log(import_chalk5.default.green("Upload history cleared successfully."));
6209
6540
  return true;
6210
6541
  } catch (error) {
6542
+ void tracker_default.trackEvent(TRACK_EVENTS.uploadHistoryFailed, TRACK_PAGES.upload, {
6543
+ a: resolveTrackAction2(TRACK_EVENTS.uploadHistoryFailed),
6544
+ action: "clear",
6545
+ reason: getTrackErrorReason(error)
6546
+ });
6211
6547
  console.error(import_chalk5.default.red(`Error clearing upload history: ${error.message}`));
6212
6548
  return false;
6213
6549
  }
@@ -6411,9 +6747,9 @@ async function compressDirectory(sourcePath) {
6411
6747
  if (!import_fs_extra4.default.existsSync(tempDir)) {
6412
6748
  import_fs_extra4.default.mkdirSync(tempDir, { recursive: true });
6413
6749
  }
6414
- const outputPath = import_path5.default.join(
6750
+ const outputPath = import_path6.default.join(
6415
6751
  tempDir,
6416
- `pinme_${import_path5.default.basename(sourcePath)}_${Date.now()}.zip`
6752
+ `pinme_${import_path6.default.basename(sourcePath)}_${Date.now()}.zip`
6417
6753
  );
6418
6754
  const output = import_fs_extra4.default.createWriteStream(outputPath);
6419
6755
  const zlib2 = require("zlib");
@@ -6438,7 +6774,7 @@ async function compressDirectory(sourcePath) {
6438
6774
  async function initChunkSession(filePath, deviceId, options = {}, isDirectory = false) {
6439
6775
  var _a2;
6440
6776
  const stats = import_fs_extra4.default.statSync(filePath);
6441
- const fileName = import_path5.default.basename(filePath);
6777
+ const fileName = import_path6.default.basename(filePath);
6442
6778
  const fileSize = stats.size;
6443
6779
  const md5 = await calculateMD5(filePath);
6444
6780
  try {
@@ -6768,7 +7104,7 @@ async function uploadDirectoryInChunks(directoryPath, deviceId, options = {}) {
6768
7104
  )} (size: ${formatSize(sizeCheck.size)})`
6769
7105
  );
6770
7106
  }
6771
- const progressBar = new StepProgressBar(import_path5.default.basename(directoryPath), true);
7107
+ const progressBar = new StepProgressBar(import_path6.default.basename(directoryPath), true);
6772
7108
  try {
6773
7109
  progressBar.startStep(0, "Preparing compression");
6774
7110
  const compressedPath = await compressDirectory(directoryPath);
@@ -6812,7 +7148,7 @@ async function uploadDirectoryInChunks(directoryPath, deviceId, options = {}) {
6812
7148
  }
6813
7149
  const uploadData = {
6814
7150
  path: directoryPath,
6815
- filename: import_path5.default.basename(directoryPath),
7151
+ filename: import_path6.default.basename(directoryPath),
6816
7152
  contentHash: (result == null ? void 0 : result.hash) || "unknown",
6817
7153
  size: sizeCheck.size,
6818
7154
  fileCount: 0,
@@ -6841,7 +7177,7 @@ async function uploadFileInChunks(filePath, deviceId, options = {}) {
6841
7177
  )} (size: ${formatSize(sizeCheck.size)})`
6842
7178
  );
6843
7179
  }
6844
- const fileName = import_path5.default.basename(filePath);
7180
+ const fileName = import_path6.default.basename(filePath);
6845
7181
  const progressBar = new StepProgressBar(fileName, false);
6846
7182
  try {
6847
7183
  progressBar.startStep(0, "Initializing session");
@@ -7031,206 +7367,6 @@ function printHighlightedUrl(label, url2, tone = "primary") {
7031
7367
  console.log("");
7032
7368
  }
7033
7369
 
7034
- // bin/utils/tracker.ts
7035
- var import_os4 = __toESM(require("os"));
7036
- var import_fs2 = __toESM(require("fs"));
7037
- var import_path6 = __toESM(require("path"));
7038
- var import_child_process2 = require("child_process");
7039
- var REQUEST_TIMEOUT_MS = 1500;
7040
- var DEFAULT_GATEWAY = "https://pinme.dev";
7041
- var DEFAULT_PRODUCT = "pinme-cli";
7042
- var TRACK_CHILD_SCRIPT = `
7043
- const rawUrl = process.argv[1];
7044
- if (!rawUrl) process.exit(0);
7045
- try {
7046
- const transport = rawUrl.startsWith('https:') ? require('https') : require('http');
7047
- const req = transport.get(rawUrl, {
7048
- headers: {
7049
- 'User-Agent': 'Pinme-CLI-Tracker'
7050
- }
7051
- }, (res) => {
7052
- res.resume();
7053
- res.on('end', () => process.exit(0));
7054
- });
7055
- req.setTimeout(${REQUEST_TIMEOUT_MS}, () => req.destroy());
7056
- req.on('error', () => process.exit(0));
7057
- req.on('close', () => process.exit(0));
7058
- } catch (_) {
7059
- process.exit(0);
7060
- }
7061
- `;
7062
- function trimTrailingSlash2(value) {
7063
- return value.replace(/\/+$/, "");
7064
- }
7065
- function shouldDisableTracking() {
7066
- return process.env.PINME_TRACKING_DISABLED === "1" || process.env.DO_NOT_TRACK === "1";
7067
- }
7068
- function sanitizeTrackValue(value) {
7069
- if (value === void 0 || value === null) {
7070
- return void 0;
7071
- }
7072
- return String(value).trim().slice(0, 200);
7073
- }
7074
- function getTrackErrorReason(error) {
7075
- var _a2, _b, _c, _d, _e;
7076
- const candidate = ((_b = (_a2 = error == null ? void 0 : error.response) == null ? void 0 : _a2.data) == null ? void 0 : _b.msg) || ((_d = (_c = error == null ? void 0 : error.response) == null ? void 0 : _c.data) == null ? void 0 : _d.message) || (error == null ? void 0 : error.message) || ((_e = error == null ? void 0 : error.toString) == null ? void 0 : _e.call(error)) || "unknown_error";
7077
- return sanitizeTrackValue(candidate) || "unknown_error";
7078
- }
7079
- var cachedProjectContext = null;
7080
- var cachedProjectContextCwd = null;
7081
- function resolveProjectContext() {
7082
- const cwd = process.cwd();
7083
- if (cachedProjectContext && cachedProjectContextCwd === cwd) {
7084
- return cachedProjectContext;
7085
- }
7086
- const context = {};
7087
- const configPath = import_path6.default.join(cwd, "pinme.toml");
7088
- if (import_fs2.default.existsSync(configPath)) {
7089
- try {
7090
- const configContent = import_fs2.default.readFileSync(configPath, "utf8");
7091
- const projectNameMatch = configContent.match(
7092
- /project_name\s*=\s*"([^"]+)"/
7093
- );
7094
- context.projectName = sanitizeTrackValue(projectNameMatch == null ? void 0 : projectNameMatch[1]) || sanitizeTrackValue(process.env.PINME_PROJECT_NAME);
7095
- context.projectDir = sanitizeTrackValue(import_path6.default.basename(cwd));
7096
- } catch (_) {
7097
- context.projectName = sanitizeTrackValue(process.env.PINME_PROJECT_NAME);
7098
- }
7099
- } else {
7100
- context.projectName = sanitizeTrackValue(process.env.PINME_PROJECT_NAME);
7101
- }
7102
- cachedProjectContext = context;
7103
- cachedProjectContextCwd = cwd;
7104
- return context;
7105
- }
7106
- function getPathKind(pathValue) {
7107
- try {
7108
- const stat = import_fs2.default.statSync(pathValue);
7109
- if (stat.isDirectory()) {
7110
- return "directory";
7111
- }
7112
- if (stat.isFile()) {
7113
- return "file";
7114
- }
7115
- } catch (_) {
7116
- return "unknown";
7117
- }
7118
- return "unknown";
7119
- }
7120
- var Tracker = class _Tracker {
7121
- static instance;
7122
- gateway;
7123
- product;
7124
- source;
7125
- disabled;
7126
- constructor(gateway, product) {
7127
- this.gateway = trimTrailingSlash2(
7128
- gateway || process.env.PINME_TRACKER_GATEWAY || DEFAULT_GATEWAY
7129
- );
7130
- this.product = product || DEFAULT_PRODUCT;
7131
- this.source = sanitizeTrackValue(process.env.PINME_TRACK_SOURCE);
7132
- this.disabled = shouldDisableTracking();
7133
- }
7134
- static getInstance(gateway, product) {
7135
- if (!_Tracker.instance) {
7136
- _Tracker.instance = new _Tracker(gateway, product);
7137
- }
7138
- return _Tracker.instance;
7139
- }
7140
- trackEvent(event, page, data = {}) {
7141
- if (this.disabled || !this.gateway) {
7142
- return Promise.resolve();
7143
- }
7144
- try {
7145
- const payload = this.buildPayload(event, page, data);
7146
- const params = new URLSearchParams(payload).toString();
7147
- const url2 = `${this.gateway}/track.gif?${params}`;
7148
- this.dispatch(url2);
7149
- } catch (_) {
7150
- }
7151
- return Promise.resolve();
7152
- }
7153
- buildPayload(event, page, data) {
7154
- const projectContext = resolveProjectContext();
7155
- const payload = {
7156
- u: getUid(),
7157
- s: this.source,
7158
- pd: this.product,
7159
- p: page,
7160
- event,
7161
- project_name: projectContext.projectName,
7162
- project_dir: projectContext.projectDir,
7163
- cli_version: version,
7164
- node_version: process.version,
7165
- os: import_os4.default.platform(),
7166
- arch: import_os4.default.arch(),
7167
- ...data
7168
- };
7169
- const filtered = {};
7170
- for (const [key, value] of Object.entries(payload)) {
7171
- const normalized = sanitizeTrackValue(value);
7172
- if (normalized) {
7173
- filtered[key] = normalized;
7174
- }
7175
- }
7176
- return filtered;
7177
- }
7178
- dispatch(url2) {
7179
- const child = (0, import_child_process2.spawn)(process.execPath, ["-e", TRACK_CHILD_SCRIPT, url2], {
7180
- detached: true,
7181
- stdio: "ignore",
7182
- windowsHide: true
7183
- });
7184
- child.unref();
7185
- }
7186
- };
7187
- var tracker = Tracker.getInstance();
7188
- var tracker_default = tracker;
7189
-
7190
- // bin/utils/trackerEvents.ts
7191
- var TRACK_PAGES = {
7192
- auth: "cli_auth",
7193
- login: "cli_login",
7194
- upload: "cli_upload",
7195
- import: "cli_import",
7196
- export: "cli_export",
7197
- remove: "cli_remove",
7198
- domain: "cli_domain",
7199
- wallet: "cli_wallet",
7200
- project: "cli_project",
7201
- deploy: "cli_deploy"
7202
- };
7203
- var TRACK_EVENTS = {
7204
- cliLoginSuccess: "cli_login_success",
7205
- cliLoginFailed: "cli_login_failed",
7206
- appKeySetSuccess: "appkey_set_success",
7207
- appKeySetFailed: "appkey_set_failed",
7208
- logoutSuccess: "logout_success",
7209
- logoutFailed: "logout_failed",
7210
- uploadSuccess: "upload_success",
7211
- uploadFailed: "upload_failed",
7212
- importSuccess: "import_success",
7213
- importFailed: "import_failed",
7214
- exportSuccess: "export_success",
7215
- exportFailed: "export_failed",
7216
- removeSuccess: "remove_success",
7217
- removeFailed: "remove_failed",
7218
- domainBindSuccess: "domain_bind_success",
7219
- domainBindFailed: "domain_bind_failed",
7220
- myDomainsSuccess: "my_domains_success",
7221
- myDomainsFailed: "my_domains_failed",
7222
- walletBalanceSuccess: "wallet_balance_success",
7223
- walletBalanceFailed: "wallet_balance_failed",
7224
- projectCreateSuccess: "project_create_success",
7225
- projectCreateFailed: "project_create_failed",
7226
- projectSaveSuccess: "project_save_success",
7227
- projectSaveFailed: "project_save_failed",
7228
- projectDeleteSuccess: "project_delete_success",
7229
- projectDeleteFailed: "project_delete_failed",
7230
- projectUpdateWebSuccess: "project_update_web_success",
7231
- projectUpdateWebFailed: "project_update_web_failed"
7232
- };
7233
-
7234
7370
  // bin/upload.ts
7235
7371
  checkNodeVersion();
7236
7372
  function checkPathSync(inputPath) {
@@ -7245,8 +7381,7 @@ function checkPathSync(inputPath) {
7245
7381
  return null;
7246
7382
  }
7247
7383
  }
7248
- async function printUploadUrls(result) {
7249
- const projectName = APP_CONFIG.pinmeProjectName;
7384
+ async function printUploadUrls(result, projectName) {
7250
7385
  const { publicUrl, managementUrl } = await resolveUploadUrls(
7251
7386
  result.contentHash,
7252
7387
  {
@@ -7259,6 +7394,52 @@ async function printUploadUrls(result) {
7259
7394
  printHighlightedUrl("URL", publicUrl, "primary");
7260
7395
  printHighlightedUrl("Management URL", managementUrl, "management");
7261
7396
  }
7397
+ function readProjectNameFromConfig(configPath) {
7398
+ var _a2;
7399
+ try {
7400
+ const config = import_fs3.default.readFileSync(configPath, "utf-8");
7401
+ const match = config.match(/project_name\s*=\s*"([^"]+)"/);
7402
+ return ((_a2 = match == null ? void 0 : match[1]) == null ? void 0 : _a2.trim()) || void 0;
7403
+ } catch {
7404
+ return void 0;
7405
+ }
7406
+ }
7407
+ function findPinmeConfig(startPath) {
7408
+ try {
7409
+ let current = import_fs3.default.statSync(startPath).isDirectory() ? startPath : import_path7.default.dirname(startPath);
7410
+ while (true) {
7411
+ const configPath = import_path7.default.join(current, "pinme.toml");
7412
+ if (import_fs3.default.existsSync(configPath)) {
7413
+ return configPath;
7414
+ }
7415
+ const parent = import_path7.default.dirname(current);
7416
+ if (parent === current) {
7417
+ return void 0;
7418
+ }
7419
+ current = parent;
7420
+ }
7421
+ } catch {
7422
+ return void 0;
7423
+ }
7424
+ }
7425
+ function resolveUploadProjectName(targetPath) {
7426
+ if (APP_CONFIG.pinmeProjectName) {
7427
+ return APP_CONFIG.pinmeProjectName;
7428
+ }
7429
+ const configPaths = [
7430
+ findPinmeConfig(targetPath),
7431
+ findPinmeConfig(process.cwd())
7432
+ ].filter(
7433
+ (value, index, values) => Boolean(value) && values.indexOf(value) === index
7434
+ );
7435
+ for (const configPath of configPaths) {
7436
+ const projectName = readProjectNameFromConfig(configPath);
7437
+ if (projectName) {
7438
+ return projectName;
7439
+ }
7440
+ }
7441
+ return void 0;
7442
+ }
7262
7443
  function getDomainFromArgs() {
7263
7444
  const args = process.argv.slice(2);
7264
7445
  const dIdx = args.findIndex((a) => a === "--domain" || a === "-d");
@@ -7308,6 +7489,7 @@ async function bindDomain(domain, contentHash, isDns, authConfig) {
7308
7489
  );
7309
7490
  if (dnsResult.code !== 200) {
7310
7491
  void tracker_default.trackEvent(TRACK_EVENTS.domainBindFailed, TRACK_PAGES.domain, {
7492
+ a: resolveTrackAction2(TRACK_EVENTS.domainBindFailed),
7311
7493
  domain_type: domainType,
7312
7494
  domain_name: displayDomain,
7313
7495
  bind_source: "upload",
@@ -7317,6 +7499,7 @@ async function bindDomain(domain, contentHash, isDns, authConfig) {
7317
7499
  return false;
7318
7500
  }
7319
7501
  void tracker_default.trackEvent(TRACK_EVENTS.domainBindSuccess, TRACK_PAGES.domain, {
7502
+ a: resolveTrackAction2(TRACK_EVENTS.domainBindSuccess),
7320
7503
  domain_type: domainType,
7321
7504
  domain_name: displayDomain,
7322
7505
  bind_source: "upload"
@@ -7333,6 +7516,7 @@ async function bindDomain(domain, contentHash, isDns, authConfig) {
7333
7516
  const ok = await bindPinmeDomain(displayDomain, contentHash);
7334
7517
  if (!ok) {
7335
7518
  void tracker_default.trackEvent(TRACK_EVENTS.domainBindFailed, TRACK_PAGES.domain, {
7519
+ a: resolveTrackAction2(TRACK_EVENTS.domainBindFailed),
7336
7520
  domain_type: domainType,
7337
7521
  domain_name: displayDomain,
7338
7522
  bind_source: "upload",
@@ -7342,6 +7526,7 @@ async function bindDomain(domain, contentHash, isDns, authConfig) {
7342
7526
  return false;
7343
7527
  }
7344
7528
  void tracker_default.trackEvent(TRACK_EVENTS.domainBindSuccess, TRACK_PAGES.domain, {
7529
+ a: resolveTrackAction2(TRACK_EVENTS.domainBindSuccess),
7345
7530
  domain_type: domainType,
7346
7531
  domain_name: displayDomain,
7347
7532
  bind_source: "upload"
@@ -7378,6 +7563,10 @@ var upload_default = async (options) => {
7378
7563
  return;
7379
7564
  }
7380
7565
  const pathKind = getPathKind(absolutePath);
7566
+ const projectName = resolveUploadProjectName(absolutePath);
7567
+ if (projectName) {
7568
+ console.log(import_chalk7.default.gray(`Project: ${projectName}`));
7569
+ }
7381
7570
  const isDns = dnsArg || (domainArg ? isDnsDomain(domainArg) : false);
7382
7571
  const displayDomain = domainArg == null ? void 0 : domainArg.replace(/^https?:\/\//, "").replace(/\/$/, "");
7383
7572
  if (isDns && domainArg) {
@@ -7429,11 +7618,12 @@ var upload_default = async (options) => {
7429
7618
  let result;
7430
7619
  try {
7431
7620
  result = await uploadPath(absolutePath, {
7432
- projectName: APP_CONFIG.pinmeProjectName,
7621
+ projectName,
7433
7622
  uid: authConfig == null ? void 0 : authConfig.address
7434
7623
  });
7435
7624
  } catch (error) {
7436
7625
  void tracker_default.trackEvent(TRACK_EVENTS.uploadFailed, TRACK_PAGES.upload, {
7626
+ a: resolveTrackAction2(TRACK_EVENTS.uploadFailed),
7437
7627
  path_kind: pathKind,
7438
7628
  has_domain: Boolean(domainArg),
7439
7629
  reason: getTrackErrorReason(error)
@@ -7443,6 +7633,7 @@ var upload_default = async (options) => {
7443
7633
  }
7444
7634
  if (!result) {
7445
7635
  void tracker_default.trackEvent(TRACK_EVENTS.uploadFailed, TRACK_PAGES.upload, {
7636
+ a: resolveTrackAction2(TRACK_EVENTS.uploadFailed),
7446
7637
  path_kind: pathKind,
7447
7638
  has_domain: Boolean(domainArg),
7448
7639
  reason: "no_result_returned"
@@ -7451,14 +7642,15 @@ var upload_default = async (options) => {
7451
7642
  process.exit(1);
7452
7643
  }
7453
7644
  void tracker_default.trackEvent(TRACK_EVENTS.uploadSuccess, TRACK_PAGES.upload, {
7645
+ a: resolveTrackAction2(TRACK_EVENTS.uploadSuccess),
7454
7646
  path_kind: pathKind,
7455
7647
  has_domain: Boolean(domainArg),
7456
- project_name: APP_CONFIG.pinmeProjectName
7648
+ project_name: projectName
7457
7649
  });
7458
7650
  console.log(
7459
7651
  import_chalk7.default.cyan(import_figlet.default.textSync("Successful", { horizontalLayout: "full" }))
7460
7652
  );
7461
- await printUploadUrls(result);
7653
+ await printUploadUrls(result, projectName);
7462
7654
  if (domainArg) {
7463
7655
  console.log(
7464
7656
  import_chalk7.default.blue(
@@ -7490,6 +7682,11 @@ var upload_default = async (options) => {
7490
7682
  console.log(import_chalk7.default.red(`path ${answer.path} does not exist`));
7491
7683
  return;
7492
7684
  }
7685
+ const pathKind = getPathKind(absolutePath);
7686
+ const projectName = resolveUploadProjectName(absolutePath);
7687
+ if (projectName) {
7688
+ console.log(import_chalk7.default.gray(`Project: ${projectName}`));
7689
+ }
7493
7690
  const isDns = dnsArg || (domainArg ? isDnsDomain(domainArg) : false);
7494
7691
  const displayDomain = domainArg == null ? void 0 : domainArg.replace(/^https?:\/\//, "").replace(/\/$/, "");
7495
7692
  if (isDns && domainArg) {
@@ -7541,21 +7738,39 @@ var upload_default = async (options) => {
7541
7738
  let result;
7542
7739
  try {
7543
7740
  result = await uploadPath(absolutePath, {
7544
- projectName: APP_CONFIG.pinmeProjectName,
7741
+ projectName,
7545
7742
  uid: authConfig == null ? void 0 : authConfig.address
7546
7743
  });
7547
7744
  } catch (error) {
7745
+ void tracker_default.trackEvent(TRACK_EVENTS.uploadFailed, TRACK_PAGES.upload, {
7746
+ a: resolveTrackAction2(TRACK_EVENTS.uploadFailed),
7747
+ path_kind: pathKind,
7748
+ has_domain: Boolean(domainArg),
7749
+ reason: getTrackErrorReason(error)
7750
+ });
7548
7751
  printCliError(error, "Upload failed.");
7549
7752
  process.exit(1);
7550
7753
  }
7551
7754
  if (!result) {
7755
+ void tracker_default.trackEvent(TRACK_EVENTS.uploadFailed, TRACK_PAGES.upload, {
7756
+ a: resolveTrackAction2(TRACK_EVENTS.uploadFailed),
7757
+ path_kind: pathKind,
7758
+ has_domain: Boolean(domainArg),
7759
+ reason: "no_result_returned"
7760
+ });
7552
7761
  console.error(import_chalk7.default.red("Upload failed: no result returned"));
7553
7762
  process.exit(1);
7554
7763
  }
7764
+ void tracker_default.trackEvent(TRACK_EVENTS.uploadSuccess, TRACK_PAGES.upload, {
7765
+ a: resolveTrackAction2(TRACK_EVENTS.uploadSuccess),
7766
+ path_kind: pathKind,
7767
+ has_domain: Boolean(domainArg),
7768
+ project_name: projectName
7769
+ });
7555
7770
  console.log(
7556
7771
  import_chalk7.default.cyan(import_figlet.default.textSync("Successful", { horizontalLayout: "full" }))
7557
7772
  );
7558
- await printUploadUrls(result);
7773
+ await printUploadUrls(result, projectName);
7559
7774
  if (domainArg) {
7560
7775
  console.log(
7561
7776
  import_chalk7.default.blue(
@@ -7677,6 +7892,7 @@ var importCar_default = async (options) => {
7677
7892
  });
7678
7893
  if (result) {
7679
7894
  void tracker_default.trackEvent(TRACK_EVENTS.importSuccess, TRACK_PAGES.import, {
7895
+ a: resolveTrackAction2(TRACK_EVENTS.importSuccess),
7680
7896
  path_kind: pathKind,
7681
7897
  has_domain: Boolean(domainArg)
7682
7898
  });
@@ -7705,6 +7921,7 @@ var importCar_default = async (options) => {
7705
7921
  const ok = await bindPinmeDomain(domainArg, result.contentHash);
7706
7922
  if (ok) {
7707
7923
  void tracker_default.trackEvent(TRACK_EVENTS.domainBindSuccess, TRACK_PAGES.domain, {
7924
+ a: resolveTrackAction2(TRACK_EVENTS.domainBindSuccess),
7708
7925
  domain_type: "pinme_subdomain",
7709
7926
  domain_name: domainArg,
7710
7927
  bind_source: "import"
@@ -7718,6 +7935,7 @@ var importCar_default = async (options) => {
7718
7935
  );
7719
7936
  } else {
7720
7937
  void tracker_default.trackEvent(TRACK_EVENTS.domainBindFailed, TRACK_PAGES.domain, {
7938
+ a: resolveTrackAction2(TRACK_EVENTS.domainBindFailed),
7721
7939
  domain_type: "pinme_subdomain",
7722
7940
  domain_name: domainArg,
7723
7941
  bind_source: "import",
@@ -7730,6 +7948,7 @@ var importCar_default = async (options) => {
7730
7948
  }
7731
7949
  } catch (error) {
7732
7950
  void tracker_default.trackEvent(TRACK_EVENTS.importFailed, TRACK_PAGES.import, {
7951
+ a: resolveTrackAction2(TRACK_EVENTS.importFailed),
7733
7952
  path_kind: pathKind,
7734
7953
  has_domain: Boolean(domainArg),
7735
7954
  reason: getTrackErrorReason(error)
@@ -7772,6 +7991,7 @@ var importCar_default = async (options) => {
7772
7991
  });
7773
7992
  if (result) {
7774
7993
  void tracker_default.trackEvent(TRACK_EVENTS.importSuccess, TRACK_PAGES.import, {
7994
+ a: resolveTrackAction2(TRACK_EVENTS.importSuccess),
7775
7995
  path_kind: pathKind,
7776
7996
  has_domain: Boolean(domainArg)
7777
7997
  });
@@ -7800,6 +8020,7 @@ var importCar_default = async (options) => {
7800
8020
  const ok = await bindPinmeDomain(domainArg, result.contentHash);
7801
8021
  if (ok) {
7802
8022
  void tracker_default.trackEvent(TRACK_EVENTS.domainBindSuccess, TRACK_PAGES.domain, {
8023
+ a: resolveTrackAction2(TRACK_EVENTS.domainBindSuccess),
7803
8024
  domain_type: "pinme_subdomain",
7804
8025
  domain_name: domainArg,
7805
8026
  bind_source: "import"
@@ -7813,6 +8034,7 @@ var importCar_default = async (options) => {
7813
8034
  );
7814
8035
  } else {
7815
8036
  void tracker_default.trackEvent(TRACK_EVENTS.domainBindFailed, TRACK_PAGES.domain, {
8037
+ a: resolveTrackAction2(TRACK_EVENTS.domainBindFailed),
7816
8038
  domain_type: "pinme_subdomain",
7817
8039
  domain_name: domainArg,
7818
8040
  bind_source: "import",
@@ -7825,6 +8047,7 @@ var importCar_default = async (options) => {
7825
8047
  }
7826
8048
  } catch (error) {
7827
8049
  void tracker_default.trackEvent(TRACK_EVENTS.importFailed, TRACK_PAGES.import, {
8050
+ a: resolveTrackAction2(TRACK_EVENTS.importFailed),
7828
8051
  path_kind: pathKind,
7829
8052
  has_domain: Boolean(domainArg),
7830
8053
  reason: getTrackErrorReason(error)
@@ -7835,6 +8058,7 @@ var importCar_default = async (options) => {
7835
8058
  }
7836
8059
  } catch (error) {
7837
8060
  void tracker_default.trackEvent(TRACK_EVENTS.importFailed, TRACK_PAGES.import, {
8061
+ a: resolveTrackAction2(TRACK_EVENTS.importFailed),
7838
8062
  reason: getTrackErrorReason(error)
7839
8063
  });
7840
8064
  printCliError(error, "Import failed.");
@@ -8022,6 +8246,7 @@ var exportCar_default = async () => {
8022
8246
  );
8023
8247
  if (!downloadUrl) {
8024
8248
  void tracker_default.trackEvent(TRACK_EVENTS.exportFailed, TRACK_PAGES.export, {
8249
+ a: resolveTrackAction2(TRACK_EVENTS.exportFailed),
8025
8250
  cid,
8026
8251
  reason: "export_failed_or_timed_out"
8027
8252
  });
@@ -8031,6 +8256,7 @@ var exportCar_default = async () => {
8031
8256
  const success = await downloadCarFile(downloadUrl, finalOutputPath);
8032
8257
  if (success) {
8033
8258
  void tracker_default.trackEvent(TRACK_EVENTS.exportSuccess, TRACK_PAGES.export, {
8259
+ a: resolveTrackAction2(TRACK_EVENTS.exportSuccess),
8034
8260
  cid,
8035
8261
  output_dir: outputDir
8036
8262
  });
@@ -8048,6 +8274,7 @@ var exportCar_default = async () => {
8048
8274
  console.log(import_chalk9.default.cyan(`CID: ${cid}`));
8049
8275
  } else {
8050
8276
  void tracker_default.trackEvent(TRACK_EVENTS.exportFailed, TRACK_PAGES.export, {
8277
+ a: resolveTrackAction2(TRACK_EVENTS.exportFailed),
8051
8278
  cid,
8052
8279
  reason: "download_failed"
8053
8280
  });
@@ -8055,6 +8282,7 @@ var exportCar_default = async () => {
8055
8282
  }
8056
8283
  } catch (error) {
8057
8284
  void tracker_default.trackEvent(TRACK_EVENTS.exportFailed, TRACK_PAGES.export, {
8285
+ a: resolveTrackAction2(TRACK_EVENTS.exportFailed),
8058
8286
  cid,
8059
8287
  reason: getTrackErrorReason(error)
8060
8288
  });
@@ -8063,6 +8291,7 @@ var exportCar_default = async () => {
8063
8291
  }
8064
8292
  } catch (error) {
8065
8293
  void tracker_default.trackEvent(TRACK_EVENTS.exportFailed, TRACK_PAGES.export, {
8294
+ a: resolveTrackAction2(TRACK_EVENTS.exportFailed),
8066
8295
  reason: getTrackErrorReason(error)
8067
8296
  });
8068
8297
  printCliError(error, "Export failed.");
@@ -8213,6 +8442,7 @@ var remove_default = async (options) => {
8213
8442
  const success = await removeFromIpfs(parsedInput.value, parsedInput.type);
8214
8443
  if (success) {
8215
8444
  void tracker_default.trackEvent(TRACK_EVENTS.removeSuccess, TRACK_PAGES.remove, {
8445
+ a: resolveTrackAction2(TRACK_EVENTS.removeSuccess),
8216
8446
  input_type: parsedInput.type
8217
8447
  });
8218
8448
  console.log(
@@ -8223,6 +8453,7 @@ var remove_default = async (options) => {
8223
8453
  }
8224
8454
  } catch (error) {
8225
8455
  void tracker_default.trackEvent(TRACK_EVENTS.removeFailed, TRACK_PAGES.remove, {
8456
+ a: resolveTrackAction2(TRACK_EVENTS.removeFailed),
8226
8457
  input_type: parsedInput.type,
8227
8458
  reason: getTrackErrorReason(error)
8228
8459
  });
@@ -8284,6 +8515,7 @@ var remove_default = async (options) => {
8284
8515
  const success = await removeFromIpfs(parsedInput.value, parsedInput.type);
8285
8516
  if (success) {
8286
8517
  void tracker_default.trackEvent(TRACK_EVENTS.removeSuccess, TRACK_PAGES.remove, {
8518
+ a: resolveTrackAction2(TRACK_EVENTS.removeSuccess),
8287
8519
  input_type: parsedInput.type
8288
8520
  });
8289
8521
  console.log(
@@ -8294,6 +8526,7 @@ var remove_default = async (options) => {
8294
8526
  }
8295
8527
  } catch (error) {
8296
8528
  void tracker_default.trackEvent(TRACK_EVENTS.removeFailed, TRACK_PAGES.remove, {
8529
+ a: resolveTrackAction2(TRACK_EVENTS.removeFailed),
8297
8530
  input_type: parsedInput.type,
8298
8531
  reason: getTrackErrorReason(error)
8299
8532
  });
@@ -8302,6 +8535,7 @@ var remove_default = async (options) => {
8302
8535
  }
8303
8536
  } catch (error) {
8304
8537
  void tracker_default.trackEvent(TRACK_EVENTS.removeFailed, TRACK_PAGES.remove, {
8538
+ a: resolveTrackAction2(TRACK_EVENTS.removeFailed),
8305
8539
  reason: getTrackErrorReason(error)
8306
8540
  });
8307
8541
  console.error(import_chalk11.default.red(`Error executing remove command: ${error.message}`));
@@ -8342,11 +8576,13 @@ async function setAppKeyCmd() {
8342
8576
  console.log(import_chalk12.default.yellow("Anonymous history merge not confirmed. You may retry later."));
8343
8577
  }
8344
8578
  void tracker_default.trackEvent(TRACK_EVENTS.appKeySetSuccess, TRACK_PAGES.auth, {
8579
+ a: resolveTrackAction2(TRACK_EVENTS.appKeySetSuccess),
8345
8580
  merged_anonymous_history: ok,
8346
8581
  has_token_address: Boolean(saved.address)
8347
8582
  });
8348
8583
  } catch (e) {
8349
8584
  void tracker_default.trackEvent(TRACK_EVENTS.appKeySetFailed, TRACK_PAGES.auth, {
8585
+ a: resolveTrackAction2(TRACK_EVENTS.appKeySetFailed),
8350
8586
  reason: getTrackErrorReason(e)
8351
8587
  });
8352
8588
  console.log(import_chalk12.default.red(`Failed to set AppKey: ${(e == null ? void 0 : e.message) || e}`));
@@ -8378,12 +8614,14 @@ async function logoutCmd() {
8378
8614
  }
8379
8615
  clearAuthToken();
8380
8616
  void tracker_default.trackEvent(TRACK_EVENTS.logoutSuccess, TRACK_PAGES.auth, {
8617
+ a: resolveTrackAction2(TRACK_EVENTS.logoutSuccess),
8381
8618
  had_session: true
8382
8619
  });
8383
8620
  console.log(import_chalk13.default.green("Successfully logged out."));
8384
8621
  console.log(import_chalk13.default.gray(`Address ${auth.address} has been removed from local storage.`));
8385
8622
  } catch (e) {
8386
8623
  void tracker_default.trackEvent(TRACK_EVENTS.logoutFailed, TRACK_PAGES.auth, {
8624
+ a: resolveTrackAction2(TRACK_EVENTS.logoutFailed),
8387
8625
  reason: getTrackErrorReason(e)
8388
8626
  });
8389
8627
  console.log(import_chalk13.default.red(`Failed to logout: ${(e == null ? void 0 : e.message) || e}`));
@@ -8397,6 +8635,10 @@ function showAppKeyCmd() {
8397
8635
  try {
8398
8636
  const auth = getAuthConfig();
8399
8637
  if (!auth) {
8638
+ void tracker_default.trackEvent(TRACK_EVENTS.appKeyShownFailed, TRACK_PAGES.auth, {
8639
+ a: resolveTrackAction2(TRACK_EVENTS.appKeyShownFailed),
8640
+ reason: "no_appkey_found"
8641
+ });
8400
8642
  console.log(import_chalk14.default.yellow("No AppKey found. Please set your AppKey first."));
8401
8643
  console.log(import_chalk14.default.gray("Run: pinme set-appkey <AppKey>"));
8402
8644
  return;
@@ -8417,7 +8659,15 @@ function showAppKeyCmd() {
8417
8659
  } else {
8418
8660
  console.log(import_chalk14.default.cyan(` AppKey: ${"*".repeat(combined.length)}`));
8419
8661
  }
8662
+ void tracker_default.trackEvent(TRACK_EVENTS.appKeyShownSuccess, TRACK_PAGES.auth, {
8663
+ a: resolveTrackAction2(TRACK_EVENTS.appKeyShownSuccess),
8664
+ has_token_address: Boolean(auth.address)
8665
+ });
8420
8666
  } catch (e) {
8667
+ void tracker_default.trackEvent(TRACK_EVENTS.appKeyShownFailed, TRACK_PAGES.auth, {
8668
+ a: resolveTrackAction2(TRACK_EVENTS.appKeyShownFailed),
8669
+ reason: getTrackErrorReason(e)
8670
+ });
8421
8671
  console.log(import_chalk14.default.red(`Failed to show AppKey: ${(e == null ? void 0 : e.message) || e}`));
8422
8672
  }
8423
8673
  }
@@ -8431,6 +8681,7 @@ async function myDomainsCmd() {
8431
8681
  try {
8432
8682
  const list = await getMyDomains();
8433
8683
  void tracker_default.trackEvent(TRACK_EVENTS.myDomainsSuccess, TRACK_PAGES.domain, {
8684
+ a: resolveTrackAction2(TRACK_EVENTS.myDomainsSuccess),
8434
8685
  domain_count: list.length
8435
8686
  });
8436
8687
  if (!list.length) {
@@ -8453,6 +8704,7 @@ async function myDomainsCmd() {
8453
8704
  });
8454
8705
  } catch (e) {
8455
8706
  void tracker_default.trackEvent(TRACK_EVENTS.myDomainsFailed, TRACK_PAGES.domain, {
8707
+ a: resolveTrackAction2(TRACK_EVENTS.myDomainsFailed),
8456
8708
  reason: getTrackErrorReason(e)
8457
8709
  });
8458
8710
  printCliError(e, "Failed to fetch domains.");
@@ -8477,12 +8729,14 @@ async function walletBalanceCmd() {
8477
8729
  const balance = Number(((_a2 = result.data) == null ? void 0 : _a2.wallet_balance_usd) ?? 0);
8478
8730
  if (!Number.isFinite(balance)) {
8479
8731
  void tracker_default.trackEvent(TRACK_EVENTS.walletBalanceFailed, TRACK_PAGES.wallet, {
8732
+ a: resolveTrackAction2(TRACK_EVENTS.walletBalanceFailed),
8480
8733
  reason: "invalid_balance_value"
8481
8734
  });
8482
8735
  console.log(import_chalk16.default.red("Failed to parse wallet balance."));
8483
8736
  return;
8484
8737
  }
8485
8738
  void tracker_default.trackEvent(TRACK_EVENTS.walletBalanceSuccess, TRACK_PAGES.wallet, {
8739
+ a: resolveTrackAction2(TRACK_EVENTS.walletBalanceSuccess),
8486
8740
  has_balance: balance > 0,
8487
8741
  balance_usd: balance.toFixed(2)
8488
8742
  });
@@ -8494,6 +8748,7 @@ async function walletBalanceCmd() {
8494
8748
  }
8495
8749
  } catch (e) {
8496
8750
  void tracker_default.trackEvent(TRACK_EVENTS.walletBalanceFailed, TRACK_PAGES.wallet, {
8751
+ a: resolveTrackAction2(TRACK_EVENTS.walletBalanceFailed),
8497
8752
  reason: getTrackErrorReason(e)
8498
8753
  });
8499
8754
  printCliError(e, "Failed to fetch wallet balance.");
@@ -8636,6 +8891,7 @@ async function bindCmd() {
8636
8891
  const up = await uploadPath(absolutePath, { uid: authConfig.address });
8637
8892
  if (!(up == null ? void 0 : up.contentHash)) {
8638
8893
  void tracker_default.trackEvent(TRACK_EVENTS.uploadFailed, TRACK_PAGES.upload, {
8894
+ a: resolveTrackAction2(TRACK_EVENTS.uploadFailed),
8639
8895
  path_kind: pathKind,
8640
8896
  has_domain: true,
8641
8897
  reason: "no_content_hash"
@@ -8644,6 +8900,7 @@ async function bindCmd() {
8644
8900
  return;
8645
8901
  }
8646
8902
  void tracker_default.trackEvent(TRACK_EVENTS.uploadSuccess, TRACK_PAGES.upload, {
8903
+ a: resolveTrackAction2(TRACK_EVENTS.uploadSuccess),
8647
8904
  path_kind: pathKind,
8648
8905
  has_domain: true
8649
8906
  });
@@ -8659,6 +8916,7 @@ async function bindCmd() {
8659
8916
  );
8660
8917
  if (dnsResult.code !== 200) {
8661
8918
  void tracker_default.trackEvent(TRACK_EVENTS.domainBindFailed, TRACK_PAGES.domain, {
8919
+ a: resolveTrackAction2(TRACK_EVENTS.domainBindFailed),
8662
8920
  domain_type: domainType,
8663
8921
  domain_name: displayDomain,
8664
8922
  bind_source: "bind",
@@ -8668,6 +8926,7 @@ async function bindCmd() {
8668
8926
  return;
8669
8927
  }
8670
8928
  void tracker_default.trackEvent(TRACK_EVENTS.domainBindSuccess, TRACK_PAGES.domain, {
8929
+ a: resolveTrackAction2(TRACK_EVENTS.domainBindSuccess),
8671
8930
  domain_type: domainType,
8672
8931
  domain_name: displayDomain,
8673
8932
  bind_source: "bind"
@@ -8684,6 +8943,7 @@ async function bindCmd() {
8684
8943
  const ok = await bindPinmeDomain(displayDomain, up.contentHash);
8685
8944
  if (!ok) {
8686
8945
  void tracker_default.trackEvent(TRACK_EVENTS.domainBindFailed, TRACK_PAGES.domain, {
8946
+ a: resolveTrackAction2(TRACK_EVENTS.domainBindFailed),
8687
8947
  domain_type: domainType,
8688
8948
  domain_name: displayDomain,
8689
8949
  bind_source: "bind",
@@ -8693,6 +8953,7 @@ async function bindCmd() {
8693
8953
  return;
8694
8954
  }
8695
8955
  void tracker_default.trackEvent(TRACK_EVENTS.domainBindSuccess, TRACK_PAGES.domain, {
8956
+ a: resolveTrackAction2(TRACK_EVENTS.domainBindSuccess),
8696
8957
  domain_type: domainType,
8697
8958
  domain_name: displayDomain,
8698
8959
  bind_source: "bind"
@@ -8711,6 +8972,7 @@ async function bindCmd() {
8711
8972
  }
8712
8973
  } catch (e) {
8713
8974
  void tracker_default.trackEvent(TRACK_EVENTS.domainBindFailed, TRACK_PAGES.domain, {
8975
+ a: resolveTrackAction2(TRACK_EVENTS.domainBindFailed),
8714
8976
  bind_source: "bind",
8715
8977
  reason: getTrackErrorReason(e)
8716
8978
  });
@@ -8752,6 +9014,7 @@ async function loginCmd(options = {}) {
8752
9014
  console.log(import_chalk18.default.green("History merged to your account"));
8753
9015
  }
8754
9016
  void tracker_default.trackEvent(TRACK_EVENTS.cliLoginSuccess, TRACK_PAGES.login, {
9017
+ a: resolveTrackAction2(TRACK_EVENTS.cliLoginSuccess),
8755
9018
  env,
8756
9019
  has_token_address: true,
8757
9020
  merged_anonymous_history: ok
@@ -8759,6 +9022,7 @@ async function loginCmd(options = {}) {
8759
9022
  process.exit(0);
8760
9023
  } catch (e) {
8761
9024
  void tracker_default.trackEvent(TRACK_EVENTS.cliLoginFailed, TRACK_PAGES.login, {
9025
+ a: resolveTrackAction2(TRACK_EVENTS.cliLoginFailed),
8762
9026
  env,
8763
9027
  reason: getTrackErrorReason(e)
8764
9028
  });
@@ -9266,6 +9530,7 @@ Next steps:`));
9266
9530
  TRACK_EVENTS.projectCreateSuccess,
9267
9531
  TRACK_PAGES.project,
9268
9532
  {
9533
+ a: resolveTrackAction2(TRACK_EVENTS.projectCreateSuccess),
9269
9534
  project_name: workerData.project_name,
9270
9535
  template_branch: TEMPLATE_BRANCH,
9271
9536
  force: Boolean(options.force)
@@ -9277,6 +9542,7 @@ Next steps:`));
9277
9542
  TRACK_EVENTS.projectCreateFailed,
9278
9543
  TRACK_PAGES.project,
9279
9544
  {
9545
+ a: resolveTrackAction2(TRACK_EVENTS.projectCreateFailed),
9280
9546
  project_name: options.name,
9281
9547
  template_branch: TEMPLATE_BRANCH,
9282
9548
  force: Boolean(options.force),
@@ -9616,6 +9882,7 @@ async function saveCmd(options) {
9616
9882
  );
9617
9883
  console.log(import_chalk21.default.green("\nDeployment complete."));
9618
9884
  void tracker_default.trackEvent(TRACK_EVENTS.projectSaveSuccess, TRACK_PAGES.deploy, {
9885
+ a: resolveTrackAction2(TRACK_EVENTS.projectSaveSuccess),
9619
9886
  project_name: projectName,
9620
9887
  has_domain: Boolean(options.domain),
9621
9888
  domain_type: options.domain ? isDnsDomain(options.domain) ? "dns" : "pinme_subdomain" : void 0
@@ -9623,6 +9890,7 @@ async function saveCmd(options) {
9623
9890
  process.exit(0);
9624
9891
  } catch (error) {
9625
9892
  void tracker_default.trackEvent(TRACK_EVENTS.projectSaveFailed, TRACK_PAGES.deploy, {
9893
+ a: resolveTrackAction2(TRACK_EVENTS.projectSaveFailed),
9626
9894
  project_name: options.projectName || options.name,
9627
9895
  has_domain: Boolean(options.domain),
9628
9896
  reason: getTrackErrorReason(error)
@@ -9758,8 +10026,26 @@ async function updateDbCmd(options) {
9758
10026
  console.log(import_chalk22.default.gray(`Found ${sqlFiles.length} SQL file(s) in db`));
9759
10027
  await updateDb(sqlFiles, projectName);
9760
10028
  console.log(import_chalk22.default.green("\nDatabase update complete."));
10029
+ void tracker_default.trackEvent(
10030
+ TRACK_EVENTS.projectUpdateDbSuccess,
10031
+ TRACK_PAGES.deploy,
10032
+ {
10033
+ a: resolveTrackAction2(TRACK_EVENTS.projectUpdateDbSuccess),
10034
+ project_name: projectName,
10035
+ sql_file_count: sqlFiles.length
10036
+ }
10037
+ );
9761
10038
  process.exit(0);
9762
10039
  } catch (error) {
10040
+ void tracker_default.trackEvent(
10041
+ TRACK_EVENTS.projectUpdateDbFailed,
10042
+ TRACK_PAGES.deploy,
10043
+ {
10044
+ a: resolveTrackAction2(TRACK_EVENTS.projectUpdateDbFailed),
10045
+ project_name: (options == null ? void 0 : options.projectName) || (options == null ? void 0 : options.name),
10046
+ reason: getTrackErrorReason(error)
10047
+ }
10048
+ );
9763
10049
  printCliError(error, "Database update failed.");
9764
10050
  process.exit(1);
9765
10051
  }
@@ -9942,8 +10228,26 @@ async function updateWorkerCmd(options) {
9942
10228
  console.log(import_chalk23.default.gray(`SQL files: ignored (not processed for update_worker)`));
9943
10229
  await updateWorker(workerJsPath, modulePaths, metadata, projectName);
9944
10230
  console.log(import_chalk23.default.green("\nWorker update complete."));
10231
+ void tracker_default.trackEvent(
10232
+ TRACK_EVENTS.projectUpdateWorkerSuccess,
10233
+ TRACK_PAGES.deploy,
10234
+ {
10235
+ a: resolveTrackAction2(TRACK_EVENTS.projectUpdateWorkerSuccess),
10236
+ project_name: projectName,
10237
+ module_count: modulePaths.length
10238
+ }
10239
+ );
9945
10240
  process.exit(0);
9946
10241
  } catch (error) {
10242
+ void tracker_default.trackEvent(
10243
+ TRACK_EVENTS.projectUpdateWorkerFailed,
10244
+ TRACK_PAGES.deploy,
10245
+ {
10246
+ a: resolveTrackAction2(TRACK_EVENTS.projectUpdateWorkerFailed),
10247
+ project_name: (options == null ? void 0 : options.projectName) || (options == null ? void 0 : options.name),
10248
+ reason: getTrackErrorReason(error)
10249
+ }
10250
+ );
9947
10251
  printCliError(error, "Worker update failed.");
9948
10252
  process.exit(1);
9949
10253
  }
@@ -10040,6 +10344,7 @@ async function updateWebCmd(options) {
10040
10344
  TRACK_EVENTS.projectUpdateWebSuccess,
10041
10345
  TRACK_PAGES.deploy,
10042
10346
  {
10347
+ a: resolveTrackAction2(TRACK_EVENTS.projectUpdateWebSuccess),
10043
10348
  project_name: projectName
10044
10349
  }
10045
10350
  );
@@ -10049,6 +10354,7 @@ async function updateWebCmd(options) {
10049
10354
  TRACK_EVENTS.projectUpdateWebFailed,
10050
10355
  TRACK_PAGES.deploy,
10051
10356
  {
10357
+ a: resolveTrackAction2(TRACK_EVENTS.projectUpdateWebFailed),
10052
10358
  project_name: (options == null ? void 0 : options.projectName) || (options == null ? void 0 : options.name),
10053
10359
  reason: getTrackErrorReason(error)
10054
10360
  }
@@ -10138,6 +10444,7 @@ async function deleteCmd(options) {
10138
10444
  TRACK_EVENTS.projectDeleteSuccess,
10139
10445
  TRACK_PAGES.project,
10140
10446
  {
10447
+ a: resolveTrackAction2(TRACK_EVENTS.projectDeleteSuccess),
10141
10448
  project_name: data.data.project_name,
10142
10449
  domain_deleted: Boolean(data.data.domain_deleted),
10143
10450
  worker_deleted: Boolean(data.data.worker_deleted),
@@ -10161,6 +10468,7 @@ Project: ${data.data.project_name}`));
10161
10468
  TRACK_EVENTS.projectDeleteFailed,
10162
10469
  TRACK_PAGES.project,
10163
10470
  {
10471
+ a: resolveTrackAction2(TRACK_EVENTS.projectDeleteFailed),
10164
10472
  project_name: options.name || getProjectName() || void 0,
10165
10473
  force: Boolean(options.force),
10166
10474
  reason: getTrackErrorReason(error)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pinme",
3
- "version": "2.0.5-beta.1",
3
+ "version": "2.0.6-beta.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },