# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [3.4.5]

### Improved
- Enhanced syntax highlighting support for double bracket embed content:
  - Added explicit `isTemplateContent: true` flag to AST structure for double bracket embed directives
  - Ensured the AST doesn't include a `path` property for template content to avoid confusion
  - Improved clarity of AST structure for syntax highlighters
  - Added test cases specifically verifying the AST structure for proper highlighting
  - Extended documentation on how template content is structured differently from path content

## [3.4.4]

### Added
- Enhanced testing for special path variables:
  - Verified correct parsing of `$.` and `$~` path prefixes
  - Confirmed proper AST structure for project and home path references
  - Validated path normalization for special variables
  - Added test coverage for special variables in both import and embed directives
  - Documented requirement for bracketed syntax with path segments (e.g., `[$./docs/file.md]`)
  - Documented that non-bracketed syntax like `@embed $./docs/file.md` doesn't work

### Fixed
- Fixed handling of variable references in double bracket embed content:
  - Now properly handles text variables (`{{variable}}`) in double bracket content
  - Correctly processes path variables (`$pathVariable`) in double bracket content
  - Ensures no invalid warnings are generated for variable references
  - Added comprehensive test coverage for variables in double bracket templates
  - Improved debugging and validation logic for embedded content

## [3.4.3]

### Fixed
- Turned off debug logging in production:
  - Disabled verbose console output that was affecting performance
  - Removed unnecessary logging during parsing operations
  - Improved overall parser performance

## [3.4.2]

### Fixed
- Fixed path variable handling in import directives:
  - Ensured consistent handling of path variables between @import and @embed directives
  - Removed incorrect section identifier support from @import directives
  - Fixed inconsistent handling of special path prefixes (`$.` and `$~`)
  - Added comprehensive test coverage for path variables in import directives
  - Aligned import directive parsing with embed directive for better consistency

## [3.4.1]

### Fixed
- Fixed array access in direct variable embedding:
  - Fixed `@embed {{list.0}}` so it properly handles array access using dot notation
  - Properly normalizes array access notation from dot notation to bracket notation internally
  - Maintains backwards compatibility with existing tests and AST structure
  - Now correctly resolves variable references with array/field access at runtime

## [3.4.0]

### Added
- Added named imports syntax:
  - Now supports selective imports with `@import [var1, var2] from [path.meld]`
  - Supports aliasing with `@import [var1, var2 as alias2] from [path.meld]`
  - Supports explicit wildcard imports with `@import [*] from [path.meld]`
  - Maintains backward compatibility with traditional imports `@import [path.meld]`
  - Enhanced AST structure with `imports` array containing name and alias information
  - Added comprehensive test coverage for named imports

## [3.3.0]

### Changed
- Changed array index notation from brackets to dot notation:
  - Now uses Ruby-style dot notation for numeric indices: `{{users.0}}` instead of `{{users[0]}}`
  - Avoids potential parsing issues with bracket notation
  - Added comprehensive test coverage for numeric field access with dot notation

## [3.2.0]

### Added
- Added URL support in path directives:
  - Now supports URLs beginning with `http://` or `https://` in `@import` and `@embed` paths
  - URLs are preserved in their original form during path normalization
  - Added `url: true` property to structured path objects for URL paths
  - Enhanced path validation to allow paths with slashes when they are URLs or use special variables
  - Improved error messages for invalid paths with clear guidance on proper format

## [3.1.1]

### Fixed
- Fixed directive handling in the grammar:
  - Only recognize directives (`@name`) when they appear at the start of a line
  - Properly handle `@` characters within regular text content
  - Improved line-start detection logic for more reliable parsing
- Fixed comment handling:
  - Properly parse comments (`>> comment`) at the beginning of lines
  - Ensured comments are correctly recognized in the AST
  - Prevented comment markers from being consumed as regular text

## [3.1.0]

### Added
- Added array access support in data variables:
  - Now supports square bracket notation in templates: `{{users[0]}}`, `{{data.items[0].name}}`
  - Handles numeric indices: `{{array[0]}}`
  - Handles string indices: `{{map["key"]}}`
  - Handles variable indices: `{{array[index]}}`
  - Supports mixing field and array access: `{{data.users[0].name}}`
  - Supports nested array access: `{{matrix[0][1]}}`
