import * as glassEasel from 'glass-easel'
import { tmpl } from './base/env'
import { MiniProgramEnv } from '../src'
const domHtml = (elem: glassEasel.Element): string => {
const domElem = elem.getBackendElement() as unknown as Element
return domElem.innerHTML
}
describe('env', () => {
test('add global components', () => {
const env = new MiniProgramEnv()
const globalCodeSpace = env.getGlobalCodeSpace()
const def = globalCodeSpace
.getComponentSpace()
.define('external')
.options({
virtualHost: true,
})
.template(
tmpl(`
`),
)
.registerComponent()
const codeSpace = env.createCodeSpace('', true)
codeSpace.getComponentSpace().setGlobalUsingComponent('external', def)
codeSpace.addComponentStaticConfig('path/to/comp', {
usingComponents: {
external: 'external',
},
})
codeSpace.addCompiledTemplate(
'path/to/comp',
tmpl(`
`),
)
codeSpace.componentEnv('path/to/comp', ({ Component }) => {
Component().register()
})
const backend = new glassEasel.CurrentWindowBackendContext()
const ab = env.associateBackend(backend)
const root = ab.createRoot('body', codeSpace, 'path/to/comp')
expect(domHtml(root.getComponent())).toBe(
'
',
)
})
test('using behaviors', () => {
const env = new MiniProgramEnv()
const codeSpace = env.createCodeSpace('', true)
codeSpace.addComponentStaticConfig('path/to/comp', {})
codeSpace.addCompiledTemplate(
'path/to/comp',
tmpl(`
{{ num }}
`),
)
codeSpace.componentEnv('path/to/comp', ({ Behavior, Component }) => {
const beh = Behavior({
data: { num: 123 },
methods: {
updateNum() {
this.setData({ num: 456 })
},
},
})
Component().behavior(beh).register()
})
const backend = new glassEasel.CurrentWindowBackendContext()
const ab = env.associateBackend(backend)
const root = ab.createRoot('body', codeSpace, 'path/to/comp')
expect(domHtml(root.getComponent())).toBe('123
')
})
test('multiple code spaces', () => {
const env = new MiniProgramEnv()
const codeSpace = env.createCodeSpace('', true)
const pluginCodeSpace1 = env.createCodeSpace('plugin-1-id', false, {
'outer-comp-1': 'inner-comp-1',
'outer-comp-11': 'inner-comp-1',
})
const pluginCodeSpace2 = env.createCodeSpace('plugin-2-id', false, {
'outer-comp-2': 'inner-comp-2',
})
expect(env.getCodeSpace('plugin-1-id')).toBe(pluginCodeSpace1)
expect(env.getCodeSpace('plugin-2-id')).toBe(pluginCodeSpace2)
expect(pluginCodeSpace1.isMainSpace()).toBe(false)
codeSpace.importCodeSpace('plugin-1-id', 'plugin-1')
codeSpace.importCodeSpace('plugin-2-id', undefined, true)
expect(codeSpace.isMainSpace()).toBe(true)
pluginCodeSpace1.addCompiledTemplate('inner-comp-1', tmpl('A'))
pluginCodeSpace1.addStyleSheet('inner-comp-1', undefined, 'c1')
pluginCodeSpace1.componentEnv('inner-comp-1', ({ Component }) => {
Component().register()
})
pluginCodeSpace2.addCompiledTemplate('inner-comp-2', tmpl('B'))
pluginCodeSpace2.addStyleSheet('inner-comp-2', undefined, 'c2')
pluginCodeSpace2.componentEnv('inner-comp-2', ({ Component }) => {
Component().register()
})
codeSpace.addComponentStaticConfig('path/to/comp', {
usingComponents: {
'c-a': 'plugin://plugin-1/outer-comp-1',
'c-aa': 'plugin://plugin-1/outer-comp-11',
'i-a': 'plugin-private://plugin-1-id/inner-comp-1',
'i-b': 'plugin://plugin-2/outer-comp-2',
'c-b': 'plugin-private://plugin-2-id/inner-comp-2',
},
})
codeSpace.addCompiledTemplate(
'path/to/comp',
tmpl(`
`),
)
codeSpace.componentEnv('path/to/comp', ({ Component }) => {
Component().register()
})
codeSpace.componentEnv('', ({ Component }) => {
Component().register()
})
const backend = new glassEasel.CurrentWindowBackendContext()
const ab = env.associateBackend(backend)
const root = ab.createRoot('body', codeSpace, 'path/to/comp')
expect(domHtml(root.getComponent())).toBe(
'AAB',
)
})
})