@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.
- package/README.md +44 -25
- package/dist/commands/build.d.ts +5 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +6 -0
- package/dist/commands/build.js.map +1 -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/compile.d.ts +3 -0
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +128 -6
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/create.js +1 -1
- package/dist/commands/data/create.js +2 -2
- package/dist/commands/data/create.js.map +1 -1
- package/dist/commands/data/delete.js +2 -2
- package/dist/commands/data/delete.js.map +1 -1
- package/dist/commands/data/get.js +2 -2
- package/dist/commands/data/get.js.map +1 -1
- package/dist/commands/data/query.js +2 -2
- package/dist/commands/data/query.js.map +1 -1
- package/dist/commands/data/update.js +2 -2
- package/dist/commands/data/update.js.map +1 -1
- package/dist/commands/dev.d.ts +9 -0
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +116 -22
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/generate.js +9 -9
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/i18n/check.d.ts +18 -0
- package/dist/commands/i18n/check.d.ts.map +1 -0
- package/dist/commands/i18n/check.js +153 -0
- package/dist/commands/i18n/check.js.map +1 -0
- package/dist/commands/init.js +2 -2
- package/dist/commands/lint.d.ts +3 -0
- package/dist/commands/lint.d.ts.map +1 -1
- package/dist/commands/lint.js +24 -0
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/login.d.ts +17 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +313 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/{auth/logout.js → logout.js} +14 -2
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/meta/delete.js +2 -2
- package/dist/commands/meta/delete.js.map +1 -1
- package/dist/commands/meta/get.js +2 -2
- package/dist/commands/meta/get.js.map +1 -1
- package/dist/commands/meta/list.js +2 -2
- package/dist/commands/meta/list.js.map +1 -1
- package/dist/commands/meta/register.js +2 -2
- package/dist/commands/meta/register.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/projects/bind.d.ts +30 -0
- package/dist/commands/projects/bind.d.ts.map +1 -0
- package/dist/commands/projects/bind.js +132 -0
- package/dist/commands/projects/bind.js.map +1 -0
- package/dist/commands/projects/create.d.ts +28 -0
- package/dist/commands/projects/create.d.ts.map +1 -0
- package/dist/commands/projects/create.js +120 -0
- package/dist/commands/projects/create.js.map +1 -0
- package/dist/commands/projects/list.d.ts +21 -0
- package/dist/commands/projects/list.d.ts.map +1 -0
- package/dist/commands/projects/list.js +79 -0
- package/dist/commands/projects/list.js.map +1 -0
- package/dist/commands/projects/projects.test.d.ts +2 -0
- package/dist/commands/projects/projects.test.d.ts.map +1 -0
- package/dist/commands/projects/projects.test.js +56 -0
- package/dist/commands/projects/projects.test.js.map +1 -0
- package/dist/commands/projects/show.d.ts +21 -0
- package/dist/commands/projects/show.d.ts.map +1 -0
- package/dist/commands/projects/show.js +72 -0
- package/dist/commands/projects/show.js.map +1 -0
- package/dist/commands/projects/switch.d.ts +24 -0
- package/dist/commands/projects/switch.d.ts.map +1 -0
- package/dist/commands/projects/switch.js +64 -0
- package/dist/commands/projects/switch.js.map +1 -0
- package/dist/commands/publish.d.ts +17 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +135 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/{auth/login.d.ts → register.d.ts} +3 -2
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/{auth/login.js → register.js} +44 -61
- package/dist/commands/register.js.map +1 -0
- 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 +22 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +1173 -58
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/start.d.ts +18 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +112 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/{auth/whoami.js → whoami.js} +5 -5
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.d.ts +11 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -5
- package/dist/index.js.map +1 -1
- package/dist/utils/account.d.ts +31 -0
- package/dist/utils/account.d.ts.map +1 -0
- package/dist/utils/account.js +154 -0
- package/dist/utils/account.js.map +1 -0
- package/dist/utils/api-client.d.ts +10 -4
- package/dist/utils/api-client.d.ts.map +1 -1
- package/dist/utils/api-client.js +13 -7
- package/dist/utils/api-client.js.map +1 -1
- package/dist/utils/auth-config.d.ts +6 -0
- package/dist/utils/auth-config.d.ts.map +1 -1
- package/dist/utils/auth-config.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/build-runtime.d.ts +45 -0
- package/dist/utils/build-runtime.d.ts.map +1 -0
- package/dist/utils/build-runtime.js +154 -0
- package/dist/utils/build-runtime.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/config.d.ts.map +1 -1
- package/dist/utils/config.js +17 -2
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/console.d.ts +33 -0
- package/dist/utils/console.d.ts.map +1 -0
- package/dist/utils/console.js +172 -0
- package/dist/utils/console.js.map +1 -0
- package/dist/utils/extract-hook-body.d.ts +13 -0
- package/dist/utils/extract-hook-body.d.ts.map +1 -0
- package/dist/utils/extract-hook-body.js +175 -0
- package/dist/utils/extract-hook-body.js.map +1 -0
- package/dist/utils/format.d.ts +8 -0
- package/dist/utils/format.d.ts.map +1 -1
- package/dist/utils/format.js +15 -2
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/i18n-coverage.d.ts +61 -0
- package/dist/utils/i18n-coverage.d.ts.map +1 -0
- package/dist/utils/i18n-coverage.js +176 -0
- package/dist/utils/i18n-coverage.js.map +1 -0
- package/dist/utils/lower-callables.d.ts +17 -0
- package/dist/utils/lower-callables.d.ts.map +1 -0
- package/dist/utils/lower-callables.js +181 -0
- package/dist/utils/lower-callables.js.map +1 -0
- package/dist/utils/plugin-detection.d.ts +1 -0
- package/dist/utils/plugin-detection.d.ts.map +1 -1
- package/dist/utils/plugin-detection.js +41 -0
- package/dist/utils/plugin-detection.js.map +1 -1
- package/dist/utils/studio.d.ts +1 -0
- package/dist/utils/studio.d.ts.map +1 -1
- package/dist/utils/studio.js +24 -9
- package/dist/utils/studio.js.map +1 -1
- package/package.json +60 -22
- package/.turbo/turbo-build.log +0 -4
- package/CHANGELOG.md +0 -821
- package/bin/run-dev.js +0 -5
- package/dist/commands/auth/login.d.ts.map +0 -1
- package/dist/commands/auth/login.js.map +0 -1
- package/dist/commands/auth/logout.d.ts.map +0 -1
- package/dist/commands/auth/logout.js.map +0 -1
- package/dist/commands/auth/whoami.d.ts.map +0 -1
- package/dist/commands/auth/whoami.js.map +0 -1
- package/dist/commands/codemod/v2-to-v3.d.ts +0 -10
- package/dist/commands/codemod/v2-to-v3.d.ts.map +0 -1
- package/dist/commands/codemod/v2-to-v3.js +0 -145
- package/dist/commands/codemod/v2-to-v3.js.map +0 -1
- package/dist/commands/plugin/add.d.ts +0 -22
- package/dist/commands/plugin/add.d.ts.map +0 -1
- package/dist/commands/plugin/add.js +0 -93
- package/dist/commands/plugin/add.js.map +0 -1
- package/dist/commands/plugin/build.d.ts +0 -29
- package/dist/commands/plugin/build.d.ts.map +0 -1
- package/dist/commands/plugin/build.js +0 -170
- package/dist/commands/plugin/build.js.map +0 -1
- package/dist/commands/plugin/info.d.ts +0 -10
- package/dist/commands/plugin/info.d.ts.map +0 -1
- package/dist/commands/plugin/info.js +0 -65
- package/dist/commands/plugin/info.js.map +0 -1
- package/dist/commands/plugin/list.d.ts +0 -13
- package/dist/commands/plugin/list.d.ts.map +0 -1
- package/dist/commands/plugin/list.js +0 -78
- package/dist/commands/plugin/list.js.map +0 -1
- package/dist/commands/plugin/publish.d.ts +0 -27
- package/dist/commands/plugin/publish.d.ts.map +0 -1
- package/dist/commands/plugin/publish.js +0 -152
- package/dist/commands/plugin/publish.js.map +0 -1
- package/dist/commands/plugin/remove.d.ts +0 -20
- package/dist/commands/plugin/remove.d.ts.map +0 -1
- package/dist/commands/plugin/remove.js +0 -79
- package/dist/commands/plugin/remove.js.map +0 -1
- package/dist/commands/plugin/validate.d.ts +0 -23
- package/dist/commands/plugin/validate.d.ts.map +0 -1
- package/dist/commands/plugin/validate.js +0 -251
- package/dist/commands/plugin/validate.js.map +0 -1
- package/src/bin.ts +0 -13
- package/src/commands/auth/login.ts +0 -188
- package/src/commands/auth/logout.ts +0 -51
- package/src/commands/auth/whoami.ts +0 -85
- package/src/commands/codemod/v2-to-v3.ts +0 -171
- package/src/commands/compile.ts +0 -114
- package/src/commands/create.ts +0 -281
- package/src/commands/data/create.ts +0 -110
- package/src/commands/data/delete.ts +0 -84
- package/src/commands/data/get.ts +0 -84
- package/src/commands/data/query.ts +0 -127
- package/src/commands/data/update.ts +0 -114
- package/src/commands/dev.ts +0 -83
- package/src/commands/diff.ts +0 -294
- package/src/commands/doctor.ts +0 -572
- package/src/commands/explain.ts +0 -412
- package/src/commands/generate.ts +0 -924
- package/src/commands/info.ts +0 -124
- package/src/commands/init.ts +0 -327
- package/src/commands/lint.ts +0 -315
- package/src/commands/meta/delete.ts +0 -79
- package/src/commands/meta/get.ts +0 -73
- package/src/commands/meta/list.ts +0 -105
- package/src/commands/meta/register.ts +0 -97
- package/src/commands/plugin/add.ts +0 -112
- package/src/commands/plugin/build.ts +0 -193
- package/src/commands/plugin/info.ts +0 -79
- package/src/commands/plugin/list.ts +0 -93
- package/src/commands/plugin/publish.ts +0 -176
- package/src/commands/plugin/remove.ts +0 -97
- package/src/commands/plugin/validate.ts +0 -268
- package/src/commands/serve.ts +0 -411
- package/src/commands/studio.ts +0 -52
- package/src/commands/test.ts +0 -135
- package/src/commands/validate.ts +0 -143
- package/src/index.ts +0 -22
- package/src/utils/api-client.ts +0 -88
- package/src/utils/auth-config.ts +0 -107
- package/src/utils/config.ts +0 -80
- package/src/utils/format.ts +0 -267
- package/src/utils/output-formatter.ts +0 -91
- package/src/utils/plugin-detection.ts +0 -16
- package/src/utils/plugin-helpers.ts +0 -37
- package/src/utils/studio.ts +0 -350
- package/test/commands.test.ts +0 -128
- package/test/create.test.ts +0 -25
- package/test/plugin-commands.test.ts +0 -44
- package/test/plugin.test.ts +0 -169
- package/test/remote-api-commands.test.ts +0 -188
- package/test/remote-api-utils.test.ts +0 -196
- package/test/serve-host-config.test.ts +0 -77
- package/tsconfig.build.json +0 -20
- package/tsconfig.json +0 -25
- package/tsup.config.ts +0 -23
- /package/dist/commands/{auth/logout.d.ts → logout.d.ts} +0 -0
- /package/dist/commands/{auth/whoami.d.ts → whoami.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -63,12 +63,7 @@ Available generate types: `object`, `view`, `action`, `flow`, `agent`, `dashboar
|
|
|
63
63
|
|
|
64
64
|
### Plugin Management
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
|---------|-------------|
|
|
68
|
-
| `os plugin list [config]` | List plugins defined in configuration (alias: `os plugin ls`) |
|
|
69
|
-
| `os plugin info <name> [config]` | Show detailed plugin information |
|
|
70
|
-
| `os plugin add <package>` | Add a plugin import and entry to config |
|
|
71
|
-
| `os plugin remove <name>` | Remove a plugin from config (alias: `os plugin rm`) |
|
|
66
|
+
Runtime plugins (declared in `objectstack.config.ts` `plugins`) are loaded automatically by `os serve` / `os dev`. There is no `os plugin` command group in v1; project-level dependency management and marketplace distribution will arrive with the Cloud Projects model. To distribute a build today, use `os build` (or `os compile`) and bind the artifact via `os projects bind <id> --artifact dist/objectstack.json`.
|
|
72
67
|
|
|
73
68
|
### Quality
|
|
74
69
|
|
|
@@ -144,18 +139,9 @@ export default defineStack({
|
|
|
144
139
|
|
|
145
140
|
- `-d, --dir <directory>` — Override target directory
|
|
146
141
|
|
|
147
|
-
### `os
|
|
148
|
-
|
|
149
|
-
- `--json` — Output as JSON
|
|
150
|
-
|
|
151
|
-
### `os plugin add`
|
|
152
|
-
|
|
153
|
-
- `-d, --dev` — Add as a dev-only plugin
|
|
154
|
-
- `-c, --config <path>` — Configuration file path
|
|
142
|
+
### `os plugins` (oclif)
|
|
155
143
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
- `-c, --config <path>` — Configuration file path
|
|
144
|
+
`os plugins install`, `os plugins uninstall`, `os plugins update`, and friends come from `@oclif/plugin-plugins`. They install third-party CLI extensions (oclif plugins), not runtime plugins for an ObjectStack project. See [oclif's plugin docs](https://oclif.io/docs/plugins) for the full surface.
|
|
159
145
|
|
|
160
146
|
### `os info`
|
|
161
147
|
|
|
@@ -237,10 +223,10 @@ os init # 1. Create project
|
|
|
237
223
|
os generate object customer # 2. Add a Customer object
|
|
238
224
|
os generate object order # 3. Add an Order object
|
|
239
225
|
os generate view customer # 4. Add a list view
|
|
240
|
-
os
|
|
241
|
-
os
|
|
242
|
-
os
|
|
243
|
-
os
|
|
226
|
+
os validate # 5. Validate everything
|
|
227
|
+
os dev # 6. Start dev server
|
|
228
|
+
os compile # 7. Build for production
|
|
229
|
+
os projects bind <id> --artifact dist/objectstack.json # 8. Bind to a Cloud Project
|
|
244
230
|
```
|
|
245
231
|
|
|
246
232
|
## Architecture
|
|
@@ -255,11 +241,12 @@ os compile # 8. Build for production
|
|
|
255
241
|
│ ├── compile.ts # os compile
|
|
256
242
|
│ ├── validate.ts # os validate
|
|
257
243
|
│ ├── generate.ts # os generate (alias: g)
|
|
258
|
-
│ ├──
|
|
244
|
+
│ ├── projects/ # os projects <subcommand>
|
|
259
245
|
│ │ ├── list.ts
|
|
260
|
-
│ │ ├──
|
|
261
|
-
│ │ ├──
|
|
262
|
-
│ │
|
|
246
|
+
│ │ ├── show.ts
|
|
247
|
+
│ │ ├── create.ts
|
|
248
|
+
│ │ ├── switch.ts
|
|
249
|
+
│ │ └── bind.ts
|
|
263
250
|
│ ├── codemod/ # os codemod <subcommand>
|
|
264
251
|
│ │ └── v2-to-v3.ts
|
|
265
252
|
│ └── ...
|
|
@@ -267,6 +254,38 @@ os compile # 8. Build for production
|
|
|
267
254
|
└── package.json # oclif config under "oclif" key
|
|
268
255
|
```
|
|
269
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
|
+
|
|
270
289
|
## License
|
|
271
290
|
|
|
272
291
|
Apache-2.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAEA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,OAAgB,WAAW,SAA4E;CACxG"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
+
import Compile from './compile.js';
|
|
3
|
+
export default class Build extends Compile {
|
|
4
|
+
static description = 'Compile ObjectStack configuration to JSON artifact (alias for compile)';
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAU,WAAW,GAAG,wEAAwE,CAAC"}
|
|
@@ -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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"}
|
|
@@ -7,6 +7,9 @@ export default class Compile extends Command {
|
|
|
7
7
|
static flags: {
|
|
8
8
|
output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
9
|
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
'strict-body': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
'runtime-bundle': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
'no-runtime-bundle': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
13
|
};
|
|
11
14
|
run(): Promise<void>;
|
|
12
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAC;AAqBnD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,OAAgB,WAAW,SAAwD;IAEnF,OAAgB,IAAI;;MAElB;IAEF,OAAgB,KAAK;;;;;;MAoBnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA2L3B"}
|