From 9d6e7a269557488e26ba823484e850c22c64d3b8 Mon Sep 17 00:00:00 2001 From: wboughattas Date: Sat, 27 Dec 2025 18:35:15 -0500 Subject: [PATCH] First commit --- .gitignore | 32 ++ .husky/pre-commit | 1 + .prettierrc | 27 + 404.html | 24 + Gemfile | 22 + Gemfile.lock | 178 +++++++ README.md | 31 ++ _config.yml | 66 +++ _includes/directory_tree.html | 30 ++ _includes/folder_tree.html | 99 ++++ _includes/head.html | 20 + _includes/header.html | 15 + _includes/social.html | 12 + _layouts/category_index.html | 33 ++ _layouts/forge.html | 6 + _layouts/home.html | 29 + .../2025-12-27-architecture-0.1.md | 17 + _posts/releases/2025-12-27-release-0.1.md | 54 ++ assets/main.scss | 37 ++ docker-compose.yml | 10 + index.markdown | 41 ++ nginx.conf | 42 ++ package.json | 35 ++ pnpm-lock.yaml | 500 ++++++++++++++++++ 24 files changed, 1361 insertions(+) create mode 100644 .gitignore create mode 100644 .husky/pre-commit create mode 100644 .prettierrc create mode 100644 404.html create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 README.md create mode 100644 _config.yml create mode 100644 _includes/directory_tree.html create mode 100644 _includes/folder_tree.html create mode 100644 _includes/head.html create mode 100644 _includes/header.html create mode 100644 _includes/social.html create mode 100644 _layouts/category_index.html create mode 100644 _layouts/forge.html create mode 100644 _layouts/home.html create mode 100644 _posts/architectures/2025-12-27-architecture-0.1.md create mode 100644 _posts/releases/2025-12-27-release-0.1.md create mode 100644 assets/main.scss create mode 100644 docker-compose.yml create mode 100644 index.markdown create mode 100644 nginx.conf create mode 100644 package.json create mode 100644 pnpm-lock.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..598a0aa --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# node +node_modules/ +npm-debug.log* +yarn*.log* +pnpm-debug.log* + +# builds / caches / coverage +dist/ +build/ +.cache/ +.tmp/ +coverage/ + +# env / local config +.env +.env.* +.DS_Store +Thumbs.db +.idea/ +.vscode/ +*.swp + +# Jekyll +_site +.sass-cache +.jekyll-cache +.jekyll-metadata +vendor +.bundle/ + +# Misc +*.log diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..dff836d --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +pnpm exec lint-staged \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..a19e0fa --- /dev/null +++ b/.prettierrc @@ -0,0 +1,27 @@ +{ + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "printWidth": 100, + "plugins": ["@shopify/prettier-plugin-liquid", "prettier-plugin-nginx"], + "overrides": [ + { + "files": "*.html", + "options": { + "parser": "liquid-html" + } + }, + { + "files": "*.md", + "options": { + "parser": "markdown" + } + }, + { + "files": ["nginx.conf", "*.conf"], + "options": { + "parser": "nginx" + } + } + ] +} diff --git a/404.html b/404.html new file mode 100644 index 0000000..5b63762 --- /dev/null +++ b/404.html @@ -0,0 +1,24 @@ +--- +permalink: /404.html +layout: page +--- + + +
+

404

+ +

