{"id":29075163,"url":"https://github.com/ertgl/holypack","last_synced_at":"2025-06-27T15:10:17.851Z","repository":{"id":287795098,"uuid":"965803863","full_name":"ertgl/holypack","owner":"ertgl","description":"[WIP] Backend-agnostic build system for scalable web projects.","archived":false,"fork":false,"pushed_at":"2025-06-27T07:16:56.000Z","size":2386,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-27T07:40:10.422Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ertgl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-13T23:40:51.000Z","updated_at":"2025-06-26T09:24:03.000Z","dependencies_parsed_at":"2025-06-06T11:37:51.557Z","dependency_job_id":null,"html_url":"https://github.com/ertgl/holypack","commit_stats":null,"previous_names":["ertgl/holypack"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ertgl/holypack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ertgl%2Fholypack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ertgl%2Fholypack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ertgl%2Fholypack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ertgl%2Fholypack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ertgl","download_url":"https://codeload.github.com/ertgl/holypack/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ertgl%2Fholypack/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262279297,"owners_count":23286554,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-27T15:10:14.876Z","updated_at":"2025-06-27T15:10:17.837Z","avatar_url":"https://github.com/ertgl.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1 align=\"center\"\u003e\n    holypack\n  \u003c/h1\u003e\n  \u003cpicture\u003e\n    \u003cimg\n      alt=\"holycat, the mascot of holypack\"\n      src=\"assets/holycat.png\"\n      width=\"375px\"\n      height=\"375px\"\n    /\u003e\n  \u003c/picture\u003e\n  \u003cp align=\"center\"\u003e\n    \u003csmall\u003e\n      A holycat, has some business with your boxes.\n    \u003c/small\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n\u003e [!CAUTION]\n\u003e **This project is in early development.**\n\u003e\n\u003e The content in this README is more of a plan and might not reflect the final\n\u003e product.\n\u003e\n\u003e Development is ongoing very actively.\n\u003e\n\u003e If you are interested, I would like to hear your thoughts. Contact\n\u003e information is available on my profile.\n\n## Table of Contents\n\n- [Overview](#overview)\n  - [Scope](#scope)\n  - [Principles](#principles)\n  - [Features](#features)\n- [Integrations](#integrations)\n- [Packages](#packages)\n- [Installation](#installation)\n- [Usage](#usage)\n- [Name](#name)\n- [License](#license)\n\n## Overview\n\nHolypack is a backend-agnostic build system designed for accessible and\nscalable web projects. It focuses on transforming, optimizing, and bundling\nfrontend assets with minimal setup and maximum flexibility. Built with modern\ntooling and enterprise-readiness in mind, it supports a wide range of project\ntypes (from progressive-enhancement-first architectures to single-page\napplications) without enforcing backend constraints. Holypack provides reliable\ndefaults, thoughtful integrations for linting, testing, security and a modular\nplugin system for unrestricted extensibility.\n\n### Scope\n\nMany modern tools either make strong assumptions about the backend environment\n(typically JavaScript or TypeScript) or overlook the needs of progressive\nenhancement, which is vital for accessibility and long-term scalability.\nHolypack is crafted to fill this gap by offering a backend-agnostic approach\nthat prioritizes portability, flexibility, and production-readiness from the\nstart. It supports diverse project types, including SPAs, PWAs, SSR setups, and\nCLI tools without dictating architectural choices.\n\n### Principles\n\nHolypack is designed to help achieve long-term maintainability, modern\ndeveloper workflows, and a clear separation of concerns. It uses proven\ntechnologies to keep things simple but flexible enough to handle different use\ncases. The configuration approach strikes a balance, avoiding unnecessary\ncomplexity while still allowing customization when needed.\n\nThe core principles behind holypack include:\n\n  - **Production-ready**: A straightforward setup by default.\n  - **Guided flexibility**: A mix of \"**convention over configuration**\" and\n    \"**configuration over convention**.\"\n  - **Optimized for modern workflows**: Integrates with fast,\n    developer-friendly tools that improve productivity.\n  - **Built on proven technologies**: Combined with the best practices to\n    ensure sustainable efficiency.\n  - **Adaptable and non-restrictive**: Works with any project structure,\n    without being restrictive.\n\n### Features\n\nHolypack offers a set of enterprise-friendly features that balance performance,\nsecurity, and developer experience. All designed to adapt to projects of any\nscale.\n\n#### Foundation\n\n- **Modular plugin system**, uses [tapable](https://github.com/webpack/tapable)\n  under the hood\n- **Backend-agnostic architecture**, supports any backend in any language\n- **Project templates** for:\n  - Frontend-only (assets)\n  - Single Page Applications (SPA)\n  - Progressive Web Applications (PWA, service workers, navigation preloading)\n  - Server-Side Rendering (SSR) with progressive enhancement\n\n#### Build \u0026 Transform\n\n- Code and asset bundling via [webpack](https://webpack.js.org/)\n- JavaScript/TypeScript transpilation with [Babel](https://babeljs.io/) and\n  [SWC](https://swc.rs/)\n- CSS processing with [PostCSS](https://postcss.org/) and\n  [Lightning CSS](https://lightningcss.dev/)\n- Superpowered CSS, with [Sass](https://sass-lang.com/) and\n  [SCSS](https://sass-lang.com/documentation/syntax/#scss)\n- First-class [CSS modules](https://github.com/css-modules/css-modules) support\n\n#### Security \u0026 Integrity\n\n- [Subresource Integrity (SRI)](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity)\n- [Content Security Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP)\n- [Trusted Types](https://developer.mozilla.org/en-US/docs/Web/API/Trusted_Types_API)\n- Dual builds for **modern** and **legacy** environments\n- Built-in support for **graceful degradation**\n\n#### CLI \u0026 Distribution\n\n- Build CLI applications targeting Node.js (including SSR use cases)\n- Optional JavaScript **obfuscation** for closed-source projects\n- Support for bundling into **single-file** executables\n\n\u003e [!WARNING]\n\u003e Code obfuscation is **not a security mechanism** for intellectual properties.\n\u003e It serves as a deterrent and may support legal standing by demonstrating that\n\u003e violations were deliberate rather than accidental.\n\n## Integrations\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eName\u003c/th\u003e\n    \u003cth\u003ePackage\u003c/th\u003e\n    \u003cth\u003eStatus\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"3\" aria-hidden=\"true\"\u003e\u0026#8203;\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth align=\"left\" colspan=\"3\"\u003eLinters\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://eslint.org/\"\u003eESLint\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"integrations/eslint\"\u003e@holypack/integration-eslint\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003eCompleted\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/dequelabs/axe-core\"\u003eaxe-core\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://stylelint.io/\"\u003eStylelint\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://commitlint.js.org/\"\u003ecommitlint\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://typicode.github.io/husky/\"\u003eHusky\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"3\"\u003e\u0026#8203;\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth align=\"left\" colspan=\"3\"\u003eBuild Tools\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://www.typescriptlang.org/\"\u003eTypeScript\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"integrations/typescript\"\u003e@holypack/integration-typescript\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003eCompleted\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://babeljs.io/\"\u003eBabel\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"integrations/babel\"\u003e@holypack/integration-babel\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003eCompleted\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://swc.rs/\"\u003eSWC\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://obfuscator.io/\"\u003eJavaScript Obfuscator\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://postcss.org/\"\u003ePostCSS\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://lightningcss.dev/\"\u003eLightning CSS\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://sass-lang.com/\"\u003eSass\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://sass-lang.com/documentation/syntax/#scss\"\u003eSCSS\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://browsersl.ist/\"\u003eBrowserslist\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://webpack.js.org/\"\u003ewebpack\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"integrations/webpack\"\u003e@holypack/integration-webpack\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      Work in progress\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"3\"\u003e\u0026#8203;\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth align=\"left\" colspan=\"3\"\u003eTesting Tools\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://jestjs.io/\"\u003eJest\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"integrations/jest\"\u003e@holypack/integration-jest\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003eCompleted\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"3\"\u003e\u0026#8203;\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth align=\"left\" colspan=\"3\"\u003eDistribution \u0026 Release Tools\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/changesets/changesets\"\u003echangesets\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/ertgl/export-map-generator\"\u003eexport-map-generator\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003eCompleted\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"3\"\u003e\u0026#8203;\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth align=\"left\" colspan=\"3\"\u003eLibraries \u0026 Frameworks\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://expressjs.com/\"\u003eExpress\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://react.dev/\"\u003eReact\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd colspan=\"3\"\u003e\u0026#8203;\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth align=\"left\" colspan=\"3\"\u003ePolyfills\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/zloirock/core-js\"\u003ecore-js\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/w3c/trusted-types\"\u003etrusted-types\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Packages\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eName\u003c/th\u003e\n    \u003cth\u003ePackage\u003c/th\u003e\n    \u003cth\u003eStatus\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ecore\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"packages/core\"\u003e@holypack/core\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003eCompleted\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ecli\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"packages/cli\"\u003e@holypack/cli\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003ePlanned\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eprelude\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"packages/prelude\"\u003eholypack\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003eCompleted\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Installation\n\nThe packages will be available once the initial implementation is complete.\n\n## Usage\n\nThe final view of the usage will be provided at a later stage.\n\n### Configuration\n\nMultiple file formats are supported for configuration, including JSON, YAML,\nJavaScript and TypeScript.\n\nExample of configuration in `holypack.config.mjs`:\n\n```js\nimport eslint from \"@holypack/integration-eslint\";\nimport { defineConfig } from \"holypack/config\";\n\nexport default defineConfig({\n  integrations: [\n    eslint(),\n  ],\n});\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    \u003cb\u003e\n      Toggle the \u003ccode\u003eeslint.config.mjs\u003c/code\u003e view for the above example\n    \u003c/b\u003e\n  \u003c/summary\u003e\n\n  ```js\n  import createHolypackPlugin from \"@holypack/eslint-plugin\";\n\n  const holypack = await createHolypackPlugin();\n\n  export default [\n    ...holypack.configs.recommended,\n  ];\n  ```\n\u003c/details\u003e\n\n#### Configuration Exploration\n\nWhen a configuration file is provided, the system will use it as the main\nconfiguration file. Otherwise, it will look for a configuration file in the\ncurrent working directory with the following priority:\n\n- `package.json` (`holypack.config` property)\n- `holypack.config.ts`\n- `holypack.config.js`\n- `holypack.config.mts`\n- `holypack.config.mjs`\n- `holypack.config.cts`\n- `holypack.config.cjs`\n- `.holypackrc.ts`\n- `.holypackrc.js`\n- `.holypackrc.mts`\n- `.holypackrc.mjs`\n- `.holypackrc.cts`\n- `.holypackrc.cjs`\n- `.holypackrc.json`\n- `.holypackrc.yml`\n- `.holypackrc.yaml`\n- `.holypackrc`\n- `.config/holypackrc.ts`\n- `.config/holypackrc.js`\n- `.config/holypackrc.mts`\n- `.config/holypackrc.mjs`\n- `.config/holypackrc.cts`\n- `.config/holypackrc.cjs`\n- `.config/holypackrc.json`\n- `.config/holypackrc.yml`\n- `.config/holypackrc.yaml`\n- `.config/holypackrc`\n\n### Low-level API\n\nThe final view of the API will be provided at a later stage.\n\n#### Context Resolution\n\nExample:\n\n```ts\nimport { resolveContext } from \"@holypack/core\";\n\nconst context = await resolveContext();\n```\n\n## Name\n\nThe name first came from my reaction to how crowded the npm registry felt. But\nit now reflects my respect for the stack of technologies that I have used to\nbuild this project. Cats are also very surprising.\n\nJust same as webpack, I prefer not to capitalize it in the middle of a\nsentence.\n\n## License\n\nThis project is licensed under the\n[MIT License](https://opensource.org/license/mit).\nSee the [LICENSE](LICENSE) file for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fertgl%2Fholypack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fertgl%2Fholypack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fertgl%2Fholypack/lists"}