domql 2.0.6 → 2.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +208 -0
  2. package/package.json +53 -20
  3. package/packages/cookie/index.js +22 -0
  4. package/packages/emotion/index.js +35 -0
  5. package/packages/object/index.js +29 -0
  6. package/packages/object/package.json +20 -0
  7. package/packages/routeLink/index.js +23 -0
  8. package/packages/router/index.js +18 -0
  9. package/src/element/assign.js +22 -0
  10. package/src/element/cache.js +52 -0
  11. package/src/element/create.js +144 -0
  12. package/src/element/createNode.js +92 -0
  13. package/src/element/createProps.js +64 -0
  14. package/src/element/createState.js +51 -0
  15. package/src/element/define.js +13 -0
  16. package/src/element/id.js +10 -0
  17. package/src/element/index.js +34 -0
  18. package/src/element/iterate.js +80 -0
  19. package/src/element/methods.js +96 -0
  20. package/src/element/mixins/attr.js +18 -0
  21. package/src/element/mixins/classList.js +37 -0
  22. package/src/element/mixins/content.js +17 -0
  23. package/src/element/mixins/data.js +21 -0
  24. package/src/element/mixins/html.js +17 -0
  25. package/src/element/mixins/index.js +23 -0
  26. package/src/element/mixins/registry.js +55 -0
  27. package/src/element/mixins/state.js +16 -0
  28. package/src/element/mixins/style.js +14 -0
  29. package/src/element/mixins/text.js +19 -0
  30. package/src/element/nodes.js +139 -0
  31. package/src/element/parse.js +17 -0
  32. package/src/element/proto.js +66 -0
  33. package/src/element/root.js +10 -0
  34. package/src/element/set.js +46 -0
  35. package/src/element/tree.js +5 -0
  36. package/src/element/update.js +100 -0
  37. package/src/event/can.js +10 -0
  38. package/src/event/index.js +11 -0
  39. package/src/event/is.js +13 -0
  40. package/src/event/on.js +33 -0
  41. package/src/event/store.js +6 -0
  42. package/src/event/wrappers.js +14 -0
  43. package/src/index.js +16 -0
  44. package/src/utils/index.js +6 -0
  45. package/src/utils/node.js +10 -0
  46. package/src/utils/object.js +193 -0
  47. package/src/utils/protoUtils.js +119 -0
  48. package/src/utils/report.js +62 -0
  49. package/allExports.js +0 -17
  50. package/index.js +0 -15
