Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
2dffb3d
chore: Update packages
DaveSkender May 15, 2026
38b0ceb
code cleanup (minor)
DaveSkender May 15, 2026
d272d74
chore: exclude AGENTS.md from package builds
DaveSkender May 15, 2026
a896d94
fix: remove hard dependency on chartjs-chart-financial external packa…
DaveSkender May 15, 2026
a23d09e
docs: update for correctness
DaveSkender May 15, 2026
edc6264
chore: bump version to 0.1.1 in package.json
DaveSkender May 15, 2026
1a86237
feat: enhance testing tasks and update dotnet test command
DaveSkender May 15, 2026
d59d560
docs: Address PR review feedback and rewrite quick-start guide
DaveSkender May 15, 2026
f64af0b
docs: Remove internal repo references from indy-charts doc site
DaveSkender May 15, 2026
0086549
docs: Sentence case headings and clarify vitepress site purpose in AG…
DaveSkender May 15, 2026
afce89d
docs: Sentence case nav, sidebar, and feature card titles
DaveSkender May 15, 2026
4002a9f
chore: Implement .env/.env.example for local credentials
DaveSkender May 15, 2026
2148606
chore: Update environment configuration and streamline local setup
DaveSkender May 16, 2026
03c8d5c
docs: Update Node.js version requirement to 22+ in installation guide
DaveSkender May 16, 2026
b609773
chore: Update NuGet and Node packages to latest compatible versions
DaveSkender May 16, 2026
68d36b2
docs: Add usage examples for Indy Charts and VitePress integration
DaveSkender May 16, 2026
db5f645
refactor: vue not vitepress
DaveSkender May 16, 2026
8e14d93
chore: Update installation instructions and package dependencies for …
DaveSkender May 16, 2026
b00f07a
chore: Improve formatting and clarity in documentation
DaveSkender May 16, 2026
ef5c2f7
chore: refresh github workflows
DaveSkender May 16, 2026
18b8dae
feat: Upgrade to Stock.Indicators v3.0.0-preview.3.1
DaveSkender May 16, 2026
48abfb8
chore: remove outdated plan for missing indicators implementation
DaveSkender May 16, 2026
9cda473
refactor: strip VitePress card wrappers and add CancellationToken pro…
DaveSkender May 16, 2026
95b1a8f
feat: update chart themes and add static chart examples with sample data
DaveSkender May 16, 2026
71eb84e
fix: Resolve PR review thread issues
DaveSkender May 16, 2026
065b08d
Update link text for contributing guidelines
DaveSkender May 16, 2026
6bbe449
Update link description in README.md
DaveSkender May 16, 2026
8022acf
Update chart library reference in documentation
DaveSkender May 16, 2026
8eb802d
Handle operation cancellation in quote retrieval
DaveSkender May 16, 2026
592b356
Update server/WebApi/Services/Service.Quotes.cs
DaveSkender May 16, 2026
88af651
fix: Use production API URL in VitePress production builds
DaveSkender May 17, 2026
2778d97
fix: Allow VitePress CF Pages origins in API CORS policy
DaveSkender May 17, 2026
356c124
fix: Address Codacy issues in WebApi services and test utils
DaveSkender May 17, 2026
54cf744
fix: Accept 'date' field from Skender v2 API alongside 'timestamp'
DaveSkender May 17, 2026
b5a4299
Update libs/indy-charts/api/client.ts
DaveSkender May 18, 2026
febd746
feat: Add unit tests for UtilityService and Main controller endpoints…
DaveSkender May 18, 2026
c2a0338
refactor: Simplify ControllerContext setup in MainEndpointsTests
DaveSkender May 18, 2026
61428bc
feat: Enhance theme support and customization; update utility service…
DaveSkender May 18, 2026
d81e97a
feat: Enhance OverlayChart functionality with full dataset building a…
DaveSkender May 18, 2026
cdb7916
fix: Update date handling in backup quotes generation and improve REA…
DaveSkender May 18, 2026
3e23930
refactor: Optimize mockChartApi by pre-computing response payloads an…
DaveSkender May 18, 2026
5ea6690
refactor: Improve pushMetaTags tests by injecting mocks via dependenc…
DaveSkender May 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .claude/agents

This file was deleted.

