@cocreate/api 1.19.1 → 1.20.0
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.
- package/CHANGELOG.md +19 -0
- package/package.json +1 -1
- package/src/index.js +198 -14
- package/src/client.js +0 -192
- package/src/server.js +0 -20
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
# [1.20.0](https://github.com/CoCreate-app/CoCreate-api/compare/v1.19.2...v1.20.0) (2024-02-03)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* now used in client only ([bad8ddd](https://github.com/CoCreate-app/CoCreate-api/commit/bad8ddd4aac147056e59255ef5de5af984ece845))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* init a module and its attributes using ([1238015](https://github.com/CoCreate-app/CoCreate-api/commit/1238015b42861f3be0488efcf950f5f3717f55e1))
|
|
12
|
+
|
|
13
|
+
## [1.19.2](https://github.com/CoCreate-app/CoCreate-api/compare/v1.19.1...v1.19.2) (2024-02-02)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Bug Fixes
|
|
17
|
+
|
|
18
|
+
* handling of methods ([9807e74](https://github.com/CoCreate-app/CoCreate-api/commit/9807e74983c28482e280edd003ad371344758efa))
|
|
19
|
+
|
|
1
20
|
## [1.19.1](https://github.com/CoCreate-app/CoCreate-api/compare/v1.19.0...v1.19.1) (2024-01-30)
|
|
2
21
|
|
|
3
22
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cocreate/api",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.20.0",
|
|
4
4
|
"description": "A simple api helper component in vanilla javascript used by JavaScript developers to create thirdparty api intergrations. CoCreate-api includes the client component and server side for api processing. Thirdparty apis can be accessible using HTML5 attributes and/or JavaScript API. ",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"thirdparty-api-intergration",
|
package/src/index.js
CHANGED
|
@@ -1,14 +1,198 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
/*globals CustomEvent, config*/
|
|
2
|
+
import { getValueFromObject, dotNotationToObject } from "@cocreate/utils";
|
|
3
|
+
import Observer from "@cocreate/observer";
|
|
4
|
+
import Socket from "@cocreate/socket-client";
|
|
5
|
+
import Actions from '@cocreate/actions';
|
|
6
|
+
import { render } from '@cocreate/render';
|
|
7
|
+
import '@cocreate/element-prototype';
|
|
8
|
+
|
|
9
|
+
const CoCreateApi = {
|
|
10
|
+
modules: {},
|
|
11
|
+
|
|
12
|
+
init: function (moduleConfig) {
|
|
13
|
+
if (!moduleConfig) {
|
|
14
|
+
let elements = document.querySelectorAll('[api], [module]')
|
|
15
|
+
for (let i = 0; i < elements.length; i++) {
|
|
16
|
+
let name = elements[i].getAttribute('api') || elements[i].getAttribute('module')
|
|
17
|
+
this.register({ name, endPoints: {} });
|
|
18
|
+
}
|
|
19
|
+
} else {
|
|
20
|
+
let { name, endPoints, options } = moduleConfig
|
|
21
|
+
this.register({ name, endPoints, options });
|
|
22
|
+
if (options && options.socket !== false && !Socket.sockets.size)
|
|
23
|
+
Socket.create({ prefix: 'api' });
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
register: function ({ name, endPoints, options }) {
|
|
28
|
+
const self = this;
|
|
29
|
+
if (typeof this.modules[name] === 'undefined') {
|
|
30
|
+
this.modules[name] = { name, endPoints, options };
|
|
31
|
+
|
|
32
|
+
Socket.listen(name, (data) => {
|
|
33
|
+
self.response(name, data);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
Actions.init({
|
|
37
|
+
name,
|
|
38
|
+
callback: (action) => {
|
|
39
|
+
action.form = action.form || document
|
|
40
|
+
self.request({ ...action, type: 'action' })
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const inputEvent = (element) => {
|
|
45
|
+
element.addEventListener('input', (e) => {
|
|
46
|
+
if (!e.detail || e.detail && e.detail.skip != true) {
|
|
47
|
+
self.request({ name, element, type: 'input' })
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
let elements = document.querySelectorAll(`[${name}]`)
|
|
53
|
+
for (let i = 0; i < elements.length; i++) {
|
|
54
|
+
inputEvent(elements[i])
|
|
55
|
+
this.request({ name, element: elements[i], type: 'onload' })
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
Observer.init({
|
|
59
|
+
name: `${name}NodeObserver`,
|
|
60
|
+
observe: ['addedNodes'],
|
|
61
|
+
target: `[${name}]`,
|
|
62
|
+
callback: function (mutation) {
|
|
63
|
+
inputEvent(mutation.target)
|
|
64
|
+
self.request({ name, element: mutation.target, type: 'nodeObserver' })
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
Observer.init({
|
|
69
|
+
name: `${name}AttributeObserver`,
|
|
70
|
+
observe: ['attributes'],
|
|
71
|
+
attributeName: [name],
|
|
72
|
+
callback: function (mutation) {
|
|
73
|
+
self.request({ name, element: mutation.target, type: 'attributeObserver' })
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
request: async function (object) {
|
|
81
|
+
if (object.element) {
|
|
82
|
+
if (!object.method)
|
|
83
|
+
object.method = object.element.getAttribute(object.name)
|
|
84
|
+
if (!object.key)
|
|
85
|
+
object.key = object.element.getAttribute(`${object.name}-key`)
|
|
86
|
+
if (!object.event)
|
|
87
|
+
object.event = object.element.getAttribute(`${object.name}-event`)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (this.modules[object.name][object.method] && this.modules[object.name][object.method].request)
|
|
91
|
+
this.modules[object.name][object.method].request(object)
|
|
92
|
+
else if (!object.event && object.type === 'action' || object.event && object.event.includes(object.type)) {
|
|
93
|
+
let data = await CoCreateApi.getData(object);
|
|
94
|
+
CoCreateApi.send(object.name, object.method, data);
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
response: function (name, data) {
|
|
99
|
+
const method = data.method.substring(name.length + 1);
|
|
100
|
+
if (this.modules[name][method] && this.modules[name][method].response)
|
|
101
|
+
this.modules[name][method].response(data[name])
|
|
102
|
+
else if (data.error) {
|
|
103
|
+
render({
|
|
104
|
+
selector: `[template*='${name}']`,
|
|
105
|
+
data: [{
|
|
106
|
+
type: name,
|
|
107
|
+
method,
|
|
108
|
+
status: 'failed',
|
|
109
|
+
message: data.error
|
|
110
|
+
}]
|
|
111
|
+
});
|
|
112
|
+
} else {
|
|
113
|
+
CoCreateApi.setData({ name, method, data })
|
|
114
|
+
|
|
115
|
+
document.dispatchEvent(new CustomEvent(name, {
|
|
116
|
+
detail: {
|
|
117
|
+
data: data[name]
|
|
118
|
+
}
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
send: function (name, method, data) {
|
|
124
|
+
Socket.send({ method: name + '.' + method, [name]: data, broadcastBrowser: false, status: 'await' });
|
|
125
|
+
},
|
|
126
|
+
|
|
127
|
+
// TODO: handle $param operator
|
|
128
|
+
getData: async function ({ name, method, element, form }) {
|
|
129
|
+
const data = {}
|
|
130
|
+
|
|
131
|
+
if (!form && element)
|
|
132
|
+
form = element.closest('form');
|
|
133
|
+
|
|
134
|
+
let elements
|
|
135
|
+
if (form)
|
|
136
|
+
elements = form.querySelectorAll(`[${name}="${method}"]`);
|
|
137
|
+
if (!elements || elements.length == 0)
|
|
138
|
+
elements = [element]
|
|
139
|
+
|
|
140
|
+
for (let i = 0; i < elements.length; i++) {
|
|
141
|
+
if (!elements[i] || elements[i].closest('[template]'))
|
|
142
|
+
continue
|
|
143
|
+
let key = elements[i].getAttribute(`${name}-key`)
|
|
144
|
+
if (key) {
|
|
145
|
+
data[key] = await elements[i].getValue()
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return dotNotationToObject(data);
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
// TODO: handle $param operator
|
|
153
|
+
setData: function ({ name, method, data, form }) {
|
|
154
|
+
if (!form)
|
|
155
|
+
form = document;
|
|
156
|
+
|
|
157
|
+
let elements = form.querySelectorAll(`[${name}="${method}"]`);
|
|
158
|
+
if (!elements || elements.length == 0)
|
|
159
|
+
return
|
|
160
|
+
|
|
161
|
+
for (let i = 0; i < elements.length; i++) {
|
|
162
|
+
let attribute = elements[i].getAttribute(name)
|
|
163
|
+
if (attribute) {
|
|
164
|
+
if (elements[i].hasAttribute('actions')) continue;
|
|
165
|
+
let templateid = elements[i].getAttribute('template_id')
|
|
166
|
+
if (templateid) {
|
|
167
|
+
let items = document.querySelectorAll(`[templateid="${templateid}"]`)
|
|
168
|
+
for (let item of items)
|
|
169
|
+
item.remove()
|
|
170
|
+
render({
|
|
171
|
+
selector: `[template="${templateid}"]`,
|
|
172
|
+
data
|
|
173
|
+
});
|
|
174
|
+
} else {
|
|
175
|
+
let key = elements[i].getAttribute(`${name}-key`)
|
|
176
|
+
let value = getValueFromObject(data[name], key);
|
|
177
|
+
elements[i].setValue(value);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
Observer.init({
|
|
187
|
+
name: `apiNodeObserver`,
|
|
188
|
+
observe: ['addedNodes'],
|
|
189
|
+
target: '[module], [api]',
|
|
190
|
+
callback: function (mutation) {
|
|
191
|
+
let name = mutation.target.getAttribute('api') || mutation.target.getAttribute('module')
|
|
192
|
+
CoCreateApi.register({ name, endPoints: {} });
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
CoCreateApi.init()
|
|
197
|
+
|
|
198
|
+
export default CoCreateApi;
|
package/src/client.js
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
/*globals CustomEvent, config*/
|
|
2
|
-
import { getAttributes, getValueFromObject, dotNotationToObject } from "@cocreate/utils";
|
|
3
|
-
import observer from "@cocreate/observer";
|
|
4
|
-
import socket from "@cocreate/socket-client";
|
|
5
|
-
import action from '@cocreate/actions';
|
|
6
|
-
import { render } from '@cocreate/render';
|
|
7
|
-
import '@cocreate/element-prototype';
|
|
8
|
-
|
|
9
|
-
const CoCreateApi = {
|
|
10
|
-
components: {},
|
|
11
|
-
|
|
12
|
-
init: function ({ name, endPoints, options }) {
|
|
13
|
-
this.register({ name, endPoints, options });
|
|
14
|
-
if (options && options.socket !== false && !socket.sockets.size)
|
|
15
|
-
socket.create({ prefix: 'api' });
|
|
16
|
-
},
|
|
17
|
-
|
|
18
|
-
register: function ({ name, endPoints, options }) {
|
|
19
|
-
const self = this;
|
|
20
|
-
if (typeof this.components[name] === 'undefined') {
|
|
21
|
-
this.components[name] = { name, endPoints, options };
|
|
22
|
-
|
|
23
|
-
socket.listen(name, (data) => {
|
|
24
|
-
self.__response(name, data);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
for (const endPoint of Object.keys(endPoints)) {
|
|
28
|
-
let functions = endPoints[endPoint]
|
|
29
|
-
if (typeof functions.request !== 'function') {
|
|
30
|
-
functions.request = self.__request;
|
|
31
|
-
}
|
|
32
|
-
action.init({
|
|
33
|
-
name: endPoint,
|
|
34
|
-
endEvent: endPoint,
|
|
35
|
-
callback: (data) => {
|
|
36
|
-
let params
|
|
37
|
-
const element = data.element
|
|
38
|
-
let form = element.closest('form') || document
|
|
39
|
-
const selector = `[${name}^="${endPoint}."]`
|
|
40
|
-
let el = form.querySelector(selector)
|
|
41
|
-
if (!el) return
|
|
42
|
-
params = self.parseParams({ name, element: el })
|
|
43
|
-
if (params) {
|
|
44
|
-
functions.request({ name, ...params, element, form, type: 'action' })
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const inputEvent = (element) => {
|
|
51
|
-
const self = this
|
|
52
|
-
element.addEventListener('input', (e) => {
|
|
53
|
-
if (element.hasAttribute(name)) {
|
|
54
|
-
let params = self.parseParams({ name, element })
|
|
55
|
-
if (params) {
|
|
56
|
-
if (!e.detail || e.detail && e.detail.skip != true) {
|
|
57
|
-
endPoints[params.endPoint].request({ name, ...params, element, type: 'input' })
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
let elements = document.querySelectorAll(`[${name}]`)
|
|
65
|
-
for (let element of elements) {
|
|
66
|
-
let params = this.parseParams({ name, element })
|
|
67
|
-
if (params) {
|
|
68
|
-
endPoints[params.endPoint].request({ name, ...params, element, type: 'onload' })
|
|
69
|
-
inputEvent(element)
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
observer.init({
|
|
74
|
-
name: `${name}NodeObserver`,
|
|
75
|
-
observe: ['addedNodes'],
|
|
76
|
-
target: `[${name}]`,
|
|
77
|
-
callback: function (mutation) {
|
|
78
|
-
let params = self.parseParams({ name, element: mutation.target })
|
|
79
|
-
if (params) {
|
|
80
|
-
endPoints[params.endPoint].request({ name, ...params, element: mutation.target, type: 'nodeObserver' });
|
|
81
|
-
inputEvent(mutation.target)
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
observer.init({
|
|
87
|
-
name: `${name}AttributeObserver`,
|
|
88
|
-
observe: ['attributes'],
|
|
89
|
-
attributeName: [name],
|
|
90
|
-
callback: function (mutation) {
|
|
91
|
-
let params = self.parseParams({ name, element: mutation.target })
|
|
92
|
-
if (params) {
|
|
93
|
-
endPoints[params.endPoint].request({ name, ...params, element: mutation.target, type: 'attributeObserver' });
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
},
|
|
99
|
-
|
|
100
|
-
__request: async function ({ name, endPoint, element }) {
|
|
101
|
-
let form = element.closest('form');
|
|
102
|
-
let data = await this.getData({ name, endPoint, form });
|
|
103
|
-
this.send(name, endPoint, data[endPoint]);
|
|
104
|
-
},
|
|
105
|
-
|
|
106
|
-
__response: function (name, data) {
|
|
107
|
-
const { endPoint, response } = data;
|
|
108
|
-
const component = this.components[name];
|
|
109
|
-
const functions = component.endPoints[endPoint]
|
|
110
|
-
if (functions.listen !== false) {
|
|
111
|
-
if (typeof functions.response === 'function') {
|
|
112
|
-
functions.response(response);
|
|
113
|
-
} else
|
|
114
|
-
this.setData({ name, endPoint, data })
|
|
115
|
-
|
|
116
|
-
document.dispatchEvent(new CustomEvent(endPoint, {
|
|
117
|
-
detail: {
|
|
118
|
-
data: response
|
|
119
|
-
}
|
|
120
|
-
}));
|
|
121
|
-
}
|
|
122
|
-
},
|
|
123
|
-
|
|
124
|
-
send: function (name, endPoint, data) {
|
|
125
|
-
let method = name + '.' + endPoint
|
|
126
|
-
socket.send({ method, endPoint, data, broadcastBrowser: false });
|
|
127
|
-
},
|
|
128
|
-
|
|
129
|
-
parseParams: function ({ name, endPoint, element }) {
|
|
130
|
-
let attribute = element.getAttribute(name)
|
|
131
|
-
if (!attribute)
|
|
132
|
-
return false
|
|
133
|
-
|
|
134
|
-
let dotNotation = attribute
|
|
135
|
-
let params = attribute.split('.')
|
|
136
|
-
endPoint = params[0]
|
|
137
|
-
let key = params[1]
|
|
138
|
-
return { endPoint, key, dotNotation, params }
|
|
139
|
-
|
|
140
|
-
},
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
getData: async function ({ name, endPoint, element, form }) {
|
|
144
|
-
const data = {}
|
|
145
|
-
const selector = `[${name}^="${endPoint}."]`
|
|
146
|
-
let elements
|
|
147
|
-
if (form)
|
|
148
|
-
elements = form.querySelectorAll(selector);
|
|
149
|
-
if (!elements || elements.length == 0)
|
|
150
|
-
elements = [element]
|
|
151
|
-
for (let el of elements) {
|
|
152
|
-
if (!el || el.closest('[template]')) continue
|
|
153
|
-
let attribute = el.getAttribute(name)
|
|
154
|
-
if (attribute)
|
|
155
|
-
data[attribute] = await el.getValue()
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
return dotNotationToObject(data);
|
|
159
|
-
},
|
|
160
|
-
|
|
161
|
-
setData: function ({ name, endPoint, data, form }) {
|
|
162
|
-
const selector = `[${name}^="${endPoint}."]`
|
|
163
|
-
if (!form)
|
|
164
|
-
form = document;
|
|
165
|
-
let elements = form.querySelectorAll(selector);
|
|
166
|
-
if (!elements || elements.length == 0) return
|
|
167
|
-
|
|
168
|
-
for (let el of elements) {
|
|
169
|
-
let attribute = el.getAttribute(name)
|
|
170
|
-
if (attribute) {
|
|
171
|
-
if (el.hasAttribute('actions')) continue;
|
|
172
|
-
let templateid = el.getAttribute('template_id')
|
|
173
|
-
if (templateid) {
|
|
174
|
-
let items = document.querySelectorAll(`[templateid="${templateid}"]`)
|
|
175
|
-
for (let item of items)
|
|
176
|
-
item.remove()
|
|
177
|
-
render({
|
|
178
|
-
selector: `[template="${templateid}"]`,
|
|
179
|
-
data
|
|
180
|
-
});
|
|
181
|
-
} else {
|
|
182
|
-
let value = getValueFromObject(data, attribute);
|
|
183
|
-
el.setValue(value);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
export default CoCreateApi;
|
package/src/server.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
class CoCreateApi {
|
|
2
|
-
constructor(crud) {
|
|
3
|
-
this.wsManager = crud.wsManager
|
|
4
|
-
this.crud = crud
|
|
5
|
-
this.init()
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
async getOrganization(config, component) {
|
|
9
|
-
|
|
10
|
-
let organization = await this.crud.getOrganization(config);
|
|
11
|
-
|
|
12
|
-
if (!organization.error)
|
|
13
|
-
return false;
|
|
14
|
-
|
|
15
|
-
return organization
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
module.exports = CoCreateApi;
|