Skip to content

Commit

Permalink
resolve #13
Browse files Browse the repository at this point in the history
  • Loading branch information
loreanvictor committed Jul 3, 2023
1 parent 3b8c0c9 commit f7d79a0
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 18 deletions.
23 changes: 18 additions & 5 deletions jest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,27 @@ export default {
preset: 'ts-jest',
verbose: true,
clearMocks: true,
testEnvironment: 'jsdom',
testEnvironmentOptions: {
url: 'http://localhost',
},
testMatch: ['**/test/**/*.test.[jt]s?(x)'],
projects: [
{
displayName: 'browser',
preset: 'ts-jest',
testEnvironment: 'jsdom',
testEnvironmentOptions: {
url: 'http://localhost',
},
testMatch: ['**/test/**/*.test.[jt]s?(x)'],
},
{
displayName: 'node',
preset: 'ts-jest',
testEnvironment: 'node',
testMatch: ['**/test/**/*.ssr-test.[jt]s?(x)'],
}
],
collectCoverageFrom: [
'src/**/*.{ts,tsx}',
'!src/**/*.test.{ts,tsx}',
'!src/**/*.ssr-test.{ts,tsx}',
],
coverageThreshold: {
global: {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "minicomp",
"version": "0.3.4",
"version": "0.3.5",
"description": "Minimalistic library for creating Web Components",
"main": "dist/commonjs/index.js",
"module": "dist/es/index.js",
Expand Down
38 changes: 28 additions & 10 deletions src/define.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,38 +3,56 @@ import { ComponentOptions, component, FunctionalComponent } from './component'

export type DefinitionOptions = ComponentOptions & ElementDefinitionOptions

export type DefinableCompoennt = {
export type DefinableCompoent = {
tag: string
component: FunctionalComponent
options?: DefinitionOptions
}


export function define(comp: DefinableCompoennt): void
export function define(comp: DefinableCompoent, options?: DefinitionOptions): void
export function define(tag: string, fn: FunctionalComponent, options?: DefinitionOptions): void
export function define(
tag: string | DefinableCompoennt,
fn?: FunctionalComponent,
tag: string | DefinableCompoent,
fn?: FunctionalComponent | DefinitionOptions,
options?: DefinitionOptions
) {
if (typeof tag === 'string') {
(options?.window?.customElements ?? customElements)
.define(tag, component(fn as FunctionalComponent, options), options)
const registry = options?.window?.customElements ?? customElements
registry.define(tag, component(fn as FunctionalComponent, options), options)
} else {
((fn as ComponentOptions)?.window?.customElements ?? customElements)
.define(tag.tag, component(tag.component, tag.options), tag.options)
const opts: DefinitionOptions = {
...tag.options,
...fn,
}
const registry = opts.window?.customElements ?? customElements
registry.define(tag.tag, component(tag.component, opts), tag.options)
}
}


export function definable(tag: string, fn: FunctionalComponent, options?: ComponentOptions): DefinableCompoennt {
export function definable(tag: string, fn: FunctionalComponent, options?: ComponentOptions): DefinableCompoent {
return { tag, component: fn, options }
}


export function using(options: DefinitionOptions) {
function _define(comp: DefinableCompoent, opts?: DefinitionOptions): void
function _define(tag: string, fn: FunctionalComponent, opts?: DefinitionOptions): void
function _define(
tag: string | DefinableCompoent,
fn?: FunctionalComponent | DefinitionOptions,
opts?: DefinitionOptions
) {
if (typeof tag === 'string') {
define(tag, fn as FunctionalComponent, { ...options, ...opts })
} else {
define(tag, { ...options, ...fn })
}
}

return {
define: (tag: string, fn: FunctionalComponent) => define(tag, fn, options),
define: _define,
component: (fn: FunctionalComponent) => component(fn, options),
}
}
20 changes: 20 additions & 0 deletions src/test/define.ssr-test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
jest.mock('htm/mini', () => require('htm/mini/index.umd.js'))


import { JSDOM } from 'jsdom'
import { using, define, definable } from '../define'


describe(define, () => {
test('defines defineables in ssr environment.', () => {
const Comp = definable('ssr-1', () => '<div>Hellow World!</div>')

const window = new JSDOM().window as any
using({ window }).define(Comp)

window.document.body.innerHTML = '<ssr-1></ssr-1>'
const el = window.document.querySelector('ssr-1')
expect(el.shadowRoot!.innerHTML).toBe('<div>Hellow World!</div>')
})
})

4 changes: 2 additions & 2 deletions src/test/exports.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {
define, definable, DefinableCompoennt, PropableElement,
define, definable, DefinableCompoent, PropableElement,
onConnected, onDisconnected, onAttributeChanged, onAdopted, onRendered,
onPropertyChanged, currentNode, hooksMeta, ownerDocument,
ATTRIBUTE_REMOVED, onAttribute, onProperty, onCleanup, on,
Expand All @@ -10,7 +10,7 @@ import {
test('stuff are exported properly.', () => {
expect(define).toBeDefined()
expect(definable).toBeDefined()
expect(<DefinableCompoennt>{}).toBeDefined()
expect(<DefinableCompoent>{}).toBeDefined()

expect(onConnected).toBeDefined()
expect(onDisconnected).toBeDefined()
Expand Down

0 comments on commit f7d79a0

Please sign in to comment.