1 change: 0 additions & 1 deletion .claude/skills

This file was deleted.

6 changes: 4 additions & 2 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ double_quote_style = double # Use double quotes for strings

# Markdown files
[*.md]
max_line_length = off
trim_trailing_whitespace = false

# JSON, XML, and .NET projects
Expand All @@ -30,6 +31,7 @@ end_of_line = crlf # Use CRLF for Windows specific files
indent_size = 4 # Use 4 spaces for .NET files
tab_width = 4 # Set tab width to 4 spaces

# .NET and C# style and code analyis settings
dotnet_sort_system_directives_first = true # Place System.* usings before others
dotnet_separate_import_directive_groups = false # Don't add blank lines between using directives
dotnet_style_prefer_single_quotes = false:suggestion # Prefer double quotes
Expand All @@ -44,5 +46,5 @@ csharp_style_expression_bodied_methods = true:silent # Allow expression-bodi
csharp_style_expression_bodied_properties = true:silent # Allow expression-bodied properties

# Diagnostic overrides
dotnet_diagnostic.IDE0058.severity = none # Disable "use '_' discard" value warnings
dotnet_diagnostic.CA1873.severity = warning # Avoid potentially expensive logging
dotnet_diagnostic.IDE0058.severity = none # Disable "use '_' discard" value warnings
dotnet_diagnostic.CA1873.severity = warning # Avoid potentially expensive logging
15 changes: 11 additions & 4 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
"label": "Install: Packages (pnpm)",
"detail": "Restore Node.js packages across workspaces",
"type": "shell",
"command": "pnpm install"
"command": "pnpm install --config.confirmModulesPurge=false"
},
{
"label": "Install: Packages (NuGet)",
Expand All @@ -74,7 +74,7 @@
"label": "Update: Angular packages (client)",
"detail": "Update dependencies using Angular CLI for the client website.",
"type": "shell",
"command": "pnpm --filter @stock-charts/client exec ng update @angular/cli @angular/core @angular/material angular-eslint --allow-dirty"
"command": "pnpm --filter @stock-charts/client run ng -- update @angular/cli @angular/core @angular/material angular-eslint --allow-dirty"
},
{
"label": "Update: Node packages",
Expand Down Expand Up @@ -241,12 +241,19 @@
},
{
"label": "Test: All tests",
"detail": "Run Website and Backend .NET unit tests",
"dependsOn": ["Test: Website", "Test: Backend .NET"],
"detail": "Run all unit tests: Website, Libs, and Backend .NET",
"dependsOn": ["Test: Website", "Test: Libs", "Test: Backend .NET"],
"dependsOrder": "parallel",
"group": "test",
"problemMatcher": "$msCompile"
},
{
"label": "Test: Libs",
"detail": "Run Vitest unit tests for chartjs-financial and indy-charts libraries",
"type": "shell",
"command": "pnpm run test:libs",
"group": "test"
},
{
"label": "Test: Website",
"detail": "Run Angular unit tests",
Expand Down
28 changes: 14 additions & 14 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,14 @@ stock-charts/
├── client/ # Angular frontend
│ ├── src/
│ │ ├── app/ # Angular components and services
│ │ ├── chartjs/ # Chart.js extensions
│ │ │ └── financial/ # Financial chart types (candlestick, OHLC)
│ │ ├── environments/ # Environment configs
│ │ └── styles/ # SCSS stylesheets
│ ├── angular.json # Angular config
│ ├── tsconfig.json # TypeScript config
│ └── package.json # Frontend dependencies
├── libs/ # Shared TypeScript libraries
│ ├── chartjs-financial/ # Chart.js financial chart types (candlestick, OHLC, volume)
│ └── indy-charts/ # Reusable financial indicator charts library
├── server/ # .NET backend
│ ├── Functions/ # Azure Functions
│ ├── WebApi/ # REST API endpoints
Expand All @@ -44,16 +45,15 @@ stock-charts/
## Commands

```bash
# Setup (automated - all platforms)
bash scripts/setup-environment.sh # Auto-detects OS and installs prerequisites
# Or use VS Code: Ctrl+Shift+P → "Tasks: Run Task" → "Setup: Dev environment"
# Setup
# VS Code: Ctrl+Shift+P → "Tasks: Run Task" → "Setup: Dev environment"

# Install dependencies
pnpm install # Install all workspace dependencies

# Development
pnpm start # Start Angular dev server (http://localhost:4200)
pnpm run azure:start # Start Azurite storage emulator
pnpm start # Start Angular dev server (http://localhost:4200)
pnpm run azure:start # Start Azurite storage emulator
cd server/Functions && func start # Start Azure Functions (http://localhost:7071)
cd server/WebApi && dotnet run # Start Web API (https://localhost:5001)

Expand Down Expand Up @@ -192,9 +192,9 @@ public class Service

- **Angular v21**: Standalone components, signals-based reactivity, modern control flow (`@if`, `@for`, `@switch`)
- **TypeScript**: Strict mode enabled, comprehensive type safety
- **Chart.js v4+**: Financial chart extensions in `client/src/chartjs/financial/` (candlestick, OHLC, volume)
- **Chart.js v4+**: Financial chart types in `libs/chartjs-financial/`; bundled into `@facioquo/indy-charts` dist
- **Angular Material v21**: UI component library for consistent design
- **pnpm workspaces**: Unified dependency management (root + client workspace)
- **pnpm workspaces**: Unified dependency management across root and all workspace packages

Client-side project dependencies are strictly in this direction only: client → indy-charts → chartjs-financial

Expand All @@ -208,15 +208,15 @@ Client-side project dependencies are strictly in this direction only: client →

### Financial charts integration

Financial chart types (`candlestick`, `ohlc`, `volume`) are integrated as typed Chart.js extensions:
Financial chart types (`candlestick`, `ohlc`, `volume`) are maintained in `libs/chartjs-financial/` and bundled into `@facioquo/indy-charts`:

- **Location**: `client/src/chartjs/financial/`
- **Registration**: `registerFinancialCharts()` called from `main.ts`
- **Location**: `libs/chartjs-financial/`
- **Registration**: `setupIndyCharts()` called from `main.ts`; `registerFinancialCharts()` is an internal detail of `@facioquo/indy-charts`
- **Data shape**: OHLC points as `{ x: timestamp, o, h, l, c }`
- **Theming**: `getFinancialPalette()` and `applyFinancialElementTheme()`
- **Factories**: `buildCandlestickDataset()`, `buildVolumeDataset()`, `buildFinancialChartOptions()`
- **Performance**: For 5k-10k candles, disable animations, use non-intersecting tooltip mode
- **Attribution**: Derived from [chartjs-chart-financial](https://github.com/chartjs/chartjs-chart-financial)
- **Attribution**: Derived from [chartjs/chartjs-chart-financial](https://github.com/chartjs/chartjs-chart-financial)

## Boundaries

Expand Down Expand Up @@ -268,7 +268,7 @@ Financial chart types (`candlestick`, `ohlc`, `volume`) are integrated as typed

One-time setup:

1. **Setup**: Run `bash scripts/setup-environment.sh` or VS Code task "Setup: Dev environment"
1. **Setup**: VS Code task "Setup: Dev environment"
2. **Install**: Run `pnpm install` from root
3. **Credentials** (optional): Configure Alpaca API credentials for real-time quote updates
- See [server/Functions/README.md](server/Functions/README.md) for configuration options
Expand Down
12 changes: 3 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ This repo and charting tool is primarily intended to demonstrate the [Stock Indi

- [Git](https://git-scm.com/)
- [Node.js](https://nodejs.org/) (v24 LTS or later)
- [pnpm](https://pnpm.io/) (v10 LTS or later) - Installed via platform package managers:
- [pnpm](https://pnpm.io/) (v11 or later) - Installed via platform package managers:
- **macOS**: Homebrew (`brew install pnpm`)
- **Windows**: winget (`winget install pnpm.pnpm`)
- **Linux**: Corepack (`corepack enable && corepack prepare pnpm --activate`)
Expand All @@ -27,13 +27,7 @@ This repo and charting tool is primarily intended to demonstrate the [Stock Indi
- [Azure Functions Core Tools](https://learn.microsoft.com/azure/azure-functions/functions-run-local) (v4) - **Required for backend development**
- [Visual Studio Code](https://code.visualstudio.com/) (recommended) or [Visual Studio](http://visualstudio.com)

**Quick setup (all platforms):**

```bash
bash scripts/setup-environment.sh
```

For manual setup, install the prerequisites above with the listed package managers, then run `pnpm install` from the repository root.
After installing the prerequisites above, run `pnpm install` from the repository root.

**Note:** Azure Functions Core Tools is essential for running the backend Azure Functions locally (`func start` command) and must be [installed separately](https://learn.microsoft.com/azure/azure-functions/functions-run-local#install-the-azure-functions-core-tools) on Linux.

Expand Down Expand Up @@ -62,7 +56,7 @@ pnpm start # Terminal 4: Angular dev server

Financial chart support (`candlestick`, `ohlc`) is integrated as typed, modular Chart.js workspace packages under `libs/chartjs-financial` and `libs/indy-charts`.

- Register once at startup with `registerFinancialCharts()` (already called from `client/src/main.ts`).
- Register once at startup with `setupIndyCharts()` (already called from `client/src/main.ts`).
- Use OHLC data points in `{ x, o, h, l, c }` shape where `x` is a timestamp.
- Theme candle/volume colors via `getFinancialPalette()` + `applyFinancialElementTheme()`.
- Use factories (`buildCandlestickDataset`, `buildVolumeDataset`, `buildFinancialChartOptions`) for consistent typed chart config.
Expand Down
52 changes: 26 additions & 26 deletions client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "@stock-charts/client",
"description": "Angular frontend for stock charts application",
"type": "module",
"packageManager": "pnpm@10.33.2",
"packageManager": "pnpm@11.1.2",
"scripts": {
"ng": "ng",
"start": "ng serve --open --hmr",
Expand All @@ -25,20 +25,20 @@
"clean": "rm -rf .angular coverage dist node_modules test-results"
},
"dependencies": {
"@angular/animations": "~21.2.10",
"@angular/cdk": "~21.2.8",
"@angular/common": "~21.2.10",
"@angular/compiler": "~21.2.10",
"@angular/core": "~21.2.10",
"@angular/forms": "~21.2.10",
"@angular/material": "~21.2.8",
"@angular/platform-browser": "~21.2.10",
"@angular/platform-browser-dynamic": "~21.2.10",
"@angular/router": "~21.2.10",
"@angular/service-worker": "~21.2.10",
"@angular/animations": "~21.2.13",
"@angular/cdk": "~21.2.11",
"@angular/common": "~21.2.13",
"@angular/compiler": "~21.2.13",
"@angular/core": "~21.2.13",
"@angular/forms": "~21.2.13",
"@angular/material": "~21.2.11",
"@angular/platform-browser": "~21.2.13",
"@angular/platform-browser-dynamic": "~21.2.13",
"@angular/router": "~21.2.13",
"@angular/service-worker": "~21.2.13",
"@ctrl/tinycolor": "^4.2.0",
"@facioquo/indy-charts": "workspace:*",
"@ng-matero/extensions": "~21.3.0",
"@ng-matero/extensions": "~21.3.1",
"chart.js": "~4.5.1",
"chartjs-adapter-date-fns": "^3.0.0",
"chartjs-plugin-annotation": "^3.1.0",
Expand All @@ -47,24 +47,24 @@
"rxjs": "~7.8.2",
"tslib": "^2.8.1",
"uuid": "^14.0.0",
"zone.js": "~0.16.1"
"zone.js": "~0.16.2"
},
"devDependencies": {
"@angular/build": "~21.2.8",
"@angular/cli": "~21.2.8",
"@angular/compiler-cli": "~21.2.10",
"@angular/build": "~21.2.11",
"@angular/cli": "~21.2.11",
"@angular/compiler-cli": "~21.2.13",
"@eslint/js": "^10.0.1",
"@types/node": "^25.6.0",
"@vitest/coverage-v8": "^4.1.5",
"@vitest/eslint-plugin": "^1.6.16",
"angular-eslint": "~21.3.1",
"eslint": "^10.2.1",
"@types/node": "^25.8.0",
"@vitest/coverage-v8": "^4.1.6",
"@vitest/eslint-plugin": "^1.6.17",
"angular-eslint": "~21.4.0",
"eslint": "^10.4.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.5",
"jiti": "^2.6.1",
"jsdom": "^29.1.0",
"jiti": "^2.7.0",
"jsdom": "^29.1.1",
"typescript": "~5.9.3",
"typescript-eslint": "^8.59.1",
"vitest": "^4.1.5"
"typescript-eslint": "^8.59.3",
"vitest": "^4.1.6"
}
}
79 changes: 7 additions & 72 deletions docs/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ If you're using AI coding agents (GitHub Copilot, Claude, etc.), refer to [AGENT
**All platforms:**

- [Git](https://git-scm.com/) and [Node.js](https://nodejs.org/) (v24 LTS or later)
- [pnpm](https://pnpm.io/) (v10 LTS or later) - Installed via platform package managers:
- [pnpm](https://pnpm.io/) (v11 or later) - Installed via platform package managers:
- **macOS**: Homebrew (`brew install pnpm`)
- **Windows**: winget (`winget install pnpm.pnpm`)
- **Linux**: Corepack (`corepack enable && corepack prepare pnpm --activate`)
Expand All @@ -31,90 +31,25 @@ If you're using AI coding agents (GitHub Copilot, Claude, etc.), refer to [AGENT

**Note:** Azure Functions Core Tools is essential for running the backend Azure Functions locally (`func start` command). It is not installed automatically with Node or .NET SDK.

### Platform-specific installation
### Installation

#### Quick setup (all platforms)

Clone the repository and run the universal setup script that automatically detects your OS:
Clone the repository and install dependencies:

```bash
git clone https://github.com/facioquo/stock-charts.git
cd stock-charts
bash scripts/setup-environment.sh
```

Or use VS Code: `Ctrl+Shift+P` → "Tasks: Run Task" → "Setup: Dev environment"

Manually install dependencies (alternative if not using the setup script):

```bash
pnpm install
```

#### Platform-specific scripts

**macOS** - `scripts/setup-macos.sh`

Installs all prerequisites via [Homebrew](https://brew.sh/):

- Node.js v24 LTS
- .NET SDK v10
- Azure Functions Core Tools v4
- pnpm v10 LTS (via Homebrew)
- Angular CLI (global via pnpm)

```bash
bash scripts/setup-macos.sh
```

**Linux** - `scripts/setup-environment.sh`

Installs all prerequisites:

- Node.js v24 LTS
- .NET SDK v10.0
- pnpm v10 LTS (via Corepack)
- Angular CLI (global)

```bash
bash scripts/setup-environment.sh
```

**Note:** Azure Functions Core Tools must be installed manually on Linux. See the [installation guide](https://learn.microsoft.com/azure/azure-functions/functions-run-local#linux).

**Windows** - `scripts/setup-windows.sh`

Installs all prerequisites via winget (requires Git Bash for Windows):

- Node.js v24 LTS
- .NET SDK v10.0
- Azure Functions Core Tools v4
- pnpm v10 LTS (via winget)
- Angular CLI (global via pnpm)

```bash
bash scripts/setup-windows.sh
```

**Note:** Requires [Git Bash for Windows](https://git-scm.com/downloads) and [winget (Windows Package Manager)](https://aka.ms/getwinget).

**Alternative: WSL2** (recommended for Windows developers)

Use [Windows Subsystem for Linux 2](https://learn.microsoft.com/windows/wsl/install) with the Linux setup script:

```bash
wsl --install
# After WSL setup, run the universal script
bash scripts/setup-environment.sh
```
Or use VS Code: `Ctrl+Shift+P` → "Tasks: Run Task" → "Setup: Dev environment"

### Verify installation

After running the setup script or manual installation, verify all tools:
After installation, verify all tools:

```bash
node --version # Should be v24+
pnpm --version # Should be 10+
pnpm --version # Should be 11+
dotnet --version # Should be 10.0+
func --version # Should be 4.x
```
Expand All @@ -133,7 +68,7 @@ pnpm install
**Option 1: VS Code Tasks** (recommended)

```bash
# Ctrl+Shift+P → "Tasks: Run Task" → "start-full-stack"
# Ctrl+Shift+P → "Tasks: Run Task" → "Run: Full development stack"
```

This starts all services: Azurite storage emulator, Azure Functions, Web API, and Angular dev server.
Expand Down
Loading
Loading