@bscotch/sprite-source 1.4.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 (67) hide show
  1. package/LICENSE.md +29 -0
  2. package/README.md +84 -0
  3. package/dist/SpriteCache.d.ts +67 -0
  4. package/dist/SpriteCache.d.ts.map +1 -0
  5. package/dist/SpriteCache.js +139 -0
  6. package/dist/SpriteCache.js.map +1 -0
  7. package/dist/SpriteCache.schemas.d.ts +74 -0
  8. package/dist/SpriteCache.schemas.d.ts.map +1 -0
  9. package/dist/SpriteCache.schemas.js +51 -0
  10. package/dist/SpriteCache.schemas.js.map +1 -0
  11. package/dist/SpriteDest.actions.d.ts +18 -0
  12. package/dist/SpriteDest.actions.d.ts.map +1 -0
  13. package/dist/SpriteDest.actions.js +163 -0
  14. package/dist/SpriteDest.actions.js.map +1 -0
  15. package/dist/SpriteDest.d.ts +35 -0
  16. package/dist/SpriteDest.d.ts.map +1 -0
  17. package/dist/SpriteDest.js +359 -0
  18. package/dist/SpriteDest.js.map +1 -0
  19. package/dist/SpriteDest.schemas.d.ts +45 -0
  20. package/dist/SpriteDest.schemas.d.ts.map +1 -0
  21. package/dist/SpriteDest.schemas.js +33 -0
  22. package/dist/SpriteDest.schemas.js.map +1 -0
  23. package/dist/SpriteDir.d.ts +39 -0
  24. package/dist/SpriteDir.d.ts.map +1 -0
  25. package/dist/SpriteDir.js +240 -0
  26. package/dist/SpriteDir.js.map +1 -0
  27. package/dist/SpriteFrame.d.ts +36 -0
  28. package/dist/SpriteFrame.d.ts.map +1 -0
  29. package/dist/SpriteFrame.js +225 -0
  30. package/dist/SpriteFrame.js.map +1 -0
  31. package/dist/SpriteSource.d.ts +60 -0
  32. package/dist/SpriteSource.d.ts.map +1 -0
  33. package/dist/SpriteSource.js +153 -0
  34. package/dist/SpriteSource.js.map +1 -0
  35. package/dist/SpriteSource.schemas.d.ts +56 -0
  36. package/dist/SpriteSource.schemas.d.ts.map +1 -0
  37. package/dist/SpriteSource.schemas.js +54 -0
  38. package/dist/SpriteSource.schemas.js.map +1 -0
  39. package/dist/checksum.d.ts +4 -0
  40. package/dist/checksum.d.ts.map +1 -0
  41. package/dist/checksum.js +28 -0
  42. package/dist/checksum.js.map +1 -0
  43. package/dist/cli.d.mts +3 -0
  44. package/dist/cli.d.mts.map +1 -0
  45. package/dist/cli.mjs +113 -0
  46. package/dist/cli.mjs.map +1 -0
  47. package/dist/constants.d.ts +8 -0
  48. package/dist/constants.d.ts.map +1 -0
  49. package/dist/constants.js +10 -0
  50. package/dist/constants.js.map +1 -0
  51. package/dist/index.d.ts +9 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +8 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/safeFs.d.ts +5 -0
  56. package/dist/safeFs.d.ts.map +1 -0
  57. package/dist/safeFs.js +34 -0
  58. package/dist/safeFs.js.map +1 -0
  59. package/dist/types.d.ts +25 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +2 -0
  62. package/dist/types.js.map +1 -0
  63. package/dist/utility.d.ts +25 -0
  64. package/dist/utility.d.ts.map +1 -0
  65. package/dist/utility.js +101 -0
  66. package/dist/utility.js.map +1 -0
  67. package/package.json +58 -0
