@cimplify/cli 0.13.1 → 0.13.3

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.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { startTunnelRuntime } from './chunk-ZX5ZEOEU.mjs';
2
+ import { startTunnelRuntime } from './chunk-KNTFZ6LD.mjs';
3
3
  import { info } from './chunk-ZPVN6UXL.mjs';
4
4
 
5
5
  // src/commands/agent.ts
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { gitDetectRoot, gitCurrentBranch, gitCurrentSha, gitStatusPorcelain } from './chunk-OVHZV57L.mjs';
3
3
  import { parseEnvFile } from './chunk-5U5OXOPN.mjs';
4
- import { package_default } from './chunk-AMREB4KE.mjs';
4
+ import { package_default } from './chunk-QKDCMUWP.mjs';
5
5
  import { parseArgs } from './chunk-C4M3DXKC.mjs';
6
6
  import { readAuthOrNull, readProjectLinkOrNull, readProjectState } from './chunk-QA36VSLX.mjs';
7
7
  import { bold, dim, yellow, green, info, result, red } from './chunk-ZPVN6UXL.mjs';
@@ -4,6 +4,7 @@ import { promises, watch } from 'fs';
4
4
  import path2 from 'path';
5
5
  import http from 'http';
6
6
  import { spawn } from 'child_process';
7
+ import { createHash } from 'crypto';
7
8
 
8
9
  var TUNNEL_URL_ENV = "CIMPLIFY_TUNNEL_URL";
9
10
  var TUNNEL_TOKEN_ENV = "CIMPLIFY_TUNNEL_TOKEN";