@@ -0,0 +1,92 @@
1
+ 'use strict'
2
+
3
+ import create from './create'
4
+ import cacheNode from './cache'
5
+ import * as on from '../event/on'
6
+
7
+ import { isFunction, isObject } from '../utils'
8
+ import {
9
+ throughInitialDefine,
10
+ throughInitialExec,
11
+ applyEvents
12
+ } from './iterate'
13
+ import { registry } from './mixins'
14
+ import { isMethod } from './methods'
15
+ // import { defineSetter } from './methods'
16
+
17
+ const ENV = process.env.NODE_ENV
18
+
19
+ // const defineSetter = (element, key) => Object.defineProperty(element, key, {
20
+ // get: function () {
21
+ // console.log('GET', key)
22
+ // return element.__data[key]
23
+ // },
24
+ // set: function (new_value) {
25
+ // console.log('SET', key, new_value)
26
+ // element.__data[key] = new_value
27
+ // element.__data['modified'] = (new Date()).getTime()
28
+ // }
29
+ // })
30
+
31
+ const createNode = (element) => {
32
+ // create and assign a node
33
+ let { node, tag } = element
34
+
35
+ let isNewNode
36
+
37
+ // console.groupCollapsed('CREATE:')
38
+ // console.log(element)
39
+ // console.groupEnd('CREATE:')
40
+
41
+ if (!node) {
42
+ isNewNode = true
43
+
44
+ if (tag === 'shadow') {
45
+ node = element.node = element.parent.node.attachShadow({ mode: 'open' })
46
+ } else node = element.node = cacheNode(element)
47
+
48
+ // run `on.attachNode`
49
+ if (element.on && isFunction(element.on.attachNode)) {
50
+ on.attachNode(element.on.attachNode, element, element.state)
51
+ }
52
+ }
53
+
54
+ // node.dataset // .key = element.key
55
+
56
+ if (ENV === 'test' || ENV === 'development') {
57
+ node.ref = element
58
+ if (isFunction(node.setAttribute)) node.setAttribute('key', element.key)
59
+ }
60
+
61
+ // iterate through all given params
62
+ if (element.tag !== 'string' || element.tag !== 'fragment') {
63
+ // iterate through define
64
+ if (isObject(element.define)) throughInitialDefine(element)
65
+
66
+ // iterate through exec
67
+ throughInitialExec(element)
68
+
69
+ // apply events
70
+ if (isNewNode && isObject(element.on)) applyEvents(element)
71
+
72
+ for (const param in element) {
73
+ const prop = element[param]
74
+
75
+ if (isMethod(param) || isObject(registry[param]) || prop === undefined) continue
76
+
77
+ const hasDefined = element.define && element.define[param]
78
+ const ourParam = registry[param]
79
+
80
+ if (ourParam) { // Check if param is in our method registry
81
+ if (isFunction(ourParam)) ourParam(prop, element, node)
82
+ } else if (element[param] && !hasDefined) {
83
+ create(prop, element, param) // Create element
84
+ }
85
+ }
86
+ }
87
+
88
+ // node.dataset.key = key
89
+ return element
90
+ }
91
+
92
+ export default createNode
@@ -0,0 +1,64 @@
1
+ 'use strict'
2
+
3
+ import { deepClone, deepMerge, exec, isArray } from '../utils'
4
+
5
+ const initProps = (element, parent) => {
6
+ const propsStack = []
7
+ if (element.props) propsStack.push(element.props)
8
+
9
+ if (isArray(element.__proto)) {
10
+ element.__proto.map(proto => {
11
+ if (proto.props) propsStack.push(proto.props)
12
+ return proto.props
13
+ })
14
+ }
15
+
16
+ return propsStack
17
+ }
18
+
19
+ const inheritProps = (element, parent) => {
20
+ element.props = (parent && parent.props) || { update, __element: element }
21
+ }
22
+
23
+ export const syncProps = (props, element) => {
24
+ element.props = {}
25
+ const mergedProps = { update, __element: element }
26
+ props.forEach(v => {
27
+ if (v === 'update' || v === '__element') return
28
+ element.props = deepMerge(mergedProps, deepClone(exec(v, element)))
29
+ })
30
+ element.props = mergedProps
31
+ return element.props
32
+ }
33
+
34
+ const createProps = function (element, parent, cached) {
35
+ const propsStack = cached || initProps(element, parent)
36
+
37
+ if (propsStack.length) {
38
+ element.__props = propsStack
39
+ syncProps(propsStack, element)
40
+ element.props.update = update
41
+ } else inheritProps(element, parent)
42
+
43
+ return element
44
+ }
45
+
46
+ export const updateProps = (newProps, element, parent) => {
47
+ let propsStack = element.__props
48
+
49
+ if (newProps) propsStack = element.__props = [].concat(newProps, propsStack)
50
+
51
+ if (propsStack) syncProps(propsStack, element)
52
+ else inheritProps(element, parent)
53
+
54
+ // console.log(cachedProps)
55
+ return element
56
+ }
57
+
58
+ function update (props) {
59
+ const element = this.__element
60
+ // element.update({ props })
61
+ element.update()
62
+ }
63
+
64
+ export default createProps
@@ -0,0 +1,51 @@
1
+ 'use strict'
2
+
3
+ import { on } from '../event'
4
+ import { deepClone, exec, isFunction, overwriteDeep } from '../utils'
5
+
6
+ export const parseState = function () {
7
+ const state = this
8
+ const parseState = {}
9
+ for (const param in state) {
10
+ if (param !== '__element' && param !== 'update' && param !== 'parse') {
11
+ parseState[param] = state[param]
12
+ }
13
+ }
14
+ return parseState
15
+ }
16
+
17
+ export const updateState = function (obj, options = {}) {
18
+ const state = this
19
+ const element = state.__element
20
+
21
+ // run `on.stateUpdated`
22
+ if (element.on && isFunction(element.on.initStateUpdated)) {
23
+ on.initStateUpdated(element.on.initStateUpdated, element, state)
24
+ }
25
+
26
+ overwriteDeep(state, obj, ['update', 'parse', '__element'])
27
+ if (!options.preventUpdate) element.update()
28
+
29
+ // run `on.stateUpdated`
30
+ if (element.on && isFunction(element.on.stateUpdated)) {
31
+ on.stateUpdated(element.on.stateUpdated, element, state)
32
+ }
33
+ }
34
+
35
+ export default function (element, parent) {
36
+ let { state } = element
37
+ if (!state) return (parent && parent.state) || {}
38
+ if (isFunction(state)) state = exec(state, element)
39
+
40
+ state = deepClone(state, ['update', 'parse', '__element'])
41
+ state.__element = element
42
+ state.parse = parseState
43
+ state.update = updateState
44
+
45
+ // run `on.stateCreated`
46
+ if (element.on && isFunction(element.on.stateCreated)) {
47
+ on.stateCreated(element.on.stateCreated, element, element.state)
48
+ }
49
+
50
+ return state
51
+ }
@@ -0,0 +1,13 @@
1
+ 'use strict'
2
+
3
+ import { registry } from './mixins'
4
+ import { report } from '../utils'
5
+
6
+ export default (params, options = {}) => {
7
+ const { overwrite } = options
8
+ for (const param in params) {
9
+ if (registry[param] && !overwrite) {
10
+ report('OverwriteToBuiltin', param)
11
+ } else registry[param] = params[param]
12
+ }
13
+ }
@@ -0,0 +1,10 @@
1
+ 'use strict'
2
+
3
+ const createID = function * () {
4
+ let index = 1
5
+ while (index < index + 1) {
6
+ yield index++
7
+ }
8
+ }
9
+
10
+ export default createID()
@@ -0,0 +1,34 @@
1
+ 'use strict'
2
+
3
+ import nodes from './nodes'
4
+ import root from './root'
5
+ import tree from './tree'
6
+ import cache from './cache'
7
+ import create from './create'
8
+ import createNode from './createNode'
9
+ import * as assign from './assign'
10
+ import define from './define'
11
+ import update from './update'
12
+ import parse from './parse'
13
+ import set from './set'
14
+
15
+ import { lookup, remove, get, log, keys } from './methods'
16
+
17
+ export {
18
+ nodes,
19
+ root,
20
+ tree,
21
+ cache,
22
+ create,
23
+ createNode,
24
+ assign,
25
+ define,
26
+ remove,
27
+ update,
28
+ parse,
29
+ lookup,
30
+ set,
31
+ get,
32
+ log,
33
+ keys
34
+ }
@@ -0,0 +1,80 @@
1
+ 'use strict'
2
+
3
+ import { exec, isFunction, isNumber, isString, overwrite } from '../utils'
4
+ import { isMethod } from './methods'
5
+
6
+ export const applyEvents = element => {
7
+ const { node, on } = element
8
+ for (const param in on) {
9
+ if (
10
+ param === 'init' ||
11
+ param === 'render' ||
12
+ param === 'update'
13
+ ) continue
14
+
15
+ const appliedFunction = element.on[param]
16
+ if (isFunction(appliedFunction)) {
17
+ node.addEventListener(param, event =>
18
+ appliedFunction(event, element, element.state),
19
+ true)
20
+ }
21
+ }
22
+ }
23
+
24
+ export const throughInitialExec = element => {
25
+ for (const param in element) {
26
+ const prop = element[param]
27
+ if (isFunction(prop) && !isMethod(param)) {
28
+ element.__exec[param] = prop
29
+ element[param] = prop(element, element.state)
30
+ }
31
+ }
32
+ }
33
+
34
+ export const throughUpdatedExec = (element, options) => {
35
+ const { __exec } = element
36
+ const changes = {}
37
+
38
+ for (const param in __exec) {
39
+ const prop = element[param]
40
+ const newExec = __exec[param](element, element.state)
41
+
42
+ // if element is string
43
+ if (prop && prop.node && (isString(newExec) || isNumber(newExec))) {
44
+ overwrite(prop, { text: newExec }, options)
45
+ } else if (newExec !== prop) {
46
+ element.__cached[param] = changes[param] = prop
47
+ element[param] = newExec
48
+ }
49
+ }
50
+
51
+ return changes
52
+ }
53
+
54
+ export const throughInitialDefine = element => {
55
+ const { define } = element
56
+ for (const param in define) {
57
+ let prop = element[param]
58
+
59
+ if (isFunction(prop) && !isMethod(param)) {
60
+ element.__exec[param] = prop
61
+ element[param] = prop = exec(prop, element)
62
+ }
63
+
64
+ element.__cached[param] = prop
65
+ element[param] = define[param](prop, element, element.state)
66
+ }
67
+ return element
68
+ }
69
+
70
+ export const throughUpdatedDefine = element => {
71
+ const { define, __exec } = element
72
+ const changes = {}
73
+ for (const param in define) {
74
+ const execParam = __exec[param]
75
+ if (execParam) element.__cached[param] = execParam(element, element.state)
76
+ const cached = exec(element.__cached[param], element)
77
+ element[param] = define[param](cached, element, element.state)
78
+ }
79
+ return changes
80
+ }
@@ -0,0 +1,96 @@
1
+ 'use strict'
2
+
3
+ import { isObject, isObjectLike } from '../utils'
4
+ import { registry } from './mixins'
5
+
6
+ // TODO: update these files
7
+ export const lookup = function (key) {
8
+ const element = this
9
+ let { parent } = element
10
+
11
+ while (parent.key !== key) {
12
+ parent = parent.parent
13
+ if (!parent) return
14
+ }
15
+
16
+ return parent
17
+ }
18
+
19
+ export const remove = function (params) {
20
+ const element = this
21
+ element.node.remove()
22
+ delete element.parent[element.key]
23
+ }
24
+
25
+ export const get = function (param) {
26
+ const element = this
27
+ return element[param]
28
+ }
29
+
30
+ export const set = function () {
31
+ }
32
+
33
+ export const update = function () {
34
+ }
35
+
36
+ export const defineSetter = (element, key, get, set) =>
37
+ Object.defineProperty(element, key, { get, set })
38
+
39
+ export const keys = function () {
40
+ const element = this
41
+ const keys = []
42
+ for (const param in element) {
43
+ if (!isObject(registry[param])) {
44
+ keys.push(param)
45
+ }
46
+ }
47
+ return keys
48
+ }
49
+
50
+ export const parse = function () {
51
+ const element = this
52
+ const obj = {}
53
+ const keys = element.keys()
54
+ keys.forEach(v => (obj[v] = element[v]))
55
+ return obj
56
+ }
57
+
58
+ export const parseDeep = function (param) {
59
+ const element = this
60
+ const orig = param || element
61
+ const obj = {}
62
+ const keys = orig.keys && orig.keys()
63
+ if (!keys) return
64
+ keys.forEach(v => {
65
+ const prop = orig[v]
66
+ if (isObjectLike(prop)) parseDeep(prop)
67
+ else obj[v] = prop
68
+ })
69
+ return obj
70
+ }
71
+
72
+ export const log = function (...args) {
73
+ const element = this
74
+ console.group(element.key)
75
+ if (args.length) {
76
+ args.forEach(v => console.log(`%c${v}:\n`, 'font-weight: bold', element[v]))
77
+ } else {
78
+ console.log(element.path)
79
+ const keys = element.keys()
80
+ keys.forEach(v => console.log(`%c${v}:\n`, 'font-weight: bold', element[v]))
81
+ }
82
+ console.groupEnd(element.key)
83
+ return element
84
+ }
85
+
86
+ export const isMethod = function (param) {
87
+ return param === 'set' ||
88
+ param === 'update' ||
89
+ param === 'remove' ||
90
+ param === 'lookup' ||
91
+ param === 'keys' ||
92
+ param === 'parse' ||
93
+ param === 'parseDeep' ||
94
+ param === 'if' ||
95
+ param === 'log'
96
+ }
@@ -0,0 +1,18 @@
1
+ 'use strict'
2
+
3
+ import { exec, report } from '../../utils'
4
+
5
+ /**
6
+ * Recursively add attributes to a DOM node
7
+ */
8
+ export default (params, element, node) => {
9
+ if (params) {
10
+ if (!(typeof params === 'object')) report('HTMLInvalidAttr', params)
11
+ for (const attr in params) {
12
+ // if (!node) node = element.node
13
+ const val = exec(params[attr], element)
14
+ if (val && node.setAttribute) node.setAttribute(attr, val)
15
+ else if (node.removeAttribute) node.removeAttribute(attr)
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,37 @@
1
+ 'use strict'
2
+
3
+ import { exec, isObject, isString } from '../../utils'
4
+
5
+ export const assignClass = (element) => {
6
+ const { key } = element
7
+ if (element.class === true) element.class = key
8
+ else if (!element.class && typeof key === 'string' && key.charAt(0) === '_' && key.charAt(1) !== '_') {
9
+ element.class = key.slice(1)
10
+ }
11
+ }
12
+
13
+ // stringifies class object
14
+ export const classify = (obj, element) => {
15
+ let className = ''
16
+ for (const item in obj) {
17
+ const param = obj[item]
18
+ if (typeof param === 'boolean' && param) className += ` ${item}`
19
+ else if (typeof param === 'string') className += ` ${param}`
20
+ else if (typeof param === 'function') {
21
+ className += ` ${exec(param, element)}`
22
+ }
23
+ }
24
+ return className
25
+ }
26
+
27
+ export default (params, element, node) => {
28
+ if (!params) return
29
+ const { key } = element
30
+ if (params === true) params = element.class = { key }
31
+ if (isString(params)) params = element.class = { default: params }
32
+ if (isObject(params)) params = classify(params, element)
33
+ // TODO: fails on string
34
+ const className = params.replace(/\s+/g, ' ').trim()
35
+ node.classList = className
36
+ return className
37
+ }
@@ -0,0 +1,17 @@
1
+ 'use strict'
2
+
3
+ import set from '../set'
4
+
5
+ /**
6
+ * Appends anything as content
7
+ * an original one as a child
8
+ */
9
+ export default (param, element, node) => {
10
+ if (param && element) {
11
+ if (param.__hash === element.content.__hash && element.content.update) {
12
+ element.content.update(param)
13
+ } else {
14
+ set.call(element, param)
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,21 @@
1
+ 'use strict'
2
+
3
+ import { exec, isObject } from '../../utils'
4
+ import Report from '../../utils/report'
5
+
6
+ /**
7
+ * Apply data parameters on the DOM nodes
8
+ * this should only work if `showOnNode: true` is passed
9
+ */
10
+ export default (params, element, node) => {
11
+ if (params && params.showOnNode) {
12
+ if (!isObject(params)) Report('HTMLInvalidData', params)
13
+
14
+ // Apply data params on node
15
+ for (const dataset in params) {
16
+ if (dataset !== 'showOnNode') {
17
+ node.dataset[dataset] = exec(params[dataset], element)
18
+ }
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,17 @@
1
+ 'use strict'
2
+
3
+ import { exec } from '../../utils'
4
+
5
+ /**
6
+ * Appends raw HTML as content
7
+ * an original one as a child
8
+ */
9
+ export default (param, element, node) => {
10
+ const prop = exec(param, element)
11
+ if (prop) {
12
+ // const parser = new window.DOMParser()
13
+ // param = parser.parseFromString(param, 'text/html')
14
+ if (node.nodeName === 'SVG') node.textContent = prop
15
+ else node.innerHTML = prop
16
+ }
17
+ }
@@ -0,0 +1,23 @@
1
+ 'use strict'
2
+
3
+ import attr from './attr'
4
+ import classList from './classList'
5
+ import content from './content'
6
+ import data from './data'
7
+ import html from './html'
8
+ import style from './style'
9
+ import text from './text'
10
+ import state from './state'
11
+ import registry from './registry'
12
+
13
+ export {
14
+ attr,
15
+ classList,
16
+ content,
17
+ data,
18
+ style,
19
+ text,
20
+ html,
21
+ state,
22
+ registry
23
+ }
@@ -0,0 +1,55 @@
1
+ 'use strict'
2
+
3
+ import {
4
+ attr,
5
+ style,
6
+ text,
7
+ html,
8
+ content,
9
+ data,
10
+ classList,
11
+ state
12
+ } from '.'
13
+
14
+ export default {
15
+ attr,
16
+ style,
17
+ text,
18
+ html,
19
+ content,
20
+ data,
21
+ class: classList,
22
+ state,
23
+
24
+ proto: {},
25
+ props: {},
26
+ path: {},
27
+ childProto: {},
28
+ if: {},
29
+ define: {},
30
+ transform: {},
31
+ __hash: {},
32
+ __cached: {},
33
+ __defined: {},
34
+ __exec: {},
35
+ __changes: {},
36
+ __trash: {},
37
+ __root: {},
38
+ __props: {},
39
+ __proto: {},
40
+ __ifFragment: {},
41
+ __ifFalsy: {},
42
+ key: {},
43
+ tag: {},
44
+ parent: {},
45
+ node: {},
46
+ set: {},
47
+ update: {},
48
+ remove: {},
49
+ lookup: {},
50
+ keys: {},
51
+ log: {},
52
+ parse: {},
53
+ parseDeep: {},
54
+ on: {}
55
+ }
@@ -0,0 +1,16 @@
1
+ 'use strict'
2
+
3
+ import { exec, isObject } from '../../utils'
4
+
5
+ export default (params, element, node) => {
6
+ const state = exec(params, element)
7
+
8
+ if (isObject(state)) {
9
+ for (const param in state) {
10
+ if (param === 'update' || param === '__element' || param === 'parse') continue
11
+ element.state[param] = exec(state[param], element)
12
+ }
13
+ }
14
+
15
+ return element
16
+ }
@@ -0,0 +1,14 @@
1
+ 'use strict'
2
+
3
+ import { isObject, map } from '../../utils'
4
+ import { report } from '../../utils/report'
5
+
6
+ /**
7
+ * Recursively add styles to a DOM node
8
+ */
9
+ export default (params, element, node) => {
10
+ if (params) {
11
+ if (isObject(params)) map(node.style, params, element)
12
+ else report('HTMLInvalidStyles', params)
13
+ }
14
+ }
@@ -0,0 +1,19 @@
1
+ 'use strict'
2
+
3
+ import { create } from '..'
4
+ import { exec } from '../../utils'
5
+
6
+ /**
7
+ * Creates a text node and appends into
8
+ * an original one as a child
9
+ */
10
+ export default (param, element, node) => {
11
+ const prop = exec(param, element)
12
+ if (element.tag === 'string') node.nodeValue = prop
13
+ else if (param) {
14
+ if (element.__text) {
15
+ element.__text.text = prop
16
+ if (element.__text.node) element.__text.node.nodeValue = prop
17
+ } else create({ tag: 'string', text: prop }, element, '__text')
18
+ }
19
+ }