apphx 2.0.0 → 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 +11 -9
- 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 +177 -91
- package/dist/integrations.js.map +1 -1
- package/dist/notify.js +267 -0
- package/dist/notify.js.map +1 -0
- package/dist/policy.js +3 -16
- package/dist/policy.js.map +1 -1
- 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
|
@@ -29,7 +29,7 @@ const ResourcesOptionsSchema = z.strictObject({
|
|
|
29
29
|
from: hexColor,
|
|
30
30
|
to: hexColor,
|
|
31
31
|
tolerance: z.number().int().min(0).max(255).optional()
|
|
32
|
-
})).
|
|
32
|
+
})).default([]),
|
|
33
33
|
recolorAll: z.union([
|
|
34
34
|
z.strictObject({
|
|
35
35
|
mode: z.literal("hue-shift"),
|
|
@@ -40,7 +40,14 @@ const ResourcesOptionsSchema = z.strictObject({
|
|
|
40
40
|
mode: z.literal("channels"),
|
|
41
41
|
order: z.string().regex(/^[RGBA]{3,4}$/)
|
|
42
42
|
})
|
|
43
|
-
]).optional()
|
|
43
|
+
]).optional(),
|
|
44
|
+
scale: z.strictObject({
|
|
45
|
+
width: z.number().int().min(1).optional(),
|
|
46
|
+
height: z.number().int().min(1).optional(),
|
|
47
|
+
scale: z.number().positive().optional(),
|
|
48
|
+
interpolation: z.enum(["nearest", "bilinear"]).optional()
|
|
49
|
+
}).optional(),
|
|
50
|
+
flatten: z.strictObject({ bgColor: hexColor.optional() }).optional()
|
|
44
51
|
}).optional()
|
|
45
52
|
});
|
|
46
53
|
const ProjectOptionsSchema = z.strictObject({
|
|
@@ -54,7 +61,103 @@ const ProjectOptionsSchema = z.strictObject({
|
|
|
54
61
|
const ContentOptionsSchema = z.strictObject({
|
|
55
62
|
sensitiveWords: wordMap.optional(),
|
|
56
63
|
controlColors: z.record(hexColor, hexColor).optional(),
|
|
57
|
-
fontColors: z.record(hexColor, hexColor).optional()
|
|
64
|
+
fontColors: z.record(hexColor, hexColor).optional(),
|
|
65
|
+
dfa: z.strictObject({
|
|
66
|
+
/** Extra sensitive words appended to the built-in lexicon. */
|
|
67
|
+
words: z.array(z.string().min(1)).default([]),
|
|
68
|
+
/** Replacement emitted per matched word character. */
|
|
69
|
+
replace: z.string().min(1).default("*"),
|
|
70
|
+
keywordMix: z.strictObject({ prefix: z.string().min(1).optional() }).optional()
|
|
71
|
+
}).optional()
|
|
72
|
+
});
|
|
73
|
+
/**
|
|
74
|
+
* Options for iOS/Objective-C/Swift projects.
|
|
75
|
+
* Every subsection is optional; empty subsections are no-ops.
|
|
76
|
+
*/
|
|
77
|
+
const ObjcSymbolsOptionsSchema = z.strictObject({
|
|
78
|
+
algorithmType: z.union([
|
|
79
|
+
z.literal(0),
|
|
80
|
+
z.literal(1),
|
|
81
|
+
z.literal(3)
|
|
82
|
+
]).optional(),
|
|
83
|
+
methodPrefix: z.string().optional(),
|
|
84
|
+
methodSuffix: z.string().optional(),
|
|
85
|
+
propertyPrefix: z.string().optional(),
|
|
86
|
+
classPrefix: z.string().optional(),
|
|
87
|
+
replaceClassPrefix: z.strictObject({
|
|
88
|
+
from: z.string().min(1),
|
|
89
|
+
to: z.string().min(1)
|
|
90
|
+
}).optional(),
|
|
91
|
+
replaceMethodPrefix: z.strictObject({
|
|
92
|
+
from: z.string().min(1),
|
|
93
|
+
to: z.string().min(1)
|
|
94
|
+
}).optional(),
|
|
95
|
+
replacePropertyPrefix: z.strictObject({
|
|
96
|
+
from: z.string().min(1),
|
|
97
|
+
to: z.string().min(1)
|
|
98
|
+
}).optional(),
|
|
99
|
+
magicColor: z.strictObject({
|
|
100
|
+
enabled: z.boolean().optional(),
|
|
101
|
+
addColor: z.number().optional(),
|
|
102
|
+
textColor: z.number().optional(),
|
|
103
|
+
replaceColor: z.tuple([
|
|
104
|
+
z.number(),
|
|
105
|
+
z.number(),
|
|
106
|
+
z.number()
|
|
107
|
+
]).optional(),
|
|
108
|
+
alpha: z.tuple([z.number(), z.number()]).optional()
|
|
109
|
+
}).optional()
|
|
110
|
+
});
|
|
111
|
+
const ObjcOptionsSchema = z.strictObject({
|
|
112
|
+
symbols: ObjcSymbolsOptionsSchema.optional(),
|
|
113
|
+
stringEncryption: z.strictObject({
|
|
114
|
+
/** XOR key 0-255; omitted keys are derived deterministically from the seed. */
|
|
115
|
+
encryptionNum: z.number().int().min(0).max(255).optional(),
|
|
116
|
+
/** ObjC macro / Swift function name. Defaults to NNC_NSSTRING / OBF_NSSTRING. */
|
|
117
|
+
encryptedName: z.string().min(1).optional()
|
|
118
|
+
}).optional(),
|
|
119
|
+
junkCode: z.strictObject({
|
|
120
|
+
amount: z.number().int().min(0).max(32).optional(),
|
|
121
|
+
rubPrefix: z.string().min(1).optional()
|
|
122
|
+
}).optional(),
|
|
123
|
+
junkFiles: z.strictObject({
|
|
124
|
+
count: z.number().int().min(0).max(64).optional(),
|
|
125
|
+
amount: z.number().int().min(0).max(32).optional(),
|
|
126
|
+
rubPrefix: z.string().min(1).optional(),
|
|
127
|
+
language: z.enum(["OC", "Swift"]).optional()
|
|
128
|
+
}).optional(),
|
|
129
|
+
cleanResources: z.strictObject({ ignore: z.array(z.string().min(1)).default([]) }).optional(),
|
|
130
|
+
projectIdentity: z.strictObject({
|
|
131
|
+
projectName: z.string().min(1).optional(),
|
|
132
|
+
folderPrefix: z.string().optional(),
|
|
133
|
+
imagePrefix: z.string().optional(),
|
|
134
|
+
imageAlgorithm: z.union([
|
|
135
|
+
z.literal(0),
|
|
136
|
+
z.literal(1),
|
|
137
|
+
z.literal(3)
|
|
138
|
+
]).optional()
|
|
139
|
+
}).optional()
|
|
140
|
+
});
|
|
141
|
+
const FlutterSymbolsOptionsSchema = z.strictObject({
|
|
142
|
+
prefixWord: z.string().optional(),
|
|
143
|
+
missAlgorithmType: z.union([
|
|
144
|
+
z.literal(0),
|
|
145
|
+
z.literal(1),
|
|
146
|
+
z.literal(2),
|
|
147
|
+
z.literal(3)
|
|
148
|
+
]).optional(),
|
|
149
|
+
classWhiteList: z.array(z.string().min(1)).optional(),
|
|
150
|
+
methodWhiteList: z.array(z.string().min(1)).optional(),
|
|
151
|
+
variableWhiteList: z.array(z.string().min(1)).optional(),
|
|
152
|
+
features: z.strictObject({
|
|
153
|
+
variable: z.boolean().optional(),
|
|
154
|
+
className: z.boolean().optional(),
|
|
155
|
+
method: z.boolean().optional(),
|
|
156
|
+
resourceName: z.boolean().optional(),
|
|
157
|
+
resourceHash: z.boolean().optional(),
|
|
158
|
+
deleteNotes: z.boolean().optional(),
|
|
159
|
+
uuid: z.boolean().optional()
|
|
160
|
+
}).optional()
|
|
58
161
|
});
|
|
59
162
|
const ObfuscatorConfigSchema = z.strictObject({
|
|
60
163
|
framework: z.enum([
|
|
@@ -70,12 +173,16 @@ const ObfuscatorConfigSchema = z.strictObject({
|
|
|
70
173
|
code: CodeOptionsSchema.optional(),
|
|
71
174
|
resources: ResourcesOptionsSchema.optional(),
|
|
72
175
|
project: ProjectOptionsSchema.optional(),
|
|
73
|
-
content: ContentOptionsSchema.optional()
|
|
176
|
+
content: ContentOptionsSchema.optional(),
|
|
177
|
+
/** iOS/Objective-C/Swift options. */
|
|
178
|
+
objc: ObjcOptionsSchema.optional(),
|
|
179
|
+
/** Flutter symbol/resource options. */
|
|
180
|
+
flutter: FlutterSymbolsOptionsSchema.optional()
|
|
74
181
|
}).superRefine((value, context) => {
|
|
75
|
-
if (!value.code && !value.resources && !value.project && !value.content) context.addIssue({
|
|
182
|
+
if (!value.code && !value.resources && !value.project && !value.content && !value.objc && !value.flutter) context.addIssue({
|
|
76
183
|
code: "custom",
|
|
77
184
|
path: [],
|
|
78
|
-
message: "At least one of code, resources, project or
|
|
185
|
+
message: "At least one of code, resources, project, content, objc or flutter must be configured"
|
|
79
186
|
});
|
|
80
187
|
const rename = value.code?.renameIdentifiers;
|
|
81
188
|
if (rename && !Object.keys(rename.mappings).length && !rename.patterns.length && !rename.generated) context.addIssue({
|
|
@@ -89,6 +196,12 @@ const ObfuscatorConfigSchema = z.strictObject({
|
|
|
89
196
|
path: ["resources", "rename"],
|
|
90
197
|
message: "rename needs at least one mapping or a generated count"
|
|
91
198
|
});
|
|
199
|
+
const images = value.resources?.images;
|
|
200
|
+
if (images && !images.recolor.length && !images.recolorAll && !images.scale && !images.flatten) context.addIssue({
|
|
201
|
+
code: "custom",
|
|
202
|
+
path: ["resources", "images"],
|
|
203
|
+
message: "images needs at least one of recolor, recolorAll, scale or flatten"
|
|
204
|
+
});
|
|
92
205
|
for (const [index, pattern] of (rename?.patterns ?? []).entries()) try {
|
|
93
206
|
new RegExp(pattern.match);
|
|
94
207
|
} catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","names":[],"sources":["../src/config.ts"],"sourcesContent":["import { z } from 'zod';\nimport type { Framework } from './common.js';\n\nconst wordMap = z.record(z.string().min(1), z.string().min(1));\nconst hexColor = z.string().regex(/^#[0-9a-fA-F]{6}$/);\n\nconst CodeOptionsSchema = z.strictObject({\n removeComments: z.boolean().optional(),\n encryptStrings: z.strictObject({ excludes: z.array(z.string().min(1)).default([]) }).optional(),\n renameIdentifiers: z.strictObject({\n mappings: wordMap.default({}),\n patterns: z.array(z.strictObject({ match: z.string().min(1), replacement: z.string().min(1) })).default([]),\n /** Deterministically rename this many discovered declarations to seed-derived tokens. */\n generated: z.number().int().min(0).max(64).optional(),\n }).optional(),\n junkCode: z.strictObject({ lines: z.number().int().min(0).max(32).default(2) }).optional(),\n keywords: wordMap.optional(),\n});\n\nconst ResourcesOptionsSchema = z.strictObject({\n rename: z.strictObject({\n mappings: wordMap.default({}),\n /** Deterministically rename this many discovered resource stems to seed-derived tokens. */\n generated: z.number().int().min(0).max(128).optional(),\n }).optional(),\n hashPerturb: z.strictObject({ bytes: z.number().int().min(1).max(64) }).optional(),\n images: z.strictObject({\n recolor: z.array(z.strictObject({ from: hexColor, to: hexColor, tolerance: z.number().int().min(0).max(255).optional() })).min(1),\n recolorAll: z.union([\n z.strictObject({ mode: z.literal('hue-shift'), degrees: z.number().finite() }),\n z.strictObject({ mode: z.literal('invert') }),\n z.strictObject({ mode: z.literal('channels'), order: z.string().regex(/^[RGBA]{3,4}$/) }),\n ]).optional(),\n }).optional(),\n});\n\nconst ProjectOptionsSchema = z.strictObject({\n name: z.strictObject({ from: z.string().min(1), to: z.string().min(1) }).optional(),\n directories: z.array(z.string().min(1)).default([]),\n uuids: z.boolean().optional(),\n});\n\nconst ContentOptionsSchema = z.strictObject({\n sensitiveWords: wordMap.optional(),\n controlColors: z.record(hexColor, hexColor).optional(),\n fontColors: z.record(hexColor, hexColor).optional(),\n});\n\nexport const ObfuscatorConfigSchema = z.strictObject({\n framework: z.enum(['flutter', 'android-java', 'swift', 'react-native', 'expo', 'uni-app', 'mygo']).optional(),\n seed: z.string().min(1).optional(),\n code: CodeOptionsSchema.optional(),\n resources: ResourcesOptionsSchema.optional(),\n project: ProjectOptionsSchema.optional(),\n content: ContentOptionsSchema.optional(),\n}).superRefine((value, context) => {\n if (!value.code && !value.resources && !value.project && !value.content) {\n context.addIssue({ code: 'custom', path: [], message: 'At least one of code, resources, project or content must be configured' });\n }\n const rename = value.code?.renameIdentifiers;\n if (rename && !Object.keys(rename.mappings).length && !rename.patterns.length && !rename.generated) {\n context.addIssue({ code: 'custom', path: ['code', 'renameIdentifiers'], message: 'renameIdentifiers needs at least one mapping, pattern or generated count' });\n }\n const resourceRename = value.resources?.rename;\n if (resourceRename && !Object.keys(resourceRename.mappings).length && !resourceRename.generated) {\n context.addIssue({ code: 'custom', path: ['resources', 'rename'], message: 'rename needs at least one mapping or a generated count' });\n }\n for (const [index, pattern] of (rename?.patterns ?? []).entries()) {\n try { new RegExp(pattern.match); } catch { context.addIssue({ code: 'custom', path: ['code', 'renameIdentifiers', 'patterns', index], message: `Pattern must compile as a regular expression: ${pattern.match}` }); }\n }\n for (const [index, exclude] of (value.code?.encryptStrings?.excludes ?? []).entries()) {\n try { new RegExp(exclude); } catch { context.addIssue({ code: 'custom', path: ['code', 'encryptStrings', 'excludes', index], message: `Exclude pattern must compile as a regular expression: ${exclude}` }); }\n }\n});\nexport type ObfuscatorConfig = z.infer<typeof ObfuscatorConfigSchema>;\nexport type CodeOptions = NonNullable<ObfuscatorConfig['code']>;\nexport type ResourcesOptions = NonNullable<ObfuscatorConfig['resources']>;\nexport type ProjectOptions = NonNullable<ObfuscatorConfig['project']>;\nexport type ContentOptions = NonNullable<ObfuscatorConfig['content']>;\nexport type FrameworkOption = NonNullable<ObfuscatorConfig['framework']> | Framework;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../src/config.ts"],"sourcesContent":["import { z } from 'zod';\nimport type { Framework } from './common.js';\n\nconst wordMap = z.record(z.string().min(1), z.string().min(1));\nconst hexColor = z.string().regex(/^#[0-9a-fA-F]{6}$/);\n\nconst CodeOptionsSchema = z.strictObject({\n removeComments: z.boolean().optional(),\n encryptStrings: z.strictObject({ excludes: z.array(z.string().min(1)).default([]) }).optional(),\n renameIdentifiers: z.strictObject({\n mappings: wordMap.default({}),\n patterns: z.array(z.strictObject({ match: z.string().min(1), replacement: z.string().min(1) })).default([]),\n /** Deterministically rename this many discovered declarations to seed-derived tokens. */\n generated: z.number().int().min(0).max(64).optional(),\n }).optional(),\n junkCode: z.strictObject({ lines: z.number().int().min(0).max(32).default(2) }).optional(),\n keywords: wordMap.optional(),\n});\n\nconst ResourcesOptionsSchema = z.strictObject({\n rename: z.strictObject({\n mappings: wordMap.default({}),\n /** Deterministically rename this many discovered resource stems to seed-derived tokens. */\n generated: z.number().int().min(0).max(128).optional(),\n }).optional(),\n hashPerturb: z.strictObject({ bytes: z.number().int().min(1).max(64) }).optional(),\n images: z.strictObject({\n recolor: z.array(z.strictObject({ from: hexColor, to: hexColor, tolerance: z.number().int().min(0).max(255).optional() })).default([]),\n recolorAll: z.union([\n z.strictObject({ mode: z.literal('hue-shift'), degrees: z.number().finite() }),\n z.strictObject({ mode: z.literal('invert') }),\n z.strictObject({ mode: z.literal('channels'), order: z.string().regex(/^[RGBA]{3,4}$/) }),\n ]).optional(),\n scale: z.strictObject({\n width: z.number().int().min(1).optional(),\n height: z.number().int().min(1).optional(),\n scale: z.number().positive().optional(),\n interpolation: z.enum(['nearest', 'bilinear']).optional(),\n }).optional(),\n flatten: z.strictObject({ bgColor: hexColor.optional() }).optional(),\n }).optional(),\n});\n\nconst ProjectOptionsSchema = z.strictObject({\n name: z.strictObject({ from: z.string().min(1), to: z.string().min(1) }).optional(),\n directories: z.array(z.string().min(1)).default([]),\n uuids: z.boolean().optional(),\n});\n\nconst ContentOptionsSchema = z.strictObject({\n sensitiveWords: wordMap.optional(),\n controlColors: z.record(hexColor, hexColor).optional(),\n fontColors: z.record(hexColor, hexColor).optional(),\n dfa: z.strictObject({\n /** Extra sensitive words appended to the built-in lexicon. */\n words: z.array(z.string().min(1)).default([]),\n /** Replacement emitted per matched word character. */\n replace: z.string().min(1).default('*'),\n keywordMix: z.strictObject({ prefix: z.string().min(1).optional() }).optional(),\n }).optional(),\n});\n\n/**\n * Options for iOS/Objective-C/Swift projects.\n * Every subsection is optional; empty subsections are no-ops.\n */\nconst ObjcSymbolsOptionsSchema = z.strictObject({\n algorithmType: z.union([z.literal(0), z.literal(1), z.literal(3)]).optional(),\n methodPrefix: z.string().optional(),\n methodSuffix: z.string().optional(),\n propertyPrefix: z.string().optional(),\n classPrefix: z.string().optional(),\n replaceClassPrefix: z.strictObject({ from: z.string().min(1), to: z.string().min(1) }).optional(),\n replaceMethodPrefix: z.strictObject({ from: z.string().min(1), to: z.string().min(1) }).optional(),\n replacePropertyPrefix: z.strictObject({ from: z.string().min(1), to: z.string().min(1) }).optional(),\n magicColor: z.strictObject({\n enabled: z.boolean().optional(),\n addColor: z.number().optional(),\n textColor: z.number().optional(),\n replaceColor: z.tuple([z.number(), z.number(), z.number()]).optional(),\n alpha: z.tuple([z.number(), z.number()]).optional(),\n }).optional(),\n});\n\nconst ObjcOptionsSchema = z.strictObject({\n symbols: ObjcSymbolsOptionsSchema.optional(),\n stringEncryption: z.strictObject({\n /** XOR key 0-255; omitted keys are derived deterministically from the seed. */\n encryptionNum: z.number().int().min(0).max(255).optional(),\n /** ObjC macro / Swift function name. Defaults to NNC_NSSTRING / OBF_NSSTRING. */\n encryptedName: z.string().min(1).optional(),\n }).optional(),\n junkCode: z.strictObject({\n amount: z.number().int().min(0).max(32).optional(),\n rubPrefix: z.string().min(1).optional(),\n }).optional(),\n junkFiles: z.strictObject({\n count: z.number().int().min(0).max(64).optional(),\n amount: z.number().int().min(0).max(32).optional(),\n rubPrefix: z.string().min(1).optional(),\n language: z.enum(['OC', 'Swift']).optional(),\n }).optional(),\n cleanResources: z.strictObject({ ignore: z.array(z.string().min(1)).default([]) }).optional(),\n projectIdentity: z.strictObject({\n projectName: z.string().min(1).optional(),\n folderPrefix: z.string().optional(),\n imagePrefix: z.string().optional(),\n imageAlgorithm: z.union([z.literal(0), z.literal(1), z.literal(3)]).optional(),\n }).optional(),\n});\n\nconst FlutterSymbolsOptionsSchema = z.strictObject({\n prefixWord: z.string().optional(),\n missAlgorithmType: z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3)]).optional(),\n classWhiteList: z.array(z.string().min(1)).optional(),\n methodWhiteList: z.array(z.string().min(1)).optional(),\n variableWhiteList: z.array(z.string().min(1)).optional(),\n features: z.strictObject({\n variable: z.boolean().optional(),\n className: z.boolean().optional(),\n method: z.boolean().optional(),\n resourceName: z.boolean().optional(),\n resourceHash: z.boolean().optional(),\n deleteNotes: z.boolean().optional(),\n uuid: z.boolean().optional(),\n }).optional(),\n});\n\nexport const ObfuscatorConfigSchema = z.strictObject({\n framework: z.enum(['flutter', 'android-java', 'swift', 'react-native', 'expo', 'uni-app', 'mygo']).optional(),\n seed: z.string().min(1).optional(),\n code: CodeOptionsSchema.optional(),\n resources: ResourcesOptionsSchema.optional(),\n project: ProjectOptionsSchema.optional(),\n content: ContentOptionsSchema.optional(),\n /** iOS/Objective-C/Swift options. */\n objc: ObjcOptionsSchema.optional(),\n /** Flutter symbol/resource options. */\n flutter: FlutterSymbolsOptionsSchema.optional(),\n}).superRefine((value, context) => {\n if (!value.code && !value.resources && !value.project && !value.content && !value.objc && !value.flutter) {\n context.addIssue({ code: 'custom', path: [], message: 'At least one of code, resources, project, content, objc or flutter must be configured' });\n }\n const rename = value.code?.renameIdentifiers;\n if (rename && !Object.keys(rename.mappings).length && !rename.patterns.length && !rename.generated) {\n context.addIssue({ code: 'custom', path: ['code', 'renameIdentifiers'], message: 'renameIdentifiers needs at least one mapping, pattern or generated count' });\n }\n const resourceRename = value.resources?.rename;\n if (resourceRename && !Object.keys(resourceRename.mappings).length && !resourceRename.generated) {\n context.addIssue({ code: 'custom', path: ['resources', 'rename'], message: 'rename needs at least one mapping or a generated count' });\n }\n const images = value.resources?.images;\n if (images && !images.recolor.length && !images.recolorAll && !images.scale && !images.flatten) {\n context.addIssue({ code: 'custom', path: ['resources', 'images'], message: 'images needs at least one of recolor, recolorAll, scale or flatten' });\n }\n for (const [index, pattern] of (rename?.patterns ?? []).entries()) {\n try { new RegExp(pattern.match); } catch { context.addIssue({ code: 'custom', path: ['code', 'renameIdentifiers', 'patterns', index], message: `Pattern must compile as a regular expression: ${pattern.match}` }); }\n }\n for (const [index, exclude] of (value.code?.encryptStrings?.excludes ?? []).entries()) {\n try { new RegExp(exclude); } catch { context.addIssue({ code: 'custom', path: ['code', 'encryptStrings', 'excludes', index], message: `Exclude pattern must compile as a regular expression: ${exclude}` }); }\n }\n});\nexport type ObfuscatorConfig = z.infer<typeof ObfuscatorConfigSchema>;\nexport type CodeOptions = NonNullable<ObfuscatorConfig['code']>;\nexport type ResourcesOptions = NonNullable<ObfuscatorConfig['resources']>;\nexport type ProjectOptions = NonNullable<ObfuscatorConfig['project']>;\nexport type ContentOptions = NonNullable<ObfuscatorConfig['content']>;\nexport type ObjcOptions = NonNullable<ObfuscatorConfig['objc']>;\nexport type FlutterSymbolsOptions = NonNullable<ObfuscatorConfig['flutter']>;\nexport type FrameworkOption = NonNullable<ObfuscatorConfig['framework']> | Framework;\n"],"mappings":"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"}
|