@blackasteroid/riu 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +371 -0
  3. package/dist/cache/uploads.js +48 -0
  4. package/dist/cache/uploads.js.map +1 -0
  5. package/dist/cli.js +196 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/doctor.js +89 -0
  8. package/dist/commands/doctor.js.map +1 -0
  9. package/dist/commands/init.js +168 -0
  10. package/dist/commands/init.js.map +1 -0
  11. package/dist/commands/install-sdk.js +121 -0
  12. package/dist/commands/install-sdk.js.map +1 -0
  13. package/dist/commands/list.js +67 -0
  14. package/dist/commands/list.js.map +1 -0
  15. package/dist/commands/new.js +177 -0
  16. package/dist/commands/new.js.map +1 -0
  17. package/dist/commands/update.js +116 -0
  18. package/dist/commands/update.js.map +1 -0
  19. package/dist/commands/upgrade.js +93 -0
  20. package/dist/commands/upgrade.js.map +1 -0
  21. package/dist/commands/upload-all.js +250 -0
  22. package/dist/commands/upload-all.js.map +1 -0
  23. package/dist/commands/upload.js +205 -0
  24. package/dist/commands/upload.js.map +1 -0
  25. package/dist/config/schema.js +76 -0
  26. package/dist/config/schema.js.map +1 -0
  27. package/dist/config/store.js +70 -0
  28. package/dist/config/store.js.map +1 -0
  29. package/dist/manifest/builder.js +84 -0
  30. package/dist/manifest/builder.js.map +1 -0
  31. package/dist/manifest/itemTypes.js +44 -0
  32. package/dist/manifest/itemTypes.js.map +1 -0
  33. package/dist/manifest/writer.js +38 -0
  34. package/dist/manifest/writer.js.map +1 -0
  35. package/dist/sdk/installer.js +59 -0
  36. package/dist/sdk/installer.js.map +1 -0
  37. package/dist/sdk/locator.js +160 -0
  38. package/dist/sdk/locator.js.map +1 -0
  39. package/dist/steam/client.js +163 -0
  40. package/dist/steam/client.js.map +1 -0
  41. package/dist/steam/mock.js +51 -0
  42. package/dist/steam/mock.js.map +1 -0
  43. package/dist/steam/types.js +7 -0
  44. package/dist/steam/types.js.map +1 -0
  45. package/dist/ui/BulkUploadProgress.js +21 -0
  46. package/dist/ui/BulkUploadProgress.js.map +1 -0
  47. package/dist/ui/InitWizard.js +67 -0
  48. package/dist/ui/InitWizard.js.map +1 -0
  49. package/dist/ui/NewSkinWizard.js +52 -0
  50. package/dist/ui/NewSkinWizard.js.map +1 -0
  51. package/dist/ui/UploadProgress.js +46 -0
  52. package/dist/ui/UploadProgress.js.map +1 -0
  53. package/dist/utils/iconValidator.js +68 -0
  54. package/dist/utils/iconValidator.js.map +1 -0
  55. package/dist/utils/slugify.js +13 -0
  56. package/dist/utils/slugify.js.map +1 -0
  57. package/dist/utils/updateCheck.js +93 -0
  58. package/dist/utils/updateCheck.js.map +1 -0
  59. package/dist/version.js +9 -0
  60. package/dist/version.js.map +1 -0
  61. package/package.json +67 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadProgress.js","sourceRoot":"","sources":["../../src/ui/UploadProgress.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ // Validates a PNG icon against the requirements Steam workshop preview
