Does the protector work on output from a compiler rather than hand-written source?
Yes, and it does not know the difference. The tool parses JavaScript and emits JavaScript, so whatever produced the input is irrelevant to it. What changes is not whether it works but what it adds, because a compiler has usually already done part of the job. The right question is therefore not compatibility, it is marginal benefit, and the answer depends on which of your remaining artifacts still carry meaning: the strings, the structure, the dispatch tables and the parts of the payload that were never JavaScript.
If my compiler already minifies and renames, what is left to protect?
More than the file size suggests. A compiler renames to make output small, which is a different goal from making it hard to follow, and the two diverge in three places. String literals survive minification almost entirely, and they are how a reader navigates unfamiliar code. Control flow survives completely, so the shape of your algorithms is intact. And the generated runtime keeps readable metadata wherever the language needs reflection or dispatch. Renaming is the transformation with the most overlap; string handling, control flow flattening and virtualised bytecode have almost none.
What is the most common way this breaks a compiled application?
Member renaming meeting a generated runtime that dispatches on names. Languages that offer reflection, dynamic dispatch, serialisation by field name or interoperability declarations compile into JavaScript that looks up properties using strings the compiler preserved deliberately. Rename those properties and the lookup fails at run time rather than at build time, which is the expensive kind of failure. The mechanism to prevent it is the reserved names list, which accepts regular expressions for names to preserve and maps onto the variable exclusion list the engine already uses.
Is a WebAssembly component in my build protected too?
No, and it is worth being direct about that boundary. A JavaScript protector transforms JavaScript. A compiled module in another format is a separate asset that your page fetches, and it passes through untouched. The bundler plugins make this concrete: they filter emitted assets down to JavaScript files by default, so a module in another format is never even a candidate for the protection step. If your renderer or your numeric core ships as a compiled module, the honest position is that the JavaScript around it is protected and the module is not.
Do source maps from these toolchains create a bigger problem than usual?
Considerably bigger, because of what they contain. A source map from an ordinary JavaScript build reconstructs your JavaScript. A source map from a compiler reconstructs your original language, which is the actual codebase your team works in, with its real structure and names. Publishing one alongside a protected bundle undoes the entire exercise and hands over something better than the intermediate output. Keep maps out of the public deployment and upload them to your error reporting service through a private channel instead.
How much harder does this make debugging a production problem?
There is one more layer than teams expect, and planning for it is the whole answer. Ordinarily you have two representations, your source and the shipped bundle, and a symbol map connects them. Here you have three: your original language, the compiler output, and the protected output. The identifier map from the protection step reverses the last hop only, returning you to the compiler output rather than to your source. Getting back to your source needs the compiler's own map applied afterwards, so keep both artifacts from the same build and rehearse the two-step before you need it.
Does protection change which browsers my compiled output runs in?
No, because the engine does not translate between language levels. The one setting called target selects a runtime profile rather than a language version, there is no downlevelling or output-version option anywhere in the configuration, and modern syntax in the input is preserved rather than rewritten into an older form. Whatever your compiler decided to emit is what ships. That is convenient here, since compiler output tends to be conservative already, but it also means the protection step is not a safety net: if your toolchain emits syntax an old browser rejects, protecting the file leaves that exactly as it was.
What is the shortest sensible configuration for a compiled build?
Five decisions. Protect the compiler's final optimised output as the last step before deployment, never the intermediate files. Turn on the transformations your compiler did not do, which means string handling and control flow work rather than another pass of renaming. Build a reserved names list from everything your language exports, serialises by name, or reaches through interoperability declarations, and keep it in version control next to the compiler's own externs. Keep both symbol maps from every release. And test the compiled and protected artifact end to end, because the source you can read is now two transformations away from the code that runs.