- Enhanced field access structure:
  - Field and array access elements now have a consistent structure
  - Added comprehensive test coverage for array access patterns

## [3.0.1]

### Fixed
- Fixed JSON array syntax in `@data` directives:
  - Fixed parsing of arrays of objects at the top level
  - Added support for trailing commas in arrays
  - Ensured nested arrays and objects work properly
  - Fixed documentation to match implementation

## [3.0.0]

### Added
- Implemented clear distinction between embed directive bracket types:
  - Single brackets (`@embed [path/to/file.md]`) are now strictly for paths
  - Double brackets (`@embed [[content]]`) are now strictly for content
  - Added validation to enforce correct syntax usage
  - Added helpful error messages for incorrect syntax
- Improved path variable handling in embed directives:
  - Path variables in single brackets (`@embed [$file_path]`) are now properly extracted
  - Path variables in double brackets (`@embed [[$file_path]]`) are treated as literal text
  - Direct variable embedding (`@embed {{variable}}`) is supported for cleaner syntax
  - Enhanced tests to verify both path and content handling
- Enhanced validation in `validateEmbedPath` and `validateEmbedContent` functions:
  - Added checks for multiline content and multiple words in paths
  - Improved detection of content that should use double brackets
  - Updated validation to provide more helpful error messages
- Added support for special path variables in path directives:
  - `$HOMEPATH` and `$~` for home directory paths
  - `$PROJECTPATH` and `$.` for project root paths
  - Proper parsing of path segments after special variables
- Added support for JSON array syntax in @data directives:
  - Now supports `@data var = [ { "some": "var" }, { "another": "var" } ]`
  - Handles nested arrays and objects
  - Supports trailing commas in arrays
- Added optional variable warning flag:
  - Added `variable_warning` boolean option (defaults to `false`)
  - When `true`, suppresses warnings for undefined variables in paths
  - When `false` (default), warnings are emitted for undefined variables

### Changed
- Multiple improvements to embed directive handling:
  - Clear distinction between paths (single brackets) and content (double brackets)
  - Improved property handling for path structures
  - Consistent handling of header levels in embed directives
- Updated test suite to verify bracket syntax distinctions:
  - Added tests for path variables in different bracket types
  - Added tests to ensure proper AST structure based on bracket type
- AST structure now provides clear distinction between paths and content:
  - Single brackets create a node with a `path` property
  - Double brackets create a node with a `content` property
- Improved path validation for import and embed directives:
  - Added context-aware path validation to handle path directives properly
  - Fixed handling of relative paths in test environments
  - Enhanced path structure with proper base and segments properties
- Improved debugging of path resolution issues

### Documentation
- Added comprehensive documentation:
  - Created new ADVICE.md with best practices for modifying PEG.js grammar
  - Documented lessons learned from debugging and fixing parser issues
  - Updated README with details on path directive special variables
  - Added documentation for variable warning configuration

## [2.1.0]
- Standardized field naming across all directives:
  - Changed the `id` field to `identifier` in `PathDirective` and `VarDirective`
  - Updated related tests to check for the `identifier` field
  - Improved codebase consistency for better maintainability

## [2.0.0]

### Changed
- **BREAKING CHANGE**: Unified variable syntax to improve consistency:
  - Text variables now use `{{variable}}` syntax (previously `${variable}`)
  - Data variables now use `{{variable}}` syntax (previously `#{variable}`)
  - Path variables still use `$variable` syntax (unchanged)
  - The parser distinguishes between text and data variables based on context
  - Simplifies the user experience by reducing the number of syntaxes to learn
- Improved multiline template support through `[[...]]` syntax:
  - Works with the new unified variable syntax
  - Provides consistent handling for both text and data multiline content

### Migration
- Replace all instances of `${variable}` with `{{variable}}` for text variables
- Replace all instances of `#{variable}` with `{{variable}}` for data variables
- No changes needed for path variables using `$variable` syntax
- No changes needed for multiline templates using `[[...]]` syntax