2
+ // images need: PNG format, square, power-of-two dimensions, RGBA preferred.
3
+ // Uses sharp because it's fast, doesn't require an external binary, and
4
+ // already in the dep tree.
5
+ import sharp from "sharp";
6
+ import { existsSync, statSync } from "node:fs";
7
+ import { extname } from "node:path";
8
+ const ALLOWED_DIMENSIONS = [256, 512, 1024, 2048];
9
+ const MAX_FILE_SIZE_BYTES = 1 * 1024 * 1024; // Steam preview limit is 1MB
10
+ export async function validateIcon(iconPath) {
11
+ const errors = [];
12
+ const warnings = [];
13
+ if (!existsSync(iconPath)) {
14
+ return { ok: false, errors: [`file not found: ${iconPath}`], warnings };
15
+ }
16
+ const stat = statSync(iconPath);
17
+ if (!stat.isFile()) {
18
+ return { ok: false, errors: [`not a regular file: ${iconPath}`], warnings };
19
+ }
20
+ if (extname(iconPath).toLowerCase() !== ".png") {
21
+ errors.push(`icon must be a .png file (got ${extname(iconPath) || "no extension"})`);
22
+ }
23
+ if (stat.size > MAX_FILE_SIZE_BYTES) {
24
+ errors.push(`icon exceeds Steam's 1MB preview limit (${(stat.size / 1024).toFixed(0)}KB)`);
25
+ }
26
+ let width;
27
+ let height;
28
+ let format;
29
+ let hasAlpha;
30
+ try {
31
+ const meta = await sharp(iconPath).metadata();
32
+ width = meta.width;
33
+ height = meta.height;
34
+ format = meta.format;
35
+ hasAlpha = meta.hasAlpha;
36
+ if (format !== "png") {
37
+ errors.push(`sharp reports format as "${format}", expected "png"`);
38
+ }
39
+ if (!width || !height) {
40
+ errors.push("could not read image dimensions");
41
+ }
42
+ else {
43
+ if (width !== height) {
44
+ errors.push(`icon must be square (got ${width}x${height})`);
45
+ }
46
+ if (!ALLOWED_DIMENSIONS.includes(width)) {
47
+ errors.push(`icon dimensions must be one of ${ALLOWED_DIMENSIONS.join("/")}, got ${width}`);
48
+ }
49
+ }
50
+ if (hasAlpha === false) {
51
+ warnings.push("icon has no alpha channel — RGBA is preferred for transparent backgrounds");
52
+ }
53
+ }
54
+ catch (e) {
55
+ errors.push(`failed to parse image: ${e instanceof Error ? e.message : String(e)}`);
56
+ }
57
+ return {
58
+ ok: errors.length === 0,
59
+ errors,
60
+ warnings,
61
+ width,
62
+ height,
63
+ format,
64
+ hasAlpha,
65
+ fileSize: stat.size,
66
+ };
67
+ }
68
+ //# sourceMappingURL=iconValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iconValidator.js","sourceRoot":"","sources":["../../src/utils/iconValidator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ // Simple slugifier for default output folder names. Lowercases, swaps
2
+ // non-alphanumeric runs for dashes, trims, and falls back to "skin" if
3
+ // the result is empty.
4
+ export function slugify(input) {
5
+ const slug = input
6
+ .normalize("NFKD")
7
+ .replace(/[\u0300-\u036f]/g, "") // strip combining diacritics
8
+ .toLowerCase()
9
+ .replace(/[^a-z0-9]+/g, "-")
10
+ .replace(/^-+|-+$/g, "");
11
+ return slug.length > 0 ? slug : "skin";
12
+ }
13
+ //# sourceMappingURL=slugify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slugify.js","sourceRoot":"","sources":["../../src/utils/slugify.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,uEAAuE;AACvE,uBAAuB;AAEvB,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,MAAM,IAAI,GAAG,KAAK;SACf,SAAS,CAAC,MAAM,CAAC;SACjB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,6BAA6B;SAC7D,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AACzC,CAAC"}
@@ -0,0 +1,93 @@
1
+ // Wraps update-notifier so the rest of the CLI doesn't have to know about
2
+ // it. Skipped automatically when:
3
+ // - the user explicitly passed --json (we can't pollute structured stdout)
4
+ // - the only arg is --version / -v / --help / -h (these should stay snappy)
5
+ // - the command is `riu upgrade` itself (would be confusing to nag during upgrade)
6
+ //
7
+ // Notice goes to stderr so even if a downstream tool didn't pass --json,
8
+ // stdout still parses cleanly.
9
+ import updateNotifier from "update-notifier";
10
+ import { readFileSync } from "node:fs";
11
+ import { fileURLToPath } from "node:url";
12
+ import { dirname, join } from "node:path";
13
+ const here = dirname(fileURLToPath(import.meta.url));
14
+ const pkgPath = join(here, "..", "..", "package.json");
15
+ let cached;
16
+ function loadPkg() {
17
+ if (cached)
18
+ return cached;
19
+ cached = JSON.parse(readFileSync(pkgPath, "utf8"));
20
+ return cached;
21
+ }
22
+ function shouldSkip(argv) {
23
+ // argv[0] = node, argv[1] = cli.js, argv[2..] = user args
24
+ const userArgs = argv.slice(2);
25
+ if (userArgs.length === 0)
26
+ return true; // bare `riu` shows help, no need to nag
27
+ if (userArgs.includes("--json"))
28
+ return true;
29
+ // Skip if --json appears anywhere as a flag (commander variant: --json=true)
30
+ if (userArgs.some((a) => a === "--json" || a.startsWith("--json=")))
31
+ return true;
32
+ // Version/help should be instant
33
+ if (userArgs.some((a) => a === "--version" || a === "-v" || a === "--help" || a === "-h"))
34
+ return true;
35
+ // Don't nag during upgrade itself
36
+ if (userArgs[0] === "upgrade")
37
+ return true;
38
+ return false;
39
+ }
40
+ export function maybeRunUpdateCheck(argv) {
41
+ if (shouldSkip(argv))
42
+ return;
43
+ try {
44
+ const pkg = loadPkg();
45
+ const notifier = updateNotifier({
46
+ pkg,
47
+ // 1 day cache so we don't hit the registry on every command
48
+ updateCheckInterval: 1000 * 60 * 60 * 24,
49
+ // Don't show in CI
50
+ shouldNotifyInNpmScript: false,
51
+ });
52
+ // The notifier check runs in a child process and writes to a config file.
53
+ // notify() prints the banner to stderr if an update is available.
54
+ notifier.notify({
55
+ defer: false,
56
+ isGlobal: true,
57
+ message: "Update available {currentVersion} → {latestVersion}\nRun {updateCommand} (or `riu upgrade`) to update",
58
+ });
59
+ }
60
+ catch {
61
+ // Network failure or anything else — never block the command on update checks.
62
+ }
63
+ }
64
+ // Used by `riu upgrade` to fetch the latest published version synchronously.
65
+ export async function fetchLatestVersion() {
66
+ const pkg = loadPkg();
67
+ try {
68
+ const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(pkg.name)}/latest`);
69
+ if (!res.ok) {
70
+ return {
71
+ currentVersion: pkg.version,
72
+ updateAvailable: false,
73
+ packageName: pkg.name,
74
+ };
75
+ }
76
+ const data = (await res.json());
77
+ const latest = data.version;
78
+ return {
79
+ currentVersion: pkg.version,
80
+ latestVersion: latest,
81
+ updateAvailable: !!latest && latest !== pkg.version,
82
+ packageName: pkg.name,
83
+ };
84
+ }
85
+ catch {
86
+ return {
87
+ currentVersion: pkg.version,
88
+ updateAvailable: false,
89
+ packageName: pkg.name,
90
+ };
91
+ }
92
+ }
93
+ //# sourceMappingURL=updateCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateCheck.js","sourceRoot":"","sources":["../../src/utils/updateCheck.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,kCAAkC;AAClC,6EAA6E;AAC7E,8EAA8E;AAC9E,qFAAqF;AACrF,EAAE;AACF,yEAAyE;AACzE,+BAA+B;AAE/B,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAOvD,IAAI,MAA8B,CAAC;AAEnC,SAAS,OAAO;IACd,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAe,CAAC;IACjE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,IAAc;IAChC,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,wCAAwC;IAChF,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,6EAA6E;IAC7E,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjF,iCAAiC;IACjC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACvG,kCAAkC;IAClC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAc;IAChD,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,cAAc,CAAC;YAC9B,GAAG;YACH,4DAA4D;YAC5D,mBAAmB,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;YACxC,mBAAmB;YACnB,uBAAuB,EAAE,KAAK;SAC/B,CAAC,CAAC;QACH,0EAA0E;QAC1E,kEAAkE;QAClE,QAAQ,CAAC,MAAM,CAAC;YACd,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,IAAI;YACd,OAAO,EACL,uGAAuG;SAC1G,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,+EAA+E;IACjF,CAAC;AACH,CAAC;AASD,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,8BAA8B,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7F,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO;gBACL,cAAc,EAAE,GAAG,CAAC,OAAO;gBAC3B,eAAe,EAAE,KAAK;gBACtB,WAAW,EAAE,GAAG,CAAC,IAAI;aACtB,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,OAAO;YACL,cAAc,EAAE,GAAG,CAAC,OAAO;YAC3B,aAAa,EAAE,MAAM;YACrB,eAAe,EAAE,CAAC,CAAC,MAAM,IAAI,MAAM,KAAK,GAAG,CAAC,OAAO;YACnD,WAAW,EAAE,GAAG,CAAC,IAAI;SACtB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,cAAc,EAAE,GAAG,CAAC,OAAO;YAC3B,eAAe,EAAE,KAAK;YACtB,WAAW,EAAE,GAAG,CAAC,IAAI;SACtB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ // Read version from package.json so we have a single source of truth.
2
+ import { readFileSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { dirname, join } from "node:path";
5
+ const here = dirname(fileURLToPath(import.meta.url));
6
+ const pkgPath = join(here, "..", "package.json");
7
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
8
+ export const VERSION = pkg.version;
9
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAwB,CAAC;AAE7E,MAAM,CAAC,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@blackasteroid/riu",
3
+ "version": "0.2.0",
4
+ "description": "Automate uploading icon-only Rust workshop skins from the command line. Generate manifests, validate icons, and push to Steam Workshop — interactively or via JSON for agents.",
5
+ "type": "module",
6
+ "bin": {
7
+ "riu": "./dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "scripts": {
18
+ "dev": "tsx src/cli.tsx",
19
+ "build": "tsc",
20
+ "start": "node dist/cli.js",
21
+ "typecheck": "tsc --noEmit",
22
+ "test": "node --test --import tsx 'src/**/__tests__/*.test.ts'",
23
+ "prepublishOnly": "npm run build"
24
+ },
25
+ "engines": {
26
+ "node": ">=20"
27
+ },
28
+ "keywords": [
29
+ "rust",
30
+ "facepunch",
31
+ "steam",
32
+ "workshop",
33
+ "skins",
34
+ "cli"
35
+ ],
36
+ "author": "Pablo Morales",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/BlackAsteroid/rust-icon-uploader.git"
41
+ },
42
+ "homepage": "https://github.com/BlackAsteroid/rust-icon-uploader#readme",
43
+ "bugs": {
44
+ "url": "https://github.com/BlackAsteroid/rust-icon-uploader/issues"
45
+ },
46
+ "dependencies": {
47
+ "commander": "^12.1.0",
48
+ "conf": "^13.0.1",
49
+ "ink": "^5.0.1",
50
+ "ink-select-input": "^6.0.0",
51
+ "ink-spinner": "^5.0.0",
52
+ "ink-table": "^3.1.0",
53
+ "ink-text-input": "^6.0.0",
54
+ "react": "^18.3.1",
55
+ "sharp": "^0.33.5",
56
+ "steamworks-ffi-node": "^0.10.2",
57
+ "update-notifier": "^7.3.1",
58
+ "zod": "^3.23.8"
59
+ },
60
+ "devDependencies": {
61
+ "@types/node": "^22.7.4",
62
+ "@types/react": "^18.3.11",
63
+ "@types/update-notifier": "^6.0.8",
64
+ "tsx": "^4.19.1",
65
+ "typescript": "^5.6.2"
66
+ }
67
+ }