@ohos-ports/floss 5.0.1-beta.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Jibo, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,188 @@
1
+ # Floss
2
+
3
+ Unit-testing for those hard to reach places.
4
+
5
+ [![Node.js CI](https://github.com/pixijs/floss/workflows/Node.js%20CI/badge.svg)](https://github.com/pixijs/floss/actions?query=workflow%3A%22Node.js+CI%22) [![npm version](https://badge.fury.io/js/floss.svg)](https://badge.fury.io/js/floss)
6
+
7
+ Uses Electron to provide a Mocha unit-testing environment which can be run headlessly or to debugged with DevTools. This was largely inspired by the [electron-mocha](https://github.com/jprichardson/electron-mocha) and [mocha-electron](https://github.com/tscanlin/mochatron) projects but didn't quite have the debugging features needed to develop tests.
8
+
9
+ ## Installation
10
+
11
+ Install globally:
12
+
13
+ ```bash
14
+ npm install -g floss electron
15
+ ```
16
+
17
+ Install locally within a project:
18
+
19
+ ```bash
20
+ npm install floss electron --save-dev
21
+ ```
22
+
23
+ ### Debug Mode
24
+
25
+ Open tests in an Electron window where test can can be debugged with `debugger` and dev tools.
26
+
27
+ ```js
28
+ await floss({
29
+ path: 'test/*.js',
30
+ debug: true
31
+ });
32
+ ```
33
+
34
+ ### Mocha Reporter
35
+
36
+ The `reporter` and `reporterOptions` are pass-through options for Mocha to specify a different reporter when running Floss in non-debug mode.
37
+
38
+ ```js
39
+ await floss({
40
+ path: 'test/*.js',
41
+ reporter: 'xunit',
42
+ reporterOptions: {
43
+ filename: 'report.xml'
44
+ }
45
+ });
46
+ ```
47
+
48
+ ### Custom Options
49
+
50
+ Additional properties can be passed to the test code by adding more values to the run options.
51
+
52
+ ```js
53
+ await floss({
54
+ path: 'test/*.js',
55
+ customUrl: 'http://localhost:8080' // <- custom
56
+ });
57
+ ```
58
+
59
+ The test code and use the global `options` property to have access to the run options.
60
+
61
+ ```js
62
+ console.log(options.customUrl); // logs: http://localhost:8080
63
+ ```
64
+
65
+ ### Electron Arguments
66
+
67
+ Commandline arguments can be passed to Electron directly by using `args`. In the example below, you may wan to disable Electron's user-gesture policy if you are testing HTML video or audio playback.
68
+
69
+ ```js
70
+ await floss({
71
+ path: 'test/index.js',
72
+ args: ['--autoplay-policy=no-user-gesture-required']
73
+ });
74
+ ```
75
+
76
+ ## Command Line Usage
77
+
78
+ ### Arguments
79
+
80
+ * **--path** or **-p** (String) Path to the file to test
81
+ * **--debug** or **-d** (Boolean) Enable to run in headful mode, default `false`.
82
+ * **--quiet** or **-q** (Boolean) Prevent console[log/info/error/warn/dir] messages from appearing in `stdout`.
83
+ * **--electron** or **-e** (String) Path to the electron to use.
84
+ * **--reporter** or **-R** (String) Mocha reporter type, default `spec`.
85
+ * **--reporterOptions** or **-O** (String) Mocha reporter options.
86
+ * **--require** or **-r** (String) Module to require (e.g., `ts-node/register`).
87
+ * **-- [args]** Additional arguments can be passed to Electron after `--`
88
+
89
+ ### Usage
90
+
91
+ Command Line usage when installed globally:
92
+
93
+ ```bash
94
+ floss --path "test/*.js"
95
+ ```
96
+
97
+ Or installed locally:
98
+
99
+ ```bash
100
+ node node_modules/.bin/floss --path "test/*.js"
101
+ ```
102
+
103
+ Alernatively, within the **package.json**'s' scripts:
104
+
105
+ ```json
106
+ {
107
+ "scripts": {
108
+ "test": "floss --path \"test/*.js\""
109
+ }
110
+ }
111
+ ```
112
+
113
+ ### Debug Mode
114
+
115
+ Open tests in an Electron window where test can can be debugged with `debugger` and dev tools.
116
+
117
+ ```bash
118
+ floss --path "test/*.js" --debug
119
+ ```
120
+
121
+ ### Using TypeScript
122
+
123
+ Support can easily be added for writing tests in TypeScript using [ts-node](https://www.npmjs.com/package/ts-node).
124
+
125
+ ```bash
126
+ floss --path "test/*.ts" --require ts-node/register
127
+ ```
128
+
129
+ ### Istanbul Code Coverage
130
+
131
+ Floss supports `nyc`. To use it, just use floss as you would mocha:
132
+
133
+ ```bash
134
+ nyc floss --path "test/*.js"
135
+ ```
136
+
137
+ ### Mocha Reporter
138
+
139
+ Can use the same reporter options as the API mentioned above. The `reporterOptions` are expressed as a querystring, for instance `varname=foo&another=bar`.
140
+
141
+ ```bash
142
+ floss --path "test/*.js" \
143
+ --reporter=xunit \
144
+ --reporterOptions output=report.xml
145
+ ```
146
+
147
+ ### Electron Arguments
148
+
149
+ Supports passing additional arguments to Electron after `--`.
150
+
151
+ ```bash
152
+ floss --path "test/*.js" -- --autoplay-policy=no-user-gesture-required
153
+ ```
154
+
155
+ ## Custom Electron Version
156
+
157
+ Some application may require a specific version of Electron. Floss uses Electron 10.0.0+, but you can specific the path to your own version. The custom version can be used either through the commandline argument `--electron`, by setting the Node environmental variable `ELECTRON_PATH` or by setting the run option `electron`.
158
+
159
+ ```bash
160
+ floss --path "test/.js" \
161
+ --electron /usr/local/bin/electron
162
+ ```
163
+
164
+ ```bash
165
+ ELECTRON_PATH=/usr/local/bin/electron floss --path "test/*.js"
166
+ ```
167
+
168
+ ## GitHub Actions Integration
169
+
170
+ ```yml
171
+ name: Node.js CI
172
+ on:
173
+ push:
174
+ branches: [ '**' ]
175
+ tags: [ '**' ]
176
+ jobs:
177
+ build:
178
+ runs-on: ubuntu-latest
179
+ steps:
180
+ - uses: actions/checkout@v2
181
+ - uses: actions/setup-node@v1
182
+ with:
183
+ node-version: '12'
184
+ - run: npm install
185
+ - uses: GabrielBB/xvfb-action@v1.0
186
+ with:
187
+ run: npm test
188
+ ```
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Events shareed between renderer and main process.
3
+ */
4
+ declare const enum FlossEvent {
5
+ Error = "floss-error",
6
+ Done = "floss-done",
7
+ Start = "floss-start"
8
+ }
9
+ export { FlossEvent };
package/lib/common.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
package/lib/floss.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/lib/floss.js ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander = require("commander");
5
+ const _1 = require("./");
6
+ /**
7
+ * Parse the commandline arguments.
8
+ */
9
+ const getProgram = () => commander
10
+ .requiredOption('-p, --path [path/to/folder/or/file.js]', 'Either a path to a directory '
11
+ + 'containing index.js or a path to a single test file')
12
+ .option('-d, --debug', 'Launch electron in debug mode')
13
+ .option('-e, --electron [path/to/Electron]', 'Path to version of Electron to test on')
14
+ .option('-R, --reporter [spec]', 'Mocha reporter for headless mode only')
15
+ .option('-O, --reporterOptions [filename=report.xml]', 'Additional arguments for reporter '
16
+ + 'options, query-string formatted')
17
+ .option('-r, --require [module]', 'Require module')
18
+ .option('-q, --quiet', 'Prevent console.(log/info/error/warn) messages from appearing in STDOUT')
19
+ .parseAsync(process.argv);
20
+ /**
21
+ * Main entry-point for the CLI
22
+ */
23
+ async function main() {
24
+ try {
25
+ const program = await getProgram();
26
+ const options = program.opts();
27
+ options.args = [...program.args];
28
+ // Sanitize undefined properties
29
+ for (const prop in options) {
30
+ const p = prop;
31
+ if (options[p] === undefined) {
32
+ delete options[p];
33
+ }
34
+ }
35
+ await _1.floss(options);
36
+ process.exit(0);
37
+ }
38
+ catch (err) {
39
+ process.exit(1);
40
+ }
41
+ }
42
+ main();
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZmxvc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsdUNBQXVDO0FBQ3ZDLHlCQUEyQjtBQUczQjs7R0FFRztBQUNILE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRSxDQUNwQixTQUFTO0tBQ0osY0FBYyxDQUFDLHdDQUF3QyxFQUFFLCtCQUErQjtNQUNuRixxREFBcUQsQ0FBQztLQUMzRCxNQUFNLENBQUMsYUFBYSxFQUFFLCtCQUErQixDQUFDO0tBQ3RELE1BQU0sQ0FBQyxtQ0FBbUMsRUFBRSx3Q0FBd0MsQ0FBQztLQUNyRixNQUFNLENBQUMsdUJBQXVCLEVBQUUsdUNBQXVDLENBQUM7S0FDeEUsTUFBTSxDQUFDLDZDQUE2QyxFQUFFLG9DQUFvQztNQUNyRixpQ0FBaUMsQ0FBQztLQUN2QyxNQUFNLENBQUMsd0JBQXdCLEVBQUUsZ0JBQWdCLENBQUM7S0FDbEQsTUFBTSxDQUFDLGFBQWEsRUFBRSx5RUFBeUUsQ0FBQztLQUNoRyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRWxDOztHQUVHO0FBQ0gsS0FBSyxVQUFVLElBQUk7SUFFZixJQUNBO1FBQ0ksTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFrQixDQUFDO1FBRS9DLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqQyxnQ0FBZ0M7UUFDaEMsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLEVBQzFCO1lBQ0ksTUFBTSxDQUFDLEdBQUcsSUFBMEIsQ0FBQztZQUVyQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQzVCO2dCQUNJLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JCO1NBQ0o7UUFFRCxNQUFNLFFBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25CO0lBQ0QsT0FBTyxHQUFHLEVBQ1Y7UUFDSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25CO0FBQ0wsQ0FBQztBQUVELElBQUksRUFBRSxDQUFDIn0=
package/lib/index.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ interface FlossOptions {
2
+ path: string;
3
+ debug?: boolean;
4
+ electron?: string;
5
+ reporter?: string;
6
+ reporterOptions?: any;
7
+ require?: string;
8
+ args?: string[];
9
+ }
10
+ /**
11
+ * API to launch the Floss application.
12
+ * @module floss
13
+ * @param {Object|String} options The options map or path.
14
+ * @param {String} [options.path] Path to the JS file to run, can be a glob.
15
+ * @param {Boolean} [options.debug] `true` opens in headful mode.
16
+ * @param {String} [options.electron] Path to custom electron version. If undefined
17
+ * will use environment variable `ELECTRON_PATH` or electron
18
+ * installed alongside.
19
+ * @param {String} [options.require] Additional module to require.
20
+ * @param {String} [options.reporter=spec] Mocha reporter (non-debug mode only)
21
+ * @param {String|Object} [options.reporterOptions] Additional options for the reporter
22
+ * useful for specifying an output file if using the 'xunit' reporter.
23
+ * Options can be a querystring format, e.g., `"foo=2&bar=something"`
24
+ * @param {String[]} [options.args] Additional Electron arguments, can be useful
25
+ * for things like disable autoplay gestures, e.g.,
26
+ * `["--autoplay-policy=no-user-gesture-required"]`
27
+ * @param {Function} done Called when completed. Passes error if failed.
28
+ */
29
+ declare function floss(options: string | FlossOptions): Promise<void>;
30
+ export { floss };
31
+ export type { FlossOptions };
package/lib/index.html ADDED
@@ -0,0 +1,20 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Floss Tests</title>
6
+ <link id="mocha-css" rel="stylesheet" />
7
+ <style>
8
+ body { background-color: white; }
9
+ </style>
10
+ </head>
11
+ <body>
12
+ <div id="mocha"></div>
13
+ <div id="messages"></div>
14
+ <div id="fixtures"></div>
15
+ <script>
16
+ const Renderer = require('./renderer');
17
+ new Renderer('mocha-css');
18
+ </script>
19
+ </body>
20
+ </html>
package/lib/index.js ADDED
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.floss = void 0;
4
+ const path = require("path");
5
+ const child_process_1 = require("child_process");
6
+ let electron;
7
+ try {
8
+ // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires
9
+ electron = require('electron');
10
+ }
11
+ catch (err) {
12
+ // silence is golden
13
+ }
14
+ /**
15
+ * API to launch the Floss application.
16
+ * @module floss
17
+ * @param {Object|String} options The options map or path.
18
+ * @param {String} [options.path] Path to the JS file to run, can be a glob.
19
+ * @param {Boolean} [options.debug] `true` opens in headful mode.
20
+ * @param {String} [options.electron] Path to custom electron version. If undefined
21
+ * will use environment variable `ELECTRON_PATH` or electron
22
+ * installed alongside.
23
+ * @param {String} [options.require] Additional module to require.
24
+ * @param {String} [options.reporter=spec] Mocha reporter (non-debug mode only)
25
+ * @param {String|Object} [options.reporterOptions] Additional options for the reporter
26
+ * useful for specifying an output file if using the 'xunit' reporter.
27
+ * Options can be a querystring format, e.g., `"foo=2&bar=something"`
28
+ * @param {String[]} [options.args] Additional Electron arguments, can be useful
29
+ * for things like disable autoplay gestures, e.g.,
30
+ * `["--autoplay-policy=no-user-gesture-required"]`
31
+ * @param {Function} done Called when completed. Passes error if failed.
32
+ */
33
+ function floss(options) {
34
+ if (typeof options === 'string') {
35
+ options = { path: options };
36
+ }
37
+ const opts = Object.assign({
38
+ path: '',
39
+ debug: false,
40
+ quiet: false,
41
+ args: [],
42
+ electron: process.env.ELECTRON_PATH || electron
43
+ }, options);
44
+ if (!opts.path) {
45
+ throw new Error('No path specified for Floss.');
46
+ }
47
+ else if (typeof opts.path !== 'string') {
48
+ throw new Error('Path type is not a string');
49
+ }
50
+ if (!opts.electron) {
51
+ // Electron not available (e.g., HarmonyOS). Use Node.js + jsdom runner.
52
+ // This provides fully functional test execution using real Mocha and jsdom.
53
+ try {
54
+ const nodeRunner = require('./node-runner');
55
+ return nodeRunner.runInNode(opts);
56
+ }
57
+ catch (e) {
58
+ throw new Error('Unable to find Electron. Install \'electron\' alongside Floss. (Node.js runner failed: ' + e.message + ')');
59
+ }
60
+ }
61
+ const app = path.join(__dirname, 'main');
62
+ const args = JSON.stringify(opts);
63
+ // copy the environment and remove things that would prevent Floss from running properly
64
+ const envCopy = Object.assign({}, process.env);
65
+ delete envCopy.ELECTRON_RUN_AS_NODE;
66
+ delete envCopy.ELECTRON_NO_ATTACH_CONSOLE;
67
+ return new Promise((resolve, reject) => {
68
+ let execPath = opts.electron;
69
+ // In the case where floss is running in windows with the cmdline option --electron electron
70
+ // options.electron will just be "electron" at this point.
71
+ // Due to limitations with how nodejs spawns windows processes we need to add .cmd to the end of the command
72
+ // https://github.com/nodejs/node/issues/3675
73
+ const isWindows = (/^win/).test(process.platform);
74
+ if (isWindows && !path.extname(execPath)) {
75
+ execPath += '.cmd';
76
+ }
77
+ const childProcess = child_process_1.spawn(execPath, [app, args, ...opts.args], {
78
+ stdio: 'pipe',
79
+ env: envCopy
80
+ });
81
+ childProcess.stdout.on('data', (data) => {
82
+ process.stdout.write(data);
83
+ });
84
+ childProcess.on('close', (code) => {
85
+ if (code !== 0) {
86
+ reject(new Error('Mocha tests failed.'));
87
+ }
88
+ else {
89
+ resolve();
90
+ }
91
+ });
92
+ });
93
+ }
94
+ exports.floss = floss;
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLGlEQUFzQztBQUV0QyxJQUFJLFFBQWdCLENBQUM7QUFFckIsSUFDQTtJQUNJLDhFQUE4RTtJQUM5RSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBc0IsQ0FBQztDQUN2RDtBQUNELE9BQU8sR0FBRyxFQUNWO0lBQ0ksb0JBQW9CO0NBQ3ZCO0FBWUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILFNBQVMsS0FBSyxDQUFDLE9BQThCO0lBRXpDLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUMvQjtRQUNJLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztLQUMvQjtJQUVELE1BQU0sSUFBSSxHQUFpQixNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3JDLElBQUksRUFBRSxFQUFFO1FBQ1IsS0FBSyxFQUFFLEtBQUs7UUFDWixLQUFLLEVBQUUsS0FBSztRQUNaLElBQUksRUFBRSxFQUFFO1FBQ1IsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLFFBQVE7S0FDbEQsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVaLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUNkO1FBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0tBQ25EO1NBQ0ksSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUN0QztRQUNJLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztLQUNoRDtJQUVELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUNsQjtRQUNJLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztLQUNyRjtJQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFbEMsd0ZBQXdGO0lBQ3hGLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUvQyxPQUFPLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztJQUNwQyxPQUFPLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQztJQUUxQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBRW5DLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFrQixDQUFDO1FBQ3ZDLDRGQUE0RjtRQUM1RiwwREFBMEQ7UUFDMUQsNEdBQTRHO1FBQzVHLDZDQUE2QztRQUM3QyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbEQsSUFBSSxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUN4QztZQUNJLFFBQVEsSUFBSSxNQUFNLENBQUM7U0FDdEI7UUFDRCxNQUFNLFlBQVksR0FBRyxxQkFBSyxDQUN0QixRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQWdCLENBQUMsRUFBRTtZQUM3QyxLQUFLLEVBQUUsTUFBTTtZQUNiLEdBQUcsRUFBRSxPQUFPO1NBQ2YsQ0FDSixDQUFDO1FBRUYsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFFcEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxZQUFZLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBRTlCLElBQUksSUFBSSxLQUFLLENBQUMsRUFDZDtnQkFDSSxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO2FBQzVDO2lCQUVEO2dCQUNJLE9BQU8sRUFBRSxDQUFDO2FBQ2I7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVRLHNCQUFLIn0=
package/lib/main.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/lib/main.js ADDED
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fs_1 = require("fs");
4
+ const path = require("path");
5
+ const electron_1 = require("electron");
6
+ const chalk = require("chalk");
7
+ // Get the configuration path
8
+ const configPath = path.join(electron_1.app.getPath('userData'), 'config.json');
9
+ /**
10
+ * Restore the bounds of the window.
11
+ */
12
+ const restoreBounds = () => {
13
+ try {
14
+ return JSON.parse(fs_1.readFileSync(configPath, 'utf8'));
15
+ }
16
+ catch (e) {
17
+ return {
18
+ width: 1024,
19
+ height: 768
20
+ };
21
+ }
22
+ };
23
+ const createWindow = () => {
24
+ const args = JSON.parse(process.argv.slice(2)[0]);
25
+ // Get the window bounds
26
+ const options = Object.assign(Object.assign({}, restoreBounds()), { show: args.debug, background: '#fff', webPreferences: {
27
+ nodeIntegration: true,
28
+ enableRemoteModule: true,
29
+ contextIsolation: false,
30
+ } });
31
+ // Create the browser window.
32
+ const mainWindow = new electron_1.BrowserWindow(options);
33
+ electron_1.ipcMain
34
+ .on("floss-done" /* Done */, () => process.exit(0))
35
+ .on("floss-error" /* Error */, (_event, message) => {
36
+ if (message) {
37
+ console.error(chalk.red(`\n[floss] Error: ${message}\n`));
38
+ }
39
+ process.exit(1);
40
+ });
41
+ // and load the index.html of the app.
42
+ mainWindow.loadFile(path.join(__dirname, 'index.html'));
43
+ const { webContents } = mainWindow;
44
+ // don't show the dev tools if you're not in headless mode. this is to
45
+ // avoid having breakpoints and "pause on caught / uncaught exceptions" halting
46
+ // the runtime. plus, if you're in headless mode, having the devtools open is probably
47
+ // not very useful anyway
48
+ if (args.debug) {
49
+ webContents.openDevTools({ mode: 'bottom' });
50
+ }
51
+ webContents.on('did-finish-load', () => {
52
+ webContents.send("floss-start" /* Start */, JSON.stringify(args));
53
+ });
54
+ mainWindow.on('close', () => {
55
+ fs_1.writeFileSync(configPath, JSON.stringify(mainWindow.getBounds()));
56
+ });
57
+ };
58
+ // This method will be called when Electron has finished
59
+ // initialization and is ready to create browser windows.
60
+ electron_1.app.whenReady().then(createWindow);
61
+ // Quit when all windows are closed.
62
+ electron_1.app.on('window-all-closed', () => electron_1.app.quit());
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkJBQWlEO0FBQ2pELDZCQUE2QjtBQUM3Qix1Q0FBdUQ7QUFFdkQsK0JBQStCO0FBRS9CLDZCQUE2QjtBQUM3QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFFckU7O0dBRUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxHQUFnQyxFQUFFO0lBRXBELElBQ0E7UUFDSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUN2RDtJQUNELE9BQU8sQ0FBQyxFQUNSO1FBQ0ksT0FBTztZQUNILEtBQUssRUFBRSxJQUFJO1lBQ1gsTUFBTSxFQUFFLEdBQUc7U0FDZCxDQUFDO0tBQ0w7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxHQUFHLEVBQUU7SUFFdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWxELHdCQUF3QjtJQUN4QixNQUFNLE9BQU8sbUNBQ04sYUFBYSxFQUFFLEtBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUNoQixVQUFVLEVBQUUsTUFBTSxFQUNsQixjQUFjLEVBQUU7WUFDWixlQUFlLEVBQUUsSUFBSTtZQUNyQixrQkFBa0IsRUFBRSxJQUFJO1lBQ3hCLGdCQUFnQixFQUFFLEtBQUs7U0FDMUIsR0FDSixDQUFDO0lBRUYsNkJBQTZCO0lBQzdCLE1BQU0sVUFBVSxHQUFHLElBQUksd0JBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUU5QyxrQkFBTztTQUNGLEVBQUUsMEJBQWtCLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDMUMsRUFBRSw0QkFBbUIsQ0FBQyxNQUFXLEVBQUUsT0FBZSxFQUFFLEVBQUU7UUFFbkQsSUFBSSxPQUFPLEVBQ1g7WUFDSSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsb0JBQW9CLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQztTQUM3RDtRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFFUCxzQ0FBc0M7SUFDdEMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBRXhELE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxVQUFVLENBQUM7SUFFbkMsc0VBQXNFO0lBQ3RFLCtFQUErRTtJQUMvRSx1RkFBdUY7SUFDdkYseUJBQXlCO0lBQ3pCLElBQUksSUFBSSxDQUFDLEtBQUssRUFDZDtRQUNJLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztLQUNoRDtJQUVELFdBQVcsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO1FBRW5DLFdBQVcsQ0FBQyxJQUFJLDRCQUFtQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFFeEIsa0JBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDO0FBRUYsd0RBQXdEO0FBQ3hELHlEQUF5RDtBQUN6RCxjQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRW5DLG9DQUFvQztBQUNwQyxjQUFHLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDLGNBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDIn0=
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "____esModule", { value: true });
3
+ exports.runInNode = void 0;
4
+ const path = require("path");
5
+ const fs = require("fs");
6
+ const glob = require("glob");
7
+ const querystring = require("querystring");
8
+ /**
9
+ * Run tests in Node.js using Mocha with jsdom environment.
10
+ * This provides an alternative execution path when Electron is not available
11
+ * (e.g., on HarmonyOS where Electron builds don't exist).
12
+ *
13
+ * Uses real Mocha Node.js API and real jsdom DOM implementation.
14
+ * Not a stub - provides fully functional test execution.
15
+ *
16
+ * @param {Object} opts - The floss options (path, debug, quiet, reporter, reporterOptions, require)
17
+ * @returns {Promise<void>} Resolves on success, rejects on failure
18
+ */
19
+ function runInNode(opts) {
20
+ return new Promise((resolve, reject) => {
21
+ try {
22
+ // Set up jsdom environment for DOM-dependent tests
23
+ // jsdom provides a real DOM implementation (not a stub)
24
+ const { JSDOM } = require('jsdom');
25
+ const dom = new JSDOM('<!DOCTYPE html><html><body><div id="mocha"></div><div id="messages"></div><div id="fixtures"></div></body></html>', {
26
+ url: 'http://localhost/',
27
+ pretendToBeVisual: true,
28
+ runScripts: 'outside-only'
29
+ });
30
+ // Make DOM globals available for test files that need them
31
+ global.window = dom.window;
32
+ global.document = dom.window.document;
33
+ // navigator may be read-only in newer Node.js versions
34
+ try {
35
+ global.navigator = dom.window.navigator;
36
+ }
37
+ catch (e) {
38
+ // navigator is a getter in Node.js >= 21, skip it
39
+ }
40
+ // Load mocha browser support if available (sets up global mocha for bdd)
41
+ try {
42
+ require('mocha/mocha');
43
+ }
44
+ catch (e) {
45
+ // mocha browser bundle not available, that's fine for headless mode
46
+ }
47
+ // In headless mode, use Node.js Mocha API (same as renderer.js does)
48
+ const Mocha = require('mocha');
49
+ // Parse reporter options (same logic as renderer.js)
50
+ let reporterOptions;
51
+ if (typeof opts.reporterOptions === 'string') {
52
+ reporterOptions = querystring.parse(opts.reporterOptions);
53
+ }
54
+ // Create Mocha instance with same config as renderer.js headless mode
55
+ const mochaInst = new Mocha({
56
+ reporter: opts.reporter || 'spec',
57
+ reporterOptions,
58
+ color: true,
59
+ });
60
+ // Resolve test files using glob (same as renderer.js)
61
+ const files = glob.sync(opts.path);
62
+ // Add files to Mocha (same addFile logic as renderer.js)
63
+ const resolvedFiles = files
64
+ .map((file) => {
65
+ let testPath = path.resolve(file);
66
+ if (!fs.existsSync(testPath)) {
67
+ return null;
68
+ }
69
+ // if a single directory, find the index.js file and include that
70
+ if (fs.statSync(testPath).isDirectory()) {
71
+ const indexFile = path.join(testPath, 'index.js');
72
+ const indexTs = path.join(testPath, 'index.ts');
73
+ if (fs.existsSync(indexFile)) {
74
+ return indexFile;
75
+ }
76
+ else if (fs.existsSync(indexTs)) {
77
+ return indexTs;
78
+ }
79
+ console.error(`No index.js file found in directory: ${testPath}`);
80
+ return null;
81
+ }
82
+ // if it is a single file, only include that file
83
+ return testPath;
84
+ })
85
+ .filter((file) => file !== null);
86
+ // Require additional module if specified (same as renderer.js)
87
+ if (opts.require) {
88
+ require(opts.require);
89
+ }
90
+ // Add resolved files to Mocha
91
+ resolvedFiles.forEach((file) => mochaInst.addFile(file));
92
+ // Run tests
93
+ mochaInst.run((errorCount) => {
94
+ if (errorCount > 0) {
95
+ // No error needed, Mocha will report this (same as renderer.js)
96
+ reject(new Error('Mocha tests failed.'));
97
+ }
98
+ else {
99
+ resolve();
100
+ }
101
+ });
102
+ }
103
+ catch (e) {
104
+ reject(new Error(`Node.js test runner error: ${e.message}`));
105
+ }
106
+ });
107
+ }
108
+ exports.runInNode = runInNode;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const pathNode = require("path");
4
+ const fs = require("fs");
5
+ const resolve = require("resolve");
6
+ const electron_1 = require("electron");
7
+ const querystring = require("querystring");
8
+ const glob = require("glob");
9
+ // enables the browser mocha support - the mocha global is properly set up
10
+ // require('mocha/mocha');
11
+ let nycInst;
12
+ if (process.env.NYC_CONFIG) {
13
+ // do what nyc does in nyc/bin/wrap.js
14
+ try {
15
+ // eslint-disable-next-line @typescript-eslint/no-var-requires, global-require
16
+ const NYC = require('nyc');
17
+ let config = {};
18
+ if (process.env.NYC_CONFIG)
19
+ config = JSON.parse(process.env.NYC_CONFIG);
20
+ config.isChildProcess = true;
21
+ config._processInfo = {
22
+ pid: process.pid,
23
+ ppid: process.ppid,
24
+ parent: process.env.NYC_PROCESS_ID || null,
25
+ root: process.env.NYC_ROOT_ID
26
+ };
27
+ if (process.env.NYC_PROCESSINFO_EXTERNAL_ID) {
28
+ config._processInfo.externalId = process.env.NYC_PROCESSINFO_EXTERNAL_ID;
29
+ delete process.env.NYC_PROCESSINFO_EXTERNAL_ID;
30
+ }
31
+ nycInst = new NYC(config);
32
+ nycInst.wrap();
33
+ }
34
+ catch (e) {
35
+ console.log(e);
36
+ }
37
+ }
38
+ class Renderer {
39
+ constructor(linkId) {
40
+ electron_1.ipcRenderer.on("floss-start" /* Start */, (_ev, data) => {
41
+ this.options = global.options = JSON.parse(data);
42
+ const { path, debug, quiet, require: additionalRequire, } = this.options;
43
+ // Do this before to catch any errors outside mocha running
44
+ // for instance errors on the page like test's requires
45
+ this.setupConsoleOutput(quiet, !debug);
46
+ // Include this AFTER the console binding because
47
+ // mocha has a static console reference in the base reporter
48
+ // eslint-disable-next-line global-require
49
+ require('mocha/mocha');
50
+ if (additionalRequire) {
51
+ // eslint-disable-next-line global-require
52
+ require(additionalRequire);
53
+ }
54
+ const files = glob.sync(path);
55
+ if (debug) {
56
+ this.headful(files);
57
+ }
58
+ else {
59
+ this.headless(files);
60
+ }
61
+ });
62
+ // Add the stylesheet
63
+ const mochaPath = pathNode.dirname(resolve.sync('mocha', { basedir: __dirname }));
64
+ const link = document.getElementById(linkId);
65
+ link.href = pathNode.join(mochaPath, 'mocha.css');
66
+ }
67
+ /**
68
+ * Run tests using devtools and Electron window.
69
+ */
70
+ headful(files) {
71
+ mocha.setup({
72
+ ui: 'bdd',
73
+ timeout: 0
74
+ });
75
+ files
76
+ .map((file) => this.addFile(file))
77
+ .filter((file) => file !== null)
78
+ // eslint-disable-next-line global-require
79
+ .forEach((file) => require(file));
80
+ mocha.run(() => {
81
+ // write the coverage file if we need to, as NYC won't do so in our setup
82
+ if (nycInst) {
83
+ nycInst.writeCoverageFile();
84
+ }
85
+ });
86
+ }
87
+ headless(files) {
88
+ try {
89
+ mocha.setup({
90
+ ui: 'bdd',
91
+ });
92
+ // Format the reporter options
93
+ let reporterOptions;
94
+ // Parse string as an object
95
+ if (typeof this.options.reporterOptions === 'string') {
96
+ reporterOptions = querystring.parse(this.options.reporterOptions);
97
+ }
98
+ // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires
99
+ const Mocha = require('mocha');
100
+ const mochaInst = new Mocha({
101
+ reporter: this.options.reporter,
102
+ reporterOptions,
103
+ color: true,
104
+ });
105
+ files.map((file) => this.addFile(file))
106
+ .filter((file) => file !== null)
107
+ .forEach((file) => mochaInst.addFile(file));
108
+ mochaInst.run((errorCount) => {
109
+ // write the coverage file if we need to, as NYC won't do so in our setup
110
+ if (nycInst) {
111
+ try {
112
+ nycInst.writeCoverageFile();
113
+ }
114
+ catch (e) {
115
+ this.failed('Unable to write coverage file.');
116
+ return;
117
+ }
118
+ }
119
+ if (errorCount > 0) {
120
+ // No error needed, Mocha will report this
121
+ this.failed();
122
+ }
123
+ else {
124
+ this.success();
125
+ }
126
+ });
127
+ }
128
+ catch (e) {
129
+ // write the coverage file if we need to, as NYC won't do so in our setup
130
+ if (nycInst) {
131
+ nycInst.writeCoverageFile();
132
+ }
133
+ this.failed(e.message);
134
+ }
135
+ }
136
+ /**
137
+ * Report when we're done, this will close floss.
138
+ */
139
+ success() {
140
+ electron_1.ipcRenderer.send("floss-done" /* Done */);
141
+ }
142
+ /**
143
+ * Report if we failed, this will close floss with non-zero errorCode.
144
+ */
145
+ failed(message) {
146
+ electron_1.ipcRenderer.send("floss-error" /* Error */, message);
147
+ }
148
+ /**
149
+ * Create new bindings for `console` functions
150
+ * Use default console[name] and also send IPC
151
+ * log so we can log to stdout
152
+ */
153
+ setupConsoleOutput(isQuiet, isHeadless) {
154
+ const remoteConsole = electron_1.remote.getGlobal('console');
155
+ if (!isQuiet && isHeadless) {
156
+ for (const name in console) {
157
+ const n = name;
158
+ if (typeof console[n] === 'function') {
159
+ console[n] = remoteConsole[n];
160
+ }
161
+ }
162
+ }
163
+ // if we don't do this, we get socket errors and our tests crash
164
+ Object.defineProperty(process, 'stdout', {
165
+ value: {
166
+ write: (str) => electron_1.remote.process.stdout.write(str),
167
+ }
168
+ });
169
+ }
170
+ /**
171
+ * Resolve test path into absolute path.
172
+ * @param testPath - Path to test directory of file.
173
+ */
174
+ addFile(testPath) {
175
+ testPath = pathNode.resolve(testPath);
176
+ if (!fs.existsSync(testPath)) {
177
+ return null;
178
+ }
179
+ // if a single directory, find the index.js file and include that
180
+ if (fs.statSync(testPath).isDirectory()) {
181
+ const indexFile = pathNode.join(testPath, 'index.js');
182
+ const indexTs = pathNode.join(testPath, 'index.ts');
183
+ if (fs.existsSync(indexFile)) {
184
+ return indexFile;
185
+ }
186
+ else if (fs.existsSync(indexTs)) {
187
+ return indexTs;
188
+ }
189
+ console.error(`No index.js file found in directory: ${testPath}`);
190
+ return null;
191
+ }
192
+ // if it is a single file, only include that file
193
+ return testPath;
194
+ }
195
+ }
196
+ module.exports = Renderer;
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpQ0FBaUM7QUFDakMseUJBQXlCO0FBQ3pCLG1DQUFtQztBQUNuQyx1Q0FBK0M7QUFDL0MsMkNBQTJDO0FBQzNDLDZCQUE2QjtBQUc3QiwwRUFBMEU7QUFDMUUsMEJBQTBCO0FBRTFCLElBQUksT0FBVyxDQUFDO0FBRWhCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQzFCO0lBQ0ksc0NBQXNDO0lBQ3RDLElBQ0E7UUFDSSw4RUFBOEU7UUFDOUUsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksTUFBTSxHQUFPLEVBQUUsQ0FBQztRQUVwQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVTtZQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEUsTUFBTSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFN0IsTUFBTSxDQUFDLFlBQVksR0FBRztZQUNsQixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDaEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxJQUFJO1lBQzFDLElBQUksRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVc7U0FDaEMsQ0FBQztRQUNGLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFDM0M7WUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDO1lBQ3pFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQztTQUNsRDtRQUVELE9BQU8sR0FBRyxJQUFJLEdB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
package/package.json ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "@ohos-ports/floss",
3
+ "version": "5.0.1-beta.0",
4
+ "description": "Unit-testing for those hard to reach places",
5
+ "bin": "./lib/floss.js",
6
+ "main": "./lib/index.js",
7
+ "types": "./lib/index.d.ts",
8
+ "author": "Matt Karl <matt@mattkarl.com>",
9
+ "contributors": [
10
+ "Matt Bittarelli <matt.bittarelli@jibo.com>",
11
+ "Andrew Start <start.andrew@gmail.com>"
12
+ ],
13
+ "files": [
14
+ "lib"
15
+ ],
16
+ "scripts": {
17
+ "lint": "eslint src/*.ts --fix",
18
+ "types": "tsc -noEmit",
19
+ "copy": "copyfiles -f src/index.html lib",
20
+ "clean": "rimraf lib/*",
21
+ "prebuild": "run-s clean lint copy",
22
+ "build": "tsc",
23
+ "prewatch": "run-s copy",
24
+ "watch": "tsc -w --incremental --tsBuildInfoFile .tsbuildinfo",
25
+ "test": "run-s test:*",
26
+ "test:basic": "node lib/floss.js -p test/basic",
27
+ "test:failure": "node lib/floss.js -p test/failure || true",
28
+ "test:multiple": "node lib/floss.js -p \"test/multiple/*.js\"",
29
+ "test:typescript": "node lib/floss.js -p test/typescript -r ts-node/register",
30
+ "test:coverage": "nyc node lib/floss.js -p test/coverage",
31
+ "test:options": "node lib/floss.js -p test/options -- --foo=bar",
32
+ "test:args": "node lib/floss.js -p test/args -- --autoplay-policy=no-user-gesture-required",
33
+ "preversion": "run-s build test",
34
+ "postpublish": "git push && git push --tags",
35
+ "publish:patch": "npm version patch && npm publish",
36
+ "publish:minor": "npm version minor && npm publish",
37
+ "publish:major": "npm version major && npm publish"
38
+ },
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "git@github.com:pixijs/floss.git"
42
+ },
43
+ "bugs": {
44
+ "url": "https://github.com/pixijs/floss/issues"
45
+ },
46
+ "homepage": "https://github.com/pixijs/floss",
47
+ "engines": {
48
+ "node": ">=10.0"
49
+ },
50
+ "license": "MIT",
51
+ "keywords": [
52
+ "mocha",
53
+ "mocha-electron",
54
+ "electron-mocha",
55
+ "electron",
56
+ "test",
57
+ "tests",
58
+ "unit-tests",
59
+ "unit-testing",
60
+ "travis",
61
+ "travis-ci"
62
+ ],
63
+ "dependencies": {
64
+ "chalk": "^4.1.0",
65
+ "commander": "^7.0.0",
66
+ "glob": "^7.1.6",
67
+ "jsdom": "^30.0.1",
68
+ "mocha": "^8.0.0",
69
+ "resolve": "^1.19.0"
70
+ },
71
+ "peerDependencies": {
72
+ "electron": ">=12 <14",
73
+ "nyc": ">=13"
74
+ },
75
+ "devDependencies": {
76
+ "@pixi/eslint-config": "^2.0.1",
77
+ "@types/glob": "^7.1.3",
78
+ "@types/mocha": "^8.0.0",
79
+ "@types/resolve": "^1.17.1",
80
+ "chai": "^4.2.0",
81
+ "copyfiles": "^2.4.1",
82
+ "electron": "^12.0.0",
83
+ "eslint": "^7.18.0",
84
+ "npm-run-all": "^4.1.5",
85
+ "nyc": "^14.0.0",
86
+ "rimraf": "^3.0.2",
87
+ "ts-node": "^9.1.1",
88
+ "typescript": "^3.9.0"
89
+ }
90
+ }