## [1.5.0]

### Added
- Support for multiline template literals using `[[ ... ]]` syntax:
  - Added new `MultilineTemplateLiteral` rule to the grammar
  - Enhanced `TextValue` to support multiline templates
  - Added variable interpolation support within multiline templates
  - Added comprehensive test coverage for the new syntax

## [1.4.0]

### Fixed
- Enhanced path parsing and validation:
  - Fixed path validation in EmbedDirective and DataValue rules
  - Improved handling of relative paths
  - Added better debug documentation
- Fixed "Assignment to constant variable" errors:
  - Created new variables instead of reassigning constants in EmbedDirective and DataValue rules
  - Improved code structure
- Fixed header level and section with header tests:
  - Removed cwd property when not needed in structured objects

## [1.3.3]

### Fixed
- Add a Comment case to the node validation switch statement in meld-ast to make sure it's included in validation
- Improved code fence parsing to better handle edge cases:
  - Fixed handling of empty code fences to include proper newlines
  - Fixed handling of mismatched backticks to properly reject invalid fences
  - Ensured consistent newline handling in preserved code fence content
  - Fixed CommonMark test cases for nested code fence handling

## [1.3.2]

Fix: removed vitest being imported in production code.

## [1.3.1]

### Fixed
- Fixed code fence parsing to properly handle nested fences according to CommonMark spec:
  - Equal backticks properly terminate the fence
  - Fewer backticks are treated as literal content
  - Empty code fences are allowed
  - Added comprehensive test coverage for all backtick count combinations (3-5)

## [1.3.0]

### Added
- Added support for code fences with 4 and 5 backticks
- Added proper nesting support for code fences:
  - 4-backtick fences can contain 3-backtick fences
  - 5-backtick fences can contain both 3 and 4-backtick fences
- Added `preserveCodeFences` parser option:
  - Defaults to `true` to maintain backward compatibility
  - When `true`, preserves code fence markers in content
  - When `false`, only includes content between fences

### Changed
- Changed default behavior of code fence parsing to preserve fence markers
- Updated grammar to support nested code fence detection
- Improved code fence content handling based on `preserveCodeFences` option

## [1.1.0]

### Fixed
- Fixed parser exports to properly support both ESM and CommonJS environments
- Fixed issue with duplicate exports in generated parser code
- Fixed TypeScript type resolution for parser imports

### Changed
- Moved generated parser files to separate `lib/grammar` directory
- Updated build process to preserve parser files during clean step
- Improved TypeScript configuration to properly handle parser files

### Added
- Added better error handling for parser initialization
- Added proper type definitions for parser exports
- Added support for both default and named exports in ESM

## [1.0.8]
- Fixed grammar file path resolution in installed packages:
  - Added environment detection to handle development and production paths
  - Fixed package root resolution in node_modules
  - Added detailed environment information in error messages
  - Improved debug logging with file existence checks
  - Added development/production path handling

## [1.0.5]

- Fixed ESM path resolution:
  - Fixed package root resolution in ESM environments using triple dirname
  - Added comprehensive debug logging for path resolution
  - Improved error messages to include package root information
  - Fixed grammar file loading in ESM contexts
  - Added detailed path resolution logging
  - Fixed incorrect path resolution in node_modules
- Fixed grammar file path resolution:
  - Switched to package root-relative paths for more reliable resolution
  - Added detailed debug logging for grammar file loading attempts
  - Improved error messages to show full resolved paths
  - Ensured grammar file is properly included in package distribution
  - Added fallback paths for different installation scenarios

## [1.0.4]

- Fixed peggy ESM/CJS interoperability issues:
  - Improved parser loading strategy to handle both ESM and CJS environments
  - Fixed peggy import handling to support both `require` and dynamic `import`
  - Added proper type definitions for peggy parser options
  - Enhanced error messages with more context
  - Added fallback mechanisms for different module systems
- Improved pre-built parser handling:
  - Added support for both ESM (.js) and CJS (.cjs) parser files
  - Prioritized pre-built parser loading over grammar compilation
  - Added better error handling and debug logging
  - Improved parser initialization error messages

## [1.0.3]

