bigpipe-util 0.2.13 → 0.2.14

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/dist/Primer.js ADDED
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = Primer;
7
+ var _AsyncRequest = _interopRequireDefault(require("./async/AsyncRequest"));
8
+ var _Parent = require("./core/Parent");
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ function Primer() {
11
+ const rootElement = document.documentElement;
12
+ const RELATIONSHIP_REGEX = /async(?:-post)?|dialog/;
13
+ rootElement.addEventListener('click', function (event) {
14
+ event = event || window.event;
15
+ const elementOnClicked = event.target || event.srcElement;
16
+ const linkNodeOnClicked = (0, _Parent.byTag)(elementOnClicked, 'A');
17
+ if (!linkNodeOnClicked) {
18
+ return;
19
+ }
20
+ const ajaxHref = linkNodeOnClicked.getAttribute('ajaxify');
21
+ const realHref = linkNodeOnClicked.href;
22
+ let relationship = linkNodeOnClicked.rel && linkNodeOnClicked.rel.match(RELATIONSHIP_REGEX);
23
+ relationship = relationship && relationship[0];
24
+ if (ajaxHref && realHref && !/#$/.test(realHref)) {
25
+ const isMiddleMouseButton = event.which && event.which === 2;
26
+ const hasModifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
27
+ if (isMiddleMouseButton || hasModifierKey) {
28
+ return;
29
+ }
30
+ }
31
+ if (linkNodeOnClicked.classList.contains('async-saving')) {
32
+ event.preventDefault();
33
+ return;
34
+ }
35
+ switch (relationship) {
36
+ case 'async':
37
+ case 'async-post':
38
+ event.preventDefault();
39
+ new _AsyncRequest.default(ajaxHref).setRelative(linkNodeOnClicked).setInitialHandler(() => {
40
+ linkNodeOnClicked.classList.add('async-saving');
41
+ }).setHandler(() => {
42
+ linkNodeOnClicked.classList.remove('async-saving');
43
+ }).setErrorHandler(() => {
44
+ linkNodeOnClicked.classList.remove('async-saving');
45
+ }).setMethod(relationship === 'async-post' ? 'POST' : 'GET').send();
46
+ break;
47
+ case 'dialog':
48
+ event.preventDefault();
49
+ new _AsyncRequest.default(linkNodeOnClicked.getAttribute('ajaxify')).setRelative(linkNodeOnClicked).setInitialHandler(() => {
50
+ linkNodeOnClicked.classList.add('async-saving');
51
+ }).setHandler(() => {
52
+ linkNodeOnClicked.classList.remove('async-saving');
53
+ }).setErrorHandler(() => {
54
+ linkNodeOnClicked.classList.remove('async-saving');
55
+ }).setMethod('POST').send();
56
+ break;
57
+ }
58
+ });
59
+ rootElement.addEventListener('submit', function (event) {
60
+ event = event || window.event;
61
+ const eventTarget = event.target || event.srcElement;
62
+ if (eventTarget && eventTarget.nodeName === 'FORM' && eventTarget.getAttribute('rel') === 'async') {
63
+ event.preventDefault();
64
+ const formData = new FormData(eventTarget);
65
+ const submitter = event.submitter || eventTarget.querySelector("button[type='submit']");
66
+ const activeControls = eventTarget.querySelectorAll('input:not([readonly]),select:not([readonly]),textarea:not([readonly])');
67
+ if (submitter && submitter.name) {
68
+ formData.append(submitter.name, submitter.value);
69
+ }
70
+ new _AsyncRequest.default(eventTarget.getAttribute('ajaxify') || eventTarget.getAttribute('action')).setMethod(eventTarget.method || 'POST').setRelative(eventTarget).setData(formData).setInitialHandler(function () {
71
+ eventTarget.classList.add('async-saving');
72
+ if (!eventTarget.classList.contains('disable-prevent-form')) {
73
+ activeControls.forEach(function (control) {
74
+ control.setAttribute('readonly', 'readonly');
75
+ });
76
+ if (submitter) {
77
+ submitter.disabled = true;
78
+ }
79
+ }
80
+ if (eventTarget) {
81
+ const loader = eventTarget.querySelector('.form-loader');
82
+ if (loader) {
83
+ loader.classList.add('loading');
84
+ }
85
+ }
86
+ }).setHandler(function () {
87
+ eventTarget.classList.remove('async-saving');
88
+ activeControls.forEach(function (control) {
89
+ control.removeAttribute('readonly');
90
+ });
91
+ if (submitter) {
92
+ submitter.disabled = false;
93
+ }
94
+ if (eventTarget) {
95
+ const loader = eventTarget.querySelector('.small-loader');
96
+ if (loader) {
97
+ loader.classList.remove('loading');
98
+ }
99
+ }
100
+ }).setErrorHandler(function () {
101
+ eventTarget.classList.remove('async-saving');
102
+ activeControls.forEach(function (control) {
103
+ control.removeAttribute('readonly');
104
+ });
105
+ if (submitter) {
106
+ submitter.disabled = false;
107
+ }
108
+ if (eventTarget) {
109
+ const loader = eventTarget.querySelector('.small-loader');
110
+ if (loader) {
111
+ loader.classList.remove('loading');
112
+ }
113
+ }
114
+ }).send();
115
+ }
116
+ });
117
+ }
@@ -1,40 +1,40 @@
1
- import replaceTransportMarkers from "./core/replaceTransportMarkers";
2
-
3
- function handler(dependencies, guard, context) {
4
- return dependencies.map(function (args) {
5
- return guard.apply(context, args);
6
- });
7
- }
8
-
9
- export default class ServerJS {
10
- constructor() {
11
- this._relativeTo = document.body;
12
- }
13
-
14
- handle(jsMods) {
15
- handler(jsMods.require || [], this._handleRequire, this);
16
- }
17
-
18
- _handleRequire(modulePath, method, marker) {
19
- if (method && typeof method === 'string') {
20
- if (marker) {
21
- replaceTransportMarkers(this._relativeTo, marker);
22
- }
23
-
24
- const factory = window.require(modulePath);
25
- const context = typeof factory === 'function' ? new factory : factory;
26
-
27
- if (!context[method]) {
28
- throw new TypeError(`Module ${modulePath} has no method "${method}"`);
29
- }
30
-
31
- context[method].apply(context, marker || []);
32
- } else {
33
- if (marker) {
34
- replaceTransportMarkers(this._relativeTo, marker);
35
- }
36
-
37
- new (window.require(modulePath))(...(marker || []));
38
- }
39
- }
40
- }
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _replaceTransportMarkers = _interopRequireDefault(require("./core/replaceTransportMarkers"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ function handler(dependencies, guard, context) {
10
+ return dependencies.map(function (args) {
11
+ return guard.apply(context, args);
12
+ });
13
+ }
14
+ class ServerJS {
15
+ constructor() {
16
+ this._relativeTo = document.body;
17
+ }
18
+ handle(jsMods) {
19
+ handler(jsMods.require || [], this._handleRequire, this);
20
+ }
21
+ _handleRequire(modulePath, method, marker) {
22
+ if (method && typeof method === 'string') {
23
+ if (marker) {
24
+ (0, _replaceTransportMarkers.default)(this._relativeTo, marker);
25
+ }
26
+ const factory = window.require(modulePath);
27
+ const context = typeof factory === 'function' ? new factory() : factory;
28
+ if (!context[method]) {
29
+ throw new TypeError(`Module ${modulePath} has no method "${method}"`);
30
+ }
31
+ context[method].apply(context, marker || []);
32
+ } else {
33
+ if (marker) {
34
+ (0, _replaceTransportMarkers.default)(this._relativeTo, marker);
35
+ }
36
+ new (window.require(modulePath))(...(marker || []));
37
+ }
38
+ }
39
+ }
40
+ exports.default = ServerJS;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _DOM = _interopRequireDefault(require("../core/DOM"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ class AsyncDOM {
10
+ invoke(domOps, element) {
11
+ for (let i = 0; i < domOps.length; ++i) {
12
+ let [type, selector, enableTarget, content] = domOps[i];
13
+ let node = enableTarget && element || null;
14
+ if (selector) {
15
+ node = (node || document.documentElement).querySelector(selector);
16
+ }
17
+ if (!node) {
18
+ if (typeof __DEV__ !== 'undefined' && __DEV__) {
19
+ console.error(`Selector '${selector}' does not match anything!`);
20
+ }
21
+ continue;
22
+ }
23
+ switch (type) {
24
+ case 'eval':
25
+ new Function(content).apply(node);
26
+ break;
27
+ case 'hide':
28
+ node.style.display = 'none';
29
+ break;
30
+ case 'show':
31
+ node.style.display = '';
32
+ break;
33
+ case 'setContent':
34
+ _DOM.default.setContent(node, content.__html);
35
+ break;
36
+ case 'appendContent':
37
+ _DOM.default.appendContent(node, content.__html);
38
+ break;
39
+ case 'prependContent':
40
+ _DOM.default.prependContent(node, content.__html);
41
+ break;
42
+ case 'insertAfter':
43
+ _DOM.default.insertAfter(node, content.__html);
44
+ break;
45
+ case 'insertBefore':
46
+ _DOM.default.insertBefore(node, content.__html);
47
+ break;
48
+ case 'remove':
49
+ _DOM.default.remove(node);
50
+ break;
51
+ case 'replace':
52
+ _DOM.default.replace(node, content.__html);
53
+ break;
54
+ }
55
+ }
56
+ }
57
+ }
58
+ exports.default = AsyncDOM;
@@ -1,210 +1,182 @@
1
- import emptyFunction from "fbjs/lib/emptyFunction";
2
- import AsyncResponse from "./AsyncResponse";
3
-
4
- let requests = 0;
5
-
6
- export function incrementRequests() {
7
- return requests++;
8
- }
9
-
10
- function serialize(obj, prefix) {
11
- const str = [];
12
- for(const p in obj) {
13
- if (obj.hasOwnProperty(p)) {
14
- const k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
15
- str.push(typeof v == "object" ?
16
- serialize(v, k) :
17
- encodeURIComponent(k) + "=" + encodeURIComponent(v));
18
- }
19
- }
20
- return str.join("&");
21
- }
22
-
23
- function validateResponseHandler(handler) {
24
- const valid = !handler || typeof handler === "function";
25
-
26
- if (!valid) {
27
- console.error("AsyncRequest response handlers must be functions. Pass a function, or use bind() to build one.");
28
- }
29
-
30
- return valid;
31
- }
32
-
33
- export default class AsyncRequest {
34
- constructor(uri) {
35
- this.method = "POST";
36
- this.uri = "";
37
- this.relative = null;
38
- this.data = {};
39
- this.headers = {};
40
- this.initialHandler = emptyFunction;
41
- this.handler = null;
42
- this.finallyHandler = emptyFunction;
43
- this.errorHandler = emptyFunction;
44
-
45
- if (uri !== undefined) {
46
- this.setURI(uri);
47
- }
48
- }
49
-
50
- setMethod(method) {
51
- this.method = method.toString().toUpperCase();
52
- return this;
53
- }
54
-
55
- getMethod() {
56
- return this.method;
57
- }
58
-
59
- setRelative(relative) {
60
- this.relative = relative;
61
- return this;
62
- }
63
-
64
- getRelative() {
65
- return this.relative;
66
- }
67
-
68
- setData(obj) {
69
- this.data = obj;
70
- return this;
71
- }
72
-
73
- getData() {
74
- return this.data;
75
- }
76
-
77
- setRequestHeader(name, value) {
78
- this.headers[name] = value;
79
- return this;
80
- }
81
-
82
- setURI(uri) {
83
- this.uri = uri;
84
-
85
- return this;
86
- }
87
- getURI() {
88
- return this.uri;
89
- }
90
-
91
- setInitialHandler(fn) {
92
- this.initialHandler = fn;
93
- return this;
94
- }
95
-
96
- getInitialHandler() {
97
- return this.initialHandler || emptyFunction;
98
- }
99
-
100
- setHandler(fn) {
101
- if (validateResponseHandler(fn)) {
102
- this.handler = fn;
103
- }
104
- return this;
105
- }
106
-
107
- setFinallyHandler(fn) {
108
- this.finallyHandler = fn;
109
- return this;
110
- }
111
-
112
- getFinallyHandler() {
113
- return this.finallyHandler || emptyFunction;
114
- }
115
-
116
- getHandler() {
117
- return this.handler || emptyFunction;
118
- }
119
-
120
- setErrorHandler(fn) {
121
- if (validateResponseHandler(fn)) {
122
- this.errorHandler = fn;
123
- }
124
- return this;
125
- }
126
-
127
- getErrorHandler() {
128
- return this.errorHandler || emptyFunction;
129
- }
130
-
131
- abort() {
132
- const transport = this.transport;
133
-
134
- if (transport) {
135
- transport.abort();
136
- }
137
- }
138
-
139
- _unshieldResponseText(text) {
140
- const shield = "for (;;);";
141
- const shieldLength = shield.length;
142
-
143
- if (text.length <= shieldLength) {
144
- throw new Error("Response too short on async to " + this.getURI());
145
- }
146
-
147
- return text.substring(shieldLength);
148
- }
149
-
150
- send() {
151
- const {uri, method} = this;
152
- let { data } = this;
153
-
154
- const handler = this.getHandler();
155
- const errorHandler = this.getErrorHandler();
156
- const initialHandler = this.getInitialHandler();
157
- const finallyHandler = this.getFinallyHandler();
158
-
159
- initialHandler();
160
-
161
- const request = new XMLHttpRequest();
162
- const self = this;
163
-
164
- request.open(method, uri, true);
165
-
166
- request.onload = function () {
167
- if (this.status >= 200 && this.status < 400) {
168
- let response;
169
- try {
170
- const safeJson = self._unshieldResponseText(this.responseText);
171
- response = JSON.parse(safeJson);
172
- } catch (e) {
173
- throw new Error("Failed to handle response: " + e.message + "\n" + this.responseText);
174
- }
175
-
176
- (new AsyncResponse).handle(response, self.relative);
177
-
178
- handler(response);
179
- } else {
180
- errorHandler(this);
181
- }
182
-
183
- finallyHandler(this);
184
- }
185
-
186
- request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
187
-
188
- incrementRequests();
189
-
190
- if (data instanceof FormData) {
191
- data.append('__req', requests);
192
- } else {
193
- data.__req = requests;
194
- data = serialize(data);
195
-
196
- if (method === "POST") {
197
- request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
198
- }
199
- }
200
-
201
- Object.keys(this.headers).forEach((name) => {
202
- request.setRequestHeader(name, this.headers[name]);
203
- });
204
-
205
- request.onerror = errorHandler;
206
- request.send(data);
207
-
208
- return request;
209
- }
210
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ exports.incrementRequests = incrementRequests;
8
+ var _emptyFunction = _interopRequireDefault(require("fbjs/lib/emptyFunction"));
9
+ var _AsyncResponse = _interopRequireDefault(require("./AsyncResponse"));
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ let requests = 0;
12
+ function incrementRequests() {
13
+ return requests++;
14
+ }
15
+ function serialize(obj, prefix) {
16
+ const str = [];
17
+ for (const p in obj) {
18
+ if (Object.prototype.hasOwnProperty.call(obj, p)) {
19
+ const k = prefix ? prefix + '[' + p + ']' : p,
20
+ v = obj[p];
21
+ str.push(typeof v == 'object' ? serialize(v, k) : encodeURIComponent(k) + '=' + encodeURIComponent(v));
22
+ }
23
+ }
24
+ return str.join('&');
25
+ }
26
+ function validateResponseHandler(handler) {
27
+ const valid = !handler || typeof handler === 'function';
28
+ if (!valid) {
29
+ console.error('AsyncRequest response handlers must be functions. Pass a function, or use bind() to build one.');
30
+ }
31
+ return valid;
32
+ }
33
+ class AsyncRequest {
34
+ constructor(uri) {
35
+ this.method = 'POST';
36
+ this.uri = '';
37
+ this.relative = null;
38
+ this.data = {};
39
+ this.headers = {};
40
+ this.initialHandler = _emptyFunction.default;
41
+ this.handler = null;
42
+ this.finallyHandler = _emptyFunction.default;
43
+ this.errorHandler = _emptyFunction.default;
44
+ if (uri !== undefined) {
45
+ this.setURI(uri);
46
+ }
47
+ }
48
+ setMethod(method) {
49
+ this.method = method.toString().toUpperCase();
50
+ return this;
51
+ }
52
+ getMethod() {
53
+ return this.method;
54
+ }
55
+ setRelative(relative) {
56
+ this.relative = relative;
57
+ return this;
58
+ }
59
+ getRelative() {
60
+ return this.relative;
61
+ }
62
+ setData(obj) {
63
+ this.data = obj;
64
+ return this;
65
+ }
66
+ getData() {
67
+ return this.data;
68
+ }
69
+ setRequestHeader(name, value) {
70
+ this.headers[name] = value;
71
+ return this;
72
+ }
73
+ setURI(uri) {
74
+ this.uri = uri;
75
+ return this;
76
+ }
77
+ getURI() {
78
+ return this.uri;
79
+ }
80
+ setInitialHandler(fn) {
81
+ this.initialHandler = fn;
82
+ return this;
83
+ }
84
+ getInitialHandler() {
85
+ return this.initialHandler || _emptyFunction.default;
86
+ }
87
+ setHandler(fn) {
88
+ if (validateResponseHandler(fn)) {
89
+ this.handler = fn;
90
+ }
91
+ return this;
92
+ }
93
+ setFinallyHandler(fn) {
94
+ this.finallyHandler = fn;
95
+ return this;
96
+ }
97
+ getFinallyHandler() {
98
+ return this.finallyHandler || _emptyFunction.default;
99
+ }
100
+ getHandler() {
101
+ return this.handler || _emptyFunction.default;
102
+ }
103
+ setErrorHandler(fn) {
104
+ if (validateResponseHandler(fn)) {
105
+ this.errorHandler = fn;
106
+ }
107
+ return this;
108
+ }
109
+ getErrorHandler() {
110
+ return this.errorHandler || _emptyFunction.default;
111
+ }
112
+ abort() {
113
+ const {
114
+ transport
115
+ } = this;
116
+ if (transport) {
117
+ transport.abort();
118
+ }
119
+ }
120
+ _unshieldResponseText(text) {
121
+ const shield = 'for (;;);';
122
+ const shieldLength = shield.length;
123
+ if (text.length <= shieldLength) {
124
+ throw new Error('Response too short on async to ' + this.getURI());
125
+ }
126
+ return text.substring(shieldLength);
127
+ }
128
+ send() {
129
+ const {
130
+ uri,
131
+ method
132
+ } = this;
133
+ let {
134
+ data
135
+ } = this;
136
+ const handler = this.getHandler();
137
+ const errorHandler = this.getErrorHandler();
138
+ const initialHandler = this.getInitialHandler();
139
+ const finallyHandler = this.getFinallyHandler();
140
+ initialHandler();
141
+ const request = new XMLHttpRequest();
142
+ const self = this;
143
+ request.open(method, uri, true);
144
+ request.onload = function () {
145
+ if (this.status >= 200 && this.status < 400) {
146
+ let response;
147
+ try {
148
+ const safeJson = self._unshieldResponseText(this.responseText);
149
+ response = JSON.parse(safeJson);
150
+ } catch (e) {
151
+ throw new Error('Failed to handle response: ' + e.message + '\n' + this.responseText);
152
+ }
153
+ new _AsyncResponse.default().handle(response, self.relative);
154
+ handler(response);
155
+ } else {
156
+ errorHandler(this);
157
+ }
158
+ finallyHandler(this);
159
+ };
160
+ request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
161
+ incrementRequests();
162
+ if (data instanceof FormData) {
163
+ data.append('__req', requests);
164
+ } else {
165
+ data.__req = requests;
166
+ data = serialize(data);
167
+ if (method === 'POST') {
168
+ request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
169
+ }
170
+ }
171
+ Object.keys(this.headers).forEach(name => {
172
+ request.setRequestHeader(name, this.headers[name]);
173
+ });
174
+ request.onerror = function () {
175
+ errorHandler(this);
176
+ finallyHandler(this);
177
+ };
178
+ request.send(data);
179
+ return request;
180
+ }
181
+ }
182
+ exports.default = AsyncRequest;