@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 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.19.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
- (function (root, factory) {
2
- if (typeof define === 'function' && define.amd) {
3
- define(["./client"], function(CoCreateApi) {
4
- return factory(CoCreateApi)
5
- });
6
- } else if (typeof module === 'object' && module.exports) {
7
- const CoCreateApi = require("./server.js")
8
- module.exports = factory(CoCreateApi);
9
- } else {
10
- root.returnExports = factory(root["./client.js"]);
11
- }
12
- }(typeof self !== 'undefined' ? self : this, function (CoCreateApi) {
13
- return CoCreateApi;
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;