apphx 2.0.1 → 2.1.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.
- package/README.md +10 -8
- package/dist/cli.js +41 -11
- package/dist/cli.js.map +1 -1
- package/dist/config.js +4 -2
- package/dist/config.js.map +1 -1
- package/dist/integrations.js +154 -95
- package/dist/integrations.js.map +1 -1
- package/dist/notify.js +267 -0
- package/dist/notify.js.map +1 -0
- package/dist/runner.js +119 -20
- package/dist/runner.js.map +1 -1
- package/dist/schemas.js +57 -2
- package/dist/schemas.js.map +1 -1
- package/dist/vendor/obfuscator/dist/config.js +119 -6
- package/dist/vendor/obfuscator/dist/config.js.map +1 -1
- package/dist/vendor/obfuscator/dist/dfa.js +528 -0
- package/dist/vendor/obfuscator/dist/dfa.js.map +1 -0
- package/dist/vendor/obfuscator/dist/flutter.js +3266 -0
- package/dist/vendor/obfuscator/dist/flutter.js.map +1 -0
- package/dist/vendor/obfuscator/dist/image-utils.js +335 -0
- package/dist/vendor/obfuscator/dist/image-utils.js.map +1 -0
- package/dist/vendor/obfuscator/dist/junk.js +1501 -0
- package/dist/vendor/obfuscator/dist/junk.js.map +1 -0
- package/dist/vendor/obfuscator/dist/lexicon-data.js +972 -0
- package/dist/vendor/obfuscator/dist/lexicon-data.js.map +1 -0
- package/dist/vendor/obfuscator/dist/obfuscate.js +51 -2
- package/dist/vendor/obfuscator/dist/obfuscate.js.map +1 -1
- package/dist/vendor/obfuscator/dist/objc-symbols.js +1819 -0
- package/dist/vendor/obfuscator/dist/objc-symbols.js.map +1 -0
- package/dist/vendor/obfuscator/dist/project-identity.js +852 -0
- package/dist/vendor/obfuscator/dist/project-identity.js.map +1 -0
- package/dist/vendor/obfuscator/dist/string-encrypt.js +330 -0
- package/dist/vendor/obfuscator/dist/string-encrypt.js.map +1 -0
- package/examples/android-java.factory.json +40 -5
- package/examples/expo.factory.json +68 -5
- package/examples/flutter.factory.json +40 -4
- package/examples/luggage.json +1 -0
- package/examples/multi-role-agents.md +129 -0
- package/examples/mygo.factory.json +54 -4
- package/examples/queue-loop-demo.md +146 -0
- package/examples/react-native.factory.json +58 -5
- package/examples/roles.example.json +31 -0
- package/examples/swift.factory.json +60 -5
- package/examples/uni-app.factory.json +58 -5
- package/package.json +1 -1
- package/skills/apphx/SKILL.md +39 -4
- package/skills/apphx/resources/requirement.json +1 -0
- package/skills/apphx-obfuscator/LICENSE +21 -0
- package/skills/apphx-obfuscator/SKILL.md +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-utils.js","names":[],"sources":["../src/image-utils.ts"],"sourcesContent":["import { readFileSync, writeFileSync } from 'node:fs';\nimport type { TransformOutcome, WalkEntry } from './common.js';\nimport { extension, isImageFile } from './common.js';\nimport { encodePNG, parsePNG } from './png.js';\n\n/**\n * Deterministic image color/scale transforms for project assets\n * as deterministic, pure PNG helpers plus multi-file batch functions.\n *\n * Faithfulness notes, verified against the disassembled bytecode (pycdas):\n * - `colour_distance` is the original \"redmean\"-weighted RGB distance; it is defined\n * but never called by the color-replacement path in the extracted module (dead code).\n * The replacement path actually uses `color_acquaintance_compare`, a per-channel\n * absolute-difference tolerance test.\n * - `exchange_image_colors` iterates the color map in insertion order and applies\n * *every* matching rule to the original pixel value, so the last matching rule wins.\n * `pickReplacement` reproduces that exactly.\n * - `exchange_image_colors_same_color` overwrites every non-transparent pixel's RGB\n * with a single target color, leaving alpha untouched.\n * - Scale uses PIL's `Image.BILINEAR`; this port uses center-aligned bilinear\n * interpolation per channel, which is semantically equivalent (not bit-exact).\n */\n\n/** RGB triple, 0-255 per channel. */\nexport type RGB = readonly [number, number, number];\n\n/** One parsed color-map rule: source color -> replacement color. */\nexport interface RecolorRule {\n from: RGB;\n to: RGB;\n}\n\n/** Resampling kernel used by scalePixels. */\nexport type Interpolation = 'nearest' | 'bilinear';\n\nexport interface ScaleOptions {\n /** Exact output width (px). Combined with `height` it wins over `scale`. */\n width?: number;\n /** Exact output height (px). */\n height?: number;\n /** Uniform scale factor (e.g. 0.5 halves both dimensions). */\n scale?: number;\n /** Resampling kernel. Defaults to 'bilinear' to match PIL's BILINEAR. */\n interpolation?: Interpolation;\n}\n\n/** Parse a `#RGB`/`#RRGGBB` hex color into an RGB triple. Throws on malformed input. */\nexport function hexToRgb(hex: string): RGB {\n let value = hex.trim();\n if (value.startsWith('#')) value = value.slice(1);\n if (value.length === 3) value = `${value[0]}${value[0]}${value[1]}${value[1]}${value[2]}${value[2]}`;\n if (!/^[0-9a-f]{6}$/i.test(value)) throw new Error(`Invalid hex color: ${hex}`);\n return [\n parseInt(value.slice(0, 2), 16),\n parseInt(value.slice(2, 4), 16),\n parseInt(value.slice(4, 6), 16),\n ];\n}\n\n/**\n * The original `colour_distance`: redmean-weighted RGB distance.\n * value = sqrt((2 + rmean/256)*R^2 + 4*G^2 + (2 + (255 - rmean)/256)*B^2).\n */\nexport function colourDistance(rgb1: RGB, rgb2: RGB): number {\n const rmean = (rgb1[0] + rgb2[0]) / 2;\n const r = rgb1[0] - rgb2[0];\n const g = rgb1[1] - rgb2[1];\n const b = rgb1[2] - rgb2[2];\n return Math.sqrt((2 + rmean / 256) * r * r + 4 * g * g + (2 + (255 - rmean) / 256) * b * b);\n}\n\n/**\n * The original `color_acquaintance_compare`: true when every channel of `pixel`\n * is within `tolerance` absolute distance of the corresponding `target` channel.\n */\nexport function colorAcquaintanceCompare(target: RGB, pixel: RGB, tolerance: number): boolean {\n for (let index = 0; index < 3; index += 1) {\n if (Math.abs(target[index]! - pixel[index]!) > tolerance) return false;\n }\n return true;\n}\n\n/** Parse a hex color map (target -> replacement) preserving insertion order. */\nexport function parseColorMap(colorMap: Readonly<Record<string, string>>): RecolorRule[] {\n const rules: RecolorRule[] = [];\n for (const [target, replace] of Object.entries(colorMap)) rules.push({ from: hexToRgb(target), to: hexToRgb(replace) });\n return rules;\n}\n\n/**\n * Faithful port of the `exchange_image_colors` inner loop: for a single pixel,\n * apply every rule whose `from` matches within `tolerance`; the last matching rule\n * (in map insertion order) wins. Returns the replacement RGB, or undefined.\n */\nexport function pickReplacement(r: number, g: number, b: number, map: Readonly<Record<string, string>>, tolerance: number): RGB | undefined {\n const pixel: RGB = [r, g, b];\n let chosen: RGB | undefined;\n for (const [target, replace] of Object.entries(map)) {\n if (colorAcquaintanceCompare(hexToRgb(target), pixel, tolerance)) chosen = hexToRgb(replace);\n }\n return chosen;\n}\n\n/** Recolor pixels in place using parsed rules; transparent pixels are skipped. Returns whether anything changed. */\nfunction applyRules(pixels: Uint8Array, rules: readonly RecolorRule[], tolerance: number): boolean {\n let modified = false;\n for (let index = 0; index < pixels.length; index += 4) {\n if (pixels[index + 3] === 0) continue; // faithful: transparent pixels stay untouched\n const pixel: RGB = [pixels[index]!, pixels[index + 1]!, pixels[index + 2]!];\n let chosen: RGB | undefined;\n for (const rule of rules) if (colorAcquaintanceCompare(rule.from, pixel, tolerance)) chosen = rule.to;\n if (!chosen) continue;\n if (chosen[0] !== pixels[index] || chosen[1] !== pixels[index + 1] || chosen[2] !== pixels[index + 2]) modified = true;\n pixels[index] = chosen[0];\n pixels[index + 1] = chosen[1];\n pixels[index + 2] = chosen[2];\n }\n return modified;\n}\n\n/**\n * Recolor owned PNGs by a hex color map (`#target -> #replace`). Non-PNG images and\n * undecodable PNGs are reported as unsupported, never corrupted. `seed` is reserved\n * for parity with the other transform modules; the mapping itself is deterministic.\n */\nexport function recolorImagesByMap(files: WalkEntry[], colorMap: Readonly<Record<string, string>>, tolerance = 20, seed = ''): TransformOutcome {\n void seed;\n const rules = parseColorMap(colorMap);\n const changedPaths: string[] = [];\n let changed = 0;\n let unsupported = 0;\n for (const entry of files) {\n if (!isImageFile(entry.relative)) continue;\n if (extension(entry.relative) !== 'png') { unsupported += 1; continue; }\n const before = readFileSync(entry.absolute);\n const decoded = parsePNG(before);\n if (!decoded) { unsupported += 1; continue; }\n if (!applyRules(decoded.pixels, rules, tolerance)) continue;\n const next = encodePNG(before, decoded);\n if (!next || next.equals(before)) { unsupported += 1; continue; }\n writeFileSync(entry.absolute, next);\n changed += 1;\n changedPaths.push(entry.relative);\n }\n return { changed, changedPaths, unsupported };\n}\n\n/** Overwrite every non-transparent pixel's RGB with `color` (same_color). Returns whether anything changed. */\nexport function recolorSolidPixels(pixels: Uint8Array, color: RGB): boolean {\n let modified = false;\n for (let index = 0; index < pixels.length; index += 4) {\n if (pixels[index + 3] === 0) continue;\n if (pixels[index] !== color[0] || pixels[index + 1] !== color[1] || pixels[index + 2] !== color[2]) modified = true;\n pixels[index] = color[0];\n pixels[index + 1] = color[1];\n pixels[index + 2] = color[2];\n }\n return modified;\n}\n\n/**\n * Replace every non-transparent pixel of owned PNGs with one color\n * (port of `exchange_image_colors_same_color`).\n */\nexport function recolorImagesSolid(files: WalkEntry[], color: string, seed = ''): TransformOutcome {\n void seed;\n const rgb = hexToRgb(color);\n const changedPaths: string[] = [];\n let changed = 0;\n let unsupported = 0;\n for (const entry of files) {\n if (!isImageFile(entry.relative)) continue;\n if (extension(entry.relative) !== 'png') { unsupported += 1; continue; }\n const before = readFileSync(entry.absolute);\n const decoded = parsePNG(before);\n if (!decoded) { unsupported += 1; continue; }\n if (!recolorSolidPixels(decoded.pixels, rgb)) continue;\n const next = encodePNG(before, decoded);\n if (!next || next.equals(before)) { unsupported += 1; continue; }\n writeFileSync(entry.absolute, next);\n changed += 1;\n changedPaths.push(entry.relative);\n }\n return { changed, changedPaths, unsupported };\n}\n\n/**\n * Center-aligned bilinear (or nearest-neighbor) RGBA resampling. Bilinear is the\n * default and mirrors PIL's `Image.BILINEAR`; it is per-channel and edge-clamped,\n * not bit-identical to Pillow's triangle-kernel affine transform.\n */\nexport function scalePixels(pixels: Uint8Array, srcWidth: number, srcHeight: number, dstWidth: number, dstHeight: number, interpolation: Interpolation = 'bilinear'): Uint8Array {\n if (srcWidth <= 0 || srcHeight <= 0 || dstWidth <= 0 || dstHeight <= 0) throw new Error('Image dimensions must be positive');\n if (pixels.length !== srcWidth * srcHeight * 4) throw new Error(`Pixel buffer length ${pixels.length} does not match ${srcWidth}x${srcHeight} RGBA`);\n const out = new Uint8Array(dstWidth * dstHeight * 4);\n if (srcWidth === dstWidth && srcHeight === dstHeight) { out.set(pixels); return out; }\n const xRatio = srcWidth / dstWidth;\n const yRatio = srcHeight / dstHeight;\n for (let dy = 0; dy < dstHeight; dy += 1) {\n for (let dx = 0; dx < dstWidth; dx += 1) {\n const di = (dy * dstWidth + dx) * 4;\n if (interpolation === 'nearest') {\n const sx = Math.min(srcWidth - 1, Math.floor(dx * xRatio));\n const sy = Math.min(srcHeight - 1, Math.floor(dy * yRatio));\n const si = (sy * srcWidth + sx) * 4;\n out[di] = pixels[si]!;\n out[di + 1] = pixels[si + 1]!;\n out[di + 2] = pixels[si + 2]!;\n out[di + 3] = pixels[si + 3]!;\n continue;\n }\n const cx = Math.min(srcWidth - 1, Math.max(0, (dx + 0.5) * xRatio - 0.5));\n const cy = Math.min(srcHeight - 1, Math.max(0, (dy + 0.5) * yRatio - 0.5));\n const sx0 = Math.floor(cx);\n const sy0 = Math.floor(cy);\n const sx1 = Math.min(srcWidth - 1, sx0 + 1);\n const sy1 = Math.min(srcHeight - 1, sy0 + 1);\n const u = cx - sx0;\n const v = cy - sy0;\n for (let channel = 0; channel < 4; channel += 1) {\n const p00 = pixels[(sy0 * srcWidth + sx0) * 4 + channel]!;\n const p10 = pixels[(sy0 * srcWidth + sx1) * 4 + channel]!;\n const p01 = pixels[(sy1 * srcWidth + sx0) * 4 + channel]!;\n const p11 = pixels[(sy1 * srcWidth + sx1) * 4 + channel]!;\n const top = p00 * (1 - u) + p10 * u;\n const bottom = p01 * (1 - u) + p11 * u;\n out[di + channel] = Math.round(top * (1 - v) + bottom * v);\n }\n }\n }\n return out;\n}\n\n/** Resolve the output size from `options`, clamping to at least 1px on each axis. */\nexport function resolveScaleSize(srcWidth: number, srcHeight: number, options: ScaleOptions): { width: number; height: number } {\n let width: number | undefined = options.width;\n let height: number | undefined = options.height;\n if (width !== undefined && height !== undefined) {\n // exact size wins\n } else if (options.scale !== undefined) {\n if (options.scale <= 0) throw new Error('scale must be positive');\n width = Math.round(srcWidth * options.scale);\n height = Math.round(srcHeight * options.scale);\n } else if (width !== undefined) {\n height = Math.round(srcHeight * (width / srcWidth));\n } else if (height !== undefined) {\n width = Math.round(srcWidth * (height / srcHeight));\n } else {\n width = srcWidth;\n height = srcHeight;\n }\n return { width: Math.max(1, Math.round(width)), height: Math.max(1, Math.round(height)) };\n}\n\n/**\n * Scale owned PNGs to a target size, ratio, or factor. Non-PNG images and\n * undecodable PNGs are reported as unsupported.\n */\nexport function scaleImages(files: WalkEntry[], options: ScaleOptions): TransformOutcome {\n const changedPaths: string[] = [];\n let changed = 0;\n let unsupported = 0;\n for (const entry of files) {\n if (!isImageFile(entry.relative)) continue;\n if (extension(entry.relative) !== 'png') { unsupported += 1; continue; }\n const before = readFileSync(entry.absolute);\n const decoded = parsePNG(before);\n if (!decoded) { unsupported += 1; continue; }\n const { width, height } = resolveScaleSize(decoded.width, decoded.height, options);\n if (width === decoded.width && height === decoded.height) continue;\n const pixels = scalePixels(decoded.pixels, decoded.width, decoded.height, width, height, options.interpolation ?? 'bilinear');\n const next = encodePNG(before, { width, height, pixels });\n if (!next || next.equals(before)) { unsupported += 1; continue; }\n writeFileSync(entry.absolute, next);\n changed += 1;\n changedPaths.push(entry.relative);\n }\n return { changed, changedPaths, unsupported };\n}\n\n/**\n * Composite RGBA pixels onto a solid background (`remove_transparency`): each pixel\n * becomes `src * (a/255) + bg * (1 - a/255)` and is set fully opaque. The alpha\n * channel is retained as 255 because this package's PNG encoder emits color type 6\n * (RGBA); the resulting image is visually identical to PIL's RGB output.\n */\nexport function flattenPixels(pixels: Uint8Array, bgColor: RGB): Uint8Array {\n const out = new Uint8Array(pixels.length);\n const [br, bg, bb] = bgColor;\n for (let index = 0; index < pixels.length; index += 4) {\n const alpha = pixels[index + 3]! / 255;\n out[index] = Math.round(pixels[index]! * alpha + br * (1 - alpha));\n out[index + 1] = Math.round(pixels[index + 1]! * alpha + bg * (1 - alpha));\n out[index + 2] = Math.round(pixels[index + 2]! * alpha + bb * (1 - alpha));\n out[index + 3] = 255;\n }\n return out;\n}\n\n/**\n * Flatten owned PNGs' alpha onto a background color, removing transparency.\n * Non-PNG images and undecodable PNGs are reported as unsupported.\n */\nexport function flattenTransparency(files: WalkEntry[], bgColor: RGB = [255, 255, 255]): TransformOutcome {\n const changedPaths: string[] = [];\n let changed = 0;\n let unsupported = 0;\n for (const entry of files) {\n if (!isImageFile(entry.relative)) continue;\n if (extension(entry.relative) !== 'png') { unsupported += 1; continue; }\n const before = readFileSync(entry.absolute);\n const decoded = parsePNG(before);\n if (!decoded) { unsupported += 1; continue; }\n const pixels = flattenPixels(decoded.pixels, bgColor);\n const next = encodePNG(before, { width: decoded.width, height: decoded.height, pixels });\n if (!next || next.equals(before)) continue;\n writeFileSync(entry.absolute, next);\n changed += 1;\n changedPaths.push(entry.relative);\n }\n return { changed, changedPaths, unsupported };\n}\n"],"mappings":"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"}
|