@objectstack/cli 4.0.5 → 4.1.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.
- package/README.md +32 -0
- package/dist/commands/cloud/login.d.ts +16 -0
- package/dist/commands/cloud/login.d.ts.map +1 -0
- package/dist/commands/cloud/login.js +166 -0
- package/dist/commands/cloud/login.js.map +1 -0
- package/dist/commands/cloud/logout.d.ts +15 -0
- package/dist/commands/cloud/logout.d.ts.map +1 -0
- package/dist/commands/cloud/logout.js +51 -0
- package/dist/commands/cloud/logout.js.map +1 -0
- package/dist/commands/cloud/whoami.d.ts +15 -0
- package/dist/commands/cloud/whoami.d.ts.map +1 -0
- package/dist/commands/cloud/whoami.js +81 -0
- package/dist/commands/cloud/whoami.js.map +1 -0
- package/dist/commands/dev.d.ts +6 -0
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +79 -14
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/i18n/extract.d.ts +28 -0
- package/dist/commands/i18n/extract.d.ts.map +1 -0
- package/dist/commands/i18n/extract.js +148 -0
- package/dist/commands/i18n/extract.js.map +1 -0
- package/dist/commands/login.js +2 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/package/publish.d.ts +32 -0
- package/dist/commands/package/publish.d.ts.map +1 -0
- package/dist/commands/package/publish.js +324 -0
- package/dist/commands/package/publish.js.map +1 -0
- package/dist/commands/publish.d.ts +3 -0
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +55 -11
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/rollback.d.ts +13 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +77 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/serve.d.ts +14 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +583 -30
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/start.d.ts +8 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +80 -11
- package/dist/commands/start.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/auth-flows.d.ts +31 -0
- package/dist/utils/auth-flows.d.ts.map +1 -0
- package/dist/utils/auth-flows.js +151 -0
- package/dist/utils/auth-flows.js.map +1 -0
- package/dist/utils/cloud-config.d.ts +24 -0
- package/dist/utils/cloud-config.d.ts.map +1 -0
- package/dist/utils/cloud-config.js +75 -0
- package/dist/utils/cloud-config.js.map +1 -0
- package/dist/utils/console.d.ts +1 -0
- package/dist/utils/console.d.ts.map +1 -1
- package/dist/utils/console.js +7 -4
- package/dist/utils/console.js.map +1 -1
- package/dist/utils/i18n-extract.d.ts +102 -0
- package/dist/utils/i18n-extract.d.ts.map +1 -0
- package/dist/utils/i18n-extract.js +332 -0
- package/dist/utils/i18n-extract.js.map +1 -0
- package/dist/utils/studio.d.ts.map +1 -1
- package/dist/utils/studio.js +5 -6
- package/dist/utils/studio.js.map +1 -1
- package/package.json +40 -36
package/README.md
CHANGED
|
@@ -254,6 +254,38 @@ os projects bind <id> --artifact dist/objectstack.json # 8. Bind to a Cloud Pro
|
|
|
254
254
|
└── package.json # oclif config under "oclif" key
|
|
255
255
|
```
|
|
256
256
|
|
|
257
|
+
|
|
258
|
+
## Default capability slate (always-on)
|
|
259
|
+
|
|
260
|
+
`objectstack serve` (and `os dev`) auto-mount a baseline slate of
|
|
261
|
+
service plugins for every preset **except** `--preset minimal`:
|
|
262
|
+
|
|
263
|
+
| Capability | Plugin | Why default |
|
|
264
|
+
|-------------|------------------------------|--------------------------------------------------------------|
|
|
265
|
+
| `queue` | `QueueServicePlugin` | Background retries (mail, audit batching) need a queue. |
|
|
266
|
+
| `job` | `JobServicePlugin` | Scheduled jobs (cleanup, reports, cron). |
|
|
267
|
+
| `cache` | `CacheServicePlugin` | In-memory adapter; performance baseline. |
|
|
268
|
+
| `settings` | `SettingsServicePlugin` | Mail / storage / branding / feature-flag UI + persistence. |
|
|
269
|
+
| `email` | `EmailServicePlugin` | Auth callbacks (verify, reset, magic-link) hard-depend. |
|
|
270
|
+
| `storage` | `StorageServicePlugin` | Avatars, attachments, exports. Local fallback in dev. |
|
|
271
|
+
|
|
272
|
+
Apps no longer need to list these in `requires: [...]`.
|
|
273
|
+
|
|
274
|
+
**Opt-out:** run `objectstack serve --preset minimal` to skip the slate
|
|
275
|
+
and only load core + your explicit `requires`.
|
|
276
|
+
|
|
277
|
+
**Built-in Settings manifests:** `mail`, `storage`, `branding`,
|
|
278
|
+
`feature_flags` are pre-registered. Both `mail` and `storage` expose a
|
|
279
|
+
"Test connection" action that exercises the live transport / adapter
|
|
280
|
+
end-to-end. Switching the storage adapter does **not** migrate
|
|
281
|
+
previously uploaded files — the plugin logs a warning on every swap.
|
|
282
|
+
|
|
283
|
+
**Storage warning:** when no `storage:` block is configured the plugin
|
|
284
|
+
falls back to the local driver under `.objectstack/data/uploads/`. In
|
|
285
|
+
non-dev mode a single `console.warn` fires at boot — switch to S3/GCS/
|
|
286
|
+
Azure for production by setting `config.storage`, `OS_STORAGE_*` env,
|
|
287
|
+
or via the Settings hub (`namespace=storage`).
|
|
288
|
+
|
|
257
289
|
## License
|
|
258
290
|
|
|
259
291
|
Apache-2.0
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class CloudLogin extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
url: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
password: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
'no-browser': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
private fallbackPasswordPrompt;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/cloud/login.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAoD7C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,OAAgB,WAAW,SACgG;IAE3H,OAAgB,QAAQ,WAKtB;IAEF,OAAgB,KAAK;;;;;;;MAmBnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAqEZ,sBAAsB;CAQrC"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
+
/**
|
|
3
|
+
* `objectstack cloud login` — authenticate against the ObjectStack Cloud
|
|
4
|
+
* package registry (`https://cloud.objectos.app` by default).
|
|
5
|
+
*
|
|
6
|
+
* This is distinct from `os login`, which authenticates against your
|
|
7
|
+
* *runtime* ObjectOS instance. Cloud credentials are persisted to
|
|
8
|
+
* `~/.objectstack/cloud.json` and consumed by `os package publish`,
|
|
9
|
+
* `os package install`, and any future marketplace commands.
|
|
10
|
+
*/
|
|
11
|
+
import * as readline from 'node:readline/promises';
|
|
12
|
+
import { stdin as input, stdout as output } from 'node:process';
|
|
13
|
+
import { Command, Flags } from '@oclif/core';
|
|
14
|
+
import { printHeader, printKV, printSuccess, printError } from '../../utils/format.js';
|
|
15
|
+
import { loginWithBrowser, loginWithPassword } from '../../utils/auth-flows.js';
|
|
16
|
+
import { DEFAULT_CLOUD_URL, readCloudConfig, writeCloudConfig } from '../../utils/cloud-config.js';
|
|
17
|
+
async function promptPassword(promptText) {
|
|
18
|
+
if (!process.stdin.isTTY) {
|
|
19
|
+
const rl = readline.createInterface({ input, output });
|
|
20
|
+
const answer = await rl.question(promptText);
|
|
21
|
+
rl.close();
|
|
22
|
+
return answer;
|
|
23
|
+
}
|
|
24
|
+
return new Promise((resolve) => {
|
|
25
|
+
const chars = [];
|
|
26
|
+
process.stdout.write(promptText);
|
|
27
|
+
process.stdin.setRawMode(true);
|
|
28
|
+
process.stdin.resume();
|
|
29
|
+
process.stdin.setEncoding('utf8');
|
|
30
|
+
const cleanup = () => {
|
|
31
|
+
process.stdin.setRawMode(false);
|
|
32
|
+
process.stdin.pause();
|
|
33
|
+
process.stdin.removeListener('data', handler);
|
|
34
|
+
process.stdout.write('\n');
|
|
35
|
+
};
|
|
36
|
+
const handler = (char) => {
|
|
37
|
+
switch (char) {
|
|
38
|
+
case '\u0003':
|
|
39
|
+
cleanup();
|
|
40
|
+
process.kill(process.pid, 'SIGINT');
|
|
41
|
+
break;
|
|
42
|
+
case '\r':
|
|
43
|
+
case '\n':
|
|
44
|
+
cleanup();
|
|
45
|
+
resolve(chars.join(''));
|
|
46
|
+
break;
|
|
47
|
+
case '\u007f':
|
|
48
|
+
if (chars.length > 0) {
|
|
49
|
+
chars.pop();
|
|
50
|
+
process.stdout.clearLine(0);
|
|
51
|
+
process.stdout.cursorTo(0);
|
|
52
|
+
process.stdout.write(promptText + '*'.repeat(chars.length));
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
default:
|
|
56
|
+
chars.push(char);
|
|
57
|
+
process.stdout.write('*');
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
process.stdin.on('data', handler);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
export default class CloudLogin extends Command {
|
|
64
|
+
static description = 'Authenticate against ObjectStack Cloud (the hosted package registry). Stores credentials in ~/.objectstack/cloud.json.';
|
|
65
|
+
static examples = [
|
|
66
|
+
'$ os cloud login',
|
|
67
|
+
'$ os cloud login --email me@acme.com --password secret',
|
|
68
|
+
'$ os cloud login --no-browser',
|
|
69
|
+
'$ os cloud login --url https://cloud.objectos.app # default',
|
|
70
|
+
];
|
|
71
|
+
static flags = {
|
|
72
|
+
url: Flags.string({
|
|
73
|
+
char: 'u',
|
|
74
|
+
description: 'ObjectStack Cloud URL (override for self-hosted control planes)',
|
|
75
|
+
default: DEFAULT_CLOUD_URL,
|
|
76
|
+
env: 'OS_CLOUD_URL',
|
|
77
|
+
}),
|
|
78
|
+
email: Flags.string({ char: 'e', description: 'Email address (skips browser flow)' }),
|
|
79
|
+
password: Flags.string({ char: 'p', description: 'Password (skips browser flow)' }),
|
|
80
|
+
'no-browser': Flags.boolean({
|
|
81
|
+
description: 'Print the verification URL without opening a browser',
|
|
82
|
+
default: false,
|
|
83
|
+
}),
|
|
84
|
+
force: Flags.boolean({
|
|
85
|
+
char: 'f',
|
|
86
|
+
description: 'Re-authenticate even if cloud credentials already exist',
|
|
87
|
+
default: false,
|
|
88
|
+
}),
|
|
89
|
+
json: Flags.boolean({ description: 'Output as JSON' }),
|
|
90
|
+
};
|
|
91
|
+
async run() {
|
|
92
|
+
const { flags } = await this.parse(CloudLogin);
|
|
93
|
+
try {
|
|
94
|
+
if (!flags.force) {
|
|
95
|
+
try {
|
|
96
|
+
const existing = await readCloudConfig();
|
|
97
|
+
if (existing?.token) {
|
|
98
|
+
if (flags.json) {
|
|
99
|
+
console.log(JSON.stringify({ success: false, error: 'Already logged in', email: existing.email, url: existing.url }));
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
printSuccess(`Already logged in to ${existing.url} as ${existing.email || existing.userId}`);
|
|
103
|
+
console.log('');
|
|
104
|
+
console.log(' Run `os cloud logout` to switch accounts, or use --force to re-authenticate.');
|
|
105
|
+
console.log('');
|
|
106
|
+
}
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// No stored credentials — proceed
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const url = flags.url.replace(/\/+$/, '');
|
|
115
|
+
if (!flags.json) {
|
|
116
|
+
printHeader('ObjectStack Cloud Login');
|
|
117
|
+
printKV('Server', url);
|
|
118
|
+
console.log('');
|
|
119
|
+
}
|
|
120
|
+
const result = flags.email && flags.password
|
|
121
|
+
? await loginWithPassword(url, flags.email, flags.password)
|
|
122
|
+
: process.stdin.isTTY && !flags.email && !flags.password
|
|
123
|
+
? await loginWithBrowser(url, { noBrowser: flags['no-browser'], silent: flags.json })
|
|
124
|
+
: await this.fallbackPasswordPrompt(url, flags.email);
|
|
125
|
+
await writeCloudConfig({
|
|
126
|
+
url,
|
|
127
|
+
token: result.token,
|
|
128
|
+
email: result.user?.email,
|
|
129
|
+
userId: result.user?.id,
|
|
130
|
+
createdAt: new Date().toISOString(),
|
|
131
|
+
});
|
|
132
|
+
if (flags.json) {
|
|
133
|
+
console.log(JSON.stringify({ success: true, email: result.user?.email, userId: result.user?.id, url }, null, 2));
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
printSuccess('Cloud authentication successful');
|
|
137
|
+
if (result.user?.email)
|
|
138
|
+
printKV('Email', result.user.email);
|
|
139
|
+
if (result.user?.id)
|
|
140
|
+
printKV('User ID', result.user.id);
|
|
141
|
+
console.log('');
|
|
142
|
+
console.log(' Credentials stored in ~/.objectstack/cloud.json');
|
|
143
|
+
console.log(' Next: `os package publish` to push a package, `os cloud whoami` to verify.');
|
|
144
|
+
console.log('');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
if (flags.json) {
|
|
149
|
+
console.log(JSON.stringify({ success: false, error: error.message }, null, 2));
|
|
150
|
+
this.exit(1);
|
|
151
|
+
}
|
|
152
|
+
printError(error.message || String(error));
|
|
153
|
+
this.exit(1);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async fallbackPasswordPrompt(url, providedEmail) {
|
|
157
|
+
const rl = readline.createInterface({ input, output });
|
|
158
|
+
const email = providedEmail ?? (await rl.question('Email: '));
|
|
159
|
+
rl.close();
|
|
160
|
+
const password = await promptPassword('Password: ');
|
|
161
|
+
if (!email || !password)
|
|
162
|
+
throw new Error('Email and password are required');
|
|
163
|
+
return loginWithPassword(url, email, password);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/cloud/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `objectstack cloud logout` — clear cloud credentials from
|
|
3
|
+
* ~/.objectstack/cloud.json (and best-effort revoke the session on the
|
|
4
|
+
* cloud control plane).
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from '@oclif/core';
|
|
7
|
+
export default class CloudLogout extends Command {
|
|
8
|
+
static description: string;
|
|
9
|
+
static examples: string[];
|
|
10
|
+
static flags: {
|
|
11
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=logout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/cloud/logout.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAK7C,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;IAC9C,OAAgB,WAAW,SAAgD;IAE3E,OAAgB,QAAQ,WAAyB;IAEjD,OAAgB,KAAK;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAiC3B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
+
/**
|
|
3
|
+
* `objectstack cloud logout` — clear cloud credentials from
|
|
4
|
+
* ~/.objectstack/cloud.json (and best-effort revoke the session on the
|
|
5
|
+
* cloud control plane).
|
|
6
|
+
*/
|
|
7
|
+
import { Command, Flags } from '@oclif/core';
|
|
8
|
+
import { ObjectStackClient } from '@objectstack/client';
|
|
9
|
+
import { printHeader, printSuccess, printError } from '../../utils/format.js';
|
|
10
|
+
import { deleteCloudConfig, tryReadCloudConfig } from '../../utils/cloud-config.js';
|
|
11
|
+
export default class CloudLogout extends Command {
|
|
12
|
+
static description = 'Clear stored ObjectStack Cloud credentials';
|
|
13
|
+
static examples = ['$ os cloud logout'];
|
|
14
|
+
static flags = {
|
|
15
|
+
json: Flags.boolean({ description: 'Output as JSON' }),
|
|
16
|
+
};
|
|
17
|
+
async run() {
|
|
18
|
+
const { flags } = await this.parse(CloudLogout);
|
|
19
|
+
try {
|
|
20
|
+
if (!flags.json)
|
|
21
|
+
printHeader('ObjectStack Cloud Logout');
|
|
22
|
+
const config = await tryReadCloudConfig();
|
|
23
|
+
if (config?.token && config?.url) {
|
|
24
|
+
try {
|
|
25
|
+
const client = new ObjectStackClient({ baseUrl: config.url, token: config.token });
|
|
26
|
+
await client.auth.logout();
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Best-effort
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
await deleteCloudConfig();
|
|
33
|
+
if (flags.json) {
|
|
34
|
+
console.log(JSON.stringify({ success: true, message: 'Cloud credentials cleared' }, null, 2));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
printSuccess('Cloud credentials cleared');
|
|
38
|
+
console.log('');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (flags.json) {
|
|
43
|
+
console.log(JSON.stringify({ success: false, error: error.message }, null, 2));
|
|
44
|
+
this.exit(1);
|
|
45
|
+
}
|
|
46
|
+
printError(error.message || String(error));
|
|
47
|
+
this.exit(1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/cloud/logout.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEpF,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;IAC9C,MAAM,CAAU,WAAW,GAAG,4CAA4C,CAAC;IAE3E,MAAM,CAAU,QAAQ,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAEjD,MAAM,CAAU,KAAK,GAAG;QACtB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;KACvD,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC;YAEzD,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;YAC1C,IAAI,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,GAAG,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;oBACnF,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7B,CAAC;gBAAC,MAAM,CAAC;oBACP,cAAc;gBAChB,CAAC;YACH,CAAC;YAED,MAAM,iBAAiB,EAAE,CAAC;YAE1B,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,2BAA2B,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAChG,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,2BAA2B,CAAC,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/E,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,CAAC;YACD,UAAU,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;IACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `objectstack cloud whoami` — display the active ObjectStack Cloud
|
|
3
|
+
* identity (read from ~/.objectstack/cloud.json) and verify the token
|
|
4
|
+
* with a /get-session call against the cloud control plane.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from '@oclif/core';
|
|
7
|
+
export default class CloudWhoami extends Command {
|
|
8
|
+
static description: string;
|
|
9
|
+
static examples: string[];
|
|
10
|
+
static flags: {
|
|
11
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=whoami.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../../src/commands/cloud/whoami.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAI7C,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;IAC9C,OAAgB,WAAW,SAAgD;IAE3E,OAAgB,QAAQ,WAAyB;IAEjD,OAAgB,KAAK;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA2D3B"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
+
/**
|
|
3
|
+
* `objectstack cloud whoami` — display the active ObjectStack Cloud
|
|
4
|
+
* identity (read from ~/.objectstack/cloud.json) and verify the token
|
|
5
|
+
* with a /get-session call against the cloud control plane.
|
|
6
|
+
*/
|
|
7
|
+
import { Command, Flags } from '@oclif/core';
|
|
8
|
+
import { printHeader, printKV, printSuccess, printError } from '../../utils/format.js';
|
|
9
|
+
import { tryReadCloudConfig } from '../../utils/cloud-config.js';
|
|
10
|
+
export default class CloudWhoami extends Command {
|
|
11
|
+
static description = 'Show the active ObjectStack Cloud identity';
|
|
12
|
+
static examples = ['$ os cloud whoami'];
|
|
13
|
+
static flags = {
|
|
14
|
+
json: Flags.boolean({ description: 'Output as JSON' }),
|
|
15
|
+
};
|
|
16
|
+
async run() {
|
|
17
|
+
const { flags } = await this.parse(CloudWhoami);
|
|
18
|
+
try {
|
|
19
|
+
const config = await tryReadCloudConfig();
|
|
20
|
+
if (!config?.token) {
|
|
21
|
+
if (flags.json) {
|
|
22
|
+
console.log(JSON.stringify({ logged_in: false }, null, 2));
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
printError('Not logged in to ObjectStack Cloud. Run `os cloud login` first.');
|
|
26
|
+
}
|
|
27
|
+
this.exit(1);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Verify token with /get-session
|
|
31
|
+
let sessionUser;
|
|
32
|
+
try {
|
|
33
|
+
const res = await globalThis.fetch(`${config.url}/api/v1/auth/get-session`, {
|
|
34
|
+
headers: { Authorization: `Bearer ${config.token}` },
|
|
35
|
+
});
|
|
36
|
+
if (res.ok) {
|
|
37
|
+
const data = (await res.json());
|
|
38
|
+
const u = data?.user ?? data?.data?.user;
|
|
39
|
+
if (u)
|
|
40
|
+
sessionUser = { id: u.id, email: u.email };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Network failure — fall through to local-only view
|
|
45
|
+
}
|
|
46
|
+
const email = sessionUser?.email ?? config.email;
|
|
47
|
+
const userId = sessionUser?.id ?? config.userId;
|
|
48
|
+
const valid = !!sessionUser;
|
|
49
|
+
if (flags.json) {
|
|
50
|
+
console.log(JSON.stringify({ logged_in: true, valid, url: config.url, email, userId }, null, 2));
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
printHeader('ObjectStack Cloud Identity');
|
|
54
|
+
printKV('Server', config.url);
|
|
55
|
+
if (email)
|
|
56
|
+
printKV('Email', email);
|
|
57
|
+
if (userId)
|
|
58
|
+
printKV('User ID', userId);
|
|
59
|
+
if (config.activeOrgId)
|
|
60
|
+
printKV('Org', config.activeOrgId);
|
|
61
|
+
console.log('');
|
|
62
|
+
if (valid) {
|
|
63
|
+
printSuccess('Session valid');
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
printError('Could not verify session with cloud. Token may be expired — try `os cloud login --force`.');
|
|
67
|
+
}
|
|
68
|
+
console.log('');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (flags.json) {
|
|
73
|
+
console.log(JSON.stringify({ success: false, error: error.message }, null, 2));
|
|
74
|
+
this.exit(1);
|
|
75
|
+
}
|
|
76
|
+
printError(error.message || String(error));
|
|
77
|
+
this.exit(1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/commands/cloud/whoami.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/dev.d.ts
CHANGED
|
@@ -11,6 +11,12 @@ export default class Dev extends Command {
|
|
|
11
11
|
port: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
12
|
preset: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
13
|
compile: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
artifact: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
'project-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
database: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
'database-driver': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
18
|
+
'database-auth-token': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
19
|
+
'auth-secret': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
20
|
};
|
|
15
21
|
run(): Promise<void>;
|
|
16
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAC;AAOnD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,OAAO;IACtC,OAAgB,WAAW,SAA4C;IAEvE,OAAgB,IAAI;;MAElB;IAEF,OAAgB,KAAK
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAC;AAOnD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,OAAO;IACtC,OAAgB,WAAW,SAA4C;IAEvE,OAAgB,IAAI;;MAElB;IAEF,OAAgB,KAAK;;;;;;;;;;;;;MAwCnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqH3B"}
|
package/dist/commands/dev.js
CHANGED
|
@@ -19,10 +19,36 @@ export default class Dev extends Command {
|
|
|
19
19
|
description: 'Plugin tier preset forwarded to `serve`: minimal | default | full',
|
|
20
20
|
}),
|
|
21
21
|
compile: Flags.boolean({
|
|
22
|
-
description: 'Compile objectstack.config.ts to dist/objectstack.json before starting (auto if artifact missing)',
|
|
22
|
+
description: 'Compile objectstack.config.ts to dist/objectstack.json before starting (auto if artifact missing). Ignored when --artifact is set.',
|
|
23
23
|
default: false,
|
|
24
24
|
allowNo: true,
|
|
25
25
|
}),
|
|
26
|
+
// ── Runtime overrides (mirror `os start`) ────────────────────────
|
|
27
|
+
// These let `os dev` consume a pre-built artifact and arbitrary
|
|
28
|
+
// storage/auth without an `objectstack.config.ts` in the cwd. When
|
|
29
|
+
// `--artifact` is set the auto-compile path is skipped — there's no
|
|
30
|
+
// source to compile from. All flags override the matching env var.
|
|
31
|
+
artifact: Flags.string({
|
|
32
|
+
char: 'a',
|
|
33
|
+
description: 'Path or http(s):// URL to a compiled objectstack.json (skips auto-compile; overrides $OS_ARTIFACT_PATH)',
|
|
34
|
+
}),
|
|
35
|
+
'project-id': Flags.string({
|
|
36
|
+
description: 'Project identifier (overrides $OS_PROJECT_ID, default proj_local)',
|
|
37
|
+
}),
|
|
38
|
+
database: Flags.string({
|
|
39
|
+
char: 'd',
|
|
40
|
+
description: 'Database URL: file:./db.sqlite | libsql://... | postgres://... | mongodb://... | memory:// (overrides $OS_DATABASE_URL)',
|
|
41
|
+
}),
|
|
42
|
+
'database-driver': Flags.string({
|
|
43
|
+
description: 'Force driver kind: sqlite | turso | postgres | mongodb | memory (overrides $OS_DATABASE_DRIVER)',
|
|
44
|
+
options: ['sqlite', 'turso', 'postgres', 'mongodb', 'memory'],
|
|
45
|
+
}),
|
|
46
|
+
'database-auth-token': Flags.string({
|
|
47
|
+
description: 'Auth token for libsql/Turso connections (overrides $OS_DATABASE_AUTH_TOKEN / $TURSO_AUTH_TOKEN)',
|
|
48
|
+
}),
|
|
49
|
+
'auth-secret': Flags.string({
|
|
50
|
+
description: 'Secret for @objectstack/plugin-auth (overrides $AUTH_SECRET; dev mode injects an insecure default if neither is set)',
|
|
51
|
+
}),
|
|
26
52
|
};
|
|
27
53
|
async run() {
|
|
28
54
|
const { args, flags } = await this.parse(Dev);
|
|
@@ -30,13 +56,30 @@ export default class Dev extends Command {
|
|
|
30
56
|
printHeader('Development Mode');
|
|
31
57
|
// ── Single-Project Mode ──────────────────────────────────────────────────
|
|
32
58
|
const configPath = path.resolve(process.cwd(), 'objectstack.config.ts');
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
59
|
+
const configExists = fs.existsSync(configPath);
|
|
60
|
+
// `--artifact` lets `os dev` boot a pre-built artifact without any
|
|
61
|
+
// local config — semantically the same as `os start` but with the
|
|
62
|
+
// dev conveniences (NODE_ENV=development, dev-fallback AUTH_SECRET,
|
|
63
|
+
// --ui default-on, dev-mode error formatting).
|
|
64
|
+
const isUrl = !!flags.artifact && /^https?:\/\//i.test(flags.artifact);
|
|
65
|
+
const inferredArtifact = flags.artifact
|
|
66
|
+
?? process.env.OS_ARTIFACT_PATH
|
|
67
|
+
?? path.resolve(process.cwd(), 'dist/objectstack.json');
|
|
68
|
+
const artifactPath = isUrl ? flags.artifact : path.resolve(process.cwd(), inferredArtifact);
|
|
69
|
+
const useArtifactDirect = !!flags.artifact || !configExists;
|
|
70
|
+
if (packageName === 'all' && (configExists || flags.artifact)) {
|
|
71
|
+
if (configExists && !flags.artifact) {
|
|
72
|
+
printKV('Config', configPath, '📂');
|
|
73
|
+
}
|
|
74
|
+
// Auto-compile only when we have a config AND no explicit artifact.
|
|
75
|
+
// Explicit `--artifact` means "use this, don't rebuild".
|
|
76
|
+
const needsCompile = !flags.artifact && (flags.compile || !fs.existsSync(artifactPath));
|
|
39
77
|
if (needsCompile) {
|
|
78
|
+
if (!configExists) {
|
|
79
|
+
printError('No objectstack.config.ts and no --artifact given — nothing to start.');
|
|
80
|
+
console.error(chalk.yellow(' Run `objectstack init`, `objectstack build`, or pass `--artifact <path|url>`.'));
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
40
83
|
printStep('Compiling objectstack.config.ts → dist/objectstack.json...');
|
|
41
84
|
const binPath = process.argv[1];
|
|
42
85
|
const compileResult = spawnSync(process.execPath, [binPath, 'compile', '--output', artifactPath], { stdio: 'inherit', env: { ...process.env, NODE_ENV: 'development' } });
|
|
@@ -46,15 +89,29 @@ export default class Dev extends Command {
|
|
|
46
89
|
}
|
|
47
90
|
}
|
|
48
91
|
printStep('Starting dev server (local mode)...');
|
|
92
|
+
const projectId = flags['project-id'] ?? process.env.OS_PROJECT_ID ?? 'proj_local';
|
|
93
|
+
// NOTE: Do NOT set NODE_ENV='development' here. Oclif's tsx-based
|
|
94
|
+
// TypeScript source loader (activated when NODE_ENV is 'test' or
|
|
95
|
+
// 'development') currently mis-handles `.json` requires inside
|
|
96
|
+
// CommonJS deps (e.g. dotenv's `require('../package.json')` is
|
|
97
|
+
// transformed as JS, then JSON.parse fails) — which causes the
|
|
98
|
+
// child process to report `command serve not found`. The `--dev`
|
|
99
|
+
// flag below already opts the serve command into dev semantics,
|
|
100
|
+
// and serve.ts will set NODE_ENV='development' internally before
|
|
101
|
+
// any runtime modules are imported.
|
|
49
102
|
const localEnv = {
|
|
50
103
|
...process.env,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
104
|
+
OS_PROJECT_ID: projectId,
|
|
105
|
+
OS_ARTIFACT_PATH: artifactPath,
|
|
106
|
+
...(flags.database ? { OS_DATABASE_URL: flags.database } : {}),
|
|
107
|
+
...(flags['database-driver'] ? { OS_DATABASE_DRIVER: flags['database-driver'] } : {}),
|
|
108
|
+
...(flags['database-auth-token'] ? { OS_DATABASE_AUTH_TOKEN: flags['database-auth-token'] } : {}),
|
|
109
|
+
...(flags['auth-secret'] ? { AUTH_SECRET: flags['auth-secret'] } : {}),
|
|
55
110
|
};
|
|
56
|
-
printKV('Project ID',
|
|
57
|
-
printKV('Artifact', path.relative(process.cwd(),
|
|
111
|
+
printKV('Project ID', projectId, '🎯');
|
|
112
|
+
printKV('Artifact', isUrl ? artifactPath : path.relative(process.cwd(), artifactPath), '📦');
|
|
113
|
+
if (flags.database)
|
|
114
|
+
printKV('Database', redactDbUrl(flags.database), '🗄️');
|
|
58
115
|
const port = flags.port ?? process.env.PORT;
|
|
59
116
|
const binPath = process.argv[1];
|
|
60
117
|
spawn(process.execPath, [
|
|
@@ -75,7 +132,7 @@ export default class Dev extends Command {
|
|
|
75
132
|
const isWorkspaceRoot = fs.existsSync(workspaceConfigPath);
|
|
76
133
|
if (packageName === 'all' && !isWorkspaceRoot) {
|
|
77
134
|
printError(`Config file not found in ${cwd}`);
|
|
78
|
-
console.error(chalk.yellow(' Run in a directory with objectstack.config.ts, or from the monorepo root.'));
|
|
135
|
+
console.error(chalk.yellow(' Run in a directory with objectstack.config.ts, pass --artifact <path|url>, or run from the monorepo root.'));
|
|
79
136
|
process.exit(1);
|
|
80
137
|
}
|
|
81
138
|
const filter = packageName === 'all' ? '' : `--filter ${packageName}`;
|
|
@@ -93,4 +150,12 @@ export default class Dev extends Command {
|
|
|
93
150
|
}
|
|
94
151
|
}
|
|
95
152
|
}
|
|
153
|
+
function redactDbUrl(url) {
|
|
154
|
+
try {
|
|
155
|
+
return url.replace(/(\/\/[^/@:]+):[^/@]+@/, '$1:****@');
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return url;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
96
161
|
//# sourceMappingURL=dev.js.map
|
package/dist/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEjF,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,OAAO;IACtC,MAAM,CAAU,WAAW,GAAG,wCAAwC,CAAC;IAEvE,MAAM,CAAU,IAAI,GAAG;QACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;KACzG,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,6BAA6B,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9F,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;QACnE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;QACpE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;QAC/E,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,mEAAmE;SACjF,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YACrB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|