@radiantabyss/vue 3.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.
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ presets: [
3
+ '@vue/app'
4
+ ]
5
+ }
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@radiantabyss/vue",
3
+ "version": "3.0.7",
4
+ "author": "radiantabyss.com",
5
+ "license": "ISC",
6
+ "eslintConfig": {
7
+ "root": true,
8
+ "env": {
9
+ "node": true
10
+ },
11
+ "extends": [
12
+ "plugin:vue/essential",
13
+ "eslint:recommended"
14
+ ],
15
+ "rules": {},
16
+ "parserOptions": {
17
+ "parser": "babel-eslint"
18
+ },
19
+ "globals": {
20
+ "Alert": "writable",
21
+ "Cookie": "writable",
22
+ "Item": "writable",
23
+ "Items": "writable",
24
+ "Request": "writable",
25
+ "StorageHandler": "writable"
26
+ }
27
+ }
28
+ }
package/src/Alert.js ADDED
@@ -0,0 +1,35 @@
1
+ let self = {
2
+ show(message, type = 'success', duration = null) {
3
+ if ( typeof message != 'string' ) {
4
+ message = message.join('<br/>');
5
+ }
6
+
7
+ window.dispatchEvent(new CustomEvent('alert', { detail: {
8
+ message,
9
+ type,
10
+ duration,
11
+ }}));
12
+ },
13
+
14
+ success(message, duration = null) {
15
+ self.show(message, 'success', duration);
16
+ },
17
+
18
+ error(message, duration = null) {
19
+ self.show(message, 'error', duration);
20
+ },
21
+
22
+ info(message, duration = null) {
23
+ self.show(message, 'info', duration);
24
+ },
25
+
26
+ warning(message, duration = null) {
27
+ self.show(message, 'warning', duration);
28
+ },
29
+
30
+ hide() {
31
+ window.dispatchEvent(new Event('alert-hide'));
32
+ },
33
+ };
34
+
35
+ export default self;
@@ -0,0 +1,42 @@
1
+ import Components from './Components';
2
+ import Directives from './Directives';
3
+ import Mixins from './Mixins';
4
+ import Modals from './Modals';
5
+
6
+ import Alert from './Alert';
7
+ import Cookie from './Support/Cookie';
8
+ import Confirm from './Confirm';
9
+ import Gate from './Support/Gate';
10
+ import Helpers from './Support/Helpers';
11
+ import Item from './Support/Item';
12
+ import Items from './Support/Items';
13
+ import Request from './Request';
14
+ import ReactiveStorage from './Support/ReactiveStorage';
15
+ import Str from './Support/Str';
16
+
17
+ import Store from './Store';
18
+
19
+ export default async (app) => {
20
+ await Components(app);
21
+ await Directives(app);
22
+ await Mixins(app);
23
+ await Modals(app);
24
+
25
+ window.Alert = Alert;
26
+ window.Cookie = Cookie;
27
+ window.Confirm = Confirm;
28
+ window.Gate = Gate;
29
+ window.Item = Item;
30
+ window.Items = Items;
31
+ window.Request = Request;
32
+ window.ReactiveStorage = ReactiveStorage;
33
+ window.Str = Str;
34
+
35
+ //make usable inside template
36
+ app.config.globalProperties.Item = Item;
37
+ app.config.globalProperties.Items = Items;
38
+ app.config.globalProperties.Gate = Gate;
39
+ app.config.globalProperties.Str = Str;
40
+
41
+ await Store(app);
42
+ };
@@ -0,0 +1,44 @@
1
+ import Str from './Support/Str';
2
+
3
+ let context_ra = import.meta.glob('@ra-components/Components/**/*.vue');
4
+ let context = import.meta.glob('@/Components/**/*.vue');
5
+
6
+ function getComponentName(file) {
7
+ let split = file.split('/');
8
+ let name = split[split.length - 1].replace('.vue', '')
9
+ .replace(/Component$/, '')
10
+ .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2')
11
+ .toLowerCase();
12
+
13
+ return Str.trim(name, '-');
14
+ }
15
+
16
+ export default async (app) => {
17
+ //load src components
18
+ let files = Object.keys(context);
19
+ let components = [];
20
+
21
+ for ( let i = 0; i < files.length; i++ ) {
22
+ let component = getComponentName(files[i]);
23
+ components.push(component);
24
+
25
+ let module = await context[files[i]]();
26
+ app.component(component, module.default);
27
+ }
28
+
29
+ //load ra vue components
30
+ files = Object.keys(context_ra);
31
+
32
+ for ( let i = 0; i < files.length; i++ ) {
33
+ let component = getComponentName(files[i]);
34
+
35
+ //enable component overloading. if component is already defined in src, continue
36
+ if ( components.includes(component) ) {
37
+ continue;
38
+ }
39
+
40
+ let module = await context_ra[files[i]]();
41
+ components.push(component);
42
+ app.component(component, module.default);
43
+ }
44
+ }
package/src/Confirm.js ADDED
@@ -0,0 +1,8 @@
1
+ export default function(params = {}) {
2
+ return new Promise(resolve => {
3
+ window.dispatchEvent(new CustomEvent('confirm', { detail: {
4
+ resolve,
5
+ params,
6
+ }}));
7
+ });
8
+ }
@@ -0,0 +1,20 @@
1
+ import Str from './Support/Str';
2
+
3
+ let context = import.meta.glob('/src/Directives/**/*.js');
4
+
5
+ export default async (app) => {
6
+ const files = Object.keys(context);
7
+
8
+ for ( let i = 0; i < files.length; i++ ) {
9
+ let split = files[i].split('/');
10
+ let name = split[split.length - 1].replace('.js', '')
11
+ .replace(/Directive$/, '')
12
+ .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2')
13
+ .toLowerCase();
14
+
15
+ name = Str.trim(name, '-');
16
+
17
+ let module = await context[files[i]]();
18
+ app.directive(name, module.default);
19
+ }
20
+ }
package/src/Mixins.js ADDED
@@ -0,0 +1,16 @@
1
+ let Mixins = {};
2
+ let context = import.meta.glob('/src/Mixins/**/*.js');
3
+
4
+ export default async () => {
5
+ const files = Object.keys(context);
6
+
7
+ for ( let i = 0; i < files.length; i++ ) {
8
+ let split = files[i].split('/');
9
+ let name = split[split.length - 1].replace('.js', '')
10
+ .replace(/Mixin$/, '');
11
+
12
+ let module = await context[files[i]]();
13
+ Mixins[name] = module.default;
14
+ }
15
+ window.Mixins = Mixins;
16
+ }
package/src/Modals.js ADDED
@@ -0,0 +1,19 @@
1
+ import Str from './Support/Str';
2
+
3
+ let context = import.meta.glob('/src/Modals/**/*.vue');
4
+
5
+ export default async (app) => {
6
+ const files = Object.keys(context);
7
+
8
+ for ( let i = 0; i < files.length; i++ ) {
9
+ let split = files[i].split('/');
10
+ let name = split[split.length - 1].replace('.vue', '')
11
+ .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2')
12
+ .toLowerCase();
13
+
14
+ name = Str.trim(name, '-');
15
+
16
+ let module = await context[files[i]]();
17
+ app.component(name, module.default);
18
+ }
19
+ }
package/src/Request.js ADDED
@@ -0,0 +1,210 @@
1
+ let sprite_version = import.meta.env.VITE_SPRITE_VERSION;
2
+
3
+ const formatErrors = function(response) {
4
+ let errors = [];
5
+ if ( response && response.errors ) {
6
+ for ( let i in response.errors ) {
7
+ if ( typeof response.errors[i] === 'object' ) {
8
+ for (let j in response.errors[i]) {
9
+ errors.push(response.errors[i][j]);
10
+ }
11
+ }
12
+ else {
13
+ errors.push(response.errors[i]);
14
+ }
15
+ }
16
+ }
17
+ else if ( response.statusText ) {
18
+ errors.push(response.statusText);
19
+ }
20
+
21
+ return errors;
22
+ };
23
+
24
+ const serializeToURLEncoded = (obj, prefix) => {
25
+ const str = [];
26
+ for ( let p in obj ) {
27
+ if ( obj.hasOwnProperty(p) ) {
28
+ const key = prefix ? `${prefix}[${p}]` : p;
29
+ const value = obj[p];
30
+
31
+ if ( typeof value === "object" ) {
32
+ str.push(serializeToURLEncoded(value, key));
33
+ }
34
+ else {
35
+ str.push(encodeURIComponent(key) + "=" + encodeURIComponent(value));
36
+ }
37
+ }
38
+ }
39
+ return str.join("&");
40
+ };
41
+
42
+ const appendFormData = (formData, key, value) => {
43
+ if ( Array.isArray(value) ) {
44
+ value.forEach((v) => formData.append(`${key}[]`, v));
45
+ }
46
+ else if ( typeof value === 'object' && value !== null ) {
47
+ for ( let subKey in value ) {
48
+ appendFormData(formData, `${key}[${subKey}]`, value[subKey]);
49
+ }
50
+ }
51
+ else {
52
+ formData.append(key, value);
53
+ }
54
+ };
55
+
56
+ const request = function(method, edge, payload = {}, display_errors = false, base_url = null, auth_token = null, headers = {}, upload_progress = null) {
57
+ return new Promise((resolve, reject) => {
58
+ if ( !base_url ) {
59
+ base_url = import.meta.env.VITE_BACK_URL;
60
+ }
61
+
62
+ if ( !auth_token ) {
63
+ auth_token = localStorage.getItem('jwt_token');
64
+ }
65
+
66
+ if ( method === 'POST' ) {
67
+ Alert.hide();
68
+ }
69
+
70
+ if ( !Object.keys(headers).length ) {
71
+ headers = {
72
+ 'Content-Type': 'application/x-www-form-urlencoded',
73
+ };
74
+ }
75
+
76
+ let _button;
77
+ if ( payload._button !== undefined ) {
78
+ _button = payload._button;
79
+ delete payload._button;
80
+ }
81
+
82
+ let _event;
83
+ if ( payload._event !== undefined ) {
84
+ _event = payload._event;
85
+ _event.preventDefault();
86
+
87
+ if ( _button === undefined ) {
88
+ _button = _event.target;
89
+ }
90
+
91
+ delete payload._event;
92
+ }
93
+
94
+ if ( _button !== undefined ) {
95
+ if ( _button.disabled ) {
96
+ return;
97
+ }
98
+ _button.disabled = true;
99
+ }
100
+
101
+ let data;
102
+ let url = base_url + edge;
103
+
104
+ if ( method === 'GET' ) {
105
+ url += '?' + new URLSearchParams(payload).toString();
106
+ }
107
+ else if ( method === 'POST' ) {
108
+ if ( headers['Content-Type'] === 'multipart/form-data' ) {
109
+ data = new FormData();
110
+
111
+ for (let key in payload) {
112
+ appendFormData(data, key, payload[key]);
113
+ }
114
+
115
+ delete headers['Content-Type'];
116
+ }
117
+ else if ( headers['Content-Type'] === 'application/x-www-form-urlencoded' ) {
118
+ data = serializeToURLEncoded(payload).replace(/\&+$/, '');
119
+ }
120
+ else {
121
+ data = JSON.stringify(payload);
122
+ headers['Content-Type'] = 'application/x-www-form-urlencoded';
123
+ }
124
+ }
125
+
126
+ if ( auth_token ) {
127
+ if ( typeof auth_token !== 'object' ) {
128
+ auth_token = { jwt_token: auth_token };
129
+ }
130
+ for ( let key in auth_token ) {
131
+ if ( auth_token[key] !== '' && auth_token[key] !== null ) {
132
+ url += url.includes('?') ? '&' : '?';
133
+ url += `${key}=${auth_token[key]}`;
134
+ }
135
+ }
136
+ }
137
+
138
+ let _button_html;
139
+ if ( typeof _button !== 'undefined' ) {
140
+ _button_html = _button.innerHTML;
141
+
142
+ if ( payload._replace_html ) {
143
+ _button.innerHTML = `<svg class="svg-request-spinner"><use xlink:href="/sprites.svg?v=${sprite_version}#request-spinner"></use></svg>`;
144
+ }
145
+ else {
146
+ _button.innerHTML += `&nbsp;<svg class="svg-request-spinner"><use xlink:href="/sprites.svg?v=${sprite_version}#request-spinner"></use></svg>`;
147
+ }
148
+ }
149
+
150
+ fetch(url, {
151
+ method,
152
+ headers,
153
+ body: method === 'GET' ? undefined : data,
154
+ })
155
+ .then(async (response) => {
156
+ if ( _button !== undefined ) {
157
+ _button.disabled = false;
158
+ _button.innerHTML = _button_html;
159
+ }
160
+
161
+ const response_data = await response.json();
162
+
163
+ if ( edge.match(/\.json/) ) {
164
+ return resolve(response_data);
165
+ }
166
+
167
+ if ( response.ok && response_data.success ) {
168
+ return resolve(response_data.data);
169
+ }
170
+
171
+ const errors = formatErrors(response_data);
172
+ if ( display_errors ) {
173
+ Alert.error(errors.join('<br/>'), 7000);
174
+ }
175
+
176
+ reject(errors);
177
+ })
178
+ .catch((error) => {
179
+ let errors = [error.message];
180
+
181
+ if ( display_errors ) {
182
+ Alert.error(errors.join('<br/>'), 7000);
183
+ }
184
+
185
+ if ( _button !== undefined ) {
186
+ _button.disabled = false;
187
+ _button.innerHTML = _button_html;
188
+ }
189
+
190
+ reject(errors);
191
+ });
192
+ });
193
+ };
194
+
195
+ let self = {
196
+ get(edge, payload = {}, display_errors = false, base_url = null, auth_token = null, headers = {}) {
197
+ return request('GET', edge, payload, display_errors, base_url, auth_token, headers);
198
+ },
199
+
200
+ post(edge, payload = {}, display_errors = false, base_url = null, auth_token = null, headers = {}) {
201
+ return request('POST', edge, payload, display_errors, base_url, auth_token, headers);
202
+ },
203
+
204
+ upload(edge, payload = {}, display_errors = false, upload_progress, base_url = null, auth_token = null, headers = {}) {
205
+ headers['Content-Type'] = 'multipart/form-data';
206
+ return request('POST', edge, payload, display_errors, base_url, auth_token, headers, upload_progress);
207
+ },
208
+ };
209
+
210
+ export default self;
@@ -0,0 +1,47 @@
1
+ let Actions = {};
2
+ let context = import.meta.glob('/src/Domains/**/*.vue');
3
+
4
+ const loadModules = async () => {
5
+ const files = Object.keys(context);
6
+
7
+ for ( let i = 0; i < files.length; i++ ) {
8
+ let split = files[i].split('/');
9
+ split.shift();
10
+ let name = split[split.length - 1].replace('.vue', '');
11
+ split.pop();
12
+ split.pop();
13
+ split.shift();
14
+ split.shift();
15
+
16
+ if ( !name.match(/Action$/) || name == 'Action' ) {
17
+ continue;
18
+ }
19
+
20
+ let module = await context[files[i]]();
21
+ setNamespace(Actions, name, split, module);
22
+ }
23
+ }
24
+
25
+ function setNamespace(Actions, name, namespace, module) {
26
+ if ( !namespace.length ) {
27
+ Actions[name] = module.default;
28
+ return;
29
+ }
30
+
31
+ let first = namespace[0].replace(/-/g, ' ').replace(/_/g, ' ').replace(/(^([a-zA-Z\p{M}]))|([ -][a-zA-Z\p{M}])/g,function(s) {
32
+ return s.toUpperCase();
33
+ }).replace(/ /g, '');
34
+
35
+ namespace.shift();
36
+
37
+ if ( !Actions[first] ) {
38
+ Actions[first] = {};
39
+ }
40
+
41
+ setNamespace(Actions[first], name, namespace, module);
42
+ }
43
+
44
+ export default async () => {
45
+ await loadModules();
46
+ return Actions;
47
+ }
@@ -0,0 +1,41 @@
1
+ let Middleware = {};
2
+ let context = import.meta.glob('/src/Http/Middleware/**/*.js');
3
+
4
+ const loadModules = async () => {
5
+ const files = Object.keys(context);
6
+
7
+ for ( let i = 0; i < files.length; i++ ) {
8
+ let split = files[i].split('/');
9
+ let name = split[split.length - 1].replace('.js', '').replace('Middleware', '');
10
+ let module = await context[files[i]]();
11
+ Middleware[name] = module.default;
12
+ }
13
+ }
14
+
15
+ let runMiddleware = async (to, from, i = 0) => {
16
+ //reached end, then everything passed
17
+ if ( i == to.meta.middleware.length ) {
18
+ return;
19
+ }
20
+
21
+ //middleware doesnt exist
22
+ if ( !Middleware[to.meta.middleware[i]] ) {
23
+ throw new Error(`${to.meta.middleware[i]} Middleware not found.`);
24
+ }
25
+
26
+ //run middleware
27
+ await Middleware[to.meta.middleware[i]](to, from);
28
+ await runMiddleware(to, from, i + 1);
29
+ }
30
+
31
+ export default async () => {
32
+ await loadModules();
33
+
34
+ return async (to, from) => {
35
+ if ( !to.meta || !to.meta.middleware ) {
36
+ return;
37
+ }
38
+
39
+ return runMiddleware(to, from);
40
+ };
41
+ }
@@ -0,0 +1,75 @@
1
+ let group_middleware = null;
2
+
3
+ function addRoute(path, action, middleware, name, throw_error) {
4
+ if ( !action ) {
5
+ throw `Action missing for ${path}`;
6
+ }
7
+
8
+ //format path
9
+ path = path.replace(/\{([\s\S]+?)\}/g, ':$1');
10
+
11
+ //get action
12
+ action = action.replace(/\\/g, '.').replace(/\//g, '.');
13
+ let split = action.split('.');
14
+ let namespace = split.slice(0, -1);
15
+ let action_name = name || split[split.length - 1];
16
+ let domain = namespace.length ? Str.slug(namespace[0]) : '';
17
+
18
+ if ( namespace.length ) {
19
+ action_name = namespace.join('/') + '/' + action_name;
20
+ }
21
+
22
+ let component;
23
+ try {
24
+ component = getAction(Actions, split[split.length - 1], namespace, action_name);
25
+ }
26
+ catch(e) {
27
+ if ( throw_error ) {
28
+ throw `Action ${action_name} doesn't exist.`;
29
+ }
30
+ return;
31
+ }
32
+
33
+ RouteFiles[__route_file].push({
34
+ name: action_name,
35
+ component,
36
+ path,
37
+ meta: {
38
+ domain,
39
+ middleware,
40
+ settings: component.settings ? component.settings : {},
41
+ },
42
+ });
43
+ }
44
+
45
+ function getAction(Actions, name, namespace, action_name) {
46
+ if ( !namespace.length ) {
47
+ let action = Actions[name];
48
+
49
+ action.name = action_name.replace(/\\/g, '.');
50
+ return action;
51
+ }
52
+
53
+ let first = namespace[0];
54
+ namespace.shift();
55
+
56
+ return getAction(Actions[first], name, namespace, action_name);
57
+ }
58
+
59
+ let self = {
60
+ get(path, action, middleware = [], name = '', throw_error = true) {
61
+ if ( group_middleware ) {
62
+ middleware = middleware.concat(group_middleware);
63
+ }
64
+
65
+ addRoute(path, action, middleware, name, throw_error);
66
+ },
67
+
68
+ group(middleware, callback) {
69
+ group_middleware = middleware;
70
+ callback();
71
+ group_middleware = null;
72
+ },
73
+ }
74
+
75
+ export default self;
@@ -0,0 +1,15 @@
1
+ import Str from './../Support/Str';
2
+
3
+ let self = {
4
+ run(domain) {
5
+ domain = domain.replace(/\\/g, '.').replace(/\//g, '.');
6
+ let prefix = Str.kebab(domain).replace(/\./g, '/');
7
+
8
+ Route.get(`/${prefix}`, `${domain}.ListAction`, [], '', false);
9
+ Route.get(`/${prefix}/new/{id?}`, `${domain}.NewAction`, [], '', false);
10
+ Route.get(`/${prefix}/edit/{id}`, `${domain}.EditAction`, [], '', false);
11
+ Route.get(`/${prefix}/single/{id}`, `${domain}.SingleAction`, [], '', false);
12
+ }
13
+ }
14
+
15
+ export default self;
@@ -0,0 +1 @@
1
+ export default {};