@drawcall/market 0.1.13 → 0.1.15
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/commands/preview.js +2 -2
- package/dist/commands/preview.js.map +1 -1
- package/dist/commands/upload.d.ts.map +1 -1
- package/dist/commands/upload.js +5 -0
- package/dist/commands/upload.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +4 -1
- package/dist/constants.js.map +1 -1
- package/dist/contract.d.ts +4 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +7 -2
- package/dist/contract.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +3 -2
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +45 -21
- package/dist/install.js.map +1 -1
- package/dist/schemas.d.ts +7 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +2 -1
- package/dist/schemas.js.map +1 -1
- package/dist/skill.d.ts +1 -1
- package/dist/skill.d.ts.map +1 -1
- package/dist/skill.js +3 -3
- package/package.json +2 -1
- package/src/commands/preview.ts +2 -2
- package/src/commands/upload.ts +5 -0
- package/src/constants.ts +4 -2
- package/src/contract.ts +9 -1
- package/src/index.ts +1 -0
- package/src/install.ts +54 -23
- package/src/schemas.ts +3 -1
- package/src/skill.ts +3 -3
- package/tests/install-layout.test.ts +114 -0
package/dist/commands/preview.js
CHANGED
|
@@ -7,8 +7,8 @@ import { assetNameSchema, semverSchema } from '../schemas.js';
|
|
|
7
7
|
export async function previewCommand(name, version, opts) {
|
|
8
8
|
const parsedName = assetNameSchema.parse(name);
|
|
9
9
|
const parsedVersion = version ? semverSchema.parse(version) : undefined;
|
|
10
|
-
if (opts.type === 'humanoid-animation') {
|
|
11
|
-
throw new Error(
|
|
10
|
+
if (opts.type === 'humanoid-animation' || opts.type === 'template') {
|
|
11
|
+
throw new Error(`Preview images are not supported for ${opts.type}`);
|
|
12
12
|
}
|
|
13
13
|
const spinner = ora({
|
|
14
14
|
text: `Resolving preview for ${parsedName}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAkB,MAAM,eAAe,CAAA;AAS7E,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAY,EACZ,OAA2B,EAC3B,IAA2B;IAE3B,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACvE,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;AAE7E,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,IAAI,CAAC,CAmEf"}
|
package/dist/commands/upload.js
CHANGED
|
@@ -3,6 +3,7 @@ import * as path from 'path';
|
|
|
3
3
|
import ora from 'ora';
|
|
4
4
|
import semver from 'semver';
|
|
5
5
|
import { getCliClient } from '../cli-client.js';
|
|
6
|
+
import { MAX_UPLOAD_ZIP_SIZE_BYTES } from '../schemas.js';
|
|
6
7
|
import { unchangedUploadResult, uploadResult } from '../output.js';
|
|
7
8
|
import { assetNameSchema, semverSchema } from '../schemas.js';
|
|
8
9
|
export async function uploadCommand(name, zipFilter, description, opts) {
|
|
@@ -17,6 +18,10 @@ export async function uploadCommand(name, zipFilter, description, opts) {
|
|
|
17
18
|
const cwd = opts.cwd ?? process.cwd();
|
|
18
19
|
const type = opts.type;
|
|
19
20
|
const zipFile = await resolveOneZipFile(cwd, zipFilter);
|
|
21
|
+
const zipStat = await fs.stat(zipFile);
|
|
22
|
+
if (zipStat.size >= MAX_UPLOAD_ZIP_SIZE_BYTES) {
|
|
23
|
+
throw new Error('Upload zip must be smaller than 1 GB');
|
|
24
|
+
}
|
|
20
25
|
const zip = new Uint8Array(await fs.readFile(zipFile));
|
|
21
26
|
const { client } = await getCliClient({ baseUrl: opts.baseUrl, requireAuth: true });
|
|
22
27
|
const profile = await client.user.getProfile();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAkB,MAAM,eAAe,CAAA;AAS7E,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,SAAiB,EACjB,WAAmB,EACnB,IAA0B;IAE1B,MAAM,OAAO,GAAG,GAAG,CAAC;QAClB,IAAI,EAAE,kBAAkB;QACxB,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;IAEV,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACjF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QACvD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACtC,IAAI,OAAO,CAAC,IAAI,IAAI,yBAAyB,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QACzD,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;QACtD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;QACnF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAA;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;QAC7D,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YACxC,IAAI,EAAE,UAAU;YAChB,IAAI;YACJ,iBAAiB,EAAE,IAAI;SACxB,CAAC,CAAA;QAEF,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,UAAU,UAAU,+CAA+C,CAAC,CAAA;QACtF,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;gBAC/C,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,QAAQ,CAAC,aAAa;aAChC,CAAC,CAAA;YACF,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,MAAM,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;YACjE,IAAI,QAAQ,CAAC,WAAW,KAAK,WAAW,IAAI,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC;gBACzE,OAAO,CAAC,IAAI,EAAE,CAAA;gBACd,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,UAAU,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAA;gBACtE,OAAM;YACR,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,IAAI,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;QACrE,OAAO,CAAC,IAAI,GAAG,aAAa,UAAU,IAAI,OAAO,EAAE,CAAA;QACnD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;YAC5C,IAAI,EAAE,UAAU;YAChB,IAAI;YACJ,OAAO;YACP,WAAW;YACX,eAAe,EAAE,EAAE;YACnB,iBAAiB,EAAE,EAAE;YACrB,IAAI,EAAE,EAAE;YACR,GAAG,EAAE,IAAI,IAAI,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,UAAU,IAAI,OAAO,MAAM,EAAE;gBAClE,IAAI,EAAE,iBAAiB;aACxB,CAAC;SACH,CAAC,CAAA;QAEF,OAAO,CAAC,IAAI,EAAE,CAAA;QACd,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,EAAE,CAAA;QACd,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,SAAiB;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;IAC7C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAA;IACtC,IAAI,IAAI,EAAE,MAAM,EAAE;QAAE,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAA;IAElD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;IAClC,MAAM,OAAO,GAAG,KAAK;SAClB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;SACpE,MAAM,CAAC,SAAS,CAAC;SACjB,IAAI,EAAE,CAAA;IAET,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,GAAG,CAAC,CAAA;IACzD,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,MAAM,mCAAmC,CAAC,CAAA;IAC3F,CAAC;IAED,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAA;IAC5E,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC7B,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9D,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,SAAQ;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAC5C,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,MAAc;IACjD,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACrD,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACzD,MAAM,OAAO,GACX,GAAG;QACH,YAAY,CAAC,gBAAgB,CAAC;aAC3B,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;aAC1B,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;QAC5B,GAAG,CAAA;IACL,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;AACjD,CAAC;AAED,SAAS,WAAW,CAAC,MAAe;IAClC,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAA;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC3C,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,GAAG,CAAC,CAAA;IACxE,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,CAAa,EAAE,CAAa;IAC9C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;IACjC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,aAAa,CAAC,KAAiB;IACtC,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;AACrC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;AACrD,CAAC"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type AssetType } from './schemas.js';
|
|
2
2
|
export declare const MAX_FILE_SIZE: number;
|
|
3
3
|
export declare const ALLOWED_EXTENSIONS: Record<AssetType, string[]>;
|
|
4
4
|
export declare const ASSET_TYPE_LABELS: Record<AssetType, string>;
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAExE,eAAO,MAAM,aAAa,QAA4B,CAAA;AAEtD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAK1D,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAKvD,CAAA"}
|
package/dist/constants.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
import { MAX_UPLOAD_ZIP_SIZE_BYTES } from './schemas.js';
|
|
2
|
+
export const MAX_FILE_SIZE = MAX_UPLOAD_ZIP_SIZE_BYTES;
|
|
2
3
|
export const ALLOWED_EXTENSIONS = {
|
|
3
4
|
model: ['.zip'],
|
|
4
5
|
texture: ['.zip'],
|
|
5
6
|
'humanoid-animation': ['.zip'],
|
|
7
|
+
template: ['.zip'],
|
|
6
8
|
};
|
|
7
9
|
export const ASSET_TYPE_LABELS = {
|
|
8
10
|
model: 'Model',
|
|
9
11
|
texture: 'Texture',
|
|
10
12
|
'humanoid-animation': 'Humanoid Animation',
|
|
13
|
+
template: 'Template',
|
|
11
14
|
};
|
|
12
15
|
//# sourceMappingURL=constants.js.map
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAkB,MAAM,cAAc,CAAA;AAExE,MAAM,CAAC,MAAM,aAAa,GAAG,yBAAyB,CAAA;AAEtD,MAAM,CAAC,MAAM,kBAAkB,GAAgC;IAC7D,KAAK,EAAE,CAAC,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,oBAAoB,EAAE,CAAC,MAAM,CAAC;IAC9B,QAAQ,EAAE,CAAC,MAAM,CAAC;CACnB,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAA8B;IAC1D,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,oBAAoB,EAAE,oBAAoB;IAC1C,QAAQ,EAAE,UAAU;CACrB,CAAA"}
|
package/dist/contract.d.ts
CHANGED
|
@@ -62,6 +62,7 @@ export declare const contract: {
|
|
|
62
62
|
model: "model";
|
|
63
63
|
texture: "texture";
|
|
64
64
|
"humanoid-animation": "humanoid-animation";
|
|
65
|
+
template: "template";
|
|
65
66
|
}>>;
|
|
66
67
|
query: z.ZodOptional<z.ZodString>;
|
|
67
68
|
includeUnapproved: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -77,6 +78,7 @@ export declare const contract: {
|
|
|
77
78
|
model: "model";
|
|
78
79
|
texture: "texture";
|
|
79
80
|
"humanoid-animation": "humanoid-animation";
|
|
81
|
+
template: "template";
|
|
80
82
|
}>>;
|
|
81
83
|
includeUnapproved: z.ZodDefault<z.ZodBoolean>;
|
|
82
84
|
}, z.core.$strip>, z.ZodCustom<AssetSearchResult | null, AssetSearchResult | null>, Record<never, never>, Record<never, never>>;
|
|
@@ -86,6 +88,7 @@ export declare const contract: {
|
|
|
86
88
|
model: "model";
|
|
87
89
|
texture: "texture";
|
|
88
90
|
"humanoid-animation": "humanoid-animation";
|
|
91
|
+
template: "template";
|
|
89
92
|
}>;
|
|
90
93
|
version: z.ZodString;
|
|
91
94
|
description: z.ZodOptional<z.ZodString>;
|
|
@@ -108,6 +111,7 @@ export declare const contract: {
|
|
|
108
111
|
model: "model";
|
|
109
112
|
texture: "texture";
|
|
110
113
|
"humanoid-animation": "humanoid-animation";
|
|
114
|
+
template: "template";
|
|
111
115
|
}>>;
|
|
112
116
|
}, z.core.$strip>, z.ZodCustom<GenerateAssetResult, GenerateAssetResult>, Record<never, never>, Record<never, never>>;
|
|
113
117
|
};
|
package/dist/contract.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAWvB,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,IAAI,CAAA;CAChB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,OAAO,CAAA;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,OAAO,CAAA;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA6B0B,MAAM;uBAAa,IAAI;;oBAAvB,MAAM;uBAAa,IAAI;;;;;;;CAIrE,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,QAAQ,CAAA"}
|
package/dist/contract.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { oc } from '@orpc/contract';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { downloadZipSchema, exactAssetSchema, generateAssetSchema, listAssetsSchema, updateProfileSchema, uploadZipSchema, } from './schemas.js';
|
|
3
|
+
import { MAX_UPLOAD_ZIP_SIZE_BYTES, downloadZipSchema, exactAssetSchema, generateAssetSchema, listAssetsSchema, updateProfileSchema, uploadZipSchema, } from './schemas.js';
|
|
4
4
|
export const contract = {
|
|
5
5
|
asset: {
|
|
6
6
|
search: oc.input(listAssetsSchema).output(z.custom()),
|
|
7
7
|
exact: oc.input(exactAssetSchema).output(z.custom()),
|
|
8
8
|
uploadZip: oc
|
|
9
|
-
.input(uploadZipSchema
|
|
9
|
+
.input(uploadZipSchema
|
|
10
|
+
.extend({ zip: z.instanceof(File) })
|
|
11
|
+
.refine((input) => input.zip.size < MAX_UPLOAD_ZIP_SIZE_BYTES, {
|
|
12
|
+
message: 'Upload zip must be smaller than 1 GB',
|
|
13
|
+
path: ['zip'],
|
|
14
|
+
}))
|
|
10
15
|
.output(z.custom()),
|
|
11
16
|
downloadZip: oc.input(downloadZipSchema).output(z.instanceof(Blob)),
|
|
12
17
|
downloadPreviewImage: oc.input(downloadZipSchema).output(z.instanceof(Blob)),
|
package/dist/contract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AACnC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,GAChB,MAAM,cAAc,CAAA;AA8DrB,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,KAAK,EAAE;QACL,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAoC,CAAC;QAEvF,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAA4B,CAAC;QAE9E,SAAS,EAAE,EAAE;aACV,KAAK,
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AACnC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,GAChB,MAAM,cAAc,CAAA;AA8DrB,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,KAAK,EAAE;QACL,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAoC,CAAC;QAEvF,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAA4B,CAAC;QAE9E,SAAS,EAAE,EAAE;aACV,KAAK,CACJ,eAAe;aACZ,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;aACnC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,yBAAyB,EAAE;YAC7D,OAAO,EAAE,sCAAsC;YAC/C,IAAI,EAAE,CAAC,KAAK,CAAC;SACd,CAAC,CACL;aACA,MAAM,CAAC,CAAC,CAAC,MAAM,EAAgB,CAAC;QAEnC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEnE,oBAAoB,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAE5E,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAuB,CAAC;KAChF;IAED,IAAI,EAAE;QACJ,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAe,CAAC;QAE9C,aAAa,EAAE,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAQ,CAAC;QAErE,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAA8C,CAAC;QAE/E,eAAe,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;KAChF;CACF,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export { resolve, ResolutionError } from './resolve.js';
|
|
|
8
8
|
export type { ResolvedAsset, ResolveResult } from './resolve.js';
|
|
9
9
|
export { generateAndWait, GenerateError } from './generate.js';
|
|
10
10
|
export type { GenerateInput, GenerateResult, GenerateOptions } from './generate.js';
|
|
11
|
-
export { ASSET_TYPES, assetTypeSchema, semverSchema, assetNameSchema, npmDependenciesSchema, assetDependenciesSchema, uploadZipSchema, downloadZipSchema, exactAssetSchema, generateAssetSchema, updateProfileSchema, listAssetsSchema, } from './schemas.js';
|
|
11
|
+
export { ASSET_TYPES, MAX_UPLOAD_ZIP_SIZE_BYTES, assetTypeSchema, semverSchema, assetNameSchema, npmDependenciesSchema, assetDependenciesSchema, uploadZipSchema, downloadZipSchema, exactAssetSchema, generateAssetSchema, updateProfileSchema, listAssetsSchema, } from './schemas.js';
|
|
12
12
|
export type { AssetType } from './schemas.js';
|
|
13
13
|
export { MAX_FILE_SIZE, ALLOWED_EXTENSIONS, ASSET_TYPE_LABELS } from './constants.js';
|
|
14
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGpE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,YAAY,EACV,KAAK,EACL,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,IAAI,EACJ,mBAAmB,GACpB,MAAM,eAAe,CAAA;AAEtB,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACvD,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAGhE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC9D,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAGnF,OAAO,EACL,WAAW,EACX,eAAe,EACf,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAG7C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAGpE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,YAAY,EACV,KAAK,EACL,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,IAAI,EACJ,mBAAmB,GACpB,MAAM,eAAe,CAAA;AAEtB,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACvD,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAGhE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC9D,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAGnF,OAAO,EACL,WAAW,EACX,yBAAyB,EACzB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAG7C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ export { resolve, ResolutionError } from './resolve.js';
|
|
|
7
7
|
// Generate
|
|
8
8
|
export { generateAndWait, GenerateError } from './generate.js';
|
|
9
9
|
// Schemas
|
|
10
|
-
export { ASSET_TYPES, assetTypeSchema, semverSchema, assetNameSchema, npmDependenciesSchema, assetDependenciesSchema, uploadZipSchema, downloadZipSchema, exactAssetSchema, generateAssetSchema, updateProfileSchema, listAssetsSchema, } from './schemas.js';
|
|
10
|
+
export { ASSET_TYPES, MAX_UPLOAD_ZIP_SIZE_BYTES, assetTypeSchema, semverSchema, assetNameSchema, npmDependenciesSchema, assetDependenciesSchema, uploadZipSchema, downloadZipSchema, exactAssetSchema, generateAssetSchema, updateProfileSchema, listAssetsSchema, } from './schemas.js';
|
|
11
11
|
// Constants
|
|
12
12
|
export { MAX_FILE_SIZE, ALLOWED_EXTENSIONS, ASSET_TYPE_LABELS } from './constants.js';
|
|
13
13
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAGhD,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAuBxC,UAAU;AACV,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAGvD,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAG9D,UAAU;AACV,OAAO,EACL,WAAW,EACX,eAAe,EACf,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAA;AAGrB,YAAY;AACZ,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAGhD,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAuBxC,UAAU;AACV,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAGvD,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAG9D,UAAU;AACV,OAAO,EACL,WAAW,EACX,yBAAyB,EACzB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAA;AAGrB,YAAY;AACZ,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA"}
|
package/dist/install.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Install resolved assets into a local project.
|
|
3
3
|
*
|
|
4
|
-
* 1. Downloads asset files into ./
|
|
4
|
+
* 1. Downloads public asset files into ./public/... via the oRPC client.
|
|
5
5
|
* 2. Merges npm dependencies into package.json.
|
|
6
6
|
* 3. Runs the package manager to install npm deps.
|
|
7
7
|
*
|
|
@@ -11,10 +11,11 @@
|
|
|
11
11
|
import type { MarketClient } from './client.js';
|
|
12
12
|
import type { ResolveResult } from './resolve.js';
|
|
13
13
|
export interface InstallOptions {
|
|
14
|
-
/**
|
|
14
|
+
/** Directory to start project root discovery from (default: cwd) */
|
|
15
15
|
cwd?: string;
|
|
16
16
|
/** Log progress */
|
|
17
17
|
onProgress?: (message: string) => void;
|
|
18
18
|
}
|
|
19
19
|
export declare function install(client: MarketClient, resolution: ResolveResult, opts?: InstallOptions): Promise<void>;
|
|
20
|
+
export declare function findInstallRoot(cwd?: string): Promise<string>;
|
|
20
21
|
//# sourceMappingURL=install.d.ts.map
|
package/dist/install.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AASjD,MAAM,WAAW,cAAc;IAC7B,
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AASjD,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,mBAAmB;IACnB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACvC;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,aAAa,EACzB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,eAAe,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBlF"}
|
package/dist/install.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Install resolved assets into a local project.
|
|
3
3
|
*
|
|
4
|
-
* 1. Downloads asset files into ./
|
|
4
|
+
* 1. Downloads public asset files into ./public/... via the oRPC client.
|
|
5
5
|
* 2. Merges npm dependencies into package.json.
|
|
6
6
|
* 3. Runs the package manager to install npm deps.
|
|
7
7
|
*
|
|
@@ -13,42 +13,68 @@ import * as path from 'path';
|
|
|
13
13
|
import { unzipSync } from 'fflate';
|
|
14
14
|
import { detectPackageManager, installDependencies } from 'nypm';
|
|
15
15
|
export async function install(client, resolution, opts = {}) {
|
|
16
|
-
const cwd = opts.cwd ?? process.cwd();
|
|
17
16
|
const log = opts.onProgress ?? (() => { });
|
|
18
|
-
|
|
17
|
+
const installRoot = await findInstallRoot(opts.cwd ?? process.cwd());
|
|
19
18
|
await Promise.all([
|
|
20
|
-
downloadAssets(client, resolution,
|
|
21
|
-
installNpmDeps(resolution,
|
|
19
|
+
downloadAssets(client, resolution, installRoot, log),
|
|
20
|
+
installNpmDeps(resolution, installRoot, log),
|
|
22
21
|
]);
|
|
23
22
|
}
|
|
24
|
-
async function
|
|
23
|
+
export async function findInstallRoot(cwd = process.cwd()) {
|
|
24
|
+
const start = path.resolve(cwd);
|
|
25
|
+
let packageRoot = null;
|
|
26
|
+
let dir = start;
|
|
27
|
+
while (true) {
|
|
28
|
+
if (await isFile(path.join(dir, 'package.json'))) {
|
|
29
|
+
packageRoot = dir;
|
|
30
|
+
}
|
|
31
|
+
const parent = path.dirname(dir);
|
|
32
|
+
if (parent === dir)
|
|
33
|
+
break;
|
|
34
|
+
dir = parent;
|
|
35
|
+
}
|
|
36
|
+
return packageRoot ?? start;
|
|
37
|
+
}
|
|
38
|
+
async function downloadAssets(client, resolution, projectRoot, log) {
|
|
25
39
|
for (const asset of resolution.assets) {
|
|
26
|
-
const destDir = path.join(cwd, 'src', asset.name);
|
|
27
|
-
await fs.mkdir(destDir, { recursive: true });
|
|
28
40
|
log(`Downloading ${asset.name}@${asset.version}...`);
|
|
29
41
|
const zip = await client.asset.downloadZip({ name: asset.name, version: asset.version });
|
|
30
42
|
const files = unzipSync(new Uint8Array(await zip.arrayBuffer()));
|
|
43
|
+
let installedFiles = 0;
|
|
31
44
|
for (const [relativePath, content] of Object.entries(files)) {
|
|
32
|
-
const
|
|
33
|
-
if (
|
|
45
|
+
const zipPath = relativePath.replace(/\\/g, '/');
|
|
46
|
+
if (zipPath.split('/').includes('..') ||
|
|
47
|
+
path.posix.isAbsolute(zipPath) ||
|
|
48
|
+
path.win32.isAbsolute(zipPath)) {
|
|
34
49
|
throw new Error(`Zip contains an unsafe path: ${relativePath}`);
|
|
35
50
|
}
|
|
51
|
+
const normalizedPath = path.posix.normalize(zipPath);
|
|
52
|
+
if (normalizedPath === '.' ||
|
|
53
|
+
normalizedPath === 'README.md' ||
|
|
54
|
+
normalizedPath.endsWith('/')) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const filePath = path.join(projectRoot, normalizedPath);
|
|
36
58
|
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
37
59
|
await fs.writeFile(filePath, content);
|
|
60
|
+
installedFiles += 1;
|
|
38
61
|
}
|
|
39
|
-
log(`Downloaded ${
|
|
62
|
+
log(`Downloaded ${installedFiles} files.`);
|
|
40
63
|
}
|
|
41
64
|
}
|
|
42
|
-
function
|
|
43
|
-
|
|
44
|
-
|
|
65
|
+
async function isFile(file) {
|
|
66
|
+
try {
|
|
67
|
+
return (await fs.stat(file)).isFile();
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
45
72
|
}
|
|
46
|
-
async function installNpmDeps(resolution,
|
|
73
|
+
async function installNpmDeps(resolution, projectRoot, log) {
|
|
47
74
|
const deps = resolution.npmDependencies;
|
|
48
75
|
if (Object.keys(deps).length === 0)
|
|
49
76
|
return;
|
|
50
|
-
|
|
51
|
-
const pkgPath = path.join(cwd, 'package.json');
|
|
77
|
+
const pkgPath = path.join(projectRoot, 'package.json');
|
|
52
78
|
let pkg;
|
|
53
79
|
try {
|
|
54
80
|
pkg = JSON.parse(await fs.readFile(pkgPath, 'utf-8'));
|
|
@@ -56,15 +82,13 @@ async function installNpmDeps(resolution, cwd, log) {
|
|
|
56
82
|
catch {
|
|
57
83
|
pkg = { name: 'my-project', private: true, dependencies: {} };
|
|
58
84
|
}
|
|
59
|
-
// Merge dependencies
|
|
60
85
|
pkg.dependencies = { ...pkg.dependencies, ...deps };
|
|
61
86
|
await fs.writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
|
|
62
87
|
log(`Installing npm dependencies: ${Object.keys(deps).join(', ')}`);
|
|
63
|
-
|
|
64
|
-
const pm = await detectPackageManager(cwd).catch(() => null);
|
|
88
|
+
const pm = await detectPackageManager(projectRoot).catch(() => null);
|
|
65
89
|
const pmName = pm?.name ?? 'npm';
|
|
66
90
|
log(`Using ${pmName}...`);
|
|
67
|
-
await installDependencies({ cwd, packageManager: { name: pmName, command: pmName } });
|
|
91
|
+
await installDependencies({ cwd: projectRoot, packageManager: { name: pmName, command: pmName } });
|
|
68
92
|
log('npm dependencies installed.');
|
|
69
93
|
}
|
|
70
94
|
//# sourceMappingURL=install.js.map
|
package/dist/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAA;AAkBhE,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAoB,EACpB,UAAyB,EACzB,OAAuB,EAAE;IAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
package/dist/schemas.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export declare const ASSET_TYPES: readonly ["model", "texture", "humanoid-animation"];
|
|
2
|
+
export declare const ASSET_TYPES: readonly ["model", "texture", "humanoid-animation", "template"];
|
|
3
3
|
export type AssetType = (typeof ASSET_TYPES)[number];
|
|
4
4
|
export declare const assetTypeSchema: z.ZodEnum<{
|
|
5
5
|
model: "model";
|
|
6
6
|
texture: "texture";
|
|
7
7
|
"humanoid-animation": "humanoid-animation";
|
|
8
|
+
template: "template";
|
|
8
9
|
}>;
|
|
10
|
+
export declare const MAX_UPLOAD_ZIP_SIZE_BYTES: number;
|
|
9
11
|
export declare const semverSchema: z.ZodString;
|
|
10
12
|
export declare const assetNameSchema: z.ZodString;
|
|
11
13
|
export declare const npmDependenciesSchema: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
@@ -21,6 +23,7 @@ export declare const listAssetsSchema: z.ZodObject<{
|
|
|
21
23
|
model: "model";
|
|
22
24
|
texture: "texture";
|
|
23
25
|
"humanoid-animation": "humanoid-animation";
|
|
26
|
+
template: "template";
|
|
24
27
|
}>>;
|
|
25
28
|
query: z.ZodOptional<z.ZodString>;
|
|
26
29
|
includeUnapproved: z.ZodDefault<z.ZodBoolean>;
|
|
@@ -36,6 +39,7 @@ export declare const exactAssetSchema: z.ZodObject<{
|
|
|
36
39
|
model: "model";
|
|
37
40
|
texture: "texture";
|
|
38
41
|
"humanoid-animation": "humanoid-animation";
|
|
42
|
+
template: "template";
|
|
39
43
|
}>>;
|
|
40
44
|
includeUnapproved: z.ZodDefault<z.ZodBoolean>;
|
|
41
45
|
}, z.core.$strip>;
|
|
@@ -45,6 +49,7 @@ export declare const uploadZipSchema: z.ZodObject<{
|
|
|
45
49
|
model: "model";
|
|
46
50
|
texture: "texture";
|
|
47
51
|
"humanoid-animation": "humanoid-animation";
|
|
52
|
+
template: "template";
|
|
48
53
|
}>;
|
|
49
54
|
version: z.ZodString;
|
|
50
55
|
description: z.ZodOptional<z.ZodString>;
|
|
@@ -62,6 +67,7 @@ export declare const generateAssetSchema: z.ZodObject<{
|
|
|
62
67
|
model: "model";
|
|
63
68
|
texture: "texture";
|
|
64
69
|
"humanoid-animation": "humanoid-animation";
|
|
70
|
+
template: "template";
|
|
65
71
|
}>>;
|
|
66
72
|
}, z.core.$strip>;
|
|
67
73
|
//# sourceMappingURL=schemas.d.ts.map
|
package/dist/schemas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,WAAW,iEAAkE,CAAA;AAC1F,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpD,eAAO,MAAM,eAAe;;;;;EAAsB,CAAA;AAElD,eAAO,MAAM,yBAAyB,QAAqB,CAAA;AAE3D,eAAO,MAAM,YAAY,aAKtB,CAAA;AAEH,eAAO,MAAM,eAAe,aAUxB,CAAA;AAEJ,eAAO,MAAM,qBAAqB,qDAA+C,CAAA;AAEjF,eAAO,MAAM,uBAAuB,qDAA+C,CAAA;AAEnF,eAAO,MAAM,mBAAmB;;;iBAG9B,CAAA;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;iBAO3B,CAAA;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;iBAI3B,CAAA;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;;;iBAQ1B,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;iBAG5B,CAAA;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;iBAG9B,CAAA"}
|
package/dist/schemas.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export const ASSET_TYPES = ['model', 'texture', 'humanoid-animation'];
|
|
2
|
+
export const ASSET_TYPES = ['model', 'texture', 'humanoid-animation', 'template'];
|
|
3
3
|
export const assetTypeSchema = z.enum(ASSET_TYPES);
|
|
4
|
+
export const MAX_UPLOAD_ZIP_SIZE_BYTES = 1024 * 1024 * 1024;
|
|
4
5
|
export const semverSchema = z
|
|
5
6
|
.string()
|
|
6
7
|
.regex(/^\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?(\+[a-zA-Z0-9.]+)?$/, 'Must be a valid semver version (e.g. 1.0.0)');
|
package/dist/schemas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,oBAAoB,CAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|
package/dist/skill.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const marketSkill = "---\nname: market\ndescription: Find, preview, install, generate, and publish Drawcall Market assets from a coding agent.\n---\n\n# Drawcall Market\n\nUse the `market` CLI. Keep commands short and read the summary line plus asset bullets.\n\n## Quick Start\n\n```sh\nmarket search \"wooden chair\" --type model --limit 3\nmarket install wooden-chair --type model --cwd \"$PWD\"\nmarket preview wooden-chair --out /tmp/wooden-chair.png\n```\n\n## Workflow\n\n1. Search first unless the user gave an exact asset name.\n2. Search requires `--type`; use `model` unless the user names another supported type
|
|
1
|
+
export declare const marketSkill = "---\nname: market\ndescription: Find, preview, install, generate, and publish Drawcall Market assets from a coding agent.\n---\n\n# Drawcall Market\n\nUse the `market` CLI. Keep commands short and read the summary line plus asset bullets.\n\n## Quick Start\n\n```sh\nmarket search \"wooden chair\" --type model --limit 3\nmarket install wooden-chair --type model --cwd \"$PWD\"\nmarket preview wooden-chair --out /tmp/wooden-chair.png\n```\n\n## Workflow\n\n1. Search first unless the user gave an exact asset name.\n2. Search requires `--type`; use `model` unless the user names another supported type: `texture`, `humanoid-animation`, or `template`.\n3. Use `--limit 1` for lookup, `--limit 3` for choice. Search caps at 5.\n4. Use `--verbose` only when the one-line descriptions are not enough.\n5. Use `--unapproved` only when the user asks for unapproved/private/admin assets. Do not install unapproved assets without explicit acceptance.\n6. Preview before installing when visual fit matters: `market preview <name> --out <file>`. Preview is not supported for `humanoid-animation` or `template`.\n7. Generate only when the user wants a new asset and auth is available. Generate is not supported for `template`.\n8. Upload only when publishing is requested.\n\n## Output\n\nCommands print concise summaries:\n\n```text\nResults: 2/8 query=\"wooden chair\" type=model approval=approved\n- wooden-chair@1.0.0 | model | approved | Low-poly wooden chair\nInstalled 1 asset: wooden-chair@1.0.0\nSaved preview for wooden-chair@1.0.0: /tmp/wooden-chair.png\n```\n\nIf search returns no results, try one broader noun phrase before generating. If a command returns `Error: Not logged in...`, ask before running `market login`.\n";
|
|
2
2
|
//# sourceMappingURL=skill.d.ts.map
|
package/dist/skill.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,isDAwCvB,CAAA"}
|
package/dist/skill.js
CHANGED
|
@@ -18,12 +18,12 @@ market preview wooden-chair --out /tmp/wooden-chair.png
|
|
|
18
18
|
## Workflow
|
|
19
19
|
|
|
20
20
|
1. Search first unless the user gave an exact asset name.
|
|
21
|
-
2. Search requires \`--type\`; use \`model\` unless the user names another supported type
|
|
21
|
+
2. Search requires \`--type\`; use \`model\` unless the user names another supported type: \`texture\`, \`humanoid-animation\`, or \`template\`.
|
|
22
22
|
3. Use \`--limit 1\` for lookup, \`--limit 3\` for choice. Search caps at 5.
|
|
23
23
|
4. Use \`--verbose\` only when the one-line descriptions are not enough.
|
|
24
24
|
5. Use \`--unapproved\` only when the user asks for unapproved/private/admin assets. Do not install unapproved assets without explicit acceptance.
|
|
25
|
-
6. Preview before installing when visual fit matters: \`market preview <name> --out <file>\`.
|
|
26
|
-
7. Generate only when the user wants a new asset and auth is available.
|
|
25
|
+
6. Preview before installing when visual fit matters: \`market preview <name> --out <file>\`. Preview is not supported for \`humanoid-animation\` or \`template\`.
|
|
26
|
+
7. Generate only when the user wants a new asset and auth is available. Generate is not supported for \`template\`.
|
|
27
27
|
8. Upload only when publishing is requested.
|
|
28
28
|
|
|
29
29
|
## Output
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@drawcall/market",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.15",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/drawcall-ai/market",
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build": "tsc",
|
|
33
33
|
"dev": "tsx src/cli.ts",
|
|
34
|
+
"test:install-layout": "tsx --test tests/install-layout.test.ts",
|
|
34
35
|
"typecheck": "tsc --noEmit"
|
|
35
36
|
},
|
|
36
37
|
"dependencies": {
|
package/src/commands/preview.ts
CHANGED
|
@@ -19,8 +19,8 @@ export async function previewCommand(
|
|
|
19
19
|
): Promise<void> {
|
|
20
20
|
const parsedName = assetNameSchema.parse(name)
|
|
21
21
|
const parsedVersion = version ? semverSchema.parse(version) : undefined
|
|
22
|
-
if (opts.type === 'humanoid-animation') {
|
|
23
|
-
throw new Error(
|
|
22
|
+
if (opts.type === 'humanoid-animation' || opts.type === 'template') {
|
|
23
|
+
throw new Error(`Preview images are not supported for ${opts.type}`)
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
const spinner = ora({
|
package/src/commands/upload.ts
CHANGED
|
@@ -3,6 +3,7 @@ import * as path from 'path'
|
|
|
3
3
|
import ora from 'ora'
|
|
4
4
|
import semver from 'semver'
|
|
5
5
|
import { getCliClient } from '../cli-client.js'
|
|
6
|
+
import { MAX_UPLOAD_ZIP_SIZE_BYTES } from '../schemas.js'
|
|
6
7
|
import { unchangedUploadResult, uploadResult } from '../output.js'
|
|
7
8
|
import { assetNameSchema, semverSchema, type AssetType } from '../schemas.js'
|
|
8
9
|
|
|
@@ -31,6 +32,10 @@ export async function uploadCommand(
|
|
|
31
32
|
const cwd = opts.cwd ?? process.cwd()
|
|
32
33
|
const type = opts.type
|
|
33
34
|
const zipFile = await resolveOneZipFile(cwd, zipFilter)
|
|
35
|
+
const zipStat = await fs.stat(zipFile)
|
|
36
|
+
if (zipStat.size >= MAX_UPLOAD_ZIP_SIZE_BYTES) {
|
|
37
|
+
throw new Error('Upload zip must be smaller than 1 GB')
|
|
38
|
+
}
|
|
34
39
|
const zip = new Uint8Array(await fs.readFile(zipFile))
|
|
35
40
|
const { client } = await getCliClient({ baseUrl: opts.baseUrl, requireAuth: true })
|
|
36
41
|
const profile = await client.user.getProfile()
|
package/src/constants.ts
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { MAX_UPLOAD_ZIP_SIZE_BYTES, type AssetType } from './schemas.js'
|
|
2
2
|
|
|
3
|
-
export const MAX_FILE_SIZE =
|
|
3
|
+
export const MAX_FILE_SIZE = MAX_UPLOAD_ZIP_SIZE_BYTES
|
|
4
4
|
|
|
5
5
|
export const ALLOWED_EXTENSIONS: Record<AssetType, string[]> = {
|
|
6
6
|
model: ['.zip'],
|
|
7
7
|
texture: ['.zip'],
|
|
8
8
|
'humanoid-animation': ['.zip'],
|
|
9
|
+
template: ['.zip'],
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
export const ASSET_TYPE_LABELS: Record<AssetType, string> = {
|
|
12
13
|
model: 'Model',
|
|
13
14
|
texture: 'Texture',
|
|
14
15
|
'humanoid-animation': 'Humanoid Animation',
|
|
16
|
+
template: 'Template',
|
|
15
17
|
}
|
package/src/contract.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { oc } from '@orpc/contract'
|
|
2
2
|
import { z } from 'zod'
|
|
3
3
|
import {
|
|
4
|
+
MAX_UPLOAD_ZIP_SIZE_BYTES,
|
|
4
5
|
downloadZipSchema,
|
|
5
6
|
exactAssetSchema,
|
|
6
7
|
generateAssetSchema,
|
|
@@ -76,7 +77,14 @@ export const contract = {
|
|
|
76
77
|
exact: oc.input(exactAssetSchema).output(z.custom<AssetSearchResult | null>()),
|
|
77
78
|
|
|
78
79
|
uploadZip: oc
|
|
79
|
-
.input(
|
|
80
|
+
.input(
|
|
81
|
+
uploadZipSchema
|
|
82
|
+
.extend({ zip: z.instanceof(File) })
|
|
83
|
+
.refine((input) => input.zip.size < MAX_UPLOAD_ZIP_SIZE_BYTES, {
|
|
84
|
+
message: 'Upload zip must be smaller than 1 GB',
|
|
85
|
+
path: ['zip'],
|
|
86
|
+
}),
|
|
87
|
+
)
|
|
80
88
|
.output(z.custom<AssetVersion>()),
|
|
81
89
|
|
|
82
90
|
downloadZip: oc.input(downloadZipSchema).output(z.instanceof(Blob)),
|
package/src/index.ts
CHANGED
package/src/install.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Install resolved assets into a local project.
|
|
3
3
|
*
|
|
4
|
-
* 1. Downloads asset files into ./
|
|
4
|
+
* 1. Downloads public asset files into ./public/... via the oRPC client.
|
|
5
5
|
* 2. Merges npm dependencies into package.json.
|
|
6
6
|
* 3. Runs the package manager to install npm deps.
|
|
7
7
|
*
|
|
@@ -24,7 +24,7 @@ interface PackageJson {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
export interface InstallOptions {
|
|
27
|
-
/**
|
|
27
|
+
/** Directory to start project root discovery from (default: cwd) */
|
|
28
28
|
cwd?: string
|
|
29
29
|
/** Log progress */
|
|
30
30
|
onProgress?: (message: string) => void
|
|
@@ -35,59 +35,92 @@ export async function install(
|
|
|
35
35
|
resolution: ResolveResult,
|
|
36
36
|
opts: InstallOptions = {},
|
|
37
37
|
): Promise<void> {
|
|
38
|
-
const cwd = opts.cwd ?? process.cwd()
|
|
39
38
|
const log = opts.onProgress ?? (() => {})
|
|
39
|
+
const installRoot = await findInstallRoot(opts.cwd ?? process.cwd())
|
|
40
40
|
|
|
41
|
-
// Run asset file downloads and npm dep installation in parallel
|
|
42
41
|
await Promise.all([
|
|
43
|
-
downloadAssets(client, resolution,
|
|
44
|
-
installNpmDeps(resolution,
|
|
42
|
+
downloadAssets(client, resolution, installRoot, log),
|
|
43
|
+
installNpmDeps(resolution, installRoot, log),
|
|
45
44
|
])
|
|
46
45
|
}
|
|
47
46
|
|
|
47
|
+
export async function findInstallRoot(cwd: string = process.cwd()): Promise<string> {
|
|
48
|
+
const start = path.resolve(cwd)
|
|
49
|
+
let packageRoot: string | null = null
|
|
50
|
+
|
|
51
|
+
let dir = start
|
|
52
|
+
while (true) {
|
|
53
|
+
if (await isFile(path.join(dir, 'package.json'))) {
|
|
54
|
+
packageRoot = dir
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const parent = path.dirname(dir)
|
|
58
|
+
if (parent === dir) break
|
|
59
|
+
dir = parent
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return packageRoot ?? start
|
|
63
|
+
}
|
|
64
|
+
|
|
48
65
|
async function downloadAssets(
|
|
49
66
|
client: MarketClient,
|
|
50
67
|
resolution: ResolveResult,
|
|
51
|
-
|
|
68
|
+
projectRoot: string,
|
|
52
69
|
log: (msg: string) => void,
|
|
53
70
|
): Promise<void> {
|
|
54
71
|
for (const asset of resolution.assets) {
|
|
55
|
-
const destDir = path.join(cwd, 'src', asset.name)
|
|
56
|
-
await fs.mkdir(destDir, { recursive: true })
|
|
57
|
-
|
|
58
72
|
log(`Downloading ${asset.name}@${asset.version}...`)
|
|
59
73
|
|
|
60
74
|
const zip = await client.asset.downloadZip({ name: asset.name, version: asset.version })
|
|
61
75
|
const files = unzipSync(new Uint8Array(await zip.arrayBuffer()))
|
|
76
|
+
let installedFiles = 0
|
|
62
77
|
|
|
63
78
|
for (const [relativePath, content] of Object.entries(files) as [string, Uint8Array][]) {
|
|
64
|
-
const
|
|
65
|
-
if (
|
|
79
|
+
const zipPath = relativePath.replace(/\\/g, '/')
|
|
80
|
+
if (
|
|
81
|
+
zipPath.split('/').includes('..') ||
|
|
82
|
+
path.posix.isAbsolute(zipPath) ||
|
|
83
|
+
path.win32.isAbsolute(zipPath)
|
|
84
|
+
) {
|
|
66
85
|
throw new Error(`Zip contains an unsafe path: ${relativePath}`)
|
|
67
86
|
}
|
|
87
|
+
|
|
88
|
+
const normalizedPath = path.posix.normalize(zipPath)
|
|
89
|
+
if (
|
|
90
|
+
normalizedPath === '.' ||
|
|
91
|
+
normalizedPath === 'README.md' ||
|
|
92
|
+
normalizedPath.endsWith('/')
|
|
93
|
+
) {
|
|
94
|
+
continue
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const filePath = path.join(projectRoot, normalizedPath)
|
|
68
98
|
await fs.mkdir(path.dirname(filePath), { recursive: true })
|
|
69
99
|
await fs.writeFile(filePath, content)
|
|
100
|
+
installedFiles += 1
|
|
70
101
|
}
|
|
71
102
|
|
|
72
|
-
log(`Downloaded ${
|
|
103
|
+
log(`Downloaded ${installedFiles} files.`)
|
|
73
104
|
}
|
|
74
105
|
}
|
|
75
106
|
|
|
76
|
-
function
|
|
77
|
-
|
|
78
|
-
|
|
107
|
+
async function isFile(file: string): Promise<boolean> {
|
|
108
|
+
try {
|
|
109
|
+
return (await fs.stat(file)).isFile()
|
|
110
|
+
} catch {
|
|
111
|
+
return false
|
|
112
|
+
}
|
|
79
113
|
}
|
|
80
114
|
|
|
81
115
|
async function installNpmDeps(
|
|
82
116
|
resolution: ResolveResult,
|
|
83
|
-
|
|
117
|
+
projectRoot: string,
|
|
84
118
|
log: (msg: string) => void,
|
|
85
119
|
): Promise<void> {
|
|
86
120
|
const deps = resolution.npmDependencies
|
|
87
121
|
if (Object.keys(deps).length === 0) return
|
|
88
122
|
|
|
89
|
-
|
|
90
|
-
const pkgPath = path.join(cwd, 'package.json')
|
|
123
|
+
const pkgPath = path.join(projectRoot, 'package.json')
|
|
91
124
|
let pkg: PackageJson
|
|
92
125
|
try {
|
|
93
126
|
pkg = JSON.parse(await fs.readFile(pkgPath, 'utf-8')) as PackageJson
|
|
@@ -95,17 +128,15 @@ async function installNpmDeps(
|
|
|
95
128
|
pkg = { name: 'my-project', private: true, dependencies: {} }
|
|
96
129
|
}
|
|
97
130
|
|
|
98
|
-
// Merge dependencies
|
|
99
131
|
pkg.dependencies = { ...pkg.dependencies, ...deps }
|
|
100
132
|
await fs.writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\n')
|
|
101
133
|
|
|
102
134
|
log(`Installing npm dependencies: ${Object.keys(deps).join(', ')}`)
|
|
103
135
|
|
|
104
|
-
|
|
105
|
-
const pm = await detectPackageManager(cwd).catch(() => null)
|
|
136
|
+
const pm = await detectPackageManager(projectRoot).catch(() => null)
|
|
106
137
|
const pmName = pm?.name ?? 'npm'
|
|
107
138
|
|
|
108
139
|
log(`Using ${pmName}...`)
|
|
109
|
-
await installDependencies({ cwd, packageManager: { name: pmName, command: pmName } })
|
|
140
|
+
await installDependencies({ cwd: projectRoot, packageManager: { name: pmName, command: pmName } })
|
|
110
141
|
log('npm dependencies installed.')
|
|
111
142
|
}
|
package/src/schemas.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
2
|
|
|
3
|
-
export const ASSET_TYPES = ['model', 'texture', 'humanoid-animation'] as const
|
|
3
|
+
export const ASSET_TYPES = ['model', 'texture', 'humanoid-animation', 'template'] as const
|
|
4
4
|
export type AssetType = (typeof ASSET_TYPES)[number]
|
|
5
5
|
|
|
6
6
|
export const assetTypeSchema = z.enum(ASSET_TYPES)
|
|
7
7
|
|
|
8
|
+
export const MAX_UPLOAD_ZIP_SIZE_BYTES = 1024 * 1024 * 1024
|
|
9
|
+
|
|
8
10
|
export const semverSchema = z
|
|
9
11
|
.string()
|
|
10
12
|
.regex(
|
package/src/skill.ts
CHANGED
|
@@ -18,12 +18,12 @@ market preview wooden-chair --out /tmp/wooden-chair.png
|
|
|
18
18
|
## Workflow
|
|
19
19
|
|
|
20
20
|
1. Search first unless the user gave an exact asset name.
|
|
21
|
-
2. Search requires \`--type\`; use \`model\` unless the user names another supported type
|
|
21
|
+
2. Search requires \`--type\`; use \`model\` unless the user names another supported type: \`texture\`, \`humanoid-animation\`, or \`template\`.
|
|
22
22
|
3. Use \`--limit 1\` for lookup, \`--limit 3\` for choice. Search caps at 5.
|
|
23
23
|
4. Use \`--verbose\` only when the one-line descriptions are not enough.
|
|
24
24
|
5. Use \`--unapproved\` only when the user asks for unapproved/private/admin assets. Do not install unapproved assets without explicit acceptance.
|
|
25
|
-
6. Preview before installing when visual fit matters: \`market preview <name> --out <file>\`.
|
|
26
|
-
7. Generate only when the user wants a new asset and auth is available.
|
|
25
|
+
6. Preview before installing when visual fit matters: \`market preview <name> --out <file>\`. Preview is not supported for \`humanoid-animation\` or \`template\`.
|
|
26
|
+
7. Generate only when the user wants a new asset and auth is available. Generate is not supported for \`template\`.
|
|
27
27
|
8. Upload only when publishing is requested.
|
|
28
28
|
|
|
29
29
|
## Output
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import assert from 'node:assert/strict'
|
|
2
|
+
import * as fs from 'node:fs/promises'
|
|
3
|
+
import * as os from 'node:os'
|
|
4
|
+
import * as path from 'node:path'
|
|
5
|
+
import test from 'node:test'
|
|
6
|
+
import { zipSync } from 'fflate'
|
|
7
|
+
import { findInstallRoot, install } from '../src/install.js'
|
|
8
|
+
|
|
9
|
+
const textEncoder = new TextEncoder()
|
|
10
|
+
|
|
11
|
+
test('install writes zip files into the package root', async () => {
|
|
12
|
+
const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'market-install-'))
|
|
13
|
+
const appRoot = path.join(tempDir, 'app')
|
|
14
|
+
const cwd = path.join(appRoot, 'src', 'feature')
|
|
15
|
+
await fs.mkdir(path.join(appRoot, 'public'), { recursive: true })
|
|
16
|
+
await fs.mkdir(cwd, { recursive: true })
|
|
17
|
+
await fs.writeFile(path.join(appRoot, 'package.json'), '{}\n')
|
|
18
|
+
await fs.writeFile(path.join(appRoot, 'README.md'), 'project readme\n')
|
|
19
|
+
|
|
20
|
+
await install(
|
|
21
|
+
clientWithZip({
|
|
22
|
+
'public/humanoid-animation/idle-loop.glb': textEncoder.encode('glb'),
|
|
23
|
+
'src/generated/idle-loop.ts': textEncoder.encode('export const idleLoop = true\n'),
|
|
24
|
+
'README.md': textEncoder.encode('asset readme'),
|
|
25
|
+
}),
|
|
26
|
+
{
|
|
27
|
+
assets: [
|
|
28
|
+
{
|
|
29
|
+
name: 'idle-loop',
|
|
30
|
+
version: '1.0.0',
|
|
31
|
+
npmDependencies: {},
|
|
32
|
+
assetDependencies: {},
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
npmDependencies: {},
|
|
36
|
+
},
|
|
37
|
+
{ cwd },
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
assert.equal(
|
|
41
|
+
await fs.readFile(path.join(appRoot, 'public', 'humanoid-animation', 'idle-loop.glb'), 'utf-8'),
|
|
42
|
+
'glb',
|
|
43
|
+
)
|
|
44
|
+
assert.equal(
|
|
45
|
+
await fs.readFile(path.join(appRoot, 'src', 'generated', 'idle-loop.ts'), 'utf-8'),
|
|
46
|
+
'export const idleLoop = true\n',
|
|
47
|
+
)
|
|
48
|
+
assert.equal(await fs.readFile(path.join(appRoot, 'README.md'), 'utf-8'), 'project readme\n')
|
|
49
|
+
assert.equal(await exists(path.join(cwd, 'src', 'idle-loop', 'public')), false)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
test('install rejects zip paths that escape through parent segments', async () => {
|
|
53
|
+
const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'market-install-'))
|
|
54
|
+
await fs.writeFile(path.join(tempDir, 'package.json'), '{}\n')
|
|
55
|
+
|
|
56
|
+
await assert.rejects(
|
|
57
|
+
install(
|
|
58
|
+
clientWithZip({
|
|
59
|
+
'public/../package.json': textEncoder.encode('nope\n'),
|
|
60
|
+
}),
|
|
61
|
+
{
|
|
62
|
+
assets: [
|
|
63
|
+
{
|
|
64
|
+
name: 'bad-path',
|
|
65
|
+
version: '1.0.0',
|
|
66
|
+
npmDependencies: {},
|
|
67
|
+
assetDependencies: {},
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
npmDependencies: {},
|
|
71
|
+
},
|
|
72
|
+
{ cwd: tempDir },
|
|
73
|
+
),
|
|
74
|
+
/unsafe path/u,
|
|
75
|
+
)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
test('findInstallRoot ignores public directories and uses the highest package.json', async () => {
|
|
79
|
+
const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'market-root-'))
|
|
80
|
+
const repoRoot = path.join(tempDir, 'repo')
|
|
81
|
+
const appRoot = path.join(repoRoot, 'packages', 'app')
|
|
82
|
+
const cwd = path.join(appRoot, 'src', 'routes')
|
|
83
|
+
await fs.mkdir(path.join(appRoot, 'public'), { recursive: true })
|
|
84
|
+
await fs.mkdir(cwd, { recursive: true })
|
|
85
|
+
await fs.writeFile(path.join(repoRoot, 'package.json'), '{}\n')
|
|
86
|
+
await fs.writeFile(path.join(appRoot, 'package.json'), '{}\n')
|
|
87
|
+
|
|
88
|
+
assert.equal(await findInstallRoot(cwd), repoRoot)
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
test('findInstallRoot falls back to cwd when no package.json exists', async () => {
|
|
92
|
+
const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'market-root-'))
|
|
93
|
+
const cwd = path.join(tempDir, 'repo', 'src')
|
|
94
|
+
await fs.mkdir(cwd, { recursive: true })
|
|
95
|
+
|
|
96
|
+
assert.equal(await findInstallRoot(cwd), cwd)
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
function clientWithZip(files: Record<string, Uint8Array>) {
|
|
100
|
+
return {
|
|
101
|
+
asset: {
|
|
102
|
+
downloadZip: async () => new Blob([zipSync(files)]),
|
|
103
|
+
},
|
|
104
|
+
} as never
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function exists(file: string): Promise<boolean> {
|
|
108
|
+
try {
|
|
109
|
+
await fs.stat(file)
|
|
110
|
+
return true
|
|
111
|
+
} catch {
|
|
112
|
+
return false
|
|
113
|
+
}
|
|
114
|
+
}
|