Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/localnerve/web-component-build
Assembles and minifies web components from parts, exposing parts for build templates and CSP processing
https://github.com/localnerve/web-component-build
build build-tool minifier webcomponents
Last synced: 3 months ago
JSON representation
Assembles and minifies web components from parts, exposing parts for build templates and CSP processing
- Host: GitHub
- URL: https://github.com/localnerve/web-component-build
- Owner: localnerve
- License: bsd-3-clause
- Created: 2023-12-10T23:07:05.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2024-09-30T01:50:56.000Z (3 months ago)
- Last Synced: 2024-09-30T01:55:09.796Z (3 months ago)
- Topics: build, build-tool, minifier, webcomponents
- Language: JavaScript
- Homepage:
- Size: 411 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# Web Component Build
> Assembles a web component from css, html, and js parts, assists user build flexibility
[![npm version](https://badge.fury.io/js/@localnerve%2Fweb-component-build.svg)](https://badge.fury.io/js/@localnerve%2Fweb-component-build)
![Verify](https://github.com/localnerve/web-component-build/workflows/Verify/badge.svg)
[![Coverage Status](https://coveralls.io/repos/github/localnerve/web-component-build/badge.svg?branch=main)](https://coveralls.io/github/localnerve/web-component-build?branch=main)Assembles a web component from its parts, allows developers to author the component's parts in separate files.
The parts are processed and written to an output directory, then exposed to a calling build process.* [Why This Exists](#why-this-exists)
* [Processing Possibilities](#processing-map)
* [Usage](#usage)
* [API](#api)
* [Options](#options-object-optional)
* [Result](#result-object)## Why This Exists
1. Author web components in separate JS, CSS, and HTML files
2. Expose CSS for the web component to builds for computing [CSP hashes](https://github.com/localnerve/csp-hashes#readme)
3. Expose HTML for the web component to builds for companion templates and/or DSD for SSR builds
4. Enable/ease paying these conveniences forward in web component distribution packages## Processing Map
The following is a table of _some_ of the possible input, processing, and output combos. See [options](#options-object-optional) for detailed explanations.| input | processing | output |
| ----- | ---------- | ------ |
| javascript | minify javascript | javascript |
| css | minify css | css |
| html | minify html | html |
| css, html | minify css, prepend style tag to html, minify html | css, html |
| css, html, cssHref | minfy css, prepend style tag to html, prepend link tag to html, minify html | css, html |
| cssHref, html | prepend link tag to html, minify html | html |
| javascript, css | minify css, merge style tag into javascript, minify javascript | css, javascript |
| javascript, css, html | minify css, prepend style tag to html, minify html, merge into javascript, minify javascript | css, html, javascript |
| javascript, css, html, cssHref | minify css, prepend style tag to html, prepend link tag to html, minify html, merge into javascript, minify javascript | css, html, javascript |
| javascript, html | minify html, merge into javascript, minify javascript | html, javascript |
| javascript, html, cssHref | prepend link tag to html, minify html, merge into javascript, minify javascript | html, javascript |
| javascript, cssHref | add link tag to javascript, minify javascript | javascript |> By default, html minification minifies any css found therein.
## Usage
```javascript
// Sample usage, all options specified
import {build} from '@localnerve/web-component-build';
const outputDir = 'some/path/output';const result = await build(outputDir, {
cssPath: '/some/path/file.css',
cssLinkHref: '//some/path/file.css',
jsPath: '/some/path/file.js',
htmlPath: '/some/path/file.html',
jsReplacement: '__REPLACEMENT_IN_JS__',
terserOptions: { /* terser options */ },
htmlminOptions: { /* html-minifier options */ },
cleancssOptions: { /* clean-css options */ },
minifySkip: false
});
// html, js, and css written to `outputDir`
// Retrieve processed content
const [js, css, html] = await Promise.all([
result.getJs(), result.getCss(), result.getHtml()
]);// Retrieve output paths
const [jsPath, cssPath, htmlPath] = [result.jsPath, result.cssPath, result.htmlPath];
```## API
This library exports a single function that takes an output directory and processing options, returns a [result](#result-object) object.
```
build (outputDir, options): Result
```### outputDir {String}, required
Full path to the output directory where css, html, and javascript output are written.### Options {Object}, optional*
\* Not really. One or more of `cssPath`, `jsPath`, and/or `htmlPath` **must** be supplied. They have no default, so if no options are supplied, this library throws an exception.* **cssPath** {String} - Full path to the input css file
If supplied:
+ css will be minified using `cleancssOptions`
+ css will be wrapped in a `style` tag
+ css will be inserted into the javascript file if `jsReplacement` and `jsPath` are supplied and no `htmlPath` supplied
+ css will be prepended to the html file if `htmlPath` is supplied
* **cssLinkHref** {String} - link href to a stylesheet resource to be referenced by the web component
If supplied:
+ href will be wrapped in a `link` tag
+ resulting `link` will be prepended to the html file if `htmlPath` supplied
+ resulting `link` will be inserted into the javascript file if no `htmlPath` supplied and `jsReplacement` and `jsPath` supplied
* **htmlPath** {String} - Full path to the input html file
If supplied:
+ css will be prepended in a `style` tag
+ cssLinkHref will be prepended in a `link` tag
+ html will be inserted into the javascript file if `jsReplacement` and `jsPath` is supplied
* **jsPath** {String} - Full path to the input javascript file
* **jsReplacement** {String|RegExp} - The replacement pattern for the css or html in the javascript file. See [pattern](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#pattern) for full documentation
If supplied:
+ A replacement will be attempted in the javascript file, `jsPath` must also be supplied
+ If **not supplied** or falsy, No replacement will be attempted and all assets are just copied to `outputDir`
* **terserOptions** {Object} - The [javascript minifier options](https://github.com/terser/terser/blob/master/README.md#minify-options) object
Defaults:
```
{
ecma: 2022
}
```
* **htmlminOptions** {Object} - The [html minifier options](https://github.com/terser/html-minifier-terser?tab=readme-ov-file#options-quick-reference) object
Defaults:
```
{
minifyJS: true,
minifyCSS: true,
collapseWhitespace: true,
removeAttributeQuotes: true,
removeComments: true
}
```
* **cleancssOptions** {Object} - The [css minifier options](https://github.com/clean-css/clean-css/blob/master/README.md#constructor-options) object
Defaults (same as `clean-css` defaults)
* **minifySkip** {Boolean} - True to skip all minifications, defaults to false### Result {Object}
The output of the build process. Allows access to the output paths and full output content. Format:
+ **cssPath** {String}, The full path to the output css
+ **htmlPath** {String}, The full path to the output html
+ **jsPath** {String}, The full path to the output javascript
+ **getCss** {asyncFunction}, gets the output css
+ **getHtml** {asyncFunction}, gets the output html
+ **getJs** {asyncFunction}, gets the output javascript
## License
* [BSD-3 Clasuse, Alex Grant, LocalNerve](LICENSE.md)