import { Properties } from '../parser/properties.js'; import type { PropertyNode } from '../parser/nodes.js'; /** Characters that can be used as key-value pair separators. */ export type KeyValuePairSeparator = '=' | ':' | ' '; /** Characters that can be used as comment delimiters. */ export type CommentDelimiter = '#' | '!'; /** Options for {@link PropertiesEditor.insert}. */ export type InsertOptions = { /** * Insert relative to this key (last occurrence). If the key is not found, * the property is appended at the end. */ referenceKey?: string; /** Position relative to the reference key. Default: `'after'`. */ position?: 'before' | 'after'; /** If `true`, escape non-ASCII characters as `\\uXXXX` sequences. Default: `false`. */ escapeUnicode?: boolean; /** Separator character to use between key and value. Default: `'='`. */ separator?: KeyValuePairSeparator; /** * Comment text to prepend before the property. Supports multi-line: newlines * in the string create separate comment nodes. Empty lines within the text * become blank line nodes. */ comment?: string; /** Delimiter character for the comment. Default: `'#'`. */ commentDelimiter?: CommentDelimiter; }; /** Options for {@link PropertiesEditor.insertComment}. */ export type InsertCommentOptions = { /** * Insert relative to this key (last occurrence). If the key is not found, * the comment is appended at the end. */ referenceKey?: string; /** Position relative to the reference key. Default: `'after'`. */ position?: 'before' | 'after'; /** Delimiter character for the comment. Default: `'#'`. */ commentDelimiter?: CommentDelimiter; }; /** Options for {@link PropertiesEditor.insertBlankLine}. */ export type InsertBlankLineOptions = { /** * Insert relative to this key (last occurrence). If the key is not found, * the blank line is appended at the end. */ referenceKey?: string; /** Position relative to the reference key. Default: `'after'`. */ position?: 'before' | 'after'; }; /** Options for {@link PropertiesEditor.update}. */ export type UpdateOptions = { /** Replacement value. When not set, the original value is preserved. */ newValue?: string; /** Replacement key (rename). When not set, the original key is preserved. */ newKey?: string; /** If `true`, escape non-ASCII characters as `\\uXXXX` sequences. Default: `false`. */ escapeUnicode?: boolean; /** New separator character. When not set, the original separator is preserved. */ separator?: KeyValuePairSeparator; /** * Replacement comment text. When set, all comment and blank line nodes immediately * preceding the property (up to the previous property) are removed and replaced * with the new comment. Supports multi-line via newlines in the string. */ newComment?: string; /** Delimiter character for the new comment. Default: `'#'`. */ commentDelimiter?: CommentDelimiter; }; /** Options for {@link PropertiesEditor.upsert}. */ export type UpsertOptions = { /** If `true`, escape non-ASCII characters as `\\uXXXX` sequences. Default: `false`. */ escapeUnicode?: boolean; /** Separator character. Default: `'='`. */ separator?: KeyValuePairSeparator; /** * Comment text. When inserting a new property, this is prepended as a comment. * When updating an existing property, this replaces the leading comment nodes. */ comment?: string; /** Delimiter character for the comment. Default: `'#'`. */ commentDelimiter?: CommentDelimiter; }; /** Options for {@link PropertiesEditor.delete}. */ export type DeleteOptions = { /** * If `false`, only the property node itself is removed. If `true` (default), * all comment and blank line nodes immediately preceding the property (up to * the previous property) are also removed. */ deleteLeadingNodes?: boolean; /** * Which occurrence of the key to delete when duplicates exist. * - `'last'` (default) — deletes the last occurrence (the effective value in * Java's last-wins semantics). * - `'first'` — deletes the first occurrence. Useful for cleaning up duplicate * keys while keeping the effective value. */ occurrence?: 'first' | 'last'; }; /** * An editor for `.properties` files that extends the lossless {@link Properties} * parser with insert, update, delete, and upsert operations. */ export declare class PropertiesEditor extends Properties { /** * Find the first property node with the given key. * * @param key - The unescaped key to search for. * * @returns The matching node and its index in `this.nodes`, or `undefined`. */ private findFirstProperty; /** * Find the last property node with the given key. * * @param key - The unescaped key to search for. * * @returns The matching node and its index in `this.nodes`, or `undefined`. */ private findLastProperty; /** * Insert a new property. * * @param key - The unescaped key. * @param value - The unescaped value. * @param options - Insert options. */ insert(key: string, value: string, options?: InsertOptions): void; /** * Insert a comment. * * @param comment - The comment text (may contain newlines). * @param options - Insert comment options. */ insertComment(comment: string, options?: InsertCommentOptions): void; /** * Insert a blank line. * * @param options - Insert blank line options. */ insertBlankLine(options?: InsertBlankLineOptions): void; /** * Update an existing property. * * @param key - The unescaped key to update (uses last occurrence). * @param options - Update options. * * @returns `true` if the property was found and updated, `false` otherwise. */ update(key: string, options: UpdateOptions): boolean; /** * Update a property if it exists, or insert it if it doesn't. * * @param key - The unescaped key. * @param value - The unescaped value. * @param options - Upsert options. */ upsert(key: string, value: string, options?: UpsertOptions): void; /** * Delete an occurrence of a property. * * By default, deletes the last occurrence (the effective value in Java's last-wins * semantics). Use `{ occurrence: 'first' }` to delete the first occurrence instead, * which is useful for cleaning up duplicate keys while keeping the effective value. * * @param key - The unescaped key to delete. * @param options - Delete options. * * @returns The deleted {@link PropertyNode}, or `undefined` if the key was not found. */ delete(key: string, options?: DeleteOptions): PropertyNode | undefined; /** * Delete all occurrences of a key. * * @param key - The unescaped key to delete. * * @returns An array of the deleted {@link PropertyNode} instances. */ deleteAll(key: string): PropertyNode[]; }