### Fixed
- Fixed grammar file path resolution:
  - Added support for multiple grammar file locations
  - Fixed path resolution in production environments
  - Improved error messages with attempted paths
- Resolved ESM/CJS compatibility issues:
  - Removed top-level await in parser loading
  - Fixed parser initialization in ESM context
  - Improved pre-built parser loading strategy
- Fixed type declaration generation:
  - Corrected mock parser implementation
  - Added proper peggy SyntaxError interface support
  - Fixed type assertions in test utilities
- Improved test framework compatibility:
  - Enhanced mock SyntaxError implementation
  - Added proper static properties to mock classes
  - Fixed type definitions in test utilities

## [1.0.1]

### Changed
- Simplified build configuration:
  - Removed separate dts build step
  - Unified build process through tsup
  - Improved source map generation
  - Cleaner package.json scripts
- Improved test framework:
  - Migrated from Jest to Vitest
  - Enhanced mock validation context implementation
  - Added better test framework compatibility

### Fixed
- Test framework compatibility issues
- Mock validation context implementation
- Jest to Vitest migration issues

## [1.0.0]

### Added
- Comprehensive error handling system:
  - `MeldAstError` class with rich context
  - Error codes for different failure types
  - Location tracking in errors
  - Error serialization support
  - Custom error handler support
  - Non-fatal error collection
- Robust parser initialization:
  - Environment-independent loading strategy
  - Reliable fallback mechanism
  - Clear error messages and debug logging
- Complete testing framework:
  - Type-safe node creation with `createMockNode`
  - Parser behavior testing with `createMockParser`
  - Validation testing with `createMockValidationContext`
  - Location testing with `createMockLocation`
  - Parse result type guard with `hasErrors`
- Comprehensive build system:
  - Grammar validation during build
  - Source map generation for all files
  - Build verification with extensive checks
  - Pre-built parser bundling
  - File presence verification
  - Parser export verification
- Full TypeScript support:
  - Strict types for parser options
  - Comprehensive error type definitions
  - Type tests and validation
  - JSDoc documentation
- Complete development documentation:
  - Project structure guide
  - Build process documentation
  - Development workflow guide
  - Debugging instructions
  - Common development tasks
  - Integration examples
  - Troubleshooting guide

### Changed
- Replaced environment-based parser loading with universal strategy
- Enhanced parser options with full validation and error handling
- Improved error context and type consistency
- Strengthened build process reliability
- Restructured project for better organization:
  - Colocated related functionality
  - Improved file organization
  - Better separation of concerns
- Streamlined package exports:
  - Direct import paths
  - Improved ESM/CommonJS interop
  - Better internal API access

### Fixed
- Parser initialization reliability
- Error handling consistency
- Build process validation
- Source map generation and linking
- Development environment setup
- Module resolution and interop
- Type definition organization

## [0.4.2]

### Changed
- Moved to colocated TypeScript type definitions
- Updated package exports to point to ESM/CJS-specific type definitions
- Removed separate types directory in favor of generating .d.ts files alongside compiled code

## [0.3.2]

### Changed
- Updated TypeScript configuration to use `"module": "NodeNext"` and `"moduleResolution": "NodeNext"`
- Updated to meld-spec@0.3.9 for improved module resolution and test exports
- Added comprehensive documentation for comment node support
- Improved build process documentation

### Fixed
- Fixed module resolution issues with ESM/CJS interop
- Ensured proper test file exports from meld-spec dependency

## [0.3.1]

### Changed
- Converted package to ESM format
- Updated build process to generate ESM-compatible parser
- Updated TypeScript configuration for proper ESM support
- Updated test suite to work with ESM imports
- Switched from local meld-spec import to npm published version

### Fixed
- Fixed grammar file path resolution in production builds
- Improved error handling for parser loading
- Fixed test suite compatibility with ESM modules

## [0.2.2]

### Fixed
- Fixed runtime error where grammar file wasn't being copied to dist directory
- Added proper error handling for grammar file loading

### Changed
- Removed unused experimental grammar files
- Streamlined build process to only copy necessary grammar file

## [0.2.1]
- Initial public release with basic functionality 