@@ -0,0 +1,101 @@
1
+ import { pathy, rmSafe } from '@bscotch/pathy';
2
+ import fsp from 'fs/promises';
3
+ import path from 'path';
4
+ import { readdirSafe, readdirSafeWithFileTypes } from './safeFs.js';
5
+ export function check(func, message) {
6
+ const handleError = (err) => {
7
+ const error = new Error(message);
8
+ error.cause = err;
9
+ return [error, null];
10
+ };
11
+ try {
12
+ const result = func();
13
+ // Handle async functions
14
+ if (result instanceof Promise) {
15
+ return result.then((result) => [null, result], (cause) => handleError(cause));
16
+ }
17
+ return [null, result];
18
+ }
19
+ catch (cause) {
20
+ return handleError(cause);
21
+ }
22
+ }
23
+ export class SpriteSourceError extends Error {
24
+ constructor(message, cause, asserter) {
25
+ super(message);
26
+ this.name = 'SpriteSourceError';
27
+ this.cause = cause;
28
+ Error.captureStackTrace(this, asserter || this.constructor);
29
+ }
30
+ }
31
+ export function assert(condition, message, cause) {
32
+ if (!condition) {
33
+ const err = new SpriteSourceError(message, cause, assert);
34
+ throw err;
35
+ }
36
+ }
37
+ export function rethrow(cause, message) {
38
+ const error = new Error(message);
39
+ error.cause = cause;
40
+ throw error;
41
+ }
42
+ export async function getDirs(rootFolder, maxDepth = Infinity) {
43
+ const spriteDirs = [];
44
+ async function walk(dir, depth = 1) {
45
+ if (depth > maxDepth)
46
+ return;
47
+ const files = await readdirSafeWithFileTypes(dir);
48
+ await Promise.all(files.map(async (file) => {
49
+ const filePath = path.join(dir, file.name);
50
+ if (file.isDirectory()) {
51
+ // Add as a Pathy instance where the cwd is the root folder
52
+ spriteDirs.push(pathy(filePath, rootFolder));
53
+ await walk(filePath, depth + 1);
54
+ }
55
+ }));
56
+ }
57
+ await walk(rootFolder);
58
+ return spriteDirs;
59
+ }
60
+ /**
61
+ * Delete the PNG images inside a folder. Returns the list of
62
+ * deleted images.
63
+ */
64
+ export async function deletePngChildren(path) {
65
+ if (!(await path.exists())) {
66
+ return [];
67
+ }
68
+ const files = await readdirSafe(path.absolute);
69
+ const deleteWaits = [];
70
+ const deleted = [];
71
+ for (const file of files) {
72
+ if (file.match(/\.png$/i)) {
73
+ const toDelete = path.join(file);
74
+ deleted.push(toDelete);
75
+ deleteWaits.push(rmSafe(toDelete.absolute));
76
+ }
77
+ }
78
+ await Promise.all(deleteWaits);
79
+ return deleted;
80
+ }
81
+ /**
82
+ * Asynchronously get the size of a PNG image, given its path,
83
+ * with maximal speed.
84
+ */
85
+ export async function getPngSize(path) {
86
+ const size = { width: 0, height: 0 };
87
+ const fd = await fsp.open(path.absolute, 'r');
88
+ try {
89
+ const buf = Buffer.alloc(24);
90
+ await fd.read(buf, 0, 24, 16);
91
+ size.width = buf.readUInt32BE(0);
92
+ size.height = buf.readUInt32BE(4);
93
+ }
94
+ finally {
95
+ await fd.close();
96
+ }
97
+ assert(size.width > 0, `Invalid width for ${path}`);
98
+ assert(size.height > 0, `Invalid height for ${path}`);
99
+ return size;
100
+ }
101
+ //# sourceMappingURL=utility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utility.js","sourceRoot":"","sources":["../src/utility.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@bscotch/sprite-source",
3
+ "version": "1.4.0",
4
+ "description": "Art pipeline scripting module for GameMaker sprites.",
5
+ "keywords": [
6
+ "sprite",
7
+ "image",
8
+ "2D",
9
+ "gamemaker",
10
+ "game maker",
11
+ "art",
12
+ "art asset",
13
+ "pipeline",
14
+ "spine"
15
+ ],
16
+ "homepage": "https://github.com/bscotch/stitch/tree/develop/packages/sprite-source#readme",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://github.com/bscotch/stitch.git",
20
+ "directory": "packages/sprite-source"
21
+ },
22
+ "license": "MIT",
23
+ "type": "module",
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/index.js"
28
+ }
29
+ },
30
+ "main": "dist/index.js",
31
+ "types": "dist/index.d.ts",
32
+ "bin": {
33
+ "spsrc": "./dist/cli.mjs"
34
+ },
35
+ "dependencies": {
36
+ "@bscotch/pathy": "^2.12.1",
37
+ "@bscotch/pixel-checksum": "^0.1.2",
38
+ "@bscotch/utility": "^7.2.0",
39
+ "citty": "0.1.6",
40
+ "image-js": "0.37.0",
41
+ "tslib": "^2.8.1",
42
+ "zod": "^4.0.15",
43
+ "@bscotch/yy": "2.5.0"
44
+ },
45
+ "devDependencies": {
46
+ "chai": "^5.2.1",
47
+ "typescript": "5.9.2"
48
+ },
49
+ "publishConfig": {
50
+ "access": "public"
51
+ },
52
+ "scripts": {
53
+ "build": "tsc --build && node scripts/build-schemas.mjs",
54
+ "test": "mocha --config ../../config/.mocharc.cjs",
55
+ "test:dev": "mocha --config ../../config/.mocharc.cjs --forbid-only=false --parallel=false --timeout=9999999999",
56
+ "watch": "tsc --build --watch"
57
+ }
58
+ }