{"version":3,"file":"powerstyl.cjs","sources":["../../src/lib/powerstyl.ts"],"sourcesContent":["import { AdoptedManager, GlobalManager, managerTypes, ScopedManager } from \"./manager.ts\";\n\ninterface Constructor<T, A extends any[] = any[]> {\n  new (...args: A): T;\n}\n\nexport interface StyledFn<Args extends any[], Return, Tag, Values> {\n  (...args: Args): Return;\n  [metadataSymbol]: StyledMetadata<Tag, Values>;\n}\n\nexport interface StyledMetadata<Tag, Values> {\n  tag: Tag;\n  extends: { strings: TemplateStringsArray; values: Values }[];\n  isStatic: boolean;\n}\n\nexport type StyledPartValue<T> = string | number | ((this: T, element: T) => string | number);\n\nexport type NamedElement<K, T> = K extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[K] : T;\n\ntype ApplyStyleOptions =\n  | {\n      type?: \"inline\";\n      manager?: undefined;\n    }\n  | {\n      type?: \"scoped\";\n      manager?: ScopedManager;\n    }\n  | ({\n      type?: \"adopted\";\n      manager?: AdoptedManager;\n    } & Parameters<AdoptedManager[\"applyStyle\"]>[1])\n  | ({\n      type?: \"global\";\n      manager?: GlobalManager;\n    } & Parameters<GlobalManager[\"applyStyle\"]>[1]);\n\nlet globalManager: GlobalManager;\n\nconst styledMap = new WeakMap<HTMLElement, () => void>();\n\nconst metadataSymbol: unique symbol = Symbol();\n\nconst getMetadata = (tag: any): StyledMetadata<any, any[]> => {\n  const tagMetadata = isFunction(tag) ? tag[metadataSymbol] || {} : {};\n  return {\n    isStatic: tagMetadata.isStatic || false,\n    tag: tagMetadata.tag ?? tag,\n    extends: tagMetadata.extends || [],\n  };\n};\n\nconst isFunction = (value: any): value is Function => typeof value === \"function\";\n\nconst functionIsConstructor = (value: Function): value is Constructor<any> => value.prototype?.constructor === value;\n\nconst joinParts = <T>(strings: TemplateStringsArray, values: T[], fn: (arg0: T) => string): string =>\n  values.length ? strings.reduce((acc, cur, i) => acc + cur + (i < values.length ? fn(values[i]) || \"\" : \"\"), \"\") : strings[0];\n\nexport class Powerstyl {\n  createElement<E extends HTMLElement = HTMLElement, A extends any[] = any[], N extends string = string>(\n    tag: N | Constructor<E, A> | ((...args: A) => E),\n    args: A,\n  ): NamedElement<N, E> {\n    if (isFunction(tag)) {\n      if (functionIsConstructor(tag)) {\n        return new tag(...args) as NamedElement<N, E>;\n      }\n      return tag(...args) as NamedElement<N, E>;\n    }\n    return document.createElement(tag) as NamedElement<N, E>;\n  }\n\n  styled<E extends HTMLElement = HTMLElement, A extends any[] = any[], N extends string = string>(\n    tag?: N | Constructor<E, A> | ((...args: A) => E),\n    options: ApplyStyleOptions = {},\n  ): (\n    strings: TemplateStringsArray,\n    ...values: StyledPartValue<NamedElement<N, E>>[]\n  ) => StyledFn<A, NamedElement<N, E>, typeof tag, StyledPartValue<NamedElement<N, E>>[]> {\n    return (strings, ...values) => {\n      const tagMetadata: StyledMetadata<typeof tag, StyledPartValue<NamedElement<N, E>>[]> = getMetadata(tag);\n      const finalTag = tagMetadata.tag;\n      const finalExtends = [...tagMetadata.extends, { strings, values }];\n      const isStatic = tagMetadata.isStatic && !values.some(isFunction);\n\n      const styledFn: StyledFn<A, NamedElement<N, E>, typeof tag, StyledPartValue<NamedElement<N, E>>[]> = (...args: A) => {\n        const element = this.createElement(finalTag, args);\n        options.type ??= element.shadowRoot ? managerTypes.adopted : managerTypes.scoped;\n        options.manager ??= this.getManager(element, options.type);\n\n        const partValueToString = isStatic\n          ? String\n          : (value: StyledPartValue<NamedElement<N, E>>): string => String(isFunction(value) ? value.call(element, element) : value);\n\n        const templateObjectToString = ({ strings, values }) => joinParts(strings, values, partValueToString);\n\n        const updateStyle = () => {\n          this.applyStyle(element, finalExtends.map(templateObjectToString).join(\"\"), options);\n        };\n        updateStyle();\n\n        if (!isStatic) {\n          styledMap.set(element, updateStyle);\n        }\n        return element;\n      };\n\n      styledFn[metadataSymbol] = {\n        tag: finalTag,\n        extends: finalExtends,\n        isStatic,\n      };\n      return styledFn;\n    };\n  }\n\n  applyStyle(element: HTMLElement, cssText: string, options: ApplyStyleOptions = {}): void {\n    const { manager, type, ...restOptions } = options;\n    if (type === managerTypes.inline) {\n      element.style.cssText = cssText;\n      return;\n    }\n    const { css, applyOptions } = manager.prepare(cssText, element);\n    if (applyOptions) {\n      manager.applyStyle(this.transform(css), { ...applyOptions, ...restOptions });\n    }\n  }\n\n  updateStyle(element: HTMLElement): void {\n    styledMap.get(element)?.();\n  }\n\n  transform(s: string): string {\n    return s;\n  }\n\n  getManager(element: HTMLElement, type?: keyof typeof managerTypes): ScopedManager | GlobalManager | AdoptedManager | undefined {\n    switch (type) {\n      case managerTypes.scoped:\n        return new ScopedManager(element);\n      case managerTypes.global:\n        return (globalManager ??= new GlobalManager(document.head));\n      case managerTypes.adopted:\n        return new AdoptedManager(element);\n    }\n  }\n}\n\nexport const mixin = <T extends (...args: any[]) => any>(styler0: T, ...stylers: any[]): T => {\n  const result: any = (...a) => styler0(...a);\n  const resultMetadata = getMetadata(styler0);\n  for (const arg of stylers) {\n    const argMetadata = getMetadata(arg);\n    resultMetadata.isStatic ||= argMetadata.isStatic;\n    resultMetadata.extends.push(...argMetadata.extends);\n  }\n  result[metadataSymbol] = resultMetadata;\n  return result;\n};\n"],"names":["globalManager","styledMap","metadataSymbol","getMetadata","tagMetadata","isFunction","tag","value","functionIsConstructor","joinParts","values","strings","acc","cur","fn","Powerstyl","args","finalTag","finalExtends","isStatic","styledFn","element","managerTypes","options","partValueToString","templateObjectToString","updateStyle","restOptions","type","cssText","manager","applyOptions","css","s","ScopedManager","GlobalManager","AdoptedManager","mixin","stylers","result","a","styler0","resultMetadata","arg","argMetadata"],"mappings":"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"}