Page not found :(

+

The requested page could not be found.

+
diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..10a5d60 --- /dev/null +++ b/Gemfile @@ -0,0 +1,22 @@ +source "https://rubygems.org" +gem "jekyll", "~> 4.4.1" +gem "minima", "~> 2.5" + +group :jekyll_plugins do + gem "jekyll-feed", "~> 0.12" + gem 'jekyll-archives' +end + +# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem +# and associated library. +platforms :mingw, :x64_mingw, :mswin, :jruby do + gem "tzinfo", ">= 1", "< 3" + gem "tzinfo-data" +end + +# performance-booster for watching directories on Windows +gem "wdm", "~> 0.1", :platforms => [:mingw, :x64_mingw, :mswin] + +# Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem +# do not have a Java counterpart. +gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby] diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..5d25436 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,178 @@ +GEM + remote: https://rubygems.org/ + specs: + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) + base64 (0.3.0) + bigdecimal (3.3.1) + colorator (1.1.0) + concurrent-ruby (1.3.5) + csv (3.3.5) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + eventmachine (1.2.7) + ffi (1.17.2) + ffi (1.17.2-aarch64-linux-gnu) + ffi (1.17.2-aarch64-linux-musl) + ffi (1.17.2-arm-linux-gnu) + ffi (1.17.2-arm-linux-musl) + ffi (1.17.2-arm64-darwin) + ffi (1.17.2-x86-linux-gnu) + ffi (1.17.2-x86-linux-musl) + ffi (1.17.2-x86_64-darwin) + ffi (1.17.2-x86_64-linux-gnu) + ffi (1.17.2-x86_64-linux-musl) + forwardable-extended (2.6.0) + google-protobuf (4.33.0) + bigdecimal + rake (>= 13) + google-protobuf (4.33.0-aarch64-linux-gnu) + bigdecimal + rake (>= 13) + google-protobuf (4.33.0-aarch64-linux-musl) + bigdecimal + rake (>= 13) + google-protobuf (4.33.0-arm64-darwin) + bigdecimal + rake (>= 13) + google-protobuf (4.33.0-x86-linux-gnu) + bigdecimal + rake (>= 13) + google-protobuf (4.33.0-x86-linux-musl) + bigdecimal + rake (>= 13) + google-protobuf (4.33.0-x86_64-darwin) + bigdecimal + rake (>= 13) + google-protobuf (4.33.0-x86_64-linux-gnu) + bigdecimal + rake (>= 13) + google-protobuf (4.33.0-x86_64-linux-musl) + bigdecimal + rake (>= 13) + http_parser.rb (0.8.0) + i18n (1.14.7) + concurrent-ruby (~> 1.0) + jekyll (4.4.1) + addressable (~> 2.4) + base64 (~> 0.2) + colorator (~> 1.0) + csv (~> 3.0) + em-websocket (~> 0.5) + i18n (~> 1.0) + jekyll-sass-converter (>= 2.0, < 4.0) + jekyll-watch (~> 2.0) + json (~> 2.6) + kramdown (~> 2.3, >= 2.3.1) + kramdown-parser-gfm (~> 1.0) + liquid (~> 4.0) + mercenary (~> 0.3, >= 0.3.6) + pathutil (~> 0.9) + rouge (>= 3.0, < 5.0) + safe_yaml (~> 1.0) + terminal-table (>= 1.8, < 4.0) + webrick (~> 1.7) + jekyll-archives (2.3.0) + jekyll (>= 3.6, < 5.0) + jekyll-feed (0.17.0) + jekyll (>= 3.7, < 5.0) + jekyll-sass-converter (3.1.0) + sass-embedded (~> 1.75) + jekyll-seo-tag (2.8.0) + jekyll (>= 3.8, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + json (2.15.1) + kramdown (2.5.1) + rexml (>= 3.3.9) + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.9.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.4.0) + minima (2.5.2) + jekyll (>= 3.5, < 5.0) + jekyll-feed (~> 0.9) + jekyll-seo-tag (~> 2.1) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (6.0.2) + rake (13.3.0) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) + ffi (~> 1.0) + rexml (3.4.4) + rouge (4.6.1) + safe_yaml (1.0.5) + sass-embedded (1.93.2) + google-protobuf (~> 4.31) + rake (>= 13) + sass-embedded (1.93.2-aarch64-linux-android) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-aarch64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-aarch64-linux-musl) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-arm-linux-androideabi) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-arm-linux-gnueabihf) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-arm-linux-musleabihf) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-arm64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-riscv64-linux-android) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-riscv64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-riscv64-linux-musl) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-x86_64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-x86_64-linux-android) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-x86_64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-x86_64-linux-musl) + google-protobuf (~> 4.31) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + unicode-display_width (2.6.0) + webrick (1.9.1) + +PLATFORMS + aarch64-linux-android + aarch64-linux-gnu + aarch64-linux-musl + arm-linux-androideabi + arm-linux-gnu + arm-linux-gnueabihf + arm-linux-musl + arm-linux-musleabihf + arm64-darwin + riscv64-linux-android + riscv64-linux-gnu + riscv64-linux-musl + ruby + x86-linux-gnu + x86-linux-musl + x86_64-darwin + x86_64-linux-android + x86_64-linux-gnu + x86_64-linux-musl + +DEPENDENCIES + http_parser.rb (~> 0.6.0) + jekyll (~> 4.4.1) + jekyll-archives + jekyll-feed (~> 0.12) + minima (~> 2.5) + tzinfo (>= 1, < 3) + tzinfo-data + wdm (~> 0.1) + +BUNDLED WITH + 2.7.2 diff --git a/README.md b/README.md new file mode 100644 index 0000000..fbf33e1 --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +# Severed blog (Jekyll app) + +## Development + +**Install Dependencies (Ruby & Node):** + +```bash +bundle install && pnpm install +``` + +**Start Local Server:** + +```bash +pnpm dev +``` + +**Build for Production:** + +```bash +pnpm build +``` + +## Code Quality + +**Format Code Manually:** + +```bash +pnpm format +``` + +_(Formatting also runs automatically on commit via Husky)_ diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..a5f0e02 --- /dev/null +++ b/_config.yml @@ -0,0 +1,66 @@ +# Site settings +title: Severed +email: wboughattas@proton.me +description: >- + Architectural revisions and engineering logs from the Severed platform. + Transitioning from managed cloud to self-hosted OSS infrastructure. + +# Deployment +baseurl: '' +url: 'https://blog.severed.ink' +#twitter_username: jekyllrb +github_username: Severed + +# Shorter URLs +permalink: /:categories/:title/ + +# Theme settings +theme: minima +minima: + skin: dark + +plugins: + - jekyll-feed + - jekyll-archives + +# Exclude from processing. +# The following items will not be processed, by default. +# Any item listed under the `exclude:` key here will be automatically added to +# the internal "default list". +# +# Excluded items can be processed by explicitly listing the directories or +# their entries' file path in the `include:` list. +# +exclude: + - .sass-cache/ + - .jekyll-cache/ + - gemfiles/ + - Gemfile + - Gemfile.lock + - node_modules/ + - vendor/bundle/ + - vendor/cache/ + - vendor/gems/ + - vendor/ruby/ + +# custom fields +# +module_order: + - releases + - architectures + +jekyll-archives: + enabled: + - categories + layout: category_index + permalinks: + category: '/:name/' + +sass: + style: compressed + quiet_deps: true + silence_deprecations: + - import + - color-functions + - global-builtin + - mixed-decls diff --git a/_includes/directory_tree.html b/_includes/directory_tree.html new file mode 100644 index 0000000..90d4528 --- /dev/null +++ b/_includes/directory_tree.html @@ -0,0 +1,30 @@ +
+

System Architectures

+ +
+ + + + + Architectures/ + + + +
+
diff --git a/_includes/folder_tree.html b/_includes/folder_tree.html new file mode 100644 index 0000000..43c9a0a --- /dev/null +++ b/_includes/folder_tree.html @@ -0,0 +1,99 @@ +
+
+ + + + + + _{{ include.name }} + + + +
+ {% for post in include.posts %} + +
+ {% if post.highlight == true %} + + + + {% else %} + + {% endif %} + + + {{- post.title | escape -}} + +
+ + + {{ post.date | date: '%b %d' }} + +
+ {% endfor %} +
+
+
+ + diff --git a/_includes/head.html b/_includes/head.html new file mode 100644 index 0000000..3ceef42 --- /dev/null +++ b/_includes/head.html @@ -0,0 +1,20 @@ + + + + + {%- seo -%} + + + + + + + + {%- feed_meta -%} + diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 0000000..c9f0f06 --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,15 @@ + diff --git a/_includes/social.html b/_includes/social.html new file mode 100644 index 0000000..23f8656 --- /dev/null +++ b/_includes/social.html @@ -0,0 +1,12 @@ + diff --git a/_layouts/category_index.html b/_layouts/category_index.html new file mode 100644 index 0000000..e8e1cb3 --- /dev/null +++ b/_layouts/category_index.html @@ -0,0 +1,33 @@ +--- +layout: forge +--- +
+ + + + + + Back to Forge + +
+ +

+ {{ page.title }} Module +

+ +
+ {% include folder_tree.html name=page.title posts=page.posts %} +
diff --git a/_layouts/forge.html b/_layouts/forge.html new file mode 100644 index 0000000..119c177 --- /dev/null +++ b/_layouts/forge.html @@ -0,0 +1,6 @@ +--- +layout: default +--- +
+ {{ content }} +
diff --git a/_layouts/home.html b/_layouts/home.html new file mode 100644 index 0000000..a91d482 --- /dev/null +++ b/_layouts/home.html @@ -0,0 +1,29 @@ +--- +layout: default +--- +
+ {%- if page.title -%} +

{{ page.title }}

+ {%- endif -%} + + {{ content }} + + {%- if site.posts.size > 0 -%} +

{{ page.list_title | default: 'Posts' }}

+ + {%- endif -%} +
diff --git a/_posts/architectures/2025-12-27-architecture-0.1.md b/_posts/architectures/2025-12-27-architecture-0.1.md new file mode 100644 index 0000000..380804a --- /dev/null +++ b/_posts/architectures/2025-12-27-architecture-0.1.md @@ -0,0 +1,17 @@ +--- +layout: post +title: Architecture V1 (WIP) +date: 2025-12-27 02:00:00 -0400 +categories: + - architectures +--- + +## Monitoring + +```bash +. +└── alloy + ├── config + │ └── config.alloy + └── docker-compose.yml +``` diff --git a/_posts/releases/2025-12-27-release-0.1.md b/_posts/releases/2025-12-27-release-0.1.md new file mode 100644 index 0000000..844a298 --- /dev/null +++ b/_posts/releases/2025-12-27-release-0.1.md @@ -0,0 +1,54 @@ +--- +layout: post +title: 'Release 0.1: The Severed Ecosystem' +date: 2025-12-27 02:00:00 -0400 +categories: + - releases +highlight: true +--- + +This blog serves as the public documentation for **Severed**. While the main site provides the high-level vision, +this space is dedicated to the technical source-of-truth for the experiments, infrastructure-as-code, and proprietary +tooling that are used within the cluster. + +### Ecosystem + +The following services are currently active within the `severed.ink` network: + +- **[ChronoFlow Quant](https://refinement.severed.ink)**: Proprietary Trading Pipeline `(Auth Required)` +- **[Flow Admin](https://refinement.severed.ink)**: Dagster Orchestration Engine `(Auth Required)` +- **[Optics](https://optics.severed.ink)**: Centralized Grafana Observability `(Auth Required)` +- **[Gitea](https://git.severed.ink)**: Version Control & Git Ops `(Public)` +- **[Blog](https://blog.severed.ink)**: Public Engineering Documentation `(Public)` + +### Core Infrastructure + +The ecosystem is powered by a **Home Server Cluster** managed via a **Kubernetes (k3s)** distribution. This setup +prioritizes local sovereignty and GitOps principles. + +- **CI Pipeline:** Automated build and test suites are orchestrated by a private Jenkins server utilizing self-hosted + runners. +- **GitOps & Deployment:** Automated synchronization and state enforcement via **ArgoCD**. +- **Data Layer:** Persistent storage managed by **PostgreSQL**. +- **Telemetry:** Full-stack observability provided by **Prometheus** (metrics) and **Loki** (logs) via **Grafana**. +- **Security Layer:** Push/Pull GitOps operations require an active connection to a **WireGuard (VPN)** for remote + access. + +### Roadmap + +Engineering efforts are currently focused on the following milestones: + +1. **OSS Strategy:** Transitioning from a hybrid of AWS managed services toward a ~100% Open Source Software (OSS) stack. +2. **High Availability (HA):** Implementing a "Cloud RAID-1" failover mechanism. In the event of home cluster + instability, traffic automatically routes to a secondary cloud-instantiated Kubernetes cluster as a temporary + failover. +3. **Data Resilience:** Automating PostgreSQL backup strategies to ensure parity between the primary cluster and the + cloud-based failover. +4. **Storage Infrastructure:** Integrating a dedicated **TrueNAS** node to move from local SATA/NVMe reliance to a + centralized, redundant storage architecture. + +### Terminal Redirect + +For the full technical portfolio and expertise highlights, visit the main site: + +## [→ severed.ink](https://severed.ink/) diff --git a/assets/main.scss b/assets/main.scss new file mode 100644 index 0000000..bb7cea0 --- /dev/null +++ b/assets/main.scss @@ -0,0 +1,37 @@ +--- +--- + +@import 'minima'; + +/* Minimal Tweaks for the Tree Component */ +details > summary { + list-style: none; /* Hides default triangle in some browsers */ +} + +details > summary::-webkit-details-marker { + display: none; +} + +.site-header { + border-top: none; /* Removes the top grey line (your previous request) */ + + /* Sticky Logic */ + position: sticky; /* Stick to the viewport */ + top: 0; /* Stick exactly at the top */ + z-index: 1000; /* Ensure it sits above all other content */ + background-color: #fff; /* White background to hide scrolling content */ + + /* Optional: Adds a subtle shadow when scrolling for better separation */ + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +body { + caret-color: transparent; +} + +/* 2. Restore the cursor for actual input fields so users can type */ +input, +textarea, +[contenteditable] { + caret-color: auto; +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..bccf577 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,10 @@ +services: + web: + image: nginx:alpine + container_name: jekyll_blog + ports: + - '8080:80' + volumes: + - ./_site:/usr/share/nginx/html:ro + - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro + restart: unless-stopped diff --git a/index.markdown b/index.markdown new file mode 100644 index 0000000..624d61e --- /dev/null +++ b/index.markdown @@ -0,0 +1,41 @@ +--- +layout: forge +--- + +

Highlighted articles

+ + + +

Documentation Modules

+ +
+ {% for folder_name in site.module_order %} + {% assign cat_posts = site.categories[folder_name] %} + {% if cat_posts %} + {% include folder_tree.html name=folder_name posts=cat_posts %} + {% endif %} + {% endfor %} + +{% assign sorted_cats = site.categories | sort %} +{% for category in sorted_cats %} +{% assign cat_name = category[0] %} +{% assign cat_posts = category[1] %} +{% unless site.module_order contains cat_name %} +{% include folder_tree.html name=cat_name posts=cat_posts %} +{% endunless %} +{% endfor %} + +
diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..005baba --- /dev/null +++ b/nginx.conf @@ -0,0 +1,42 @@ +server { + listen 80; + server_name localhost; + # define root globally so all location blocks (images, css, etc) inherit it + root /usr/share/nginx/html; + index index.html index.htm; + # gzip compression + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml appl> + gzip_vary on; + gzip_min_length 1000; + + # assets (images, fonts, favicons) - cache for 1 Year + location ~* \.(jpg|jpeg|gif|png|ico|svg|woff|woff2|ttf|eot)$ { + expires 365d; + add_header Cache-Control "public, no-transform"; + try_files $uri =404; + } + + # code (css, js) - cache for 1 month + location ~* \.(css|js)$ { + expires 30d; + add_header Cache-Control "public, no-transform"; + try_files $uri =404; + } + + # standard routing - short cache + location / { + try_files $uri $uri/ $uri.html =404; + } + + # error page + error_page 404 /404.html; + + location = /404.html { + internal ; + } + + # logging / lb config + real_ip_header X-Forwarded-For; + set_real_ip_from 10.0.0.0/8; +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..ecb7bb3 --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "cntest", + "version": "1.0.0", + "description": "In dev: ```bash bundle exec jekyll serve ```", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "prepare": "husky", + "format": "prettier --write .", + "dev": "bundle exec jekyll serve", + "build": "bundle exec jekyll build" + }, + "lint-staged": { + "*.{html,md,js,css,scss,json,yaml,yml,conf}": "prettier --write" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/wboughattas/cntest.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "bugs": { + "url": "https://github.com/wboughattas/cntest/issues" + }, + "homepage": "https://github.com/wboughattas/cntest#readme", + "devDependencies": { + "@shopify/prettier-plugin-liquid": "^1.10.0", + "prettier-plugin-nginx": "^1.0.3", + "husky": "^9.1.7", + "lint-staged": "^16.2.7", + "prettier": "^3.7.4" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..aed7723 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,500 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + .: + devDependencies: + '@shopify/prettier-plugin-liquid': + specifier: ^1.10.0 + version: 1.10.0(prettier@3.7.4) + husky: + specifier: ^9.1.7 + version: 9.1.7 + lint-staged: + specifier: ^16.2.7 + version: 16.2.7 + prettier: + specifier: ^3.7.4 + version: 3.7.4 + prettier-plugin-nginx: + specifier: ^1.0.3 + version: 1.0.3 + +packages: + '@shopify/liquid-html-parser@2.9.0': + resolution: + { + integrity: sha512-bkI4tLbU47YUxpgbMa9fgeJjFEMvRNEFL644Yk0ZKo5H1IRzU4pPyCQ6PkGvb0JJnt7OZ+RDGvb6ZLCnAR2Z/A==, + } + + '@shopify/prettier-plugin-liquid@1.10.0': + resolution: + { + integrity: sha512-csHYjwuT34o8ja6EY0dUBYQS5UVwsKwRYxGiuG816Ov0B8lVd8FUjOwWUk2SnrNx3cGgL0no7z+Byapp7sC1Uw==, + } + peerDependencies: + prettier: ^2.0.0 || ^3.0.0 + + ansi-escapes@7.2.0: + resolution: + { + integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==, + } + engines: { node: '>=18' } + + ansi-regex@6.2.2: + resolution: + { + integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==, + } + engines: { node: '>=12' } + + ansi-styles@6.2.3: + resolution: + { + integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==, + } + engines: { node: '>=12' } + + braces@3.0.3: + resolution: + { + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, + } + engines: { node: '>=8' } + + cli-cursor@5.0.0: + resolution: + { + integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==, + } + engines: { node: '>=18' } + + cli-truncate@5.1.1: + resolution: + { + integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==, + } + engines: { node: '>=20' } + + colorette@2.0.20: + resolution: + { + integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, + } + + commander@14.0.2: + resolution: + { + integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==, + } + engines: { node: '>=20' } + + emoji-regex@10.6.0: + resolution: + { + integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==, + } + + environment@1.1.0: + resolution: + { + integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==, + } + engines: { node: '>=18' } + + eventemitter3@5.0.1: + resolution: + { + integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, + } + + fill-range@7.1.1: + resolution: + { + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, + } + engines: { node: '>=8' } + + get-east-asian-width@1.4.0: + resolution: + { + integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==, + } + engines: { node: '>=18' } + + html-styles@1.0.0: + resolution: + { + integrity: sha512-cDl5dcj73oI4Hy0DSUNh54CAwslNLJRCCoO+RNkVo+sBrjA/0+7E/xzvj3zH/GxbbBLGJhE0hBe1eg+0FINC6w==, + } + + husky@9.1.7: + resolution: + { + integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==, + } + engines: { node: '>=18' } + hasBin: true + + is-fullwidth-code-point@5.1.0: + resolution: + { + integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==, + } + engines: { node: '>=18' } + + is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: '>=0.12.0' } + + isarray@1.0.0: + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } + + isobject@2.1.0: + resolution: + { + integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==, + } + engines: { node: '>=0.10.0' } + + line-column@1.0.2: + resolution: + { + integrity: sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww==, + } + + lint-staged@16.2.7: + resolution: + { + integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==, + } + engines: { node: '>=20.17' } + hasBin: true + + listr2@9.0.5: + resolution: + { + integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==, + } + engines: { node: '>=20.0.0' } + + log-update@6.1.0: + resolution: + { + integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==, + } + engines: { node: '>=18' } + + micromatch@4.0.8: + resolution: + { + integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, + } + engines: { node: '>=8.6' } + + mimic-function@5.0.1: + resolution: + { + integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==, + } + engines: { node: '>=18' } + + nano-spawn@2.0.0: + resolution: + { + integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==, + } + engines: { node: '>=20.17' } + + ohm-js@17.3.0: + resolution: + { + integrity: sha512-LySMdjweN1hKBMMV8lM44+1wiewkndDNNJxtgVAscs7y683MXCdQZLsIaw64/p8NuqYbKOWZoHIOA5DU/xchoA==, + } + engines: { node: '>=0.12.1' } + + onetime@7.0.0: + resolution: + { + integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==, + } + engines: { node: '>=18' } + + picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: '>=8.6' } + + pidtree@0.6.0: + resolution: + { + integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, + } + engines: { node: '>=0.10' } + hasBin: true + + prettier-plugin-nginx@1.0.3: + resolution: + { + integrity: sha512-vV5q85s8XnV6NEgvz1gVLfZhmxAxY03MyOYj2ApBpjFkbs00lRsRkTmqO9L39ADuD18z1RRCcfZ3eVxKhI/nqg==, + } + + prettier@3.7.4: + resolution: + { + integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==, + } + engines: { node: '>=14' } + hasBin: true + + restore-cursor@5.1.0: + resolution: + { + integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==, + } + engines: { node: '>=18' } + + rfdc@1.4.1: + resolution: + { + integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==, + } + + signal-exit@4.1.0: + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: '>=14' } + + slice-ansi@7.1.2: + resolution: + { + integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==, + } + engines: { node: '>=18' } + + string-argv@0.3.2: + resolution: + { + integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==, + } + engines: { node: '>=0.6.19' } + + string-width@7.2.0: + resolution: + { + integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, + } + engines: { node: '>=18' } + + string-width@8.1.0: + resolution: + { + integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==, + } + engines: { node: '>=20' } + + strip-ansi@7.1.2: + resolution: + { + integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==, + } + engines: { node: '>=12' } + + to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: '>=8.0' } + + wrap-ansi@9.0.2: + resolution: + { + integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==, + } + engines: { node: '>=18' } + + yaml@2.8.2: + resolution: + { + integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==, + } + engines: { node: '>= 14.6' } + hasBin: true + +snapshots: + '@shopify/liquid-html-parser@2.9.0': + dependencies: + line-column: 1.0.2 + ohm-js: 17.3.0 + + '@shopify/prettier-plugin-liquid@1.10.0(prettier@3.7.4)': + dependencies: + '@shopify/liquid-html-parser': 2.9.0 + html-styles: 1.0.0 + prettier: 3.7.4 + + ansi-escapes@7.2.0: + dependencies: + environment: 1.1.0 + + ansi-regex@6.2.2: {} + + ansi-styles@6.2.3: {} + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-truncate@5.1.1: + dependencies: + slice-ansi: 7.1.2 + string-width: 8.1.0 + + colorette@2.0.20: {} + + commander@14.0.2: {} + + emoji-regex@10.6.0: {} + + environment@1.1.0: {} + + eventemitter3@5.0.1: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + get-east-asian-width@1.4.0: {} + + html-styles@1.0.0: {} + + husky@9.1.7: {} + + is-fullwidth-code-point@5.1.0: + dependencies: + get-east-asian-width: 1.4.0 + + is-number@7.0.0: {} + + isarray@1.0.0: {} + + isobject@2.1.0: + dependencies: + isarray: 1.0.0 + + line-column@1.0.2: + dependencies: + isarray: 1.0.0 + isobject: 2.1.0 + + lint-staged@16.2.7: + dependencies: + commander: 14.0.2 + listr2: 9.0.5 + micromatch: 4.0.8 + nano-spawn: 2.0.0 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.8.2 + + listr2@9.0.5: + dependencies: + cli-truncate: 5.1.1 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.2 + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.2.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-function@5.0.1: {} + + nano-spawn@2.0.0: {} + + ohm-js@17.3.0: {} + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + picomatch@2.3.1: {} + + pidtree@0.6.0: {} + + prettier-plugin-nginx@1.0.3: {} + + prettier@3.7.4: {} + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + rfdc@1.4.1: {} + + signal-exit@4.1.0: {} + + slice-ansi@7.1.2: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + + string-argv@0.3.2: {} + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string-width@8.1.0: + dependencies: + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + + yaml@2.8.2: {}