@objectstack/cli 4.0.3 → 4.0.5
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 +12 -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/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 +3 -0
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +48 -19
- 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/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 +14 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +91 -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/serve.d.ts +8 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +606 -44
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/start.d.ts +11 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +43 -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 +7 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -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/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/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 +32 -0
- package/dist/utils/console.d.ts.map +1 -0
- package/dist/utils/console.js +169 -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 +25 -9
- package/dist/utils/studio.js.map +1 -1
- package/package.json +55 -21
- package/.turbo/turbo-build.log +0 -4
- package/CHANGELOG.md +0 -805
- 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
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
-
import { Args, Command, Flags } from '@oclif/core';
|
|
3
|
-
import chalk from 'chalk';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
import fs from 'fs';
|
|
6
|
-
import crypto from 'crypto';
|
|
7
|
-
import { createTimer, printHeader, printKV, printStep, printSuccess, printError } from '../../utils/format.js';
|
|
8
|
-
/**
|
|
9
|
-
* Validate a plugin artifact (.tgz) for structural integrity, checksum
|
|
10
|
-
* correctness, digital signature, and platform compatibility.
|
|
11
|
-
*
|
|
12
|
-
* Architecture alignment: `npm pack --dry-run`, `helm lint`, `vsce ls`.
|
|
13
|
-
*/
|
|
14
|
-
export default class PluginValidate extends Command {
|
|
15
|
-
static description = 'Validate a plugin artifact for integrity and compliance';
|
|
16
|
-
static args = {
|
|
17
|
-
artifact: Args.string({ description: 'Path to the artifact file', required: true }),
|
|
18
|
-
};
|
|
19
|
-
static flags = {
|
|
20
|
-
verifySignature: Flags.boolean({ description: 'Verify digital signature', default: true, allowNo: true }),
|
|
21
|
-
publicKeyPath: Flags.string({ description: 'Path to public key for signature verification' }),
|
|
22
|
-
verifyChecksums: Flags.boolean({ description: 'Verify SHA-256 checksums', default: true, allowNo: true }),
|
|
23
|
-
validateMetadata: Flags.boolean({ description: 'Validate metadata schema compliance', default: true, allowNo: true }),
|
|
24
|
-
platformVersion: Flags.string({ description: 'Target platform version for compatibility check' }),
|
|
25
|
-
json: Flags.boolean({ description: 'Output result as JSON' }),
|
|
26
|
-
};
|
|
27
|
-
async run() {
|
|
28
|
-
const { args, flags } = await this.parse(PluginValidate);
|
|
29
|
-
const timer = createTimer();
|
|
30
|
-
if (!flags.json) {
|
|
31
|
-
printHeader('Plugin Validate');
|
|
32
|
-
}
|
|
33
|
-
try {
|
|
34
|
-
const artifactPath = path.resolve(process.cwd(), args.artifact);
|
|
35
|
-
if (!fs.existsSync(artifactPath)) {
|
|
36
|
-
throw new Error(`Artifact not found: ${artifactPath}`);
|
|
37
|
-
}
|
|
38
|
-
if (!flags.json) {
|
|
39
|
-
printKV('Artifact', path.relative(process.cwd(), artifactPath));
|
|
40
|
-
printStep('Reading artifact...');
|
|
41
|
-
}
|
|
42
|
-
const artifactBuffer = fs.readFileSync(artifactPath);
|
|
43
|
-
const findings = [];
|
|
44
|
-
// 1. Verify file existence and basic structure
|
|
45
|
-
if (artifactBuffer.length === 0) {
|
|
46
|
-
findings.push({ severity: 'error', rule: 'artifact.empty', message: 'Artifact file is empty' });
|
|
47
|
-
}
|
|
48
|
-
// 2. Try to parse as JSON manifest
|
|
49
|
-
let manifest;
|
|
50
|
-
try {
|
|
51
|
-
manifest = JSON.parse(artifactBuffer.toString('utf-8'));
|
|
52
|
-
findings.push({ severity: 'info', rule: 'manifest.parsed', message: 'Manifest parsed successfully' });
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
findings.push({ severity: 'error', rule: 'manifest.invalid', message: 'Artifact does not contain valid JSON manifest' });
|
|
56
|
-
}
|
|
57
|
-
// 3. Validate required manifest fields
|
|
58
|
-
if (manifest) {
|
|
59
|
-
if (!flags.json)
|
|
60
|
-
printStep('Validating manifest fields...');
|
|
61
|
-
if (!manifest.manifest && !manifest.name) {
|
|
62
|
-
findings.push({ severity: 'warning', rule: 'manifest.name', message: 'No package name found in manifest' });
|
|
63
|
-
}
|
|
64
|
-
if (!manifest.manifest?.version && !manifest.version) {
|
|
65
|
-
findings.push({ severity: 'warning', rule: 'manifest.version', message: 'No version found in manifest' });
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
// 4. Checksum verification
|
|
69
|
-
let checksumResult;
|
|
70
|
-
if (flags.verifyChecksums) {
|
|
71
|
-
if (!flags.json)
|
|
72
|
-
printStep('Verifying checksums...');
|
|
73
|
-
const checksumFile = artifactPath + '.sha256';
|
|
74
|
-
if (fs.existsSync(checksumFile)) {
|
|
75
|
-
const checksumContent = fs.readFileSync(checksumFile, 'utf-8').trim();
|
|
76
|
-
const expectedHash = checksumContent.split(/\s+/)[0];
|
|
77
|
-
const actualHash = crypto.createHash('sha256').update(artifactBuffer).digest('hex');
|
|
78
|
-
if (expectedHash === actualHash) {
|
|
79
|
-
checksumResult = { passed: true };
|
|
80
|
-
findings.push({ severity: 'info', rule: 'checksum.sha256', message: 'SHA-256 checksum verified' });
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
checksumResult = { passed: false, mismatches: ['artifact'] };
|
|
84
|
-
findings.push({ severity: 'error', rule: 'checksum.sha256', message: `SHA-256 mismatch: expected ${expectedHash.slice(0, 16)}..., got ${actualHash.slice(0, 16)}...` });
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
findings.push({ severity: 'warning', rule: 'checksum.missing', message: 'No .sha256 checksum file found alongside artifact' });
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
// 5. Signature verification
|
|
92
|
-
let signatureResult;
|
|
93
|
-
if (flags.verifySignature) {
|
|
94
|
-
if (!flags.json)
|
|
95
|
-
printStep('Verifying signature...');
|
|
96
|
-
const sigFile = artifactPath + '.sig';
|
|
97
|
-
if (fs.existsSync(sigFile) && flags.publicKeyPath && fs.existsSync(flags.publicKeyPath)) {
|
|
98
|
-
try {
|
|
99
|
-
const publicKey = fs.readFileSync(flags.publicKeyPath, 'utf-8');
|
|
100
|
-
const signature = fs.readFileSync(sigFile, 'utf-8');
|
|
101
|
-
const verifier = crypto.createVerify('RSA-SHA256');
|
|
102
|
-
verifier.update(artifactBuffer);
|
|
103
|
-
const valid = verifier.verify(publicKey, signature, 'base64');
|
|
104
|
-
signatureResult = { passed: valid, failureReason: valid ? undefined : 'Signature does not match' };
|
|
105
|
-
findings.push({
|
|
106
|
-
severity: valid ? 'info' : 'error',
|
|
107
|
-
rule: 'signature.verify',
|
|
108
|
-
message: valid ? 'Digital signature verified' : 'Digital signature verification failed',
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
catch (e) {
|
|
112
|
-
signatureResult = { passed: false, failureReason: e.message };
|
|
113
|
-
findings.push({ severity: 'error', rule: 'signature.verify', message: `Signature verification error: ${e.message}` });
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
else if (fs.existsSync(sigFile) && !flags.publicKeyPath) {
|
|
117
|
-
findings.push({ severity: 'warning', rule: 'signature.nokey', message: 'Signature file found but no --publicKeyPath provided' });
|
|
118
|
-
}
|
|
119
|
-
else if (!fs.existsSync(sigFile)) {
|
|
120
|
-
findings.push({ severity: 'info', rule: 'signature.absent', message: 'No signature file found (unsigned artifact)' });
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
// 6. Platform compatibility check
|
|
124
|
-
let platformResult;
|
|
125
|
-
if (flags.platformVersion && manifest) {
|
|
126
|
-
if (!flags.json)
|
|
127
|
-
printStep('Checking platform compatibility...');
|
|
128
|
-
const engine = manifest.manifest?.engine || manifest.engine;
|
|
129
|
-
const required = engine?.objectstack;
|
|
130
|
-
if (required) {
|
|
131
|
-
// Semver range check supporting >=, >, ^, ~, and exact versions
|
|
132
|
-
const parseSemver = (v) => {
|
|
133
|
-
const parts = v.replace(/^v/, '').split('.').map(p => parseInt(p, 10));
|
|
134
|
-
return { major: parts[0] || 0, minor: parts[1] || 0, patch: parts[2] || 0 };
|
|
135
|
-
};
|
|
136
|
-
const target = parseSemver(flags.platformVersion);
|
|
137
|
-
let compatible = false;
|
|
138
|
-
let matched = false;
|
|
139
|
-
// >=X.Y.Z — greater than or equal
|
|
140
|
-
const gteMatch = required.match(/^>=\s*([\d.]+)/);
|
|
141
|
-
if (gteMatch) {
|
|
142
|
-
const req = parseSemver(gteMatch[1]);
|
|
143
|
-
compatible = (target.major > req.major) ||
|
|
144
|
-
(target.major === req.major && target.minor > req.minor) ||
|
|
145
|
-
(target.major === req.major && target.minor === req.minor && target.patch >= req.patch);
|
|
146
|
-
matched = true;
|
|
147
|
-
}
|
|
148
|
-
// >X.Y.Z — strictly greater than
|
|
149
|
-
if (!matched) {
|
|
150
|
-
const gtMatch = required.match(/^>\s*([\d.]+)/);
|
|
151
|
-
if (gtMatch) {
|
|
152
|
-
const req = parseSemver(gtMatch[1]);
|
|
153
|
-
compatible = (target.major > req.major) ||
|
|
154
|
-
(target.major === req.major && target.minor > req.minor) ||
|
|
155
|
-
(target.major === req.major && target.minor === req.minor && target.patch > req.patch);
|
|
156
|
-
matched = true;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
// ^X.Y.Z — caret range (same major, >= minor.patch)
|
|
160
|
-
if (!matched) {
|
|
161
|
-
const caretMatch = required.match(/^\^\s*([\d.]+)/);
|
|
162
|
-
if (caretMatch) {
|
|
163
|
-
const req = parseSemver(caretMatch[1]);
|
|
164
|
-
compatible = target.major === req.major &&
|
|
165
|
-
((target.minor > req.minor) ||
|
|
166
|
-
(target.minor === req.minor && target.patch >= req.patch));
|
|
167
|
-
matched = true;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
// ~X.Y.Z — tilde range (same major.minor, >= patch)
|
|
171
|
-
if (!matched) {
|
|
172
|
-
const tildeMatch = required.match(/^~\s*([\d.]+)/);
|
|
173
|
-
if (tildeMatch) {
|
|
174
|
-
const req = parseSemver(tildeMatch[1]);
|
|
175
|
-
compatible = target.major === req.major && target.minor === req.minor && target.patch >= req.patch;
|
|
176
|
-
matched = true;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
// Exact version match
|
|
180
|
-
if (!matched && /^\d+\.\d+\.\d+$/.test(required)) {
|
|
181
|
-
const req = parseSemver(required);
|
|
182
|
-
compatible = target.major === req.major && target.minor === req.minor && target.patch === req.patch;
|
|
183
|
-
matched = true;
|
|
184
|
-
}
|
|
185
|
-
if (matched) {
|
|
186
|
-
platformResult = { compatible, requiredRange: required, targetVersion: flags.platformVersion };
|
|
187
|
-
findings.push({
|
|
188
|
-
severity: compatible ? 'info' : 'error',
|
|
189
|
-
rule: 'platform.compatibility',
|
|
190
|
-
message: compatible
|
|
191
|
-
? `Compatible with platform v${flags.platformVersion}`
|
|
192
|
-
: `Requires platform ${required}, but target is v${flags.platformVersion}`,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
platformResult = { compatible: true, targetVersion: flags.platformVersion };
|
|
198
|
-
findings.push({ severity: 'info', rule: 'platform.noreq', message: 'No platform version requirement specified — assumed compatible' });
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
// 7. Summary
|
|
202
|
-
const errors = findings.filter(f => f.severity === 'error').length;
|
|
203
|
-
const warns = findings.filter(f => f.severity === 'warning').length;
|
|
204
|
-
const infos = findings.filter(f => f.severity === 'info').length;
|
|
205
|
-
const valid = errors === 0;
|
|
206
|
-
const result = {
|
|
207
|
-
valid,
|
|
208
|
-
checksumVerification: checksumResult,
|
|
209
|
-
signatureVerification: signatureResult,
|
|
210
|
-
platformCompatibility: platformResult,
|
|
211
|
-
findings,
|
|
212
|
-
summary: { errors, warnings: warns, infos },
|
|
213
|
-
};
|
|
214
|
-
if (flags.json) {
|
|
215
|
-
console.log(JSON.stringify(result, null, 2));
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
console.log('');
|
|
219
|
-
if (valid) {
|
|
220
|
-
printSuccess(`Validation passed ${chalk.dim(`(${timer.display()})`)}`);
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
printError(`Validation failed ${chalk.dim(`(${timer.display()})`)}`);
|
|
224
|
-
}
|
|
225
|
-
console.log('');
|
|
226
|
-
for (const finding of findings) {
|
|
227
|
-
const icon = finding.severity === 'error' ? chalk.red('✗')
|
|
228
|
-
: finding.severity === 'warning' ? chalk.yellow('⚠')
|
|
229
|
-
: chalk.blue('ℹ');
|
|
230
|
-
console.log(` ${icon} ${chalk.dim(`[${finding.rule}]`)} ${finding.message}`);
|
|
231
|
-
}
|
|
232
|
-
console.log('');
|
|
233
|
-
printKV('Errors', errors);
|
|
234
|
-
printKV('Warnings', warns);
|
|
235
|
-
printKV('Info', infos);
|
|
236
|
-
console.log('');
|
|
237
|
-
if (!valid) {
|
|
238
|
-
this.exit(1);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
catch (error) {
|
|
242
|
-
if (flags.json) {
|
|
243
|
-
console.log(JSON.stringify({ valid: false, findings: [{ severity: 'error', rule: 'system', message: error.message }], summary: { errors: 1, warnings: 0, infos: 0 } }));
|
|
244
|
-
this.exit(1);
|
|
245
|
-
}
|
|
246
|
-
printError(error.message || String(error));
|
|
247
|
-
this.exit(1);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
//# sourceMappingURL=validate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/commands/plugin/validate.ts"],"names":[],"mappings":"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"}
|
package/src/bin.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* ObjectStack CLI — oclif-based entry point.
|
|
5
|
-
*
|
|
6
|
-
* All commands are auto-discovered from `src/commands/` by oclif.
|
|
7
|
-
* Plugins extend the CLI via oclif's built-in plugin system
|
|
8
|
-
* (configured in package.json under "oclif.plugins").
|
|
9
|
-
*
|
|
10
|
-
* Run `os --help` for available commands.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
export { execute } from '@oclif/core';
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
-
|
|
3
|
-
import { Command, Flags } from '@oclif/core';
|
|
4
|
-
import { printHeader, printSuccess, printError, printKV } from '../../utils/format.js';
|
|
5
|
-
import { writeAuthConfig } from '../../utils/auth-config.js';
|
|
6
|
-
import { ObjectStackClient } from '@objectstack/client';
|
|
7
|
-
import * as readline from 'node:readline/promises';
|
|
8
|
-
import { stdin as input, stdout as output } from 'node:process';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Prompt for a password with masked input (shows * per character).
|
|
12
|
-
* Falls back to plain readline.question() in non-TTY environments.
|
|
13
|
-
*/
|
|
14
|
-
async function promptPassword(promptText: string): Promise<string> {
|
|
15
|
-
if (!process.stdin.isTTY) {
|
|
16
|
-
const rl = readline.createInterface({ input, output });
|
|
17
|
-
const answer = await rl.question(promptText);
|
|
18
|
-
rl.close();
|
|
19
|
-
return answer;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
return new Promise((resolve) => {
|
|
23
|
-
const chars: string[] = [];
|
|
24
|
-
process.stdout.write(promptText);
|
|
25
|
-
process.stdin.setRawMode(true);
|
|
26
|
-
process.stdin.resume();
|
|
27
|
-
process.stdin.setEncoding('utf8');
|
|
28
|
-
|
|
29
|
-
const cleanup = () => {
|
|
30
|
-
process.stdin.setRawMode(false);
|
|
31
|
-
process.stdin.pause();
|
|
32
|
-
process.stdin.removeListener('data', handler);
|
|
33
|
-
process.stdout.write('\n');
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const handler = (char: string) => {
|
|
37
|
-
switch (char) {
|
|
38
|
-
case '\u0003': // Ctrl+C
|
|
39
|
-
cleanup();
|
|
40
|
-
process.kill(process.pid, 'SIGINT');
|
|
41
|
-
break;
|
|
42
|
-
case '\r':
|
|
43
|
-
case '\n': // Enter
|
|
44
|
-
cleanup();
|
|
45
|
-
resolve(chars.join(''));
|
|
46
|
-
break;
|
|
47
|
-
case '\u007f': // Backspace
|
|
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
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
process.stdin.on('data', handler);
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export default class AuthLogin extends Command {
|
|
67
|
-
static override description = 'Authenticate and store session credentials';
|
|
68
|
-
|
|
69
|
-
static override examples = [
|
|
70
|
-
'$ os auth login',
|
|
71
|
-
'$ os auth login --url https://api.example.com',
|
|
72
|
-
'$ os auth login --email user@example.com --password mypassword',
|
|
73
|
-
];
|
|
74
|
-
|
|
75
|
-
static override flags = {
|
|
76
|
-
url: Flags.string({
|
|
77
|
-
char: 'u',
|
|
78
|
-
description: 'Server URL',
|
|
79
|
-
default: 'http://localhost:3000',
|
|
80
|
-
env: 'OBJECTSTACK_URL',
|
|
81
|
-
}),
|
|
82
|
-
email: Flags.string({
|
|
83
|
-
char: 'e',
|
|
84
|
-
description: 'Email address',
|
|
85
|
-
}),
|
|
86
|
-
password: Flags.string({
|
|
87
|
-
char: 'p',
|
|
88
|
-
description: 'Password',
|
|
89
|
-
}),
|
|
90
|
-
json: Flags.boolean({
|
|
91
|
-
description: 'Output as JSON',
|
|
92
|
-
}),
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
async run(): Promise<void> {
|
|
96
|
-
const { flags } = await this.parse(AuthLogin);
|
|
97
|
-
|
|
98
|
-
try {
|
|
99
|
-
if (!flags.json) {
|
|
100
|
-
printHeader('ObjectStack Login');
|
|
101
|
-
printKV('Server', flags.url);
|
|
102
|
-
console.log('');
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Prompt for credentials if not provided
|
|
106
|
-
let email = flags.email;
|
|
107
|
-
let password = flags.password;
|
|
108
|
-
|
|
109
|
-
if (!email || !password) {
|
|
110
|
-
const rl = readline.createInterface({ input, output });
|
|
111
|
-
|
|
112
|
-
if (!email) {
|
|
113
|
-
email = await rl.question('Email: ');
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
rl.close();
|
|
117
|
-
|
|
118
|
-
if (!password) {
|
|
119
|
-
password = await promptPassword('Password: ');
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (!email || !password) {
|
|
124
|
-
throw new Error('Email and password are required');
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Create client and authenticate
|
|
128
|
-
const client = new ObjectStackClient({
|
|
129
|
-
baseUrl: flags.url,
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
const response = await client.auth.login({
|
|
133
|
-
type: 'email',
|
|
134
|
-
email,
|
|
135
|
-
password,
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
// Check if login was successful
|
|
139
|
-
if (!response.data?.token && !response.data?.user) {
|
|
140
|
-
throw new Error('Login failed: Invalid response from server');
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Extract token - it might be in different locations depending on the auth system
|
|
144
|
-
const token = response.data?.token || (response as any).token;
|
|
145
|
-
const user = response.data?.user;
|
|
146
|
-
|
|
147
|
-
if (!token) {
|
|
148
|
-
throw new Error('Login failed: No token received from server');
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Store credentials
|
|
152
|
-
await writeAuthConfig({
|
|
153
|
-
url: flags.url,
|
|
154
|
-
token,
|
|
155
|
-
email: user?.email || email,
|
|
156
|
-
userId: user?.id,
|
|
157
|
-
createdAt: new Date().toISOString(),
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
if (flags.json) {
|
|
161
|
-
console.log(JSON.stringify({
|
|
162
|
-
success: true,
|
|
163
|
-
email: user?.email || email,
|
|
164
|
-
userId: user?.id,
|
|
165
|
-
}, null, 2));
|
|
166
|
-
} else {
|
|
167
|
-
printSuccess('Authentication successful');
|
|
168
|
-
printKV('Email', user?.email || email);
|
|
169
|
-
if (user?.id) {
|
|
170
|
-
printKV('User ID', user.id);
|
|
171
|
-
}
|
|
172
|
-
console.log('');
|
|
173
|
-
console.log(' Credentials stored in ~/.objectstack/credentials.json');
|
|
174
|
-
console.log('');
|
|
175
|
-
}
|
|
176
|
-
} catch (error: any) {
|
|
177
|
-
if (flags.json) {
|
|
178
|
-
console.log(JSON.stringify({
|
|
179
|
-
success: false,
|
|
180
|
-
error: error.message,
|
|
181
|
-
}, null, 2));
|
|
182
|
-
this.exit(1);
|
|
183
|
-
}
|
|
184
|
-
printError(error.message || String(error));
|
|
185
|
-
this.exit(1);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
-
|
|
3
|
-
import { Command, Flags } from '@oclif/core';
|
|
4
|
-
import { printHeader, printSuccess, printError } from '../../utils/format.js';
|
|
5
|
-
import { deleteAuthConfig } from '../../utils/auth-config.js';
|
|
6
|
-
|
|
7
|
-
export default class AuthLogout extends Command {
|
|
8
|
-
static override description = 'Clear stored authentication credentials';
|
|
9
|
-
|
|
10
|
-
static override examples = [
|
|
11
|
-
'$ os auth logout',
|
|
12
|
-
];
|
|
13
|
-
|
|
14
|
-
static override flags = {
|
|
15
|
-
json: Flags.boolean({
|
|
16
|
-
description: 'Output as JSON',
|
|
17
|
-
}),
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
async run(): Promise<void> {
|
|
21
|
-
const { flags } = await this.parse(AuthLogout);
|
|
22
|
-
|
|
23
|
-
try {
|
|
24
|
-
if (!flags.json) {
|
|
25
|
-
printHeader('ObjectStack Logout');
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
await deleteAuthConfig();
|
|
29
|
-
|
|
30
|
-
if (flags.json) {
|
|
31
|
-
console.log(JSON.stringify({
|
|
32
|
-
success: true,
|
|
33
|
-
message: 'Credentials cleared',
|
|
34
|
-
}, null, 2));
|
|
35
|
-
} else {
|
|
36
|
-
printSuccess('Credentials cleared');
|
|
37
|
-
console.log('');
|
|
38
|
-
}
|
|
39
|
-
} catch (error: any) {
|
|
40
|
-
if (flags.json) {
|
|
41
|
-
console.log(JSON.stringify({
|
|
42
|
-
success: false,
|
|
43
|
-
error: error.message,
|
|
44
|
-
}, null, 2));
|
|
45
|
-
this.exit(1);
|
|
46
|
-
}
|
|
47
|
-
printError(error.message || String(error));
|
|
48
|
-
this.exit(1);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
-
|
|
3
|
-
import { Command, Flags } from '@oclif/core';
|
|
4
|
-
import { printHeader, printError, printKV } from '../../utils/format.js';
|
|
5
|
-
import { createApiClient, requireAuth } from '../../utils/api-client.js';
|
|
6
|
-
import { formatOutput } from '../../utils/output-formatter.js';
|
|
7
|
-
|
|
8
|
-
export default class AuthWhoami extends Command {
|
|
9
|
-
static override description = 'Show current session information';
|
|
10
|
-
|
|
11
|
-
static override examples = [
|
|
12
|
-
'$ os auth whoami',
|
|
13
|
-
'$ os auth whoami --format json',
|
|
14
|
-
'$ os auth whoami --url https://api.example.com --token <token>',
|
|
15
|
-
];
|
|
16
|
-
|
|
17
|
-
static override flags = {
|
|
18
|
-
url: Flags.string({
|
|
19
|
-
char: 'u',
|
|
20
|
-
description: 'Server URL',
|
|
21
|
-
env: 'OBJECTSTACK_URL',
|
|
22
|
-
}),
|
|
23
|
-
token: Flags.string({
|
|
24
|
-
char: 't',
|
|
25
|
-
description: 'Authentication token',
|
|
26
|
-
env: 'OBJECTSTACK_TOKEN',
|
|
27
|
-
}),
|
|
28
|
-
format: Flags.string({
|
|
29
|
-
char: 'f',
|
|
30
|
-
description: 'Output format',
|
|
31
|
-
options: ['json', 'table', 'yaml'],
|
|
32
|
-
default: 'table',
|
|
33
|
-
}),
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
async run(): Promise<void> {
|
|
37
|
-
const { flags } = await this.parse(AuthWhoami);
|
|
38
|
-
|
|
39
|
-
try {
|
|
40
|
-
const { client, token } = await createApiClient({
|
|
41
|
-
url: flags.url,
|
|
42
|
-
token: flags.token,
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
requireAuth(token);
|
|
46
|
-
|
|
47
|
-
// Check if we have a token
|
|
48
|
-
// Get current session info
|
|
49
|
-
const response = await client.auth.me();
|
|
50
|
-
|
|
51
|
-
const sessionData = response.data || response;
|
|
52
|
-
|
|
53
|
-
if (flags.format === 'json') {
|
|
54
|
-
formatOutput(sessionData, 'json');
|
|
55
|
-
} else if (flags.format === 'yaml') {
|
|
56
|
-
formatOutput(sessionData, 'yaml');
|
|
57
|
-
} else {
|
|
58
|
-
printHeader('Current Session');
|
|
59
|
-
|
|
60
|
-
if (sessionData.user) {
|
|
61
|
-
printKV('User ID', sessionData.user.id || '-');
|
|
62
|
-
printKV('Email', sessionData.user.email || '-');
|
|
63
|
-
printKV('Name', sessionData.user.name || '-');
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (sessionData.session) {
|
|
67
|
-
printKV('Session ID', sessionData.session.id || '-');
|
|
68
|
-
printKV('Expires At', sessionData.session.expiresAt || '-');
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
console.log('');
|
|
72
|
-
}
|
|
73
|
-
} catch (error: any) {
|
|
74
|
-
if (flags.format === 'json') {
|
|
75
|
-
console.log(JSON.stringify({
|
|
76
|
-
success: false,
|
|
77
|
-
error: error.message,
|
|
78
|
-
}, null, 2));
|
|
79
|
-
this.exit(1);
|
|
80
|
-
}
|
|
81
|
-
printError(error.message || String(error));
|
|
82
|
-
this.exit(1);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|