Clarify tsetse's isLiteral documentation.
PiperOrigin-RevId: 261407997
diff --git a/internal/tsetse/util/is_literal.ts b/internal/tsetse/util/is_literal.ts
index 8b7209c..2f44ce2 100644
--- a/internal/tsetse/util/is_literal.ts
+++ b/internal/tsetse/util/is_literal.ts
@@ -2,7 +2,21 @@
import {findInChildren} from './ast_tools';
/**
- * Determines if the given ts.Node is literal enough for security purposes.
+ * Determines if the given ts.Node is literal enough for security purposes. This
+ * is true when the value is built from compile-time constants, with a certain
+ * tolerance for indirection in order to make this more user-friendly.
+ *
+ * This considers a few different things. We accept
+ * - What TS deems literal (literal strings, literal numbers, literal booleans,
+ * enum literals),
+ * - Binary operations of two expressions that we accept (including
+ * concatenation),
+ * - Template interpolations of what we accept,
+ * - `x?y:z` constructions, if we accept `y` and `z`
+ * - Variables that are const, and initialized with an expression we accept
+ *
+ * And to prevent bypasses, expressions that include casts are not accepted, and
+ * this checker does not follow imports.
*/
export function isLiteral(typeChecker: ts.TypeChecker, node: ts.Node): boolean {
if (ts.isBinaryExpression(node) &&