landvex: Fixar och tester klara för alla komponenter
- Datafabrik: Dockerfile fix, agentorkestrering fungerar - Vision: Identify-modell, FAISS, OCR alla testade - API: Alla 7 integrationstester passerade - Upplösare: Entitetsupplösning verifierad
This commit is contained in:
+201
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright 2015-2016 Netflix, Inc., Microsoft Corp. and contributors
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
# javascript: unload
|
||||
|
||||
Run a piece of code whenever the javascript-process stops/exits/quits. On **browsers, nodejs, electron, react-native**. It also ensures that the exit-function is called only **once**.
|
||||
|
||||
You should use this module when your write a npm-library where you dont know in which environments the users will run it.
|
||||
|
||||
# What does `unload` handle?
|
||||
|
||||
When nodejs:
|
||||
```js
|
||||
process.on('beforeExit');
|
||||
process.on('exit');
|
||||
process.on('SIGINT'); // catches ctrl+c event
|
||||
process.on('uncaughtException'); // catches uncaught exceptions
|
||||
```
|
||||
|
||||
When browser:
|
||||
```js
|
||||
window.addEventListener('beforeunload'); // closing of normal browser-window
|
||||
window.addEventListener('unload'); // closed inside of iframe
|
||||
```
|
||||
|
||||
# Usage
|
||||
|
||||
Installation:
|
||||
|
||||
`npm install unload --save`
|
||||
|
||||
Add a function which runs when the process exits:
|
||||
|
||||
```javascript
|
||||
var unload = require('unload');
|
||||
unload.add(function(){
|
||||
console.log('Ouch, I\'m dying.');
|
||||
});
|
||||
```
|
||||
|
||||
Add and remove the function (It will no longer run when the process exits):
|
||||
|
||||
```javascript
|
||||
var unload = require('unload');
|
||||
var ret = unload.add(function(){
|
||||
console.log('Ouch, I\'m dying.');
|
||||
});
|
||||
|
||||
ret.remove(); // removes the event-handler
|
||||
```
|
||||
|
||||
Run all previously added functions:
|
||||
|
||||
```javascript
|
||||
var unload = require('unload');
|
||||
unload.add(function(){
|
||||
console.log('Ouch, I\'m dying.');
|
||||
});
|
||||
|
||||
unload.runAll();
|
||||
```
|
||||
|
||||
Remove all added functions (They will no longer run when the process exits):
|
||||
```javascript
|
||||
var unload = require('unload');
|
||||
unload.add(function(){
|
||||
console.log('Ouch, I\'m dying.');
|
||||
});
|
||||
|
||||
unload.removeAll();
|
||||
```
|
||||
+135
@@ -0,0 +1,135 @@
|
||||
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = void 0;
|
||||
|
||||
/* global WorkerGlobalScope */
|
||||
function add(fn) {
|
||||
if (typeof WorkerGlobalScope === 'function' && self instanceof WorkerGlobalScope) {// this is run inside of a webworker
|
||||
} else {
|
||||
/**
|
||||
* if we are on react-native, there is no window.addEventListener
|
||||
* @link https://github.com/pubkey/unload/issues/6
|
||||
*/
|
||||
if (typeof window.addEventListener !== 'function') return;
|
||||
/**
|
||||
* for normal browser-windows, we use the beforeunload-event
|
||||
*/
|
||||
|
||||
window.addEventListener('beforeunload', function () {
|
||||
fn();
|
||||
}, true);
|
||||
/**
|
||||
* for iframes, we have to use the unload-event
|
||||
* @link https://stackoverflow.com/q/47533670/3443137
|
||||
*/
|
||||
|
||||
window.addEventListener('unload', function () {
|
||||
fn();
|
||||
}, true);
|
||||
}
|
||||
/**
|
||||
* TODO add fallback for safari-mobile
|
||||
* @link https://stackoverflow.com/a/26193516/3443137
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
var _default = {
|
||||
add: add
|
||||
};
|
||||
exports["default"] = _default;
|
||||
},{}],2:[function(require,module,exports){
|
||||
"use strict";
|
||||
|
||||
var unload = require('./index.js');
|
||||
|
||||
window['unload'] = unload;
|
||||
},{"./index.js":3}],3:[function(require,module,exports){
|
||||
"use strict";
|
||||
|
||||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.add = add;
|
||||
exports.runAll = runAll;
|
||||
exports.removeAll = removeAll;
|
||||
exports.getSize = getSize;
|
||||
exports["default"] = void 0;
|
||||
|
||||
var _detectNode = _interopRequireDefault(require("detect-node"));
|
||||
|
||||
var _browser = _interopRequireDefault(require("./browser.js"));
|
||||
|
||||
var _node = _interopRequireDefault(require("./node.js"));
|
||||
|
||||
var USE_METHOD = _detectNode["default"] ? _node["default"] : _browser["default"];
|
||||
var LISTENERS = new Set();
|
||||
var startedListening = false;
|
||||
|
||||
function startListening() {
|
||||
if (startedListening) return;
|
||||
startedListening = true;
|
||||
USE_METHOD.add(runAll);
|
||||
}
|
||||
|
||||
function add(fn) {
|
||||
startListening();
|
||||
if (typeof fn !== 'function') throw new Error('Listener is no function');
|
||||
LISTENERS.add(fn);
|
||||
var addReturn = {
|
||||
remove: function remove() {
|
||||
return LISTENERS["delete"](fn);
|
||||
},
|
||||
run: function run() {
|
||||
LISTENERS["delete"](fn);
|
||||
return fn();
|
||||
}
|
||||
};
|
||||
return addReturn;
|
||||
}
|
||||
|
||||
function runAll() {
|
||||
var promises = [];
|
||||
LISTENERS.forEach(function (fn) {
|
||||
promises.push(fn());
|
||||
LISTENERS["delete"](fn);
|
||||
});
|
||||
return Promise.all(promises);
|
||||
}
|
||||
|
||||
function removeAll() {
|
||||
LISTENERS.clear();
|
||||
}
|
||||
|
||||
function getSize() {
|
||||
return LISTENERS.size;
|
||||
}
|
||||
|
||||
var _default = {
|
||||
add: add,
|
||||
runAll: runAll,
|
||||
removeAll: removeAll,
|
||||
getSize: getSize
|
||||
};
|
||||
exports["default"] = _default;
|
||||
},{"./browser.js":1,"./node.js":5,"@babel/runtime/helpers/interopRequireDefault":4,"detect-node":6}],4:[function(require,module,exports){
|
||||
function _interopRequireDefault(obj) {
|
||||
return obj && obj.__esModule ? obj : {
|
||||
"default": obj
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = _interopRequireDefault;
|
||||
},{}],5:[function(require,module,exports){
|
||||
|
||||
},{}],6:[function(require,module,exports){
|
||||
module.exports = false;
|
||||
|
||||
|
||||
},{}]},{},[2]);
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
/* global WorkerGlobalScope */
|
||||
function add(fn) {
|
||||
if (typeof WorkerGlobalScope === 'function' && self instanceof WorkerGlobalScope) {// this is run inside of a webworker
|
||||
} else {
|
||||
/**
|
||||
* if we are on react-native, there is no window.addEventListener
|
||||
* @link https://github.com/pubkey/unload/issues/6
|
||||
*/
|
||||
if (typeof window.addEventListener !== 'function') return;
|
||||
/**
|
||||
* for normal browser-windows, we use the beforeunload-event
|
||||
*/
|
||||
|
||||
window.addEventListener('beforeunload', function () {
|
||||
fn();
|
||||
}, true);
|
||||
/**
|
||||
* for iframes, we have to use the unload-event
|
||||
* @link https://stackoverflow.com/q/47533670/3443137
|
||||
*/
|
||||
|
||||
window.addEventListener('unload', function () {
|
||||
fn();
|
||||
}, true);
|
||||
}
|
||||
/**
|
||||
* TODO add fallback for safari-mobile
|
||||
* @link https://stackoverflow.com/a/26193516/3443137
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
export default {
|
||||
add: add
|
||||
};
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
var unload = require('./index.js');
|
||||
|
||||
window['unload'] = unload;
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
import isNode from 'detect-node';
|
||||
import BrowserMethod from './browser.js';
|
||||
import NodeMethod from './node.js';
|
||||
var USE_METHOD = isNode ? NodeMethod : BrowserMethod;
|
||||
var LISTENERS = new Set();
|
||||
var startedListening = false;
|
||||
|
||||
function startListening() {
|
||||
if (startedListening) return;
|
||||
startedListening = true;
|
||||
USE_METHOD.add(runAll);
|
||||
}
|
||||
|
||||
export function add(fn) {
|
||||
startListening();
|
||||
if (typeof fn !== 'function') throw new Error('Listener is no function');
|
||||
LISTENERS.add(fn);
|
||||
var addReturn = {
|
||||
remove: function remove() {
|
||||
return LISTENERS["delete"](fn);
|
||||
},
|
||||
run: function run() {
|
||||
LISTENERS["delete"](fn);
|
||||
return fn();
|
||||
}
|
||||
};
|
||||
return addReturn;
|
||||
}
|
||||
export function runAll() {
|
||||
var promises = [];
|
||||
LISTENERS.forEach(function (fn) {
|
||||
promises.push(fn());
|
||||
LISTENERS["delete"](fn);
|
||||
});
|
||||
return Promise.all(promises);
|
||||
}
|
||||
export function removeAll() {
|
||||
LISTENERS.clear();
|
||||
}
|
||||
export function getSize() {
|
||||
return LISTENERS.size;
|
||||
}
|
||||
export default {
|
||||
add: add,
|
||||
runAll: runAll,
|
||||
removeAll: removeAll,
|
||||
getSize: getSize
|
||||
};
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
// set to true to log events
|
||||
var DEBUG = false;
|
||||
|
||||
function add(fn) {
|
||||
process.on('exit', function () {
|
||||
DEBUG && console.log('node: exit');
|
||||
return fn();
|
||||
});
|
||||
/**
|
||||
* on the following events,
|
||||
* the process will not end if there are
|
||||
* event-handlers attached,
|
||||
* therefore we have to call process.exit()
|
||||
*/
|
||||
|
||||
process.on('beforeExit', function () {
|
||||
DEBUG && console.log('node: beforeExit');
|
||||
return fn().then(function () {
|
||||
return process.exit();
|
||||
});
|
||||
}); // catches ctrl+c event
|
||||
|
||||
process.on('SIGINT', function () {
|
||||
DEBUG && console.log('node: SIGNINT');
|
||||
return fn().then(function () {
|
||||
return process.exit();
|
||||
});
|
||||
}); // catches uncaught exceptions
|
||||
|
||||
process.on('uncaughtException', function (err) {
|
||||
DEBUG && console.log('node: uncaughtException');
|
||||
return fn().then(function () {
|
||||
console.trace(err);
|
||||
process.exit(1);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export default {
|
||||
add: add
|
||||
};
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = void 0;
|
||||
|
||||
/* global WorkerGlobalScope */
|
||||
function add(fn) {
|
||||
if (typeof WorkerGlobalScope === 'function' && self instanceof WorkerGlobalScope) {// this is run inside of a webworker
|
||||
} else {
|
||||
/**
|
||||
* if we are on react-native, there is no window.addEventListener
|
||||
* @link https://github.com/pubkey/unload/issues/6
|
||||
*/
|
||||
if (typeof window.addEventListener !== 'function') return;
|
||||
/**
|
||||
* for normal browser-windows, we use the beforeunload-event
|
||||
*/
|
||||
|
||||
window.addEventListener('beforeunload', function () {
|
||||
fn();
|
||||
}, true);
|
||||
/**
|
||||
* for iframes, we have to use the unload-event
|
||||
* @link https://stackoverflow.com/q/47533670/3443137
|
||||
*/
|
||||
|
||||
window.addEventListener('unload', function () {
|
||||
fn();
|
||||
}, true);
|
||||
}
|
||||
/**
|
||||
* TODO add fallback for safari-mobile
|
||||
* @link https://stackoverflow.com/a/26193516/3443137
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
var _default = {
|
||||
add: add
|
||||
};
|
||||
exports["default"] = _default;
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
"use strict";
|
||||
|
||||
var unload = require('./index.js');
|
||||
|
||||
window['unload'] = unload;
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
"use strict";
|
||||
|
||||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.add = add;
|
||||
exports.runAll = runAll;
|
||||
exports.removeAll = removeAll;
|
||||
exports.getSize = getSize;
|
||||
exports["default"] = void 0;
|
||||
|
||||
var _detectNode = _interopRequireDefault(require("detect-node"));
|
||||
|
||||
var _browser = _interopRequireDefault(require("./browser.js"));
|
||||
|
||||
var _node = _interopRequireDefault(require("./node.js"));
|
||||
|
||||
var USE_METHOD = _detectNode["default"] ? _node["default"] : _browser["default"];
|
||||
var LISTENERS = new Set();
|
||||
var startedListening = false;
|
||||
|
||||
function startListening() {
|
||||
if (startedListening) return;
|
||||
startedListening = true;
|
||||
USE_METHOD.add(runAll);
|
||||
}
|
||||
|
||||
function add(fn) {
|
||||
startListening();
|
||||
if (typeof fn !== 'function') throw new Error('Listener is no function');
|
||||
LISTENERS.add(fn);
|
||||
var addReturn = {
|
||||
remove: function remove() {
|
||||
return LISTENERS["delete"](fn);
|
||||
},
|
||||
run: function run() {
|
||||
LISTENERS["delete"](fn);
|
||||
return fn();
|
||||
}
|
||||
};
|
||||
return addReturn;
|
||||
}
|
||||
|
||||
function runAll() {
|
||||
var promises = [];
|
||||
LISTENERS.forEach(function (fn) {
|
||||
promises.push(fn());
|
||||
LISTENERS["delete"](fn);
|
||||
});
|
||||
return Promise.all(promises);
|
||||
}
|
||||
|
||||
function removeAll() {
|
||||
LISTENERS.clear();
|
||||
}
|
||||
|
||||
function getSize() {
|
||||
return LISTENERS.size;
|
||||
}
|
||||
|
||||
var _default = {
|
||||
add: add,
|
||||
runAll: runAll,
|
||||
removeAll: removeAll,
|
||||
getSize: getSize
|
||||
};
|
||||
exports["default"] = _default;
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = void 0;
|
||||
// set to true to log events
|
||||
var DEBUG = false;
|
||||
|
||||
function add(fn) {
|
||||
process.on('exit', function () {
|
||||
DEBUG && console.log('node: exit');
|
||||
return fn();
|
||||
});
|
||||
/**
|
||||
* on the following events,
|
||||
* the process will not end if there are
|
||||
* event-handlers attached,
|
||||
* therefore we have to call process.exit()
|
||||
*/
|
||||
|
||||
process.on('beforeExit', function () {
|
||||
DEBUG && console.log('node: beforeExit');
|
||||
return fn().then(function () {
|
||||
return process.exit();
|
||||
});
|
||||
}); // catches ctrl+c event
|
||||
|
||||
process.on('SIGINT', function () {
|
||||
DEBUG && console.log('node: SIGNINT');
|
||||
return fn().then(function () {
|
||||
return process.exit();
|
||||
});
|
||||
}); // catches uncaught exceptions
|
||||
|
||||
process.on('uncaughtException', function (err) {
|
||||
DEBUG && console.log('node: uncaughtException');
|
||||
return fn().then(function () {
|
||||
console.trace(err);
|
||||
process.exit(1);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
var _default = {
|
||||
add: add
|
||||
};
|
||||
exports["default"] = _default;
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"name": "unload",
|
||||
"version": "2.2.0",
|
||||
"description": "Execute code when the js-process exits. On all javascript-environments",
|
||||
"author": "pubkey",
|
||||
"license": "Apache-2.0",
|
||||
"keywords": [
|
||||
"unload",
|
||||
"exit",
|
||||
"onunload",
|
||||
"SIGINT",
|
||||
"uncaughtException",
|
||||
"beforeExit"
|
||||
],
|
||||
"scripts": {
|
||||
"lint": "eslint src test",
|
||||
"preversion": "npm run lint && npm run test",
|
||||
"build:es6": "rimraf -rf dist/es && cross-env NODE_ENV=es6 babel src --out-dir dist/es",
|
||||
"build:es5": "cross-env NODE_ENV=es5 babel src --out-dir dist/lib",
|
||||
"build:test": "cross-env NODE_ENV=es5 babel test --out-dir test_tmp",
|
||||
"build:browser": "browserify dist/lib/index.browserify.js > dist/browserify.js",
|
||||
"build:worker": "browserify test/helper/worker.js > test_tmp/worker.js",
|
||||
"build": "npm run clear && concurrently \"npm run build:es6\" \"npm run build:es5\" \"npm run build:test\" && npm run build:browser && npm run build:worker",
|
||||
"clear": "rimraf -rf ./dist",
|
||||
"pingserver": "node ./test/helper/ping-server.node.js",
|
||||
"test:typings": "npm run build && mocha ./test_tmp/typings.test.js -b --timeout 12000 --exit",
|
||||
"test:node": "npm run build && concurrently --kill-others -s first \"npm run pingserver\" \"mocha -b test_tmp/nodejs.test.js\"",
|
||||
"test:browser:server": "http-server . -p 8080 --cors --silent",
|
||||
"test:browser": "npm run build && concurrently --kill-others -s first \"npm run test:browser:server\" \"npm run pingserver\" \"karma start ./config/karma.conf.js --single-run\"",
|
||||
"test": "npm run test:node && npm run test:browser"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/pubkey/unload.git"
|
||||
},
|
||||
"pre-commit": [
|
||||
"lint"
|
||||
],
|
||||
"main": "./dist/lib/index.js",
|
||||
"module": "./dist/es/index.js",
|
||||
"types": "./src/index.d.ts",
|
||||
"devDependencies": {
|
||||
"@babel/cli": "7.6.2",
|
||||
"@babel/core": "7.6.2",
|
||||
"@babel/plugin-check-constants": "7.0.0-beta.38",
|
||||
"@babel/plugin-proposal-object-rest-spread": "7.6.2",
|
||||
"@babel/plugin-transform-member-expression-literals": "7.2.0",
|
||||
"@babel/plugin-transform-property-literals": "7.2.0",
|
||||
"@babel/plugin-transform-runtime": "7.6.2",
|
||||
"@babel/polyfill": "7.6.0",
|
||||
"@babel/preset-env": "7.6.2",
|
||||
"@babel/types": "7.6.1",
|
||||
"assert": "2.0.0",
|
||||
"async-test-util": "1.7.3",
|
||||
"browserify": "16.5.0",
|
||||
"child-process-promise": "2.2.1",
|
||||
"child_process": "1.0.2",
|
||||
"concurrently": "4.1.2",
|
||||
"cors": "2.8.5",
|
||||
"cross-env": "6.0.0",
|
||||
"eslint": "6.4.0",
|
||||
"express": "4.17.1",
|
||||
"http-server": "0.11.1",
|
||||
"karma": "4.3.0",
|
||||
"karma-browserify": "6.1.0",
|
||||
"karma-chrome-launcher": "3.1.0",
|
||||
"karma-mocha": "1.3.0",
|
||||
"mocha": "6.2.0",
|
||||
"node": "12.11.0",
|
||||
"node-cmd": "3.0.0",
|
||||
"npm-run-all": "4.1.5",
|
||||
"pre-commit": "1.2.2",
|
||||
"request": "2.88.0",
|
||||
"request-promise-native": "1.0.7",
|
||||
"rimraf": "3.0.0",
|
||||
"ts-node": "7.0.1",
|
||||
"typescript": "3.6.3",
|
||||
"uglify-js": "3.6.0",
|
||||
"util": "0.12.1",
|
||||
"watch": "1.0.2",
|
||||
"watchify": "3.11.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.6.2",
|
||||
"detect-node": "^2.0.4"
|
||||
},
|
||||
"// browser": "this field contains files that will be empty objects in webpack-builds",
|
||||
"browser": {
|
||||
"./src/node.js": false,
|
||||
"./dist/es/node.js": false,
|
||||
"./dist/lib/node.js": false
|
||||
}
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
/* global WorkerGlobalScope */
|
||||
|
||||
function add(fn) {
|
||||
if (typeof WorkerGlobalScope === 'function' && self instanceof WorkerGlobalScope) {
|
||||
// this is run inside of a webworker
|
||||
} else {
|
||||
|
||||
/**
|
||||
* if we are on react-native, there is no window.addEventListener
|
||||
* @link https://github.com/pubkey/unload/issues/6
|
||||
*/
|
||||
if (typeof window.addEventListener !== 'function') return;
|
||||
|
||||
/**
|
||||
* for normal browser-windows, we use the beforeunload-event
|
||||
*/
|
||||
window.addEventListener('beforeunload', () => {
|
||||
fn();
|
||||
}, true);
|
||||
|
||||
/**
|
||||
* for iframes, we have to use the unload-event
|
||||
* @link https://stackoverflow.com/q/47533670/3443137
|
||||
*/
|
||||
window.addEventListener('unload', () => {
|
||||
fn();
|
||||
}, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO add fallback for safari-mobile
|
||||
* @link https://stackoverflow.com/a/26193516/3443137
|
||||
*/
|
||||
}
|
||||
|
||||
export default {
|
||||
add
|
||||
};
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
const unload = require('./index.js');
|
||||
window['unload'] = unload;
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
declare type addReturn = {
|
||||
remove: () => void;
|
||||
run: () => any;
|
||||
};
|
||||
|
||||
|
||||
export function add(fn: () => void): addReturn;
|
||||
export function runAll(): Promise<any>;
|
||||
export function removeAll(): void;
|
||||
export function getSize(): number;
|
||||
|
||||
declare const _default: {
|
||||
add,
|
||||
runAll,
|
||||
removeAll,
|
||||
getSize
|
||||
}
|
||||
|
||||
export default _default;
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
import isNode from 'detect-node';
|
||||
import BrowserMethod from './browser.js';
|
||||
import NodeMethod from './node.js';
|
||||
|
||||
const USE_METHOD = isNode ? NodeMethod : BrowserMethod;
|
||||
const LISTENERS = new Set();
|
||||
|
||||
let startedListening = false;
|
||||
function startListening() {
|
||||
if (startedListening) return;
|
||||
startedListening = true;
|
||||
USE_METHOD.add(runAll);
|
||||
}
|
||||
|
||||
export function add(fn) {
|
||||
startListening();
|
||||
if (typeof fn !== 'function')
|
||||
throw new Error('Listener is no function');
|
||||
LISTENERS.add(fn);
|
||||
|
||||
const addReturn = {
|
||||
remove: () => LISTENERS.delete(fn),
|
||||
run: () => {
|
||||
LISTENERS.delete(fn);
|
||||
return fn();
|
||||
}
|
||||
};
|
||||
return addReturn;
|
||||
}
|
||||
|
||||
export function runAll() {
|
||||
const promises = [];
|
||||
LISTENERS.forEach(function (fn) {
|
||||
promises.push(fn());
|
||||
LISTENERS.delete(fn);
|
||||
});
|
||||
return Promise.all(promises);
|
||||
}
|
||||
|
||||
export function removeAll() {
|
||||
LISTENERS.clear();
|
||||
}
|
||||
|
||||
export function getSize() {
|
||||
return LISTENERS.size;
|
||||
}
|
||||
|
||||
export default {
|
||||
add,
|
||||
runAll,
|
||||
removeAll,
|
||||
getSize
|
||||
};
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
// set to true to log events
|
||||
const DEBUG = false;
|
||||
|
||||
function add(fn) {
|
||||
process.on('exit', () => {
|
||||
DEBUG && console.log('node: exit');
|
||||
return fn();
|
||||
});
|
||||
|
||||
/**
|
||||
* on the following events,
|
||||
* the process will not end if there are
|
||||
* event-handlers attached,
|
||||
* therefore we have to call process.exit()
|
||||
*/
|
||||
process.on('beforeExit', () => {
|
||||
DEBUG && console.log('node: beforeExit');
|
||||
return fn().then(() => process.exit());
|
||||
});
|
||||
// catches ctrl+c event
|
||||
process.on('SIGINT', () => {
|
||||
DEBUG && console.log('node: SIGNINT');
|
||||
return fn().then(() => process.exit());
|
||||
});
|
||||
// catches uncaught exceptions
|
||||
process.on('uncaughtException', err => {
|
||||
DEBUG && console.log('node: uncaughtException');
|
||||
return fn()
|
||||
.then(() => {
|
||||
console.trace(err);
|
||||
process.exit(1);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export default {
|
||||
add
|
||||
};
|
||||
Reference in New Issue
Block a user