@solidnumber/cli 1.7.2 → 1.7.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.
Files changed (110) hide show
  1. package/dist/commands/audit.js +1 -1
  2. package/dist/commands/audit.js.map +1 -1
  3. package/dist/commands/brand.js +122 -0
  4. package/dist/commands/brand.js.map +1 -1
  5. package/dist/commands/clone.d.ts.map +1 -1
  6. package/dist/commands/clone.js +67 -0
  7. package/dist/commands/clone.js.map +1 -1
  8. package/dist/commands/completion.d.ts.map +1 -1
  9. package/dist/commands/completion.js +4 -0
  10. package/dist/commands/completion.js.map +1 -1
  11. package/dist/commands/demo.d.ts +12 -0
  12. package/dist/commands/demo.d.ts.map +1 -0
  13. package/dist/commands/demo.js +257 -0
  14. package/dist/commands/demo.js.map +1 -0
  15. package/dist/commands/init.d.ts +11 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +377 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/inventory.js +5 -5
  20. package/dist/commands/inventory.js.map +1 -1
  21. package/dist/commands/payment.js +101 -0
  22. package/dist/commands/payment.js.map +1 -1
  23. package/dist/commands/push.d.ts.map +1 -1
  24. package/dist/commands/push.js +42 -0
  25. package/dist/commands/push.js.map +1 -1
  26. package/dist/commands/sandbox.d.ts.map +1 -1
  27. package/dist/commands/sandbox.js +113 -0
  28. package/dist/commands/sandbox.js.map +1 -1
  29. package/dist/index.js +4 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/lib/config.d.ts.map +1 -1
  32. package/dist/lib/config.js +4 -4
  33. package/dist/lib/config.js.map +1 -1
  34. package/package.json +2 -1
  35. package/dist/__tests__/commands/auth.test.d.ts +0 -6
  36. package/dist/__tests__/commands/auth.test.d.ts.map +0 -1
  37. package/dist/__tests__/commands/auth.test.js +0 -91
  38. package/dist/__tests__/commands/auth.test.js.map +0 -1
  39. package/dist/__tests__/commands/billing.test.d.ts +0 -6
  40. package/dist/__tests__/commands/billing.test.d.ts.map +0 -1
  41. package/dist/__tests__/commands/billing.test.js +0 -141
  42. package/dist/__tests__/commands/billing.test.js.map +0 -1
  43. package/dist/__tests__/commands/company.test.d.ts +0 -6
  44. package/dist/__tests__/commands/company.test.d.ts.map +0 -1
  45. package/dist/__tests__/commands/company.test.js +0 -129
  46. package/dist/__tests__/commands/company.test.js.map +0 -1
  47. package/dist/__tests__/commands/deploy.test.d.ts +0 -8
  48. package/dist/__tests__/commands/deploy.test.d.ts.map +0 -1
  49. package/dist/__tests__/commands/deploy.test.js +0 -190
  50. package/dist/__tests__/commands/deploy.test.js.map +0 -1
  51. package/dist/__tests__/commands/history.test.d.ts +0 -8
  52. package/dist/__tests__/commands/history.test.d.ts.map +0 -1
  53. package/dist/__tests__/commands/history.test.js +0 -213
  54. package/dist/__tests__/commands/history.test.js.map +0 -1
  55. package/dist/__tests__/commands/import.test.d.ts +0 -4
  56. package/dist/__tests__/commands/import.test.d.ts.map +0 -1
  57. package/dist/__tests__/commands/import.test.js +0 -71
  58. package/dist/__tests__/commands/import.test.js.map +0 -1
  59. package/dist/__tests__/commands/logs.test.d.ts +0 -5
  60. package/dist/__tests__/commands/logs.test.d.ts.map +0 -1
  61. package/dist/__tests__/commands/logs.test.js +0 -124
  62. package/dist/__tests__/commands/logs.test.js.map +0 -1
  63. package/dist/__tests__/commands/migrate.test.d.ts +0 -9
  64. package/dist/__tests__/commands/migrate.test.d.ts.map +0 -1
  65. package/dist/__tests__/commands/migrate.test.js +0 -277
  66. package/dist/__tests__/commands/migrate.test.js.map +0 -1
  67. package/dist/__tests__/commands/pages.test.d.ts +0 -5
  68. package/dist/__tests__/commands/pages.test.d.ts.map +0 -1
  69. package/dist/__tests__/commands/pages.test.js +0 -103
  70. package/dist/__tests__/commands/pages.test.js.map +0 -1
  71. package/dist/__tests__/commands/push.test.d.ts +0 -6
  72. package/dist/__tests__/commands/push.test.d.ts.map +0 -1
  73. package/dist/__tests__/commands/push.test.js +0 -113
  74. package/dist/__tests__/commands/push.test.js.map +0 -1
  75. package/dist/__tests__/commands/sandbox.test.d.ts +0 -5
  76. package/dist/__tests__/commands/sandbox.test.d.ts.map +0 -1
  77. package/dist/__tests__/commands/sandbox.test.js +0 -132
  78. package/dist/__tests__/commands/sandbox.test.js.map +0 -1
  79. package/dist/__tests__/commands/serve.test.d.ts +0 -5
  80. package/dist/__tests__/commands/serve.test.d.ts.map +0 -1
  81. package/dist/__tests__/commands/serve.test.js +0 -115
  82. package/dist/__tests__/commands/serve.test.js.map +0 -1
  83. package/dist/__tests__/commands/site.test.d.ts +0 -5
  84. package/dist/__tests__/commands/site.test.d.ts.map +0 -1
  85. package/dist/__tests__/commands/site.test.js +0 -92
  86. package/dist/__tests__/commands/site.test.js.map +0 -1
  87. package/dist/__tests__/commands/test.test.d.ts +0 -5
  88. package/dist/__tests__/commands/test.test.d.ts.map +0 -1
  89. package/dist/__tests__/commands/test.test.js +0 -220
  90. package/dist/__tests__/commands/test.test.js.map +0 -1
  91. package/dist/__tests__/integration/smoke.test.d.ts +0 -7
  92. package/dist/__tests__/integration/smoke.test.d.ts.map +0 -1
  93. package/dist/__tests__/integration/smoke.test.js +0 -135
  94. package/dist/__tests__/integration/smoke.test.js.map +0 -1
  95. package/dist/__tests__/lib/api-client.test.d.ts +0 -6
  96. package/dist/__tests__/lib/api-client.test.d.ts.map +0 -1
  97. package/dist/__tests__/lib/api-client.test.js +0 -74
  98. package/dist/__tests__/lib/api-client.test.js.map +0 -1
  99. package/dist/__tests__/lib/company-isolation.test.d.ts +0 -19
  100. package/dist/__tests__/lib/company-isolation.test.d.ts.map +0 -1
  101. package/dist/__tests__/lib/company-isolation.test.js +0 -96
  102. package/dist/__tests__/lib/company-isolation.test.js.map +0 -1
  103. package/dist/__tests__/lib/config.test.d.ts +0 -6
  104. package/dist/__tests__/lib/config.test.d.ts.map +0 -1
  105. package/dist/__tests__/lib/config.test.js +0 -131
  106. package/dist/__tests__/lib/config.test.js.map +0 -1
  107. package/dist/__tests__/setup.d.ts +0 -4
  108. package/dist/__tests__/setup.d.ts.map +0 -1
  109. package/dist/__tests__/setup.js +0 -25
  110. package/dist/__tests__/setup.js.map +0 -1
@@ -1,131 +0,0 @@
1
- "use strict";
2
- /**
3
- * Config manager tests — verifies auth state, token expiry, logout, company isolation.
4
- * Mocks filesystem so no real ~/.solid/config.json is touched.
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- // Mock fs before importing config
8
- jest.mock('fs', () => ({
9
- existsSync: jest.fn(() => false),
10
- readFileSync: jest.fn(() => '{}'),
11
- writeFileSync: jest.fn(),
12
- mkdirSync: jest.fn(),
13
- chmodSync: jest.fn(),
14
- }));
15
- // Must require after mock
16
- const { ConfigManager } = jest.requireActual('../../lib/config');
17
- describe('ConfigManager', () => {
18
- // We can't instantiate ConfigManager directly since it's not exported.
19
- // Test through the exported config behavior via the mock in setup.ts.
20
- // These tests verify the LOGIC, not the instance.
21
- describe('isLoggedIn', () => {
22
- it('returns false when no token', () => {
23
- const config = { accessToken: undefined, tokenExpiresAt: undefined };
24
- const isLoggedIn = () => {
25
- if (!config.accessToken)
26
- return false;
27
- if (config.tokenExpiresAt && config.tokenExpiresAt < new Date())
28
- return false;
29
- return true;
30
- };
31
- expect(isLoggedIn()).toBe(false);
32
- });
33
- it('returns true when token exists and not expired', () => {
34
- const config = {
35
- accessToken: 'valid_token',
36
- tokenExpiresAt: new Date(Date.now() + 3600000),
37
- };
38
- const isLoggedIn = () => {
39
- if (!config.accessToken)
40
- return false;
41
- if (config.tokenExpiresAt && config.tokenExpiresAt < new Date())
42
- return false;
43
- return true;
44
- };
45
- expect(isLoggedIn()).toBe(true);
46
- });
47
- it('returns false when token is expired', () => {
48
- const config = {
49
- accessToken: 'expired_token',
50
- tokenExpiresAt: new Date(Date.now() - 3600000), // 1 hour ago
51
- };
52
- const isLoggedIn = () => {
53
- if (!config.accessToken)
54
- return false;
55
- if (config.tokenExpiresAt && config.tokenExpiresAt < new Date())
56
- return false;
57
- return true;
58
- };
59
- expect(isLoggedIn()).toBe(false);
60
- });
61
- it('returns true when token exists with no expiry', () => {
62
- const config = {
63
- accessToken: 'api_key_no_expiry',
64
- tokenExpiresAt: undefined,
65
- };
66
- const isLoggedIn = () => {
67
- if (!config.accessToken)
68
- return false;
69
- if (config.tokenExpiresAt && config.tokenExpiresAt < new Date())
70
- return false;
71
- return true;
72
- };
73
- expect(isLoggedIn()).toBe(true);
74
- });
75
- });
76
- describe('logout', () => {
77
- it('clears all auth fields', () => {
78
- const data = {
79
- api_url: 'https://api.solidnumber.com',
80
- environment: 'production',
81
- access_token: 'token',
82
- refresh_token: 'refresh',
83
- token_expires_at: '2026-01-01',
84
- user_id: 1,
85
- user_email: 'test@test.com',
86
- company_id: 42,
87
- companies: [{ id: 1, name: 'Test', role: 'owner' }],
88
- };
89
- // Simulate logout
90
- delete data.access_token;
91
- delete data.refresh_token;
92
- delete data.token_expires_at;
93
- delete data.user_id;
94
- delete data.user_email;
95
- delete data.company_id;
96
- delete data.companies;
97
- expect(data.access_token).toBeUndefined();
98
- expect(data.refresh_token).toBeUndefined();
99
- expect(data.user_id).toBeUndefined();
100
- expect(data.company_id).toBeUndefined();
101
- expect(data.companies).toBeUndefined();
102
- // api_url and environment should survive logout
103
- expect(data.api_url).toBe('https://api.solidnumber.com');
104
- expect(data.environment).toBe('production');
105
- });
106
- });
107
- describe('company isolation', () => {
108
- it('company_id is always scoped — never undefined in active session', () => {
109
- const config = { companyId: 99999 };
110
- expect(config.companyId).toBeDefined();
111
- expect(typeof config.companyId).toBe('number');
112
- });
113
- it('setting companyId to undefined removes it', () => {
114
- const data = { company_id: 42 };
115
- // Simulate set companyId(undefined)
116
- delete data.company_id;
117
- expect(data.company_id).toBeUndefined();
118
- });
119
- });
120
- describe('file security', () => {
121
- it('config dir created with 0o700 (user-only)', () => {
122
- // The actual ConfigManager calls mkdirSync with mode 0o700
123
- // We verify the expected mode constant
124
- expect(0o700).toBe(448); // rwx------
125
- });
126
- it('config file created with 0o600 (user read/write only)', () => {
127
- expect(0o600).toBe(384); // rw-------
128
- });
129
- });
130
- });
131
- //# sourceMappingURL=config.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../../src/__tests__/lib/config.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- /**
2
- * Global test setup — prevents tests from touching real config, real API, or real companies.
3
- */
4
- //# sourceMappingURL=setup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,25 +0,0 @@
1
- "use strict";
2
- /**
3
- * Global test setup — prevents tests from touching real config, real API, or real companies.
4
- */
5
- // Mock config — prevents filesystem access to ~/.solid/
6
- jest.mock('../lib/config', () => ({
7
- config: {
8
- apiUrl: 'https://test-api.solidnumber.com',
9
- companyId: 99999,
10
- accessToken: 'test_token_do_not_use_in_production',
11
- refreshToken: 'test_refresh_token',
12
- tokenExpiresAt: new Date(Date.now() + 3600000),
13
- userId: 1,
14
- userEmail: 'test@solidnumber.com',
15
- environment: 'development',
16
- companies: [],
17
- isLoggedIn: jest.fn(() => true),
18
- logout: jest.fn(),
19
- },
20
- }));
21
- // Mock process.exit so it throws instead of killing the test runner
22
- jest.spyOn(process, 'exit').mockImplementation((() => {
23
- throw new Error('process.exit called');
24
- }));
25
- //# sourceMappingURL=setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":";AAAA;;GAEG;AAEH,wDAAwD;AACxD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,MAAM,EAAE;QACN,MAAM,EAAE,kCAAkC;QAC1C,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,qCAAqC;QAClD,YAAY,EAAE,oBAAoB;QAClC,cAAc,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;QAC9C,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,sBAAsB;QACjC,WAAW,EAAE,aAAa;QAC1B,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QAC/B,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;KAClB;CACF,CAAC,CAAC,CAAC;AAEJ,oEAAoE;AACpE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE;IACnD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;AACzC,CAAC,CAAQ,CAAC,CAAC"}