winston0410/camouflage

View on GitHub
src/index.ts

Summary

Maintainability
A
3 hrs
Test Coverage
B
85%
'use strict'

import { isBrowser } from 'is-in-browser'
import joli from '@blackblock/joli-string'
import { isProduction } from './helper'
import { Renderer } from './type'

const create = function (config: Renderer): Renderer {
    const renderer = {
        raw: '',
        pfx: '',
        client: isBrowser,
        hasher: joli,
        hashChars: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_',
        ...config
    }

    renderer.hash = renderer.hasher(renderer.hashChars)

    if (renderer.client) {
        if (!renderer.sh) {
            renderer.sh = document.createElement('style')
            document.head.appendChild(renderer.sh)
        }

        if (!isProduction) {
            renderer.sh.setAttribute('data-css-dev', '')
        }
    }

    if (renderer.client) {
        renderer.putRaw = function (rawCssRule: string): void {
            if (isProduction) {
                const sheet = renderer.sh.sheet
                // await console.log('from microtask')
                try {
                    sheet.insertRule(rawCssRule, sheet.cssRules.length)
                } catch (error) {
                    console.log(error)
                }
            } else {
                renderer.sh.appendChild(document.createTextNode(rawCssRule))
            }
        }
    } else {
        renderer.putRaw = function (rawCssRule: string): void {
            renderer.raw += rawCssRule
        }
    }

    return renderer
}

export { create }

export { default as virtual } from './addon/virtual'
export { default as prefixer } from './addon/prefixer'
export { default as hydration } from './addon/hydration'
export { default as keyframes } from './addon/keyframes'