@@ -617,10 +618,16 @@ var ControlSession = class {
617
618
  const paths = Array.isArray(request.paths) ? request.paths : [WORKSPACE_ROOT];
618
619
  this.watch = this.deps.watcher.start(
619
620
  paths,
620
- (type, changed) => {
621
+ (type, changed, hashes) => {
621
622
  if (this.epoch !== epoch) return;
622
623
  this.seq += 1;
623
- this.send({ event: type, paths: changed, seq: this.seq, epoch });
624
+ this.send({
625
+ event: type,
626
+ paths: changed,
627
+ ...hashes ? { hashes } : {},
628
+ seq: this.seq,
629
+ epoch
630
+ });
624
631
  },
625
632
  () => {
626
633
  if (this.epoch !== epoch) return;
@@ -726,6 +733,10 @@ var NodeControlFs = class {
726
733
  }
727
734
  };
728
735
  var WATCH_DEBOUNCE_MS = 60;
736
+ var MAX_WATCH_PENDING_PATHS = 4096;
737
+ var MAX_WATCH_TRACKED_PATHS = 1e5;
738
+ var CONTENT_HASH_ALGORITHM = "sha256";
739
+ var CONTENT_HASH_ENCODING = "hex";
729
740
  var NodeControlWatcher = class {
730
741
  constructor(root) {
731
742
  this.root = root;
@@ -734,38 +745,83 @@ var NodeControlWatcher = class {
734
745
  start(_relPaths, onEvent, onResync) {
735
746
  let watcher;
736
747
  const pending = /* @__PURE__ */ new Map();
737
- const flush = (rel) => {
748
+ const versions = /* @__PURE__ */ new Map();
749
+ const observed = /* @__PURE__ */ new Map();
750
+ let stopped = false;
751
+ const clearTracking = () => {
752
+ for (const timer of pending.values()) clearTimeout(timer);
753
+ pending.clear();
754
+ versions.clear();
755
+ observed.clear();
756
+ };
757
+ const requestResync = () => {
758
+ clearTracking();
759
+ if (!stopped) onResync();
760
+ };
761
+ const flush = async (rel, version) => {
738
762
  pending.delete(rel);
739
- promises.stat(path2.join(this.root, rel)).then(
740
- (stat) => onEvent(stat.isDirectory() ? WATCH_EVENT.ADD : WATCH_EVENT.CHANGE, [rel]),
741
- () => onEvent(WATCH_EVENT.REMOVE, [rel])
742
- );
763
+ try {
764
+ const absolute = path2.join(this.root, rel);
765
+ const stat = await promises.stat(absolute);
766
+ if (stat.isDirectory()) return;
767
+ const bytes = await promises.readFile(absolute);
768
+ if (stopped || versions.get(rel) !== version) return;
769
+ const hash = createHash(CONTENT_HASH_ALGORITHM).update(bytes).digest(CONTENT_HASH_ENCODING);
770
+ if (observed.get(rel) === hash) return;
771
+ observed.set(rel, hash);
772
+ onEvent(WATCH_EVENT.CHANGE, [rel], { [rel]: hash });
773
+ } catch (error) {
774
+ if (stopped || versions.get(rel) !== version) return;
775
+ if (error.code === "ENOENT") {
776
+ if (observed.get(rel) === null) return;
777
+ observed.set(rel, null);
778
+ onEvent(WATCH_EVENT.REMOVE, [rel]);
779
+ } else {
780
+ requestResync();
781
+ }
782
+ }
783
+ if (observed.size > MAX_WATCH_TRACKED_PATHS) {
784
+ requestResync();
785
+ }
743
786
  };
744
787
  try {
745
788
  watcher = watch(this.root, { recursive: true }, (_type, filename) => {
746
789
  if (filename === null) {
747
- onResync();
790
+ requestResync();
748
791
  return;
749
792
  }
750
793
  const rel = filename.toString().split(path2.sep).join("/");
751
794
  if (isIgnored(rel)) return;
752
795
  const existing = pending.get(rel);
753
796
  if (existing) clearTimeout(existing);
797
+ if (!existing && pending.size >= MAX_WATCH_PENDING_PATHS) {
798
+ requestResync();
799
+ return;
800
+ }
801
+ const version = (versions.get(rel) ?? 0) + 1;
802
+ versions.set(rel, version);
803
+ if (versions.size > MAX_WATCH_TRACKED_PATHS) {
804
+ requestResync();
805
+ return;
806
+ }
754
807
  pending.set(
755
808
  rel,
756
- setTimeout(() => flush(rel), WATCH_DEBOUNCE_MS)
809
+ setTimeout(() => void flush(rel, version), WATCH_DEBOUNCE_MS)
757
810
  );
758
811
  });
759
812
  } catch (error) {
760
- onResync();
761
- return { stop: () => {
762
- } };
813
+ throw new ControlFsError(
814
+ CONTROL_ERROR.IO,
815
+ `failed to start workspace watcher: ${error instanceof Error ? error.message : String(error)}`
816
+ );
763
817
  }
764
- watcher.on("error", () => onResync());
818
+ watcher.on("error", () => {
819
+ requestResync();
820
+ });
765
821
  return {
766
822
  stop: () => {
767
- for (const timer of pending.values()) clearTimeout(timer);
768
- pending.clear();
823
+ stopped = true;
824
+ clearTracking();
769
825
  watcher.close();
770
826
  }
771
827
  };
@@ -811,7 +867,8 @@ function tryDecodeUtf8(bytes) {
811
867
  }
812
868
  function rethrow(rel) {
813
869
  return (error) => {
814
- if (error.code === "ENOENT") throw new ControlFsError(CONTROL_ERROR.NOT_FOUND, `not found: ${rel}`);
870
+ if (error.code === "ENOENT")
871
+ throw new ControlFsError(CONTROL_ERROR.NOT_FOUND, `not found: ${rel}`);
815
872
  if (error.code === "EACCES") throw new ControlFsError(CONTROL_ERROR.PERMISSION_DENIED, rel);
816
873
  throw new ControlFsError(CONTROL_ERROR.IO, error.message);
817
874
  };
@@ -2,7 +2,7 @@
2
2
  // package.json
3
3
  var package_default = {
4
4
  name: "@cimplify/cli",
5
- version: "0.13.1",
5
+ version: "0.13.3",
6
6
  description: "Cimplify CLI \u2014 deploy, manage env vars, link projects, and scaffold storefronts",
7
7
  keywords: [
8
8
  "cimplify",
@@ -38,6 +38,13 @@ var package_default = {
38
38
  test: "vitest",
39
39
  "test:run": "vitest run"
40
40
  },
41
+ dependencies: {
42
+ "@babel/generator": "^8.0.0",
43
+ "@babel/parser": "^8.0.4",
44
+ "@babel/traverse": "^8.0.4",
45
+ "@babel/types": "^8.0.4",
46
+ "@cimplify/sdk": "^0.99.2"
47
+ },
41
48
  devDependencies: {
42
49
  "@aws-sdk/client-s3": "^3.1070.0",
43
50
  "@types/babel__generator": "^7.27.0",
@@ -47,13 +54,6 @@ var package_default = {
47
54
  tsup: "^8.5.1",
48
55
  typescript: "6.0.3",
49
56
  vitest: "^4.1.9"
50
- },
51
- dependencies: {
52
- "@babel/generator": "^8.0.0",
53
- "@babel/parser": "^8.0.4",
54
- "@babel/traverse": "^8.0.4",
55
- "@babel/types": "^8.0.4",
56
- "@cimplify/sdk": "^0.99.2"
57
57
  }
58
58
  };
59
59
 
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { startTunnelRuntime, TUNNEL_URL_ENV } from './chunk-ZX5ZEOEU.mjs';
2
+ import { startTunnelRuntime, TUNNEL_URL_ENV } from './chunk-KNTFZ6LD.mjs';
3
3
  import { parseEnvFile, formatEnvFile } from './chunk-5U5OXOPN.mjs';
4
4
  import { ENV_SCOPE, PUBLIC_ENV_PREFIX } from './chunk-MXYUAJEW.mjs';
5
5
  import { parseArgs, flagBool } from './chunk-C4M3DXKC.mjs';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { TEMPLATES } from './chunk-SVJPU4K7.mjs';
3
- import { package_default } from './chunk-AMREB4KE.mjs';
3
+ import { package_default } from './chunk-QKDCMUWP.mjs';
4
4
 
5
5
  // src/dispatcher.ts
6
6
  var VERSION = package_default.version ?? "unknown";
@@ -143,19 +143,19 @@ var COMMANDS = {
143
143
  domains: () => import('./domains-OS3DXSDN.mjs'),
144
144
  logs: () => import('./logs-YNXDXAF7.mjs'),
145
145
  status: () => import('./status-RR3GGTVU.mjs'),
146
- dev: () => import('./dev-WSX75ELC.mjs'),
147
- agent: () => import('./agent-UTARR75F.mjs'),
146
+ dev: () => import('./dev-SYFBDJSY.mjs'),
147
+ agent: () => import('./agent-CEYZNYXA.mjs'),
148
148
  mock: () => import('./mock-HFVAAYK2.mjs'),
149
- introspect: () => import('./introspect-HGX4I3XQ.mjs'),
149
+ introspect: () => import('./introspect-D4473WPV.mjs'),
150
150
  inspect: () => import('./inspect-ULWQHT7J.mjs'),
151
- doctor: () => import('./doctor-QFCEYEEZ.mjs'),
152
- explain: () => import('./explain-BZPONVN3.mjs'),
151
+ doctor: () => import('./doctor-QPCWLW4L.mjs'),
152
+ explain: () => import('./explain-XB67PYQQ.mjs'),
153
153
  assets: () => import('./assets-Y4JE6MSG.mjs'),
154
154
  repo: () => import('./repo-OK6CVG3G.mjs'),
155
155
  list: () => import('./list-DZTPWNU3.mjs'),
156
156
  add: () => import('./add-F7GKDXAD.mjs'),
157
- update: () => import('./update-2FSGAVDH.mjs'),
158
- upgrade: () => import('./update-2FSGAVDH.mjs'),
157
+ update: () => import('./update-B5HANRBK.mjs'),
158
+ upgrade: () => import('./update-B5HANRBK.mjs'),
159
159
  "auth-step-up": () => import('./auth-step-up-EHL5PM2L.mjs')
160
160
  };
161
161
  var COMMAND_PREFIXES = {
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import { gatherIntrospection } from './chunk-2VK4UABO.mjs';
2
+ import { gatherIntrospection } from './chunk-72VM62IN.mjs';
3
3
  import './chunk-OVHZV57L.mjs';
4
4
  import './chunk-5U5OXOPN.mjs';
5
- import './chunk-AMREB4KE.mjs';
5
+ import './chunk-QKDCMUWP.mjs';
6
6
  import { parseArgs, flagBool } from './chunk-C4M3DXKC.mjs';
7
7
  import { SDK_ENV_API_URL, DEFAULT_API_BASE_URL, ApiClient, ENV_API_BASE_URL } from './chunk-JPXK5BLA.mjs';
8
8
  import { readAuthOrNull } from './chunk-QA36VSLX.mjs';
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { package_default } from './chunk-AMREB4KE.mjs';
2
+ import { package_default } from './chunk-QKDCMUWP.mjs';
3
3
  import { parseArgs } from './chunk-C4M3DXKC.mjs';
4
4
  import { CliError, CLI_ERROR_CODE } from './chunk-YPC4VU65.mjs';
5
5
  import { bold, dim, info, result } from './chunk-ZPVN6UXL.mjs';
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- export { run as default, extractMockSeed, gatherIntrospection, renderIntrospection } from './chunk-2VK4UABO.mjs';
2
+ export { run as default, extractMockSeed, gatherIntrospection, renderIntrospection } from './chunk-72VM62IN.mjs';
3
3
  import './chunk-OVHZV57L.mjs';
4
4
  import './chunk-5U5OXOPN.mjs';
5
- import './chunk-AMREB4KE.mjs';
5
+ import './chunk-QKDCMUWP.mjs';
6
6
  import './chunk-C4M3DXKC.mjs';
7
7
  import './chunk-QA36VSLX.mjs';
8
8
  import './chunk-YPC4VU65.mjs';
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { package_default } from './chunk-AMREB4KE.mjs';
2
+ import { package_default } from './chunk-QKDCMUWP.mjs';
3
3
  import { promptYesNo } from './chunk-4YIFBYBV.mjs';
4
4
  import { parseArgs, flagBool, flagString } from './chunk-C4M3DXKC.mjs';
5
5
  import { CliError, CLI_ERROR_CODE } from './chunk-YPC4VU65.mjs';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cimplify/cli",
3
- "version": "0.13.1",
4
- "description": "Cimplify CLI \u2014 deploy, manage env vars, link projects, and scaffold storefronts",
3
+ "version": "0.13.3",
4
+ "description": "Cimplify CLI — deploy, manage env vars, link projects, and scaffold storefronts",
5
5
  "keywords": [
6
6
  "cimplify",
7
7
  "cli",
@@ -36,6 +36,13 @@
36
36
  "test": "vitest",
37
37
  "test:run": "vitest run"
38
38
  },
39
+ "dependencies": {
40
+ "@babel/generator": "^8.0.0",
41
+ "@babel/parser": "^8.0.4",
42
+ "@babel/traverse": "^8.0.4",
43
+ "@babel/types": "^8.0.4",
44
+ "@cimplify/sdk": "^0.99.2"
45
+ },
39
46
  "devDependencies": {
40
47
  "@aws-sdk/client-s3": "^3.1070.0",
41
48
  "@types/babel__generator": "^7.27.0",
@@ -45,12 +52,5 @@
45
52
  "tsup": "^8.5.1",
46
53
  "typescript": "6.0.3",
47
54
  "vitest": "^4.1.9"
48
- },
49
- "dependencies": {
50
- "@babel/generator": "^8.0.0",
51
- "@babel/parser": "^8.0.4",
52
- "@babel/traverse": "^8.0.4",
53
- "@babel/types": "^8.0.4",
54
- "@cimplify/sdk": "^0.99.2"
55
55
  }
56
56
  }