@drawcall/market 0.1.5 → 0.1.7
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/dist/asset-implementation.d.ts +88 -0
- package/dist/asset-implementation.d.ts.map +1 -0
- package/dist/asset-implementation.js +2 -0
- package/dist/asset-implementation.js.map +1 -0
- package/dist/cli-client.d.ts +2 -2
- package/dist/cli-client.d.ts.map +1 -1
- package/dist/cli-client.js +4 -4
- package/dist/cli-client.js.map +1 -1
- package/dist/cli.js +106 -22
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +1 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +4 -12
- package/dist/client.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +9 -4
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +30 -28
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/logout.js +3 -3
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/preview.d.ts +9 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +50 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/search.d.ts +4 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +20 -10
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/upload.d.ts +9 -0
- package/dist/commands/upload.d.ts.map +1 -0
- package/dist/commands/upload.js +220 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/config.d.ts +4 -7
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -4
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -10
- package/dist/constants.js.map +1 -1
- package/dist/contract.d.ts +37 -134
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +10 -48
- package/dist/contract.js.map +1 -1
- package/dist/generate.d.ts +0 -2
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +5 -22
- package/dist/generate.js.map +1 -1
- package/dist/index.d.ts +5 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +1 -1
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +14 -11
- package/dist/install.js.map +1 -1
- package/dist/output.d.ts +26 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +52 -0
- package/dist/output.js.map +1 -0
- package/dist/resolve.d.ts.map +1 -1
- package/dist/resolve.js +15 -26
- package/dist/resolve.js.map +1 -1
- package/dist/schemas.d.ts +31 -39
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +23 -25
- package/dist/schemas.js.map +1 -1
- package/package.json +13 -4
- package/src/asset-implementation.ts +114 -0
- package/src/cli-client.ts +7 -6
- package/src/cli.ts +146 -29
- package/src/client.ts +5 -15
- package/src/commands/generate.ts +9 -6
- package/src/commands/install.ts +34 -31
- package/src/commands/logout.ts +3 -3
- package/src/commands/preview.ts +69 -0
- package/src/commands/search.ts +27 -11
- package/src/commands/upload.ts +262 -0
- package/src/config.ts +11 -5
- package/src/constants.ts +2 -10
- package/src/contract.ts +22 -120
- package/src/generate.ts +5 -29
- package/src/index.ts +23 -14
- package/src/install.ts +24 -14
- package/src/output.ts +76 -0
- package/src/resolve.ts +22 -38
- package/src/schemas.ts +26 -27
- package/tsconfig.json +2 -1
- package/dist/commands/login.d.ts +0 -10
- package/dist/commands/login.d.ts.map +0 -1
- package/dist/commands/login.js +0 -92
- package/dist/commands/login.js.map +0 -1
- package/dist/internal-contract.d.ts +0 -19
- package/dist/internal-contract.d.ts.map +0 -1
- package/dist/internal-contract.js +0 -19
- package/dist/internal-contract.js.map +0 -1
- package/src/commands/login.ts +0 -113
- package/src/internal-contract.ts +0 -26
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { AssetSearchResult, AssetVersion, GenerateAssetResult, PaginatedList } from './contract.js';
|
|
2
|
+
import type { AssetType } from './schemas.js';
|
|
3
|
+
export interface AssetSearchInput {
|
|
4
|
+
page: number;
|
|
5
|
+
limit: number;
|
|
6
|
+
type?: AssetType;
|
|
7
|
+
query?: string;
|
|
8
|
+
includeUnapproved: boolean;
|
|
9
|
+
sort: 'newest' | 'alphabetical' | 'relevance';
|
|
10
|
+
}
|
|
11
|
+
export interface AssetExactInput {
|
|
12
|
+
name: string;
|
|
13
|
+
type?: AssetType;
|
|
14
|
+
includeUnapproved: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface AssetUploadZipInput {
|
|
17
|
+
name: string;
|
|
18
|
+
type: AssetType;
|
|
19
|
+
version: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
npmDependencies: Record<string, string>;
|
|
22
|
+
assetDependencies: Record<string, string>;
|
|
23
|
+
tags: string[];
|
|
24
|
+
zip: File;
|
|
25
|
+
}
|
|
26
|
+
export interface AssetDownloadZipInput {
|
|
27
|
+
name: string;
|
|
28
|
+
version: string;
|
|
29
|
+
}
|
|
30
|
+
export interface AssetGenerateInput {
|
|
31
|
+
description: string;
|
|
32
|
+
type?: AssetType;
|
|
33
|
+
}
|
|
34
|
+
export interface AssetImplementationContext {
|
|
35
|
+
catalog: AssetCatalog;
|
|
36
|
+
blobs: BlobStore;
|
|
37
|
+
searchIndex?: AssetSearchIndex;
|
|
38
|
+
renderModelPreview?: (files: Record<string, Uint8Array>, model: {
|
|
39
|
+
path: string;
|
|
40
|
+
bytes: Uint8Array;
|
|
41
|
+
}) => Promise<{
|
|
42
|
+
bytes: Uint8Array;
|
|
43
|
+
contentType: string;
|
|
44
|
+
}>;
|
|
45
|
+
}
|
|
46
|
+
export interface AssetCatalog {
|
|
47
|
+
search(input: AssetSearchInput): Promise<PaginatedList<AssetSearchResult>>;
|
|
48
|
+
exact(input: AssetExactInput): Promise<AssetSearchResult | null>;
|
|
49
|
+
saveVersion(input: SaveAssetVersionInput): Promise<AssetVersion>;
|
|
50
|
+
getVersion(input: AssetDownloadZipInput): Promise<AssetVersion | null>;
|
|
51
|
+
}
|
|
52
|
+
export interface SaveAssetVersionInput {
|
|
53
|
+
name: string;
|
|
54
|
+
type: AssetType;
|
|
55
|
+
version: string;
|
|
56
|
+
description?: string;
|
|
57
|
+
ownerId: string;
|
|
58
|
+
approved: boolean;
|
|
59
|
+
npmDependencies: Record<string, string>;
|
|
60
|
+
assetDependencies: Record<string, string>;
|
|
61
|
+
sourceKey: string;
|
|
62
|
+
}
|
|
63
|
+
export interface BlobStore {
|
|
64
|
+
put(key: string, data: ArrayBuffer, contentType?: string): Promise<void>;
|
|
65
|
+
get(key: string): Promise<Blob | null>;
|
|
66
|
+
}
|
|
67
|
+
export interface AssetSearchIndexEntry {
|
|
68
|
+
name: string;
|
|
69
|
+
description: string;
|
|
70
|
+
vector: number[];
|
|
71
|
+
}
|
|
72
|
+
export interface AssetSearchIndex {
|
|
73
|
+
list(type: AssetType): Promise<AssetSearchIndexEntry[]>;
|
|
74
|
+
upsert(type: AssetType, entry: AssetSearchIndexEntry): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
export interface AssetImplementation {
|
|
77
|
+
type: AssetType;
|
|
78
|
+
search(context: AssetImplementationContext, input: AssetSearchInput): Promise<PaginatedList<AssetSearchResult>>;
|
|
79
|
+
exact(context: AssetImplementationContext, input: AssetExactInput): Promise<AssetSearchResult | null>;
|
|
80
|
+
uploadZip(context: AssetImplementationContext, input: AssetUploadZipInput, owner: {
|
|
81
|
+
id: string;
|
|
82
|
+
role: string;
|
|
83
|
+
}): Promise<AssetVersion>;
|
|
84
|
+
downloadZip(context: AssetImplementationContext, input: AssetDownloadZipInput): Promise<Blob>;
|
|
85
|
+
downloadPreviewImage?(context: AssetImplementationContext, input: AssetDownloadZipInput): Promise<Blob>;
|
|
86
|
+
generate(context: AssetImplementationContext, input: AssetGenerateInput): Promise<GenerateAssetResult>;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=asset-implementation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-implementation.d.ts","sourceRoot":"","sources":["../src/asset-implementation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-implementation.js","sourceRoot":"","sources":["../src/asset-implementation.ts"],"names":[],"mappings":""}
|
package/dist/cli-client.d.ts
CHANGED
|
@@ -5,13 +5,13 @@ export declare class NotLoggedInError extends Error {
|
|
|
5
5
|
export interface CliClientOptions {
|
|
6
6
|
/** Override the API base URL. Takes precedence over config and defaults. */
|
|
7
7
|
baseUrl?: string;
|
|
8
|
-
/** Require authentication. When true, throws NotLoggedInError if no
|
|
8
|
+
/** Require authentication. When true, throws NotLoggedInError if no token is available. */
|
|
9
9
|
requireAuth?: boolean;
|
|
10
10
|
}
|
|
11
11
|
export interface CliClient {
|
|
12
12
|
client: MarketClient;
|
|
13
13
|
baseUrl: string;
|
|
14
|
-
|
|
14
|
+
authToken: string | undefined;
|
|
15
15
|
}
|
|
16
16
|
export declare function getCliClient(opts?: CliClientOptions): Promise<CliClient>;
|
|
17
17
|
//# sourceMappingURL=cli-client.d.ts.map
|
package/dist/cli-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-client.d.ts","sourceRoot":"","sources":["../src/cli-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAKnE,qBAAa,gBAAiB,SAAQ,KAAK;;CAK1C;AAED,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,
|
|
1
|
+
{"version":3,"file":"cli-client.d.ts","sourceRoot":"","sources":["../src/cli-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAKnE,qBAAa,gBAAiB,SAAQ,KAAK;;CAK1C;AAED,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2FAA2F;IAC3F,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;CAC9B;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,CAAC,CAelF"}
|
package/dist/cli-client.js
CHANGED
|
@@ -9,15 +9,15 @@ export class NotLoggedInError extends Error {
|
|
|
9
9
|
}
|
|
10
10
|
export async function getCliClient(opts = {}) {
|
|
11
11
|
const config = await loadConfig();
|
|
12
|
-
const
|
|
12
|
+
const authToken = process.env.DRAWCALL_AUTH_TOKEN ?? process.env.MARKET_API_KEY ?? config?.authToken;
|
|
13
13
|
const baseUrl = opts.baseUrl ?? process.env.MARKET_API_URL ?? config?.baseUrl ?? DEFAULT_BASE_URL;
|
|
14
|
-
if (opts.requireAuth && !
|
|
14
|
+
if (opts.requireAuth && !authToken) {
|
|
15
15
|
throw new NotLoggedInError();
|
|
16
16
|
}
|
|
17
17
|
return {
|
|
18
|
-
client: createMarketClient({ baseUrl,
|
|
18
|
+
client: createMarketClient({ baseUrl, authToken }),
|
|
19
19
|
baseUrl,
|
|
20
|
-
|
|
20
|
+
authToken,
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
23
|
//# sourceMappingURL=cli-client.js.map
|
package/dist/cli-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-client.js","sourceRoot":"","sources":["../src/cli-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAqB,MAAM,aAAa,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,gBAAgB,GAAG,gCAAgC,CAAA;AAEzD,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC;QACE,KAAK,CAAC,0CAA0C,CAAC,CAAA;QACjD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;IAChC,CAAC;CACF;AAeD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAyB,EAAE;IAC5D,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IACjC,MAAM,
|
|
1
|
+
{"version":3,"file":"cli-client.js","sourceRoot":"","sources":["../src/cli-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAqB,MAAM,aAAa,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,gBAAgB,GAAG,gCAAgC,CAAA;AAEzD,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC;QACE,KAAK,CAAC,0CAA0C,CAAC,CAAA;QACjD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;IAChC,CAAC;CACF;AAeD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAyB,EAAE;IAC5D,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IACjC,MAAM,SAAS,GACb,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,EAAE,SAAS,CAAA;IACpF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,EAAE,OAAO,IAAI,gBAAgB,CAAA;IAEjG,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,IAAI,gBAAgB,EAAE,CAAA;IAC9B,CAAC;IAED,OAAO;QACL,MAAM,EAAE,kBAAkB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAClD,OAAO;QACP,SAAS;KACV,CAAA;AACH,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -1,39 +1,55 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
2
3
|
import { Command, Option } from 'commander';
|
|
3
4
|
import chalk from 'chalk';
|
|
5
|
+
import open from 'open';
|
|
6
|
+
import * as oauthClient from 'openid-client';
|
|
4
7
|
import { ASSET_TYPES } from './schemas.js';
|
|
5
8
|
import { installCommand } from './commands/install.js';
|
|
6
9
|
import { searchCommand } from './commands/search.js';
|
|
7
10
|
import { generateCommand } from './commands/generate.js';
|
|
8
|
-
import {
|
|
11
|
+
import { previewCommand } from './commands/preview.js';
|
|
12
|
+
import { uploadCommand } from './commands/upload.js';
|
|
9
13
|
import { logout } from './commands/logout.js';
|
|
10
|
-
import {
|
|
14
|
+
import { createMarketClient } from './client.js';
|
|
15
|
+
import { saveConfig, getConfigPath } from './config.js';
|
|
16
|
+
import { errorResult, loginResult } from './output.js';
|
|
17
|
+
const packageJson = createRequire(import.meta.url)('../package.json');
|
|
11
18
|
const program = new Command();
|
|
12
19
|
const DEFAULT_BASE_URL = 'https://api.market.drawcall.ai';
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
|
|
20
|
+
const AUTH_ISSUER_URL = 'https://auth.drawcall.ai/api/auth';
|
|
21
|
+
const DEVICE_CLIENT_ID = 'market-cli';
|
|
22
|
+
const typeOption = new Option('--type <type>', 'Asset type').choices([...ASSET_TYPES]);
|
|
23
|
+
const apiOption = new Option('--api <url>', 'API URL').default(process.env.MARKET_API_URL, 'from MARKET_API_URL / config / default');
|
|
24
|
+
program.name('market').description('Find and install Drawcall Market assets').version(packageJson.version);
|
|
16
25
|
program
|
|
17
26
|
.command('login')
|
|
18
|
-
.description('
|
|
27
|
+
.description('Sign in')
|
|
19
28
|
.addOption(apiOption)
|
|
20
29
|
.action(async (opts) => {
|
|
21
|
-
|
|
30
|
+
const baseUrl = opts.api ?? DEFAULT_BASE_URL;
|
|
31
|
+
const token = await runDeviceLogin();
|
|
32
|
+
const client = createMarketClient({ baseUrl, authToken: token });
|
|
33
|
+
const profile = await client.user.getProfile();
|
|
34
|
+
if (!profile)
|
|
35
|
+
throw new Error('The Market API did not accept the auth token.');
|
|
36
|
+
await saveConfig({ authToken: token, baseUrl });
|
|
37
|
+
console.log(loginResult(profile.email, getConfigPath()));
|
|
22
38
|
});
|
|
23
39
|
program
|
|
24
40
|
.command('logout')
|
|
25
|
-
.description('
|
|
41
|
+
.description('Sign out')
|
|
26
42
|
.action(async () => {
|
|
27
43
|
await logout();
|
|
28
44
|
});
|
|
29
45
|
program
|
|
30
46
|
.command('install')
|
|
31
|
-
.description('Install
|
|
32
|
-
.argument('<assets...>', '
|
|
47
|
+
.description('Install by name or prompt')
|
|
48
|
+
.argument('<assets...>', 'Names or prompts')
|
|
33
49
|
.addOption(typeOption)
|
|
34
50
|
.addOption(apiOption)
|
|
35
51
|
.option('--unapproved', 'Include unapproved versions', false)
|
|
36
|
-
.option('--cwd <dir>', 'Project directory'
|
|
52
|
+
.option('--cwd <dir>', 'Project directory')
|
|
37
53
|
.action(async (args, opts) => {
|
|
38
54
|
await installCommand(args, {
|
|
39
55
|
type: opts.type,
|
|
@@ -44,20 +60,68 @@ program
|
|
|
44
60
|
});
|
|
45
61
|
program
|
|
46
62
|
.command('search')
|
|
47
|
-
.description('
|
|
48
|
-
.argument('<query>', '
|
|
63
|
+
.description('Find assets')
|
|
64
|
+
.argument('<query>', 'Search query')
|
|
49
65
|
.addOption(typeOption)
|
|
50
66
|
.addOption(apiOption)
|
|
67
|
+
.option('--unapproved', 'Include unapproved versions', false)
|
|
68
|
+
.option('--limit <n>', 'Max results, 1-5', parseSearchLimit, 5)
|
|
69
|
+
.option('--verbose', 'Show longer descriptions', false)
|
|
51
70
|
.action(async (query, opts) => {
|
|
52
|
-
|
|
71
|
+
if (!opts.type) {
|
|
72
|
+
console.error(errorResult(`Search requires --type. Available types: ${ASSET_TYPES.join(', ')}`));
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
await searchCommand(query, {
|
|
76
|
+
type: opts.type,
|
|
77
|
+
baseUrl: opts.api,
|
|
78
|
+
unapproved: opts.unapproved,
|
|
79
|
+
limit: opts.limit,
|
|
80
|
+
verbose: opts.verbose,
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
program
|
|
84
|
+
.command('upload')
|
|
85
|
+
.description('Publish one model')
|
|
86
|
+
.argument('<name>', 'Asset name')
|
|
87
|
+
.argument('<file-filter>', '.glb/.gltf path or glob')
|
|
88
|
+
.argument('<description>', 'Short description')
|
|
89
|
+
.addOption(typeOption)
|
|
90
|
+
.addOption(apiOption)
|
|
91
|
+
.option('--version <version>', 'Explicit semver version')
|
|
92
|
+
.option('--cwd <dir>', 'Project directory')
|
|
93
|
+
.action(async (name, fileFilter, description, opts) => {
|
|
94
|
+
await uploadCommand(name, fileFilter, description, {
|
|
95
|
+
type: opts.type,
|
|
96
|
+
version: opts.version,
|
|
97
|
+
baseUrl: opts.api,
|
|
98
|
+
cwd: opts.cwd,
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
program
|
|
102
|
+
.command('preview')
|
|
103
|
+
.description('Save preview image')
|
|
104
|
+
.argument('<name>', 'Asset name')
|
|
105
|
+
.argument('[version]', 'Semver version')
|
|
106
|
+
.addOption(typeOption)
|
|
107
|
+
.addOption(apiOption)
|
|
108
|
+
.option('--unapproved', 'Include unapproved versions', false)
|
|
109
|
+
.option('--out <file>', 'Output PNG path')
|
|
110
|
+
.action(async (name, version, opts) => {
|
|
111
|
+
await previewCommand(name, version, {
|
|
112
|
+
type: opts.type,
|
|
113
|
+
baseUrl: opts.api,
|
|
114
|
+
unapproved: opts.unapproved,
|
|
115
|
+
out: opts.out,
|
|
116
|
+
});
|
|
53
117
|
});
|
|
54
118
|
program
|
|
55
119
|
.command('generate')
|
|
56
|
-
.description('Generate
|
|
57
|
-
.argument('<description>', '
|
|
120
|
+
.description('Generate and install')
|
|
121
|
+
.argument('<description>', 'Asset prompt')
|
|
58
122
|
.addOption(typeOption)
|
|
59
123
|
.addOption(apiOption)
|
|
60
|
-
.option('--cwd <dir>', 'Project directory'
|
|
124
|
+
.option('--cwd <dir>', 'Project directory')
|
|
61
125
|
.action(async (description, opts) => {
|
|
62
126
|
await generateCommand(description, {
|
|
63
127
|
type: opts.type,
|
|
@@ -65,12 +129,32 @@ program
|
|
|
65
129
|
cwd: opts.cwd,
|
|
66
130
|
});
|
|
67
131
|
});
|
|
132
|
+
if (process.argv.length <= 2) {
|
|
133
|
+
program.outputHelp();
|
|
134
|
+
process.exit(0);
|
|
135
|
+
}
|
|
68
136
|
program.parseAsync().catch((err) => {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if (err instanceof NotLoggedInError) {
|
|
72
|
-
console.error(chalk.red(err.message));
|
|
73
|
-
}
|
|
137
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
138
|
+
console.error(errorResult(message));
|
|
74
139
|
process.exit(1);
|
|
75
140
|
});
|
|
141
|
+
function parseSearchLimit(value) {
|
|
142
|
+
const parsed = Number.parseInt(value, 10);
|
|
143
|
+
if (!Number.isInteger(parsed) || parsed < 1) {
|
|
144
|
+
throw new Error('--limit must be a positive integer');
|
|
145
|
+
}
|
|
146
|
+
return Math.min(parsed, 5);
|
|
147
|
+
}
|
|
148
|
+
async function runDeviceLogin() {
|
|
149
|
+
const config = await oauthClient.discovery(new URL(AUTH_ISSUER_URL), DEVICE_CLIENT_ID, undefined, oauthClient.None());
|
|
150
|
+
const code = await oauthClient.initiateDeviceAuthorization(config, { scope: 'market' });
|
|
151
|
+
const verificationUri = code.verification_uri_complete ?? code.verification_uri;
|
|
152
|
+
console.log(`Open ${chalk.cyan(verificationUri)}`);
|
|
153
|
+
console.log(`Code: ${chalk.bold(code.user_code)}`);
|
|
154
|
+
await open(verificationUri).catch(() => undefined);
|
|
155
|
+
const tokens = await oauthClient.pollDeviceAuthorizationGrant(config, code);
|
|
156
|
+
if (!tokens.access_token)
|
|
157
|
+
throw new Error('Device login completed without an access token.');
|
|
158
|
+
return tokens.access_token;
|
|
159
|
+
}
|
|
76
160
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,WAAW,EAAkB,MAAM,cAAc,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,KAAK,WAAW,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAkB,MAAM,cAAc,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEtD,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAwB,CAAA;AAC5F,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,MAAM,gBAAgB,GAAG,gCAAgC,CAAA;AACzD,MAAM,eAAe,GAAG,mCAAmC,CAAA;AAC3D,MAAM,gBAAgB,GAAG,YAAY,CAAA;AAErC,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAA;AACtF,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,OAAO,CAC5D,OAAO,CAAC,GAAG,CAAC,cAAc,EAC1B,wCAAwC,CACzC,CAAA;AAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,yCAAyC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;AAE1G,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,SAAS,CAAC;KACtB,SAAS,CAAC,SAAS,CAAC;KACpB,MAAM,CAAC,KAAK,EAAE,IAAsB,EAAE,EAAE;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,gBAAgB,CAAA;IAC5C,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAA;IAC9C,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAC9E,MAAM,UAAU,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IAC/C,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,UAAU,CAAC;KACvB,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,EAAE,CAAA;AAChB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,2BAA2B,CAAC;KACxC,QAAQ,CAAC,aAAa,EAAE,kBAAkB,CAAC;KAC3C,SAAS,CAAC,UAAU,CAAC;KACrB,SAAS,CAAC,SAAS,CAAC;KACpB,MAAM,CAAC,cAAc,EAAE,6BAA6B,EAAE,KAAK,CAAC;KAC5D,MAAM,CAAC,aAAa,EAAE,mBAAmB,CAAC;KAC1C,MAAM,CACL,KAAK,EACH,IAAc,EACd,IAA2E,EAC3E,EAAE;IACF,MAAM,cAAc,CAAC,IAAI,EAAE;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,GAAG;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAA;AACJ,CAAC,CACF,CAAA;AAEH,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,aAAa,CAAC;KAC1B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;KACnC,SAAS,CAAC,UAAU,CAAC;KACrB,SAAS,CAAC,SAAS,CAAC;KACpB,MAAM,CAAC,cAAc,EAAE,6BAA6B,EAAE,KAAK,CAAC;KAC5D,MAAM,CAAC,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC,CAAC;KAC9D,MAAM,CAAC,WAAW,EAAE,0BAA0B,EAAE,KAAK,CAAC;KACtD,MAAM,CACL,KAAK,EACH,KAAa,EACb,IAMC,EACD,EAAE;IACF,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,WAAW,CAAC,4CAA4C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAClF,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,MAAM,aAAa,CAAC,KAAK,EAAE;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,GAAG;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAA;AACJ,CAAC,CACF,CAAA;AAEH,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mBAAmB,CAAC;KAChC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;KAChC,QAAQ,CAAC,eAAe,EAAE,yBAAyB,CAAC;KACpD,QAAQ,CAAC,eAAe,EAAE,mBAAmB,CAAC;KAC9C,SAAS,CAAC,UAAU,CAAC;KACrB,SAAS,CAAC,SAAS,CAAC;KACpB,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;KACxD,MAAM,CAAC,aAAa,EAAE,mBAAmB,CAAC;KAC1C,MAAM,CACL,KAAK,EACH,IAAY,EACZ,UAAkB,EAClB,WAAmB,EACnB,IAAwE,EACxE,EAAE;IACF,MAAM,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE;QACjD,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,GAAG;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAA;AACJ,CAAC,CACF,CAAA;AAEH,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,oBAAoB,CAAC;KACjC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;KAChC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;KACvC,SAAS,CAAC,UAAU,CAAC;KACrB,SAAS,CAAC,SAAS,CAAC;KACpB,MAAM,CAAC,cAAc,EAAE,6BAA6B,EAAE,KAAK,CAAC;KAC5D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC;KACzC,MAAM,CACL,KAAK,EACH,IAAY,EACZ,OAA2B,EAC3B,IAA2E,EAC3E,EAAE;IACF,MAAM,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE;QAClC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,GAAG;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAA;AACJ,CAAC,CACF,CAAA;AAEH,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,sBAAsB,CAAC;KACnC,QAAQ,CAAC,eAAe,EAAE,cAAc,CAAC;KACzC,SAAS,CAAC,UAAU,CAAC;KACrB,SAAS,CAAC,SAAS,CAAC;KACpB,MAAM,CAAC,aAAa,EAAE,mBAAmB,CAAC;KAC1C,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,IAAsD,EAAE,EAAE;IAC5F,MAAM,eAAe,CAAC,WAAW,EAAE;QACjC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,GAAG;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEJ,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAC7B,OAAO,CAAC,UAAU,EAAE,CAAA;IACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAChE,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA;AAEF,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAC5B,CAAC;AAED,KAAK,UAAU,cAAc;IAC3B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,CACxC,IAAI,GAAG,CAAC,eAAe,CAAC,EACxB,gBAAgB,EAChB,SAAS,EACT,WAAW,CAAC,IAAI,EAAE,CACnB,CAAA;IACD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,2BAA2B,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IACvF,MAAM,eAAe,GAAG,IAAI,CAAC,yBAAyB,IAAI,IAAI,CAAC,gBAAgB,CAAA;IAE/E,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;IAClD,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IAClD,MAAM,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IAElD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,4BAA4B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAC3E,IAAI,CAAC,MAAM,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;IAC5F,OAAO,MAAM,CAAC,YAAY,CAAA;AAC5B,CAAC"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import type { ContractRouterClient } from '@orpc/contract';
|
|
2
2
|
import type { AppContract } from './contract.js';
|
|
3
|
-
import type { InternalContract } from './internal-contract.js';
|
|
4
3
|
export type MarketClient = ContractRouterClient<AppContract>;
|
|
5
|
-
export type InternalClient = ContractRouterClient<InternalContract>;
|
|
6
4
|
export interface MarketClientOptions {
|
|
7
5
|
baseUrl?: string;
|
|
8
6
|
fetch?: typeof globalThis.fetch;
|
|
7
|
+
authToken?: string;
|
|
9
8
|
apiKey?: string;
|
|
10
9
|
}
|
|
11
10
|
export declare function createMarketClient(opts?: MarketClientOptions): MarketClient;
|
|
12
|
-
export declare function createInternalClient(opts?: MarketClientOptions): InternalClient;
|
|
13
11
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEhD,MAAM,MAAM,YAAY,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAA;AAI5D,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAMD,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,mBAAwB,GAAG,YAAY,CAS/E"}
|
package/dist/client.js
CHANGED
|
@@ -1,24 +1,16 @@
|
|
|
1
1
|
import { createORPCClient } from '@orpc/client';
|
|
2
2
|
import { RPCLink } from '@orpc/client/fetch';
|
|
3
3
|
const DEFAULT_BASE_URL = 'https://api.market.drawcall.ai';
|
|
4
|
-
function buildHeaders(
|
|
5
|
-
return
|
|
4
|
+
function buildHeaders(authToken) {
|
|
5
|
+
return authToken ? { authorization: `Bearer ${authToken}` } : undefined;
|
|
6
6
|
}
|
|
7
7
|
export function createMarketClient(opts = {}) {
|
|
8
8
|
const baseUrl = opts.baseUrl || DEFAULT_BASE_URL;
|
|
9
|
+
const authToken = opts.authToken ?? opts.apiKey;
|
|
9
10
|
const link = new RPCLink({
|
|
10
11
|
url: new URL('/api/rpc', baseUrl).href,
|
|
11
12
|
fetch: opts.fetch,
|
|
12
|
-
headers: buildHeaders(
|
|
13
|
-
});
|
|
14
|
-
return createORPCClient(link);
|
|
15
|
-
}
|
|
16
|
-
export function createInternalClient(opts = {}) {
|
|
17
|
-
const baseUrl = opts.baseUrl || DEFAULT_BASE_URL;
|
|
18
|
-
const link = new RPCLink({
|
|
19
|
-
url: new URL('/api/internal-rpc', baseUrl).href,
|
|
20
|
-
fetch: opts.fetch,
|
|
21
|
-
headers: buildHeaders(opts.apiKey),
|
|
13
|
+
headers: buildHeaders(authToken),
|
|
22
14
|
});
|
|
23
15
|
return createORPCClient(link);
|
|
24
16
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAM5C,MAAM,gBAAgB,GAAG,gCAAgC,CAAA;AASzD,SAAS,YAAY,CAAC,SAAkB;IACtC,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;AACzE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA4B,EAAE;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAA;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAA;IAC/C,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC;QACvB,GAAG,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI;QACtC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC;KACjC,CAAC,CAAA;IACF,OAAO,gBAAgB,CAAe,IAAI,CAAC,CAAA;AAC7C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAuCf"}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
1
|
import ora from 'ora';
|
|
3
2
|
import { getCliClient } from '../cli-client.js';
|
|
4
3
|
import { generateAndWait } from '../generate.js';
|
|
5
4
|
import { resolve } from '../resolve.js';
|
|
6
5
|
import { install as runInstall } from '../install.js';
|
|
6
|
+
import { generatedInstallResult } from '../output.js';
|
|
7
7
|
export async function generateCommand(description, opts) {
|
|
8
8
|
const { client } = await getCliClient({ baseUrl: opts.baseUrl, requireAuth: true });
|
|
9
|
-
const spinner = ora(
|
|
9
|
+
const spinner = ora({
|
|
10
|
+
text: `Generating "${description}"`,
|
|
11
|
+
isEnabled: Boolean(process.stderr.isTTY),
|
|
12
|
+
isSilent: !process.stderr.isTTY,
|
|
13
|
+
}).start();
|
|
10
14
|
try {
|
|
11
15
|
const generated = await generateAndWait(client, { description, type: opts.type }, {
|
|
12
16
|
onProgress: (msg) => {
|
|
@@ -21,10 +25,11 @@ export async function generateCommand(description, opts) {
|
|
|
21
25
|
spinner.text = msg;
|
|
22
26
|
},
|
|
23
27
|
});
|
|
24
|
-
spinner.
|
|
28
|
+
spinner.stop();
|
|
29
|
+
console.log(generatedInstallResult(generated.assetName, generated.version));
|
|
25
30
|
}
|
|
26
31
|
catch (err) {
|
|
27
|
-
spinner.
|
|
32
|
+
spinner.stop();
|
|
28
33
|
throw err;
|
|
29
34
|
}
|
|
30
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAUrD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB,EACnB,IAA4B;IAE5B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IAEnF,MAAM,OAAO,GAAG,GAAG,CAAC;QAClB,IAAI,EAAE,eAAe,WAAW,GAAG;QACnC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACxC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;KAChC,CAAC,CAAC,KAAK,EAAE,CAAA;IACV,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,eAAe,CACrC,MAAM,EACN,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAChC;YACE,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;gBAClB,OAAO,CAAC,IAAI,GAAG,GAAG,CAAA;YACpB,CAAC;SACF,CACF,CAAA;QAED,OAAO,CAAC,IAAI,GAAG,aAAa,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,OAAO,EAAE,CAAA;QACtE,MAAM,UAAU,GAAG,MAAM,OAAO,CAC9B,MAAM,CAAC,KAAK,EACZ,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,EACzD,EAAE,iBAAiB,EAAE,IAAI,CAAC,UAAU,IAAI,KAAK,EAAE,CAChD,CAAA;QAED,MAAM,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE;YACnC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;gBAClB,OAAO,CAAC,IAAI,GAAG,GAAG,CAAA;YACpB,CAAC;SACF,CAAC,CAAA;QAEF,OAAO,CAAC,IAAI,EAAE,CAAA;QACd,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IAC7E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,EAAE,CAAA;QACd,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;AAK/D,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAOD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC/F"}
|
package/dist/commands/install.js
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
1
|
import ora from 'ora';
|
|
3
2
|
import { resolve } from '../resolve.js';
|
|
4
3
|
import { install as runInstall } from '../install.js';
|
|
5
4
|
import { generateAndWait } from '../generate.js';
|
|
6
5
|
import { assetNameSchema } from '../schemas.js';
|
|
7
6
|
import { getCliClient } from '../cli-client.js';
|
|
7
|
+
import { compact, generatedInstallResult, installResult } from '../output.js';
|
|
8
8
|
export async function installCommand(args, opts) {
|
|
9
|
-
const { client,
|
|
10
|
-
const canGenerate = Boolean(
|
|
11
|
-
const spinner = ora(
|
|
9
|
+
const { client, authToken } = await getCliClient({ baseUrl: opts.baseUrl });
|
|
10
|
+
const canGenerate = Boolean(authToken);
|
|
11
|
+
const spinner = ora({
|
|
12
|
+
isEnabled: Boolean(process.stderr.isTTY),
|
|
13
|
+
isSilent: !process.stderr.isTTY,
|
|
14
|
+
}).start();
|
|
12
15
|
try {
|
|
13
16
|
const requests = [];
|
|
14
17
|
for (const arg of args) {
|
|
15
18
|
spinner.text = `Resolving "${truncate(arg, 40)}"`;
|
|
16
|
-
requests.push(await resolveArg(client, arg, opts.type, spinner, canGenerate));
|
|
19
|
+
requests.push(await resolveArg(client, arg, opts.type, spinner, canGenerate, opts.unapproved ?? false));
|
|
17
20
|
}
|
|
18
21
|
spinner.text = 'Resolving dependency tree';
|
|
19
22
|
const resolution = await resolve(client.asset, requests, {
|
|
@@ -25,58 +28,57 @@ export async function installCommand(args, opts) {
|
|
|
25
28
|
spinner.text = msg;
|
|
26
29
|
},
|
|
27
30
|
});
|
|
28
|
-
spinner.
|
|
29
|
-
|
|
31
|
+
spinner.stop();
|
|
32
|
+
console.log(installResult(resolution.assets));
|
|
30
33
|
}
|
|
31
34
|
catch (err) {
|
|
32
|
-
spinner.
|
|
35
|
+
spinner.stop();
|
|
33
36
|
throw err;
|
|
34
37
|
}
|
|
35
38
|
}
|
|
36
|
-
|
|
37
|
-
* Fallthrough: exact-name → top-1 search hit → auto-generate (auth only).
|
|
38
|
-
*/
|
|
39
|
-
async function resolveArg(client, arg, type, spinner, canGenerate) {
|
|
40
|
-
// 1. Try parsing as asset-name[@range] and looking up exact
|
|
39
|
+
async function resolveArg(client, arg, type, spinner, canGenerate, includeUnapproved) {
|
|
41
40
|
const parsed = parseNameAndRange(arg);
|
|
42
41
|
if (parsed) {
|
|
43
|
-
const existing = await client.asset.
|
|
42
|
+
const existing = await client.asset.exact({
|
|
43
|
+
name: parsed.name,
|
|
44
|
+
type,
|
|
45
|
+
includeUnapproved,
|
|
46
|
+
});
|
|
44
47
|
if (existing)
|
|
45
48
|
return parsed;
|
|
46
49
|
}
|
|
47
|
-
// 2. Semantic search — top-1
|
|
48
50
|
spinner.text = `Searching "${truncate(arg, 40)}"`;
|
|
49
|
-
const results = await client.asset.
|
|
50
|
-
|
|
51
|
+
const results = await client.asset.search({
|
|
52
|
+
query: arg,
|
|
51
53
|
type,
|
|
54
|
+
includeUnapproved,
|
|
52
55
|
limit: 1,
|
|
53
56
|
page: 1,
|
|
54
57
|
sort: 'relevance',
|
|
55
58
|
});
|
|
56
59
|
if (results.items.length > 0) {
|
|
57
60
|
const hit = results.items[0];
|
|
58
|
-
|
|
59
|
-
|
|
61
|
+
if (process.stderr.isTTY) {
|
|
62
|
+
spinner.info(`Matched "${compact(arg, 48)}" to ${hit.name} (${hit.type})`);
|
|
63
|
+
spinner.start();
|
|
64
|
+
}
|
|
60
65
|
return { name: hit.name, range: '*' };
|
|
61
66
|
}
|
|
62
|
-
// 3. Auto-generate (requires auth)
|
|
63
67
|
if (!canGenerate) {
|
|
64
68
|
throw new Error(`No matches for "${arg}". Run \`market login\` to enable auto-generation of missing assets.`);
|
|
65
69
|
}
|
|
66
|
-
spinner.text = `No matches
|
|
70
|
+
spinner.text = `No matches; generating "${truncate(arg, 40)}"`;
|
|
67
71
|
const generated = await generateAndWait(client, { description: arg, type }, {
|
|
68
72
|
onProgress: (msg) => {
|
|
69
73
|
spinner.text = msg;
|
|
70
74
|
},
|
|
71
75
|
});
|
|
72
|
-
|
|
73
|
-
|
|
76
|
+
if (process.stderr.isTTY) {
|
|
77
|
+
spinner.info(`${generatedInstallResult(generated.assetName, generated.version)} for "${compact(arg, 48)}"`);
|
|
78
|
+
spinner.start();
|
|
79
|
+
}
|
|
74
80
|
return { name: generated.assetName, range: generated.version };
|
|
75
81
|
}
|
|
76
|
-
/**
|
|
77
|
-
* Returns { name, range } if the arg parses as `<asset-name>[@<range>]`.
|
|
78
|
-
* Returns null if the name portion fails the asset-name schema (e.g. has spaces).
|
|
79
|
-
*/
|
|
80
82
|
function parseNameAndRange(arg) {
|
|
81
83
|
const atIdx = arg.indexOf('@');
|
|
82
84
|
const name = atIdx >= 0 ? arg.slice(0, atIdx) : arg;
|
|
@@ -84,6 +86,6 @@ function parseNameAndRange(arg) {
|
|
|
84
86
|
return assetNameSchema.safeParse(name).success ? { name, range } : null;
|
|
85
87
|
}
|
|
86
88
|
function truncate(s, max) {
|
|
87
|
-
return s.length > max ? s.slice(0, max -
|
|
89
|
+
return s.length > max ? s.slice(0, max - 3) + '...' : s;
|
|
88
90
|
}
|
|
89
91
|
//# sourceMappingURL=install.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|