@cocreate/api 1.19.2 → 1.20.1

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.1](https://github.com/CoCreate-app/CoCreate-api/compare/v1.20.0...v1.20.1) (2024-02-05)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Removed https://cdn.cocreate.app/latest/CoCreate.min.css ([cde1867](https://github.com/CoCreate-app/CoCreate-api/commit/cde1867f966c6dfdc7d9e3042c8130baafa3c65e))
7
+
8
+ # [1.20.0](https://github.com/CoCreate-app/CoCreate-api/compare/v1.19.2...v1.20.0) (2024-02-03)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * now used in client only ([bad8ddd](https://github.com/CoCreate-app/CoCreate-api/commit/bad8ddd4aac147056e59255ef5de5af984ece845))
14
+
15
+
16
+ ### Features
17
+
18
+ * init a module and its attributes using ([1238015](https://github.com/CoCreate-app/CoCreate-api/commit/1238015b42861f3be0488efcf950f5f3717f55e1))
19
+
1
20
  ## [1.19.2](https://github.com/CoCreate-app/CoCreate-api/compare/v1.19.1...v1.19.2) (2024-02-02)
2
21
 
3
22
 
package/docs/form.html CHANGED
@@ -11,9 +11,7 @@
11
11
  <meta name="keywords" content="drag and drop, colaboration, dnd utility, drag and drop utility" />
12
12
  <meta name="robots" content="index,follow" />
13
13
  <meta property="og:image" content="https://cdn.cocreate.app/docs/api.png">
14
- <!-- CoCreate CSS -->
15
- <!-- CoCreate CSS -->
16
- <link rel="stylesheet" href="https://cdn.cocreate.app/latest/CoCreate.min.css" type="text/css" />
14
+
17
15
  <link rel="stylesheet" href="/docs/index.css" array="files" object="60888216117c640e7596303f" key="src" type="text/css" save="true" />
18
16
  <link rel="manifest" href="/manifest.webmanifest" />
19
17
  </head>
package/docs/index.html CHANGED
@@ -11,9 +11,6 @@
11
11
  <meta name="keywords" content="drag and drop, collaboration, dnd utility, drag and drop utility" />
12
12
  <meta name="robots" content="index,follow" />
13
13
  <meta property="og:image" content="https://cdn.cocreate.app/docs/api.png">
14
-
15
- <!-- CoCreate CSS -->
16
- <link rel="stylesheet" href="https://cdn.cocreate.app/latest/CoCreate.min.css" type="text/css" />
17
14
  <link rel="stylesheet" href="/docs/index.css" array="files" object="60888216117c640e7596303f" key="src" type="text/css" save="true" />
18
15
 
19
16
  <link rel="manifest" href="/manifest.webmanifest" />
package/docs/module.html CHANGED
@@ -13,7 +13,7 @@
13
13
  <meta property="og:image" content="https://cdn.cocreate.app/docs/api.png">
14
14
 
15
15
  <!-- CoCreate CSS -->
16
- <link rel="stylesheet" href="https://cdn.cocreate.app/latest/CoCreate.min.css" type="text/css" />
16
+ <link rel="stylesheet" href="" type="text/css" />
17
17
  <link rel="stylesheet" href="/docs/index.css" array="files" object="60888216117c640e7596303f" key="src" type="text/css" save="true" />
18
18
  <link rel="manifest" href="/manifest.webmanifest">
19
19
  </head>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocreate/api",
3
- "version": "1.19.2",
3
+ "version": "1.20.1",
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,215 +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
- socket.listen(name + '.' + endPoint, (data) => {
29
- self.__response(name, data);
30
- });
31
-
32
- let functions = endPoints[endPoint]
33
- if (typeof functions.request !== 'function') {
34
- functions.request = self.__request;
35
- }
36
- action.init({
37
- name: endPoint,
38
- endEvent: endPoint,
39
- callback: (data) => {
40
- const element = data.element
41
- let form = data.form || document
42
- const selector = `[${name}^="${endPoint}."]`
43
- let el = form.querySelector(selector)
44
- if (!el) return
45
- let params = self.parseParams({ name, element: el })
46
- if (params) {
47
- functions.request({ name, ...params, element, form, type: 'action' })
48
- }
49
- },
50
- });
51
- }
52
-
53
- const inputEvent = (element) => {
54
- const self = this
55
- element.addEventListener('input', (e) => {
56
- if (element.hasAttribute(name)) {
57
- let params = self.parseParams({ name, element })
58
- if (params) {
59
- if (!e.detail || e.detail && e.detail.skip != true) {
60
- endPoints[params.endPoint].request({ name, ...params, element, type: 'input' })
61
- }
62
- }
63
- }
64
- });
65
- }
66
-
67
- let elements = document.querySelectorAll(`[${name}]`)
68
- for (let element of elements) {
69
- let params = this.parseParams({ name, element })
70
- if (params) {
71
- endPoints[params.endPoint].request({ name, ...params, element, type: 'onload' })
72
- inputEvent(element)
73
- }
74
- }
75
-
76
- observer.init({
77
- name: `${name}NodeObserver`,
78
- observe: ['addedNodes'],
79
- target: `[${name}]`,
80
- callback: function (mutation) {
81
- let params = self.parseParams({ name, element: mutation.target })
82
- if (params) {
83
- endPoints[params.endPoint].request({ name, ...params, element: mutation.target, type: 'nodeObserver' });
84
- inputEvent(mutation.target)
85
- }
86
- }
87
- });
88
-
89
- observer.init({
90
- name: `${name}AttributeObserver`,
91
- observe: ['attributes'],
92
- attributeName: [name],
93
- callback: function (mutation) {
94
- let params = self.parseParams({ name, element: mutation.target })
95
- if (params) {
96
- endPoints[params.endPoint].request({ name, ...params, element: mutation.target, type: 'attributeObserver' });
97
- }
98
- }
99
- });
100
- }
101
- },
102
-
103
-
104
- __request: async function (object) {
105
- if (object.type !== 'action')
106
- return
107
- if (!object.form)
108
- object.form = element.closest('form');
109
- let data = await CoCreateApi.getData(object);
110
- CoCreateApi.send(object.name, object.endPoint, data);
111
- },
112
-
113
- __response: function (name, data) {
114
- const endPoint = data.method.substring(name.length + 1);
115
- const component = this.components[name];
116
- const functions = component.endPoints[endPoint]
117
- if (functions.listen !== false) {
118
- if (typeof functions.response === 'function') {
119
- functions.response(data[name]);
120
- } else if (data.error) {
121
- render({
122
- selector: `[template*='${name}']`,
123
- data: [{
124
- type: name,
125
- status: 'failed',
126
- message: data.error
127
- }]
128
- });
129
- } else {
130
- CoCreateApi.setData({ name, endPoint, data })
131
-
132
- document.dispatchEvent(new CustomEvent(endPoint, {
133
- detail: {
134
- data: data[name]
135
- }
136
- }));
137
- }
138
- }
139
- },
140
-
141
- send: function (name, endPoint, data) {
142
- let method = name + '.' + endPoint
143
- socket.send({ method, endPoint, [name]: data, broadcastBrowser: false, status: 'await' });
144
- },
145
-
146
- parseParams: function ({ name, endPoint, element }) {
147
- let attribute = element.getAttribute(name)
148
- if (!attribute)
149
- return false
150
-
151
- let endPoints = this.components[name].endPoints
152
- for (let k of Object.keys(endPoints)) {
153
- if (attribute.startsWith(k)) {
154
- endPoint = k
155
- break;
156
- }
157
- }
158
-
159
- let key = attribute.substring(endPoint.length + 1);
160
- return { endPoint, key, dotNotation: attribute }
161
-
162
- },
163
-
164
-
165
- getData: async function ({ name, endPoint, element, form }) {
166
- const data = {}
167
- const selector = `[${name}^="${endPoint}."]`
168
- let elements
169
- if (form)
170
- elements = form.querySelectorAll(selector);
171
- if (!elements || elements.length == 0)
172
- elements = [element]
173
- for (let el of elements) {
174
- if (!el || el.closest('[template]')) continue
175
- let params = this.parseParams({ name, element: el })
176
- if (params.key) {
177
- data[params.key] = await el.getValue()
178
- }
179
- }
180
-
181
- return dotNotationToObject(data);
182
- },
183
-
184
- setData: function ({ name, endPoint, data, form }) {
185
- const selector = `[${name}^="${endPoint}."]`
186
- if (!form)
187
- form = document;
188
- let elements = form.querySelectorAll(selector);
189
- if (!elements || elements.length == 0) return
190
-
191
- for (let el of elements) {
192
- let attribute = el.getAttribute(name)
193
- if (attribute) {
194
- if (el.hasAttribute('actions')) continue;
195
- let templateid = el.getAttribute('template_id')
196
- if (templateid) {
197
- let items = document.querySelectorAll(`[templateid="${templateid}"]`)
198
- for (let item of items)
199
- item.remove()
200
- render({
201
- selector: `[template="${templateid}"]`,
202
- data
203
- });
204
- } else {
205
- let value = getValueFromObject(data, attribute);
206
- el.setValue(value);
207
- }
208
- }
209
- }
210
-
211
- }
212
-
213
- };
214
-
215
- 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;