@objectstack/cli 4.0.4 → 4.1.0

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 (269) hide show
  1. package/README.md +44 -25
  2. package/dist/commands/build.d.ts +5 -0
  3. package/dist/commands/build.d.ts.map +1 -0
  4. package/dist/commands/build.js +6 -0
  5. package/dist/commands/build.js.map +1 -0
  6. package/dist/commands/cloud/login.d.ts +16 -0
  7. package/dist/commands/cloud/login.d.ts.map +1 -0
  8. package/dist/commands/cloud/login.js +166 -0
  9. package/dist/commands/cloud/login.js.map +1 -0
  10. package/dist/commands/cloud/logout.d.ts +15 -0
  11. package/dist/commands/cloud/logout.d.ts.map +1 -0
  12. package/dist/commands/cloud/logout.js +51 -0
  13. package/dist/commands/cloud/logout.js.map +1 -0
  14. package/dist/commands/cloud/whoami.d.ts +15 -0
  15. package/dist/commands/cloud/whoami.d.ts.map +1 -0
  16. package/dist/commands/cloud/whoami.js +81 -0
  17. package/dist/commands/cloud/whoami.js.map +1 -0
  18. package/dist/commands/compile.d.ts +3 -0
  19. package/dist/commands/compile.d.ts.map +1 -1
  20. package/dist/commands/compile.js +128 -6
  21. package/dist/commands/compile.js.map +1 -1
  22. package/dist/commands/create.js +1 -1
  23. package/dist/commands/data/create.js +2 -2
  24. package/dist/commands/data/create.js.map +1 -1
  25. package/dist/commands/data/delete.js +2 -2
  26. package/dist/commands/data/delete.js.map +1 -1
  27. package/dist/commands/data/get.js +2 -2
  28. package/dist/commands/data/get.js.map +1 -1
  29. package/dist/commands/data/query.js +2 -2
  30. package/dist/commands/data/query.js.map +1 -1
  31. package/dist/commands/data/update.js +2 -2
  32. package/dist/commands/data/update.js.map +1 -1
  33. package/dist/commands/dev.d.ts +9 -0
  34. package/dist/commands/dev.d.ts.map +1 -1
  35. package/dist/commands/dev.js +116 -22
  36. package/dist/commands/dev.js.map +1 -1
  37. package/dist/commands/generate.js +9 -9
  38. package/dist/commands/generate.js.map +1 -1
  39. package/dist/commands/i18n/check.d.ts +18 -0
  40. package/dist/commands/i18n/check.d.ts.map +1 -0
  41. package/dist/commands/i18n/check.js +153 -0
  42. package/dist/commands/i18n/check.js.map +1 -0
  43. package/dist/commands/init.js +2 -2
  44. package/dist/commands/lint.d.ts +3 -0
  45. package/dist/commands/lint.d.ts.map +1 -1
  46. package/dist/commands/lint.js +24 -0
  47. package/dist/commands/lint.js.map +1 -1
  48. package/dist/commands/login.d.ts +17 -0
  49. package/dist/commands/login.d.ts.map +1 -0
  50. package/dist/commands/login.js +313 -0
  51. package/dist/commands/login.js.map +1 -0
  52. package/dist/commands/logout.d.ts.map +1 -0
  53. package/dist/commands/{auth/logout.js → logout.js} +14 -2
  54. package/dist/commands/logout.js.map +1 -0
  55. package/dist/commands/meta/delete.js +2 -2
  56. package/dist/commands/meta/delete.js.map +1 -1
  57. package/dist/commands/meta/get.js +2 -2
  58. package/dist/commands/meta/get.js.map +1 -1
  59. package/dist/commands/meta/list.js +2 -2
  60. package/dist/commands/meta/list.js.map +1 -1
  61. package/dist/commands/meta/register.js +2 -2
  62. package/dist/commands/meta/register.js.map +1 -1
  63. package/dist/commands/package/publish.d.ts +32 -0
  64. package/dist/commands/package/publish.d.ts.map +1 -0
  65. package/dist/commands/package/publish.js +324 -0
  66. package/dist/commands/package/publish.js.map +1 -0
  67. package/dist/commands/projects/bind.d.ts +30 -0
  68. package/dist/commands/projects/bind.d.ts.map +1 -0
  69. package/dist/commands/projects/bind.js +132 -0
  70. package/dist/commands/projects/bind.js.map +1 -0
  71. package/dist/commands/projects/create.d.ts +28 -0
  72. package/dist/commands/projects/create.d.ts.map +1 -0
  73. package/dist/commands/projects/create.js +120 -0
  74. package/dist/commands/projects/create.js.map +1 -0
  75. package/dist/commands/projects/list.d.ts +21 -0
  76. package/dist/commands/projects/list.d.ts.map +1 -0
  77. package/dist/commands/projects/list.js +79 -0
  78. package/dist/commands/projects/list.js.map +1 -0
  79. package/dist/commands/projects/projects.test.d.ts +2 -0
  80. package/dist/commands/projects/projects.test.d.ts.map +1 -0
  81. package/dist/commands/projects/projects.test.js +56 -0
  82. package/dist/commands/projects/projects.test.js.map +1 -0
  83. package/dist/commands/projects/show.d.ts +21 -0
  84. package/dist/commands/projects/show.d.ts.map +1 -0
  85. package/dist/commands/projects/show.js +72 -0
  86. package/dist/commands/projects/show.js.map +1 -0
  87. package/dist/commands/projects/switch.d.ts +24 -0
  88. package/dist/commands/projects/switch.d.ts.map +1 -0
  89. package/dist/commands/projects/switch.js +64 -0
  90. package/dist/commands/projects/switch.js.map +1 -0
  91. package/dist/commands/publish.d.ts +17 -0
  92. package/dist/commands/publish.d.ts.map +1 -0
  93. package/dist/commands/publish.js +135 -0
  94. package/dist/commands/publish.js.map +1 -0
  95. package/dist/commands/{auth/login.d.ts → register.d.ts} +3 -2
  96. package/dist/commands/register.d.ts.map +1 -0
  97. package/dist/commands/{auth/login.js → register.js} +44 -61
  98. package/dist/commands/register.js.map +1 -0
  99. package/dist/commands/rollback.d.ts +13 -0
  100. package/dist/commands/rollback.d.ts.map +1 -0
  101. package/dist/commands/rollback.js +77 -0
  102. package/dist/commands/rollback.js.map +1 -0
  103. package/dist/commands/serve.d.ts +22 -0
  104. package/dist/commands/serve.d.ts.map +1 -1
  105. package/dist/commands/serve.js +1173 -58
  106. package/dist/commands/serve.js.map +1 -1
  107. package/dist/commands/start.d.ts +18 -0
  108. package/dist/commands/start.d.ts.map +1 -0
  109. package/dist/commands/start.js +112 -0
  110. package/dist/commands/start.js.map +1 -0
  111. package/dist/commands/whoami.d.ts.map +1 -0
  112. package/dist/commands/{auth/whoami.js → whoami.js} +5 -5
  113. package/dist/commands/whoami.js.map +1 -0
  114. package/dist/index.d.ts +11 -4
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +14 -5
  117. package/dist/index.js.map +1 -1
  118. package/dist/utils/account.d.ts +31 -0
  119. package/dist/utils/account.d.ts.map +1 -0
  120. package/dist/utils/account.js +154 -0
  121. package/dist/utils/account.js.map +1 -0
  122. package/dist/utils/api-client.d.ts +10 -4
  123. package/dist/utils/api-client.d.ts.map +1 -1
  124. package/dist/utils/api-client.js +13 -7
  125. package/dist/utils/api-client.js.map +1 -1
  126. package/dist/utils/auth-config.d.ts +6 -0
  127. package/dist/utils/auth-config.d.ts.map +1 -1
  128. package/dist/utils/auth-config.js.map +1 -1
  129. package/dist/utils/auth-flows.d.ts +31 -0
  130. package/dist/utils/auth-flows.d.ts.map +1 -0
  131. package/dist/utils/auth-flows.js +151 -0
  132. package/dist/utils/auth-flows.js.map +1 -0
  133. package/dist/utils/build-runtime.d.ts +45 -0
  134. package/dist/utils/build-runtime.d.ts.map +1 -0
  135. package/dist/utils/build-runtime.js +154 -0
  136. package/dist/utils/build-runtime.js.map +1 -0
  137. package/dist/utils/cloud-config.d.ts +24 -0
  138. package/dist/utils/cloud-config.d.ts.map +1 -0
  139. package/dist/utils/cloud-config.js +75 -0
  140. package/dist/utils/cloud-config.js.map +1 -0
  141. package/dist/utils/config.d.ts.map +1 -1
  142. package/dist/utils/config.js +17 -2
  143. package/dist/utils/config.js.map +1 -1
  144. package/dist/utils/console.d.ts +33 -0
  145. package/dist/utils/console.d.ts.map +1 -0
  146. package/dist/utils/console.js +172 -0
  147. package/dist/utils/console.js.map +1 -0
  148. package/dist/utils/extract-hook-body.d.ts +13 -0
  149. package/dist/utils/extract-hook-body.d.ts.map +1 -0
  150. package/dist/utils/extract-hook-body.js +175 -0
  151. package/dist/utils/extract-hook-body.js.map +1 -0
  152. package/dist/utils/format.d.ts +8 -0
  153. package/dist/utils/format.d.ts.map +1 -1
  154. package/dist/utils/format.js +15 -2
  155. package/dist/utils/format.js.map +1 -1
  156. package/dist/utils/i18n-coverage.d.ts +61 -0
  157. package/dist/utils/i18n-coverage.d.ts.map +1 -0
  158. package/dist/utils/i18n-coverage.js +176 -0
  159. package/dist/utils/i18n-coverage.js.map +1 -0
  160. package/dist/utils/lower-callables.d.ts +17 -0
  161. package/dist/utils/lower-callables.d.ts.map +1 -0
  162. package/dist/utils/lower-callables.js +181 -0
  163. package/dist/utils/lower-callables.js.map +1 -0
  164. package/dist/utils/plugin-detection.d.ts +1 -0
  165. package/dist/utils/plugin-detection.d.ts.map +1 -1
  166. package/dist/utils/plugin-detection.js +41 -0
  167. package/dist/utils/plugin-detection.js.map +1 -1
  168. package/dist/utils/studio.d.ts +1 -0
  169. package/dist/utils/studio.d.ts.map +1 -1
  170. package/dist/utils/studio.js +24 -9
  171. package/dist/utils/studio.js.map +1 -1
  172. package/package.json +60 -22
  173. package/.turbo/turbo-build.log +0 -4
  174. package/CHANGELOG.md +0 -821
  175. package/bin/run-dev.js +0 -5
  176. package/dist/commands/auth/login.d.ts.map +0 -1
  177. package/dist/commands/auth/login.js.map +0 -1
  178. package/dist/commands/auth/logout.d.ts.map +0 -1
  179. package/dist/commands/auth/logout.js.map +0 -1
  180. package/dist/commands/auth/whoami.d.ts.map +0 -1
  181. package/dist/commands/auth/whoami.js.map +0 -1
  182. package/dist/commands/codemod/v2-to-v3.d.ts +0 -10
  183. package/dist/commands/codemod/v2-to-v3.d.ts.map +0 -1
  184. package/dist/commands/codemod/v2-to-v3.js +0 -145
  185. package/dist/commands/codemod/v2-to-v3.js.map +0 -1
  186. package/dist/commands/plugin/add.d.ts +0 -22
  187. package/dist/commands/plugin/add.d.ts.map +0 -1
  188. package/dist/commands/plugin/add.js +0 -93
  189. package/dist/commands/plugin/add.js.map +0 -1
  190. package/dist/commands/plugin/build.d.ts +0 -29
  191. package/dist/commands/plugin/build.d.ts.map +0 -1
  192. package/dist/commands/plugin/build.js +0 -170
  193. package/dist/commands/plugin/build.js.map +0 -1
  194. package/dist/commands/plugin/info.d.ts +0 -10
  195. package/dist/commands/plugin/info.d.ts.map +0 -1
  196. package/dist/commands/plugin/info.js +0 -65
  197. package/dist/commands/plugin/info.js.map +0 -1
  198. package/dist/commands/plugin/list.d.ts +0 -13
  199. package/dist/commands/plugin/list.d.ts.map +0 -1
  200. package/dist/commands/plugin/list.js +0 -78
  201. package/dist/commands/plugin/list.js.map +0 -1
  202. package/dist/commands/plugin/publish.d.ts +0 -27
  203. package/dist/commands/plugin/publish.d.ts.map +0 -1
  204. package/dist/commands/plugin/publish.js +0 -152
  205. package/dist/commands/plugin/publish.js.map +0 -1
  206. package/dist/commands/plugin/remove.d.ts +0 -20
  207. package/dist/commands/plugin/remove.d.ts.map +0 -1
  208. package/dist/commands/plugin/remove.js +0 -79
  209. package/dist/commands/plugin/remove.js.map +0 -1
  210. package/dist/commands/plugin/validate.d.ts +0 -23
  211. package/dist/commands/plugin/validate.d.ts.map +0 -1
  212. package/dist/commands/plugin/validate.js +0 -251
  213. package/dist/commands/plugin/validate.js.map +0 -1
  214. package/src/bin.ts +0 -13
  215. package/src/commands/auth/login.ts +0 -188
  216. package/src/commands/auth/logout.ts +0 -51
  217. package/src/commands/auth/whoami.ts +0 -85
  218. package/src/commands/codemod/v2-to-v3.ts +0 -171
  219. package/src/commands/compile.ts +0 -114
  220. package/src/commands/create.ts +0 -281
  221. package/src/commands/data/create.ts +0 -110
  222. package/src/commands/data/delete.ts +0 -84
  223. package/src/commands/data/get.ts +0 -84
  224. package/src/commands/data/query.ts +0 -127
  225. package/src/commands/data/update.ts +0 -114
  226. package/src/commands/dev.ts +0 -83
  227. package/src/commands/diff.ts +0 -294
  228. package/src/commands/doctor.ts +0 -572
  229. package/src/commands/explain.ts +0 -412
  230. package/src/commands/generate.ts +0 -924
  231. package/src/commands/info.ts +0 -124
  232. package/src/commands/init.ts +0 -327
  233. package/src/commands/lint.ts +0 -315
  234. package/src/commands/meta/delete.ts +0 -79
  235. package/src/commands/meta/get.ts +0 -73
  236. package/src/commands/meta/list.ts +0 -105
  237. package/src/commands/meta/register.ts +0 -97
  238. package/src/commands/plugin/add.ts +0 -112
  239. package/src/commands/plugin/build.ts +0 -193
  240. package/src/commands/plugin/info.ts +0 -79
  241. package/src/commands/plugin/list.ts +0 -93
  242. package/src/commands/plugin/publish.ts +0 -176
  243. package/src/commands/plugin/remove.ts +0 -97
  244. package/src/commands/plugin/validate.ts +0 -268
  245. package/src/commands/serve.ts +0 -411
  246. package/src/commands/studio.ts +0 -52
  247. package/src/commands/test.ts +0 -135
  248. package/src/commands/validate.ts +0 -143
  249. package/src/index.ts +0 -22
  250. package/src/utils/api-client.ts +0 -88
  251. package/src/utils/auth-config.ts +0 -107
  252. package/src/utils/config.ts +0 -80
  253. package/src/utils/format.ts +0 -267
  254. package/src/utils/output-formatter.ts +0 -91
  255. package/src/utils/plugin-detection.ts +0 -16
  256. package/src/utils/plugin-helpers.ts +0 -37
  257. package/src/utils/studio.ts +0 -350
  258. package/test/commands.test.ts +0 -128
  259. package/test/create.test.ts +0 -25
  260. package/test/plugin-commands.test.ts +0 -44
  261. package/test/plugin.test.ts +0 -169
  262. package/test/remote-api-commands.test.ts +0 -188
  263. package/test/remote-api-utils.test.ts +0 -196
  264. package/test/serve-host-config.test.ts +0 -77
  265. package/tsconfig.build.json +0 -20
  266. package/tsconfig.json +0 -25
  267. package/tsup.config.ts +0 -23
  268. /package/dist/commands/{auth/logout.d.ts → logout.d.ts} +0 -0
  269. /package/dist/commands/{auth/whoami.d.ts → whoami.d.ts} +0 -0
@@ -4,13 +4,18 @@ import { ObjectStackClient } from '@objectstack/client';
4
4
  */
5
5
  export interface ApiClientOptions {
6
6
  /**
7
- * Server URL (defaults to OBJECTSTACK_URL env var or http://localhost:3000)
7
+ * Server URL (defaults to OS_CLOUD_URL env var or http://localhost:3000)
8
8
  */
9
9
  url?: string;
10
10
  /**
11
- * Authentication token (defaults to stored credentials or OBJECTSTACK_TOKEN env var)
11
+ * Authentication token (defaults to stored credentials or OS_TOKEN env var)
12
12
  */
13
13
  token?: string;
14
+ /**
15
+ * Explicit project id. Overrides the stored `activeProjectId` from
16
+ * `~/.objectstack/credentials.json` (written by `os projects switch`).
17
+ */
18
+ projectId?: string;
14
19
  /**
15
20
  * Enable debug logging
16
21
  */
@@ -23,14 +28,15 @@ export interface ApiClientOptions {
23
28
  export interface ApiClientResult {
24
29
  client: ObjectStackClient;
25
30
  token?: string;
31
+ projectId?: string;
26
32
  }
27
33
  /**
28
34
  * Create an authenticated ObjectStack API client for CLI commands.
29
35
  *
30
36
  * Resolves configuration in this priority order:
31
37
  * 1. Explicit options passed to the function
32
- * 2. Environment variables (OBJECTSTACK_URL, OBJECTSTACK_TOKEN)
33
- * 3. Stored credentials from `os auth login`
38
+ * 2. Environment variables (OS_CLOUD_URL, OS_TOKEN)
39
+ * 3. Stored credentials from `os login`
34
40
  * 4. Defaults (http://localhost:3000)
35
41
  */
36
42
  export declare function createApiClient(options?: ApiClientOptions): Promise<ApiClientResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAkC9F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAMhD"}
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAyC9F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAMhD"}
@@ -6,17 +6,19 @@ import { readAuthConfig } from './auth-config.js';
6
6
  *
7
7
  * Resolves configuration in this priority order:
8
8
  * 1. Explicit options passed to the function
9
- * 2. Environment variables (OBJECTSTACK_URL, OBJECTSTACK_TOKEN)
10
- * 3. Stored credentials from `os auth login`
9
+ * 2. Environment variables (OS_CLOUD_URL, OS_TOKEN)
10
+ * 3. Stored credentials from `os login`
11
11
  * 4. Defaults (http://localhost:3000)
12
12
  */
13
13
  export async function createApiClient(options = {}) {
14
14
  // Resolve server URL (without applying defaults yet)
15
- let baseUrl = options.url || process.env.OBJECTSTACK_URL;
15
+ let baseUrl = options.url || process.env.OS_CLOUD_URL;
16
16
  // Resolve authentication token
17
- let token = options.token || process.env.OBJECTSTACK_TOKEN;
17
+ let token = options.token || process.env.OS_TOKEN;
18
+ // Resolve active project id (explicit > env > stored credentials)
19
+ let projectId = options.projectId || process.env.OS_PROJECT_ID;
18
20
  // If URL or token is missing, try to load from stored credentials
19
- if (!baseUrl || !token) {
21
+ if (!baseUrl || !token || !projectId) {
20
22
  try {
21
23
  const authConfig = await readAuthConfig();
22
24
  if (!token && authConfig.token) {
@@ -25,6 +27,9 @@ export async function createApiClient(options = {}) {
25
27
  if (!baseUrl && authConfig.url) {
26
28
  baseUrl = authConfig.url;
27
29
  }
30
+ if (!projectId && authConfig.activeProjectId) {
31
+ projectId = authConfig.activeProjectId;
32
+ }
28
33
  }
29
34
  catch {
30
35
  // No stored credentials - commands will fail if auth is required
@@ -37,9 +42,10 @@ export async function createApiClient(options = {}) {
37
42
  const client = new ObjectStackClient({
38
43
  baseUrl,
39
44
  token,
45
+ projectId,
40
46
  debug: options.debug || false,
41
47
  });
42
- return { client, token };
48
+ return { client, token, projectId };
43
49
  }
44
50
  /**
45
51
  * Ensure authentication is present, throwing an error if not.
@@ -47,7 +53,7 @@ export async function createApiClient(options = {}) {
47
53
  */
48
54
  export function requireAuth(token) {
49
55
  if (!token) {
50
- throw new Error('Authentication required. Please run `os auth login` or set OBJECTSTACK_TOKEN environment variable.');
56
+ throw new Error('Authentication required. Please run `os login` or set OS_TOKEN environment variable.');
51
57
  }
52
58
  }
53
59
  //# sourceMappingURL=api-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA6BlD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAA4B,EAAE;IAClE,qDAAqD;IACrD,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAEzD,+BAA+B;IAC/B,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAE3D,kEAAkE;IAClE,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;gBAC/B,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC;gBAC/B,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC;YAC3B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;QACnE,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,uBAAuB,CAAC;IACpC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC;QACnC,OAAO;QACP,KAAK;QACL,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;KAC9B,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAmClD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAA4B,EAAE;IAClE,qDAAqD;IACrD,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAEtD,+BAA+B;IAC/B,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IAElD,kEAAkE;IAClE,IAAI,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAE/D,kEAAkE;IAClE,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;gBAC/B,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC;gBAC/B,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC;YAC3B,CAAC;YACD,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC;gBAC7C,SAAS,GAAG,UAAU,CAAC,eAAe,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;QACnE,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,uBAAuB,CAAC;IACpC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC;QACnC,OAAO;QACP,KAAK;QACL,SAAS;QACT,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;KAC9B,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,sFAAsF,CACvF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -26,6 +26,12 @@ export interface AuthConfig {
26
26
  * Timestamp when credentials were last used
27
27
  */
28
28
  lastUsedAt?: string;
29
+ /**
30
+ * Active project id for subsequent CLI calls. Set via `os projects switch`;
31
+ * read by `createApiClient` so every command lands in the right project
32
+ * without an explicit flag.
33
+ */
34
+ activeProjectId?: string;
29
35
  }
30
36
  /**
31
37
  * Get the path to the credentials file
@@ -1 +1 @@
1
- {"version":3,"file":"auth-config.d.ts","sourceRoot":"","sources":["../../src/utils/auth-config.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,CAW1D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUtD;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAQrD"}
1
+ {"version":3,"file":"auth-config.d.ts","sourceRoot":"","sources":["../../src/utils/auth-config.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,CAW1D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUtD;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAQrD"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth-config.js","sourceRoot":"","sources":["../../src/utils/auth-config.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAgCrE;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAkB;IACtD,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;IAE5C,0BAA0B;IAC1B,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtC,yBAAyB;IACzB,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAExE,qFAAqF;IACrF,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;IAC5E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QACtC,MAAM,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"auth-config.js","sourceRoot":"","sources":["../../src/utils/auth-config.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAsCrE;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAkB;IACtD,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;IAE5C,0BAA0B;IAC1B,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtC,yBAAyB;IACzB,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAExE,qFAAqF;IACrF,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;IAC5E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QACtC,MAAM,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ export interface AuthFlowUser {
2
+ id?: string;
3
+ email?: string;
4
+ }
5
+ export interface AuthFlowResult {
6
+ token: string;
7
+ user?: AuthFlowUser;
8
+ }
9
+ /**
10
+ * Email + password authentication (CI / non-interactive path).
11
+ */
12
+ export declare function loginWithPassword(url: string, email: string, password: string): Promise<AuthFlowResult>;
13
+ export interface BrowserFlowOptions {
14
+ /** OAuth client id; defaults to `OS_CLI_CLIENT_ID` env or `objectstack-cli`. */
15
+ clientId?: string;
16
+ /** If true, only print the verification URL — do not launch a browser. */
17
+ noBrowser?: boolean;
18
+ /** Suppress all human-readable stdout (callers using --json). */
19
+ silent?: boolean;
20
+ /** Override the spinner / verification-URL printer for custom UI. */
21
+ onDeviceCode?: (info: {
22
+ verificationUrl: string;
23
+ userCode: string;
24
+ expiresIn: number;
25
+ }) => void;
26
+ }
27
+ /**
28
+ * RFC 8628 OAuth 2.0 Device Authorization Grant.
29
+ */
30
+ export declare function loginWithBrowser(url: string, opts?: BrowserFlowOptions): Promise<AuthFlowResult>;
31
+ //# sourceMappingURL=auth-flows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-flows.d.ts","sourceRoot":"","sources":["../../src/utils/auth-flows.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CAezB;AAmBD,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qEAAqE;IACrE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,KAAK,IAAI,CAAC;CACZ;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAiHzB"}
@@ -0,0 +1,151 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ /**
3
+ * Shared authentication flows for CLI login commands.
4
+ *
5
+ * Two commands consume this module:
6
+ * - `os login` — log in to a runtime ObjectOS instance.
7
+ * - `os cloud login` — log in to the hosted ObjectStack Cloud control plane.
8
+ *
9
+ * The flows themselves are identical (both target ObjectStack servers
10
+ * speaking the same plugin-auth endpoints); only the credential storage
11
+ * destination differs, which is the caller's responsibility.
12
+ *
13
+ * These helpers are intentionally side-effect-free with respect to disk
14
+ * I/O so callers can persist the resulting token wherever they need to.
15
+ * They DO write to stdout for the interactive device-flow UX; pass
16
+ * `silent: true` to suppress all human-readable output (used by `--json`).
17
+ */
18
+ import { ObjectStackClient } from '@objectstack/client';
19
+ /**
20
+ * Email + password authentication (CI / non-interactive path).
21
+ */
22
+ export async function loginWithPassword(url, email, password) {
23
+ const client = new ObjectStackClient({ baseUrl: url });
24
+ const response = await client.auth.login({ type: 'email', email, password });
25
+ if (!response.data?.token && !response.data?.user) {
26
+ throw new Error('Login failed: Invalid response from server');
27
+ }
28
+ const token = response.data?.token || response.token;
29
+ if (!token)
30
+ throw new Error('Login failed: No token received from server');
31
+ return {
32
+ token,
33
+ user: response.data?.user ? { id: response.data.user.id, email: response.data.user.email } : { email },
34
+ };
35
+ }
36
+ /**
37
+ * Open a URL in the system default browser (best-effort, cross-platform).
38
+ */
39
+ async function openBrowser(url) {
40
+ const { exec } = await import('node:child_process');
41
+ const platform = process.platform;
42
+ const cmd = platform === 'darwin'
43
+ ? `open "${url}"`
44
+ : platform === 'win32'
45
+ ? `start "" "${url}"`
46
+ : `xdg-open "${url}"`;
47
+ exec(cmd, () => {
48
+ /* best-effort */
49
+ });
50
+ }
51
+ /**
52
+ * RFC 8628 OAuth 2.0 Device Authorization Grant.
53
+ */
54
+ export async function loginWithBrowser(url, opts = {}) {
55
+ const clientId = opts.clientId ?? process.env.OS_CLI_CLIENT_ID ?? 'objectstack-cli';
56
+ const silent = !!opts.silent;
57
+ // RFC 8628 §3.1 — Device Authorization Request
58
+ const res = await globalThis.fetch(`${url}/api/v1/auth/device/code`, {
59
+ method: 'POST',
60
+ headers: { 'Content-Type': 'application/json' },
61
+ body: JSON.stringify({ client_id: clientId, scope: 'openid profile email' }),
62
+ });
63
+ if (!res.ok) {
64
+ const err = await res.json().catch(() => ({}));
65
+ throw new Error(`Device request failed (${res.status}): ${err?.error_description || err?.message || res.statusText}`);
66
+ }
67
+ const deviceData = (await res.json());
68
+ const { device_code, user_code, verification_uri, verification_uri_complete, expires_in, interval = 5 } = deviceData ?? {};
69
+ if (!device_code || !user_code || !verification_uri) {
70
+ throw new Error('Server did not return RFC 8628 device authorization fields. Use `--email <email> --password <password>` instead.');
71
+ }
72
+ const verificationUrl = verification_uri_complete || `${verification_uri}?user_code=${encodeURIComponent(user_code)}`;
73
+ if (opts.onDeviceCode) {
74
+ opts.onDeviceCode({ verificationUrl, userCode: user_code, expiresIn: expires_in ?? 600 });
75
+ }
76
+ else if (!silent) {
77
+ console.log(' To authorize this CLI, visit:');
78
+ console.log('');
79
+ console.log(` ${verificationUrl}`);
80
+ console.log('');
81
+ console.log(` User code: ${user_code}`);
82
+ console.log('');
83
+ }
84
+ if (!opts.noBrowser && !silent) {
85
+ await openBrowser(verificationUrl);
86
+ console.log(' (Browser opened automatically. Press Ctrl+C to cancel.)');
87
+ console.log('');
88
+ }
89
+ // RFC 8628 §3.4 — Device Access Token Request (poll)
90
+ let pollMs = (interval || 5) * 1000;
91
+ const expiryTime = Date.now() + (expires_in || 600) * 1000;
92
+ let spinner = 0;
93
+ const spinChars = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
94
+ while (Date.now() < expiryTime) {
95
+ await new Promise((r) => setTimeout(r, pollMs));
96
+ const pollRes = await globalThis.fetch(`${url}/api/v1/auth/device/token`, {
97
+ method: 'POST',
98
+ headers: { 'Content-Type': 'application/json' },
99
+ body: JSON.stringify({
100
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
101
+ device_code,
102
+ client_id: clientId,
103
+ }),
104
+ });
105
+ const pollJson = (await pollRes.json());
106
+ if (pollRes.ok && pollJson?.access_token) {
107
+ const accessToken = pollJson.access_token;
108
+ // Resolve user info via /get-session (device-token response omits user details per RFC 8628)
109
+ let user;
110
+ try {
111
+ const sessionRes = await globalThis.fetch(`${url}/api/v1/auth/get-session`, {
112
+ headers: { Authorization: `Bearer ${accessToken}` },
113
+ });
114
+ if (sessionRes.ok) {
115
+ const sessionData = (await sessionRes.json());
116
+ const u = sessionData?.user ?? sessionData?.data?.user;
117
+ if (u)
118
+ user = { id: u.id, email: u.email };
119
+ }
120
+ }
121
+ catch {
122
+ // best-effort
123
+ }
124
+ if (!silent)
125
+ process.stdout.write('\r\x1b[K');
126
+ return { token: accessToken, user };
127
+ }
128
+ // Standard RFC 8628 error codes
129
+ const errCode = pollJson?.error;
130
+ if (errCode === 'authorization_pending') {
131
+ // keep polling
132
+ }
133
+ else if (errCode === 'slow_down') {
134
+ pollMs += 5000;
135
+ }
136
+ else if (errCode === 'expired_token' || errCode === 'access_denied' || errCode === 'invalid_grant') {
137
+ throw new Error(errCode === 'access_denied'
138
+ ? 'Login denied by user.'
139
+ : 'Login timed out or device code is no longer valid. Please retry.');
140
+ }
141
+ else if (!pollRes.ok) {
142
+ throw new Error(`Polling failed (${pollRes.status}): ${pollJson?.error_description || pollJson?.message || pollRes.statusText}`);
143
+ }
144
+ if (!silent) {
145
+ process.stdout.write(`\r ${spinChars[spinner % spinChars.length]} Waiting for browser approval...`);
146
+ spinner++;
147
+ }
148
+ }
149
+ throw new Error('Login timed out.');
150
+ }
151
+ //# sourceMappingURL=auth-flows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-flows.js","sourceRoot":"","sources":["../../src/utils/auth-flows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Build a single ESM bundle that re-exports every inline handler function
3
+ * collected by `lowerCallables`. The bundle is the second half of the
4
+ * "two-product" build (alongside `objectstack.json`):
5
+ *
6
+ * dist/
7
+ * ├── objectstack.json
8
+ * └── objectstack-runtime.{contenthash}.mjs ← THIS
9
+ *
10
+ * At runtime, `StandaloneStack` (and `MultiProjectPlugin`) dynamic-import
11
+ * the mjs and merge `module.functions` into the bundle before
12
+ * `bindHooks(...)` runs — so string-named handlers resolve to real code
13
+ * even though the JSON artifact is pure metadata.
14
+ */
15
+ export interface BuildRuntimeOptions {
16
+ /** Absolute path to the user's `objectstack.config.{ts,js,mjs}`. */
17
+ sourceConfigPath: string;
18
+ /** Lowered handler refs (`name → handlerName`) — mirrors `LoweringResult.functions`. */
19
+ refs: string[];
20
+ /** Output directory (e.g. `<cwd>/dist`). Created if missing. */
21
+ outputDir: string;
22
+ /** Base file name without hash, e.g. `objectstack-runtime`. */
23
+ baseName?: string;
24
+ /** External package names to mark as external (`@objectstack/*` etc.). */
25
+ externalPackages?: string[];
26
+ }
27
+ export interface BuildRuntimeResult {
28
+ /** Absolute path to the emitted mjs. */
29
+ outputPath: string;
30
+ /** File name (relative to outputDir) — embedded in objectstack.json. */
31
+ outputFileName: string;
32
+ /** Content hash (sha256, first 16 hex chars). */
33
+ hash: string;
34
+ /** Bundle size in bytes. */
35
+ size: number;
36
+ }
37
+ export declare function buildRuntimeBundle(opts: BuildRuntimeOptions): Promise<BuildRuntimeResult>;
38
+ /** Best-effort cleanup of stale `objectstack-runtime.*.mjs` files. */
39
+ export declare function cleanupOldRuntimeBundles(outputDir: string, keepFileName: string, baseName?: string): number;
40
+ /** Reuse: read an existing bundle and recompute its size for stats. */
41
+ export declare function statBundle(outputPath: string): {
42
+ size: number;
43
+ } | null;
44
+ export declare const runtimeBundlePathRelative: (outputDir: string, file: string) => string;
45
+ //# sourceMappingURL=build-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-runtime.d.ts","sourceRoot":"","sources":["../../src/utils/build-runtime.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,gBAAgB,EAAE,MAAM,CAAC;IACzB,wFAAwF;IACxF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AA6DD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4D/F;AAED,sEAAsE;AACtE,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,SAAe,GAAG,MAAM,CAejH;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOtE;AAED,eAAO,MAAM,yBAAyB,GAAI,WAAW,MAAM,EAAE,MAAM,MAAM,KAAG,MACf,CAAC"}
@@ -0,0 +1,154 @@
1
+ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
+ import { createHash } from 'node:crypto';
3
+ import { mkdirSync, writeFileSync, readFileSync, existsSync, unlinkSync, readdirSync } from 'node:fs';
4
+ import { dirname, basename, resolve as resolvePath, relative, sep as PATH_SEP } from 'node:path';
5
+ const DEFAULT_BASE = 'objectstack-runtime';
6
+ /**
7
+ * Generate the entry source that re-extracts callable handlers from the
8
+ * compiled config. We bundle the user's config transitively (so every
9
+ * `*.hook.ts` import is captured), then walk the same shape the lowering
10
+ * pass walked and re-export the matching handlers under the same string
11
+ * keys. The runtime side merges this map into `bundle.functions`.
12
+ */
13
+ function generateEntrySource(sourceConfigPath, refs, entryDir) {
14
+ // Use a POSIX-style relative path so esbuild's resolver bundles the
15
+ // user's config + every transitively-imported `*.hook.ts` into the
16
+ // emitted ESM. A `file://` URL would be treated as external.
17
+ let importPath = relative(entryDir, sourceConfigPath).split(PATH_SEP).join('/');
18
+ if (!importPath.startsWith('.'))
19
+ importPath = './' + importPath;
20
+ const refLiteral = JSON.stringify(refs);
21
+ return `// AUTO-GENERATED by @objectstack/cli — do not edit.
22
+ import config from ${JSON.stringify(importPath)};
23
+
24
+ const REFS = new Set(${refLiteral});
25
+
26
+ function collect(cfg) {
27
+ const out = Object.create(null);
28
+ if (!cfg || typeof cfg !== 'object') return out;
29
+ // Hooks: { name, handler }
30
+ if (Array.isArray(cfg.hooks)) {
31
+ for (const h of cfg.hooks) {
32
+ if (h && typeof h === 'object' && typeof h.handler === 'function' && typeof h.name === 'string') {
33
+ if (REFS.has(h.name)) out[h.name] = h.handler;
34
+ }
35
+ }
36
+ }
37
+ // Top-level functions map
38
+ if (cfg.functions && !Array.isArray(cfg.functions) && typeof cfg.functions === 'object') {
39
+ for (const [k, v] of Object.entries(cfg.functions)) {
40
+ if (typeof v === 'function' && REFS.has(k)) out[k] = v;
41
+ }
42
+ }
43
+ // Top-level functions array
44
+ if (Array.isArray(cfg.functions)) {
45
+ for (const entry of cfg.functions) {
46
+ if (entry && typeof entry === 'object' && typeof entry.handler === 'function' && typeof entry.name === 'string') {
47
+ if (REFS.has(entry.name)) out[entry.name] = entry.handler;
48
+ }
49
+ }
50
+ }
51
+ return out;
52
+ }
53
+
54
+ const cfg = config && typeof config === 'object' && 'default' in config ? config.default : config;
55
+ export const functions = collect(cfg);
56
+ export const meta = {
57
+ builtAt: new Date().toISOString(),
58
+ refCount: ${refs.length},
59
+ };
60
+ `;
61
+ }
62
+ export async function buildRuntimeBundle(opts) {
63
+ const { sourceConfigPath, refs, outputDir } = opts;
64
+ const baseName = opts.baseName ?? DEFAULT_BASE;
65
+ if (!existsSync(outputDir))
66
+ mkdirSync(outputDir, { recursive: true });
67
+ const entryDir = dirname(sourceConfigPath);
68
+ const entryPath = resolvePath(entryDir, `.${baseName}.entry.${process.pid}.${Date.now()}.mjs`);
69
+ writeFileSync(entryPath, generateEntrySource(sourceConfigPath, refs, entryDir));
70
+ let esbuild;
71
+ try {
72
+ esbuild = await import('esbuild');
73
+ }
74
+ catch (err) {
75
+ try {
76
+ unlinkSync(entryPath);
77
+ }
78
+ catch { /* noop */ }
79
+ throw new Error(`[build-runtime] esbuild is required to bundle declarative handlers but is not installed: ${err.message}`);
80
+ }
81
+ // Bundle to an in-memory buffer first so we can hash, then rename.
82
+ let result;
83
+ try {
84
+ result = await esbuild.build({
85
+ entryPoints: [entryPath],
86
+ bundle: true,
87
+ format: 'esm',
88
+ platform: 'node',
89
+ target: 'node18',
90
+ write: false,
91
+ sourcemap: 'inline',
92
+ packages: 'external',
93
+ logLevel: 'silent',
94
+ legalComments: 'none',
95
+ resolveExtensions: ['.ts', '.tsx', '.mjs', '.js', '.cjs', '.json'],
96
+ loader: { '.ts': 'ts', '.tsx': 'tsx' },
97
+ banner: { js: '// @generated by @objectstack/cli — do not edit.' },
98
+ });
99
+ }
100
+ finally {
101
+ try {
102
+ unlinkSync(entryPath);
103
+ }
104
+ catch { /* noop */ }
105
+ }
106
+ const out = result.outputFiles?.[0];
107
+ if (!out)
108
+ throw new Error('[build-runtime] esbuild produced no output');
109
+ const code = out.text;
110
+ const hash = createHash('sha256').update(code).digest('hex').slice(0, 16);
111
+ const fileName = `${baseName}.${hash}.mjs`;
112
+ const outputPath = resolvePath(outputDir, fileName);
113
+ writeFileSync(outputPath, code);
114
+ return {
115
+ outputPath,
116
+ outputFileName: fileName,
117
+ hash,
118
+ size: Buffer.byteLength(code, 'utf8'),
119
+ };
120
+ }
121
+ /** Best-effort cleanup of stale `objectstack-runtime.*.mjs` files. */
122
+ export function cleanupOldRuntimeBundles(outputDir, keepFileName, baseName = DEFAULT_BASE) {
123
+ if (!existsSync(outputDir))
124
+ return 0;
125
+ let removed = 0;
126
+ try {
127
+ const re = new RegExp(`^${baseName}\\.[a-f0-9]+\\.mjs(\\.map)?$`);
128
+ for (const f of readdirSync(outputDir)) {
129
+ if (!re.test(f))
130
+ continue;
131
+ if (f === keepFileName)
132
+ continue;
133
+ try {
134
+ unlinkSync(resolvePath(outputDir, f));
135
+ removed += 1;
136
+ }
137
+ catch { /* noop */ }
138
+ }
139
+ }
140
+ catch { /* noop */ }
141
+ return removed;
142
+ }
143
+ /** Reuse: read an existing bundle and recompute its size for stats. */
144
+ export function statBundle(outputPath) {
145
+ try {
146
+ const buf = readFileSync(outputPath);
147
+ return { size: buf.byteLength };
148
+ }
149
+ catch {
150
+ return null;
151
+ }
152
+ }
153
+ export const runtimeBundlePathRelative = (outputDir, file) => relative(outputDir, resolvePath(outputDir, basename(file)));
154
+ //# sourceMappingURL=build-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-runtime.js","sourceRoot":"","sources":["../../src/utils/build-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /** Canonical hosted control plane. */
2
+ export declare const DEFAULT_CLOUD_URL = "https://cloud.objectos.app";
3
+ export interface CloudConfig {
4
+ /** Base URL of the cloud control plane (defaults to `https://cloud.objectos.app`). */
5
+ url: string;
6
+ /** Bearer token returned by the device or password flow. */
7
+ token: string;
8
+ /** Authenticated user's email, for display. */
9
+ email?: string;
10
+ /** Authenticated user's id. */
11
+ userId?: string;
12
+ /** Active organization id chosen for publishing. */
13
+ activeOrgId?: string;
14
+ /** ISO timestamp when the credential was created. */
15
+ createdAt: string;
16
+ /** ISO timestamp of last use (best-effort). */
17
+ lastUsedAt?: string;
18
+ }
19
+ export declare function getCloudCredentialsPath(): string;
20
+ export declare function readCloudConfig(): Promise<CloudConfig>;
21
+ export declare function tryReadCloudConfig(): Promise<CloudConfig | undefined>;
22
+ export declare function writeCloudConfig(config: CloudConfig): Promise<void>;
23
+ export declare function deleteCloudConfig(): Promise<void>;
24
+ //# sourceMappingURL=cloud-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-config.d.ts","sourceRoot":"","sources":["../../src/utils/cloud-config.ts"],"names":[],"mappings":"AA4BA,sCAAsC;AACtC,eAAO,MAAM,iBAAiB,+BAA+B,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,sFAAsF;IACtF,GAAG,EAAE,MAAM,CAAC;IACZ,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAW5D;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAM3E;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAWzE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CASvD"}