velocious 1.0.548 → 1.0.551

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.
Files changed (28) hide show
  1. package/README.md +23 -0
  2. package/build/database/advisory-lock-runner.js +17 -8
  3. package/build/database/structure-sql-loader.js +68 -0
  4. package/build/environment-handlers/node/cli/commands/db/schema/load.js +3 -45
  5. package/build/src/database/advisory-lock-runner.d.ts +25 -8
  6. package/build/src/database/advisory-lock-runner.d.ts.map +1 -1
  7. package/build/src/database/advisory-lock-runner.js +18 -9
  8. package/build/src/database/structure-sql-loader.d.ts +35 -0
  9. package/build/src/database/structure-sql-loader.d.ts.map +1 -0
  10. package/build/src/database/structure-sql-loader.js +63 -0
  11. package/build/src/environment-handlers/node/cli/commands/db/schema/load.d.ts +0 -19
  12. package/build/src/environment-handlers/node/cli/commands/db/schema/load.d.ts.map +1 -1
  13. package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +4 -42
  14. package/build/src/testing/test.d.ts +2 -1
  15. package/build/src/testing/test.d.ts.map +1 -1
  16. package/build/src/testing/test.js +3 -2
  17. package/build/src/testing/wait-for-event.d.ts +46 -0
  18. package/build/src/testing/wait-for-event.d.ts.map +1 -0
  19. package/build/src/testing/wait-for-event.js +64 -0
  20. package/build/testing/test.js +2 -1
  21. package/build/testing/wait-for-event.js +72 -0
  22. package/build/tsconfig.tsbuildinfo +1 -1
  23. package/package.json +2 -2
  24. package/src/database/advisory-lock-runner.js +17 -8
  25. package/src/database/structure-sql-loader.js +68 -0
  26. package/src/environment-handlers/node/cli/commands/db/schema/load.js +3 -45
  27. package/src/testing/test.js +2 -1
  28. package/src/testing/wait-for-event.js +72 -0
@@ -1 +1 @@
1
- {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../../../../../../src/environment-handlers/node/cli/commands/db/schema/load.js"],"names":[],"mappings":"AAKA,2DAA2D;AAC3D;IACE;;kCAE8B;IAC9B,WADa,OAAO,CAAC,IAAI,CAAC,CAazB;IAED;;;;;;OAMG;IACH,uCAJG;QAA2E,EAAE,EAArE,OAAO,4CAA4C,EAAE,OAAO;QAC/C,YAAY,EAAzB,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAsBzB;IAED;;;;OAIG;IACH,yBAHW,OAAO,4CAA4C,EAAE,OAAO,GAC1D;QAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAC,CAAC,CAAA;KAAC,GAAG,SAAS,CAS3D;CACF;wBAlEuB,uCAAuC"}
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../../../../../../src/environment-handlers/node/cli/commands/db/schema/load.js"],"names":[],"mappings":"AAKA,2DAA2D;AAC3D;IACE;;kCAE8B;IAC9B,WADa,OAAO,CAAC,IAAI,CAAC,CAczB;CACF;wBAxBuB,uCAAuC"}
@@ -1,7 +1,7 @@
1
1
  import BaseCommand from "../../../../../../cli/base-command.js";
2
2
  import fs from "fs/promises";
3
3
  import path from "path";
4
- import splitSqlStatements from "../../../../../../utils/split-sql-statements.js";
4
+ import StructureSqlLoader from "../../../../../../database/structure-sql-loader.js";
5
5
  /** Node CLI command for loading DB structure SQL files. */
6
6
  export default class DbSchemaLoad extends BaseCommand {
7
7
  /**
@@ -10,52 +10,14 @@ export default class DbSchemaLoad extends BaseCommand {
10
10
  async execute() {
11
11
  await this.getConfiguration().ensureConnections({ name: "DB schema load" }, async (dbs) => {
12
12
  const dbDir = path.join(this.directory(), "db");
13
+ const loader = new StructureSqlLoader();
13
14
  for (const identifier of Object.keys(dbs)) {
14
15
  const db = dbs[identifier];
15
16
  const structureFilePath = path.join(dbDir, `structure-${identifier}.sql`);
16
17
  const structureSql = await fs.readFile(structureFilePath, "utf8");
17
- await this.loadStructureSql({ db, structureSql });
18
+ await loader.load({ db, structureSql });
18
19
  }
19
20
  });
20
21
  }
21
- /**
22
- * Runs load structure sql.
23
- * @param {object} args - Options object.
24
- * @param {import("../../../../../../database/drivers/base.js").default} args.db - Database connection.
25
- * @param {string} args.structureSql - Structure SQL to load.
26
- * @returns {Promise<void>} - Resolves when complete.
27
- */
28
- async loadStructureSql({ db, structureSql }) {
29
- const statements = splitSqlStatements(structureSql);
30
- if (statements.length == 0)
31
- return;
32
- const executableConnection = this.executableConnection(db);
33
- await db.disableForeignKeys();
34
- try {
35
- if (executableConnection) {
36
- await executableConnection.exec(structureSql);
37
- }
38
- else {
39
- for (const statement of statements) {
40
- await db.query(statement);
41
- }
42
- }
43
- }
44
- finally {
45
- await db.enableForeignKeys();
46
- }
47
- }
48
- /**
49
- * Runs executable connection.
50
- * @param {import("../../../../../../database/drivers/base.js").default} db - Database connection.
51
- * @returns {{exec: (sql: string) => Promise<?>} | undefined} - Connection with exec support.
52
- */
53
- executableConnection(db) {
54
- const dbWithConnection = /** @type {import("../../../../../../database/drivers/base.js").default & {connection?: ?}} */ (db);
55
- const connection = dbWithConnection.connection;
56
- if (connection && typeof connection == "object" && "exec" in connection && typeof connection.exec == "function") {
57
- return /** @type {{exec: (sql: string) => Promise<?>}} */ (connection);
58
- }
59
- }
60
22
  }
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy9kYi9zY2hlbWEvbG9hZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFdBQVcsTUFBTSx1Q0FBdUMsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQ3ZCLE9BQU8sa0JBQWtCLE1BQU0saURBQWlELENBQUE7QUFFaEYsMkRBQTJEO0FBQzNELE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBYSxTQUFRLFdBQVc7SUFDbkQ7O2tDQUU4QjtJQUM5QixLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDdEYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFFL0MsS0FBSyxNQUFNLFVBQVUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtnQkFDMUIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLFVBQVUsTUFBTSxDQUFDLENBQUE7Z0JBQ3pFLE1BQU0sWUFBWSxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQTtnQkFFakUsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBQyxFQUFFLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQTtZQUNqRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEVBQUMsRUFBRSxFQUFFLFlBQVksRUFBQztRQUN2QyxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUVuRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLE9BQU07UUFFbEMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFMUQsTUFBTSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtRQUU3QixJQUFJLENBQUM7WUFDSCxJQUFJLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sb0JBQW9CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQy9DLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO29CQUNuQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQzNCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsTUFBTSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxvQkFBb0IsQ0FBQyxFQUFFO1FBQ3JCLE1BQU0sZ0JBQWdCLEdBQUcsOEZBQThGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM1SCxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUE7UUFFOUMsSUFBSSxVQUFVLElBQUksT0FBTyxVQUFVLElBQUksUUFBUSxJQUFJLE1BQU0sSUFBSSxVQUFVLElBQUksT0FBTyxVQUFVLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2hILE9BQU8sa0RBQWtELENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN4RSxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VDb21tYW5kIGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi9jbGkvYmFzZS1jb21tYW5kLmpzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHNwbGl0U3FsU3RhdGVtZW50cyBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vdXRpbHMvc3BsaXQtc3FsLXN0YXRlbWVudHMuanNcIlxuXG4vKiogTm9kZSBDTEkgY29tbWFuZCBmb3IgbG9hZGluZyBEQiBzdHJ1Y3R1cmUgU1FMIGZpbGVzLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGJTY2hlbWFMb2FkIGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICAvKipcbiAgICogUnVucyBleGVjdXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBhd2FpdCB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogXCJEQiBzY2hlbWEgbG9hZFwifSwgYXN5bmMgKGRicykgPT4ge1xuICAgICAgY29uc3QgZGJEaXIgPSBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnkoKSwgXCJkYlwiKVxuXG4gICAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgT2JqZWN0LmtleXMoZGJzKSkge1xuICAgICAgICBjb25zdCBkYiA9IGRic1tpZGVudGlmaWVyXVxuICAgICAgICBjb25zdCBzdHJ1Y3R1cmVGaWxlUGF0aCA9IHBhdGguam9pbihkYkRpciwgYHN0cnVjdHVyZS0ke2lkZW50aWZpZXJ9LnNxbGApXG4gICAgICAgIGNvbnN0IHN0cnVjdHVyZVNxbCA9IGF3YWl0IGZzLnJlYWRGaWxlKHN0cnVjdHVyZUZpbGVQYXRoLCBcInV0ZjhcIilcblxuICAgICAgICBhd2FpdCB0aGlzLmxvYWRTdHJ1Y3R1cmVTcWwoe2RiLCBzdHJ1Y3R1cmVTcWx9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBsb2FkIHN0cnVjdHVyZSBzcWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MuZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdHJ1Y3R1cmVTcWwgLSBTdHJ1Y3R1cmUgU1FMIHRvIGxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBsb2FkU3RydWN0dXJlU3FsKHtkYiwgc3RydWN0dXJlU3FsfSkge1xuICAgIGNvbnN0IHN0YXRlbWVudHMgPSBzcGxpdFNxbFN0YXRlbWVudHMoc3RydWN0dXJlU3FsKVxuXG4gICAgaWYgKHN0YXRlbWVudHMubGVuZ3RoID09IDApIHJldHVyblxuXG4gICAgY29uc3QgZXhlY3V0YWJsZUNvbm5lY3Rpb24gPSB0aGlzLmV4ZWN1dGFibGVDb25uZWN0aW9uKGRiKVxuXG4gICAgYXdhaXQgZGIuZGlzYWJsZUZvcmVpZ25LZXlzKClcblxuICAgIHRyeSB7XG4gICAgICBpZiAoZXhlY3V0YWJsZUNvbm5lY3Rpb24pIHtcbiAgICAgICAgYXdhaXQgZXhlY3V0YWJsZUNvbm5lY3Rpb24uZXhlYyhzdHJ1Y3R1cmVTcWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzKSB7XG4gICAgICAgICAgYXdhaXQgZGIucXVlcnkoc3RhdGVtZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGRiLmVuYWJsZUZvcmVpZ25LZXlzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBleGVjdXRhYmxlIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge3tleGVjOiAoc3FsOiBzdHJpbmcpID0+IFByb21pc2U8Pz59IHwgdW5kZWZpbmVkfSAtIENvbm5lY3Rpb24gd2l0aCBleGVjIHN1cHBvcnQuXG4gICAqL1xuICBleGVjdXRhYmxlQ29ubmVjdGlvbihkYikge1xuICAgIGNvbnN0IGRiV2l0aENvbm5lY3Rpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0ICYge2Nvbm5lY3Rpb24/OiA/fX0gKi8gKGRiKVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBkYldpdGhDb25uZWN0aW9uLmNvbm5lY3Rpb25cblxuICAgIGlmIChjb25uZWN0aW9uICYmIHR5cGVvZiBjb25uZWN0aW9uID09IFwib2JqZWN0XCIgJiYgXCJleGVjXCIgaW4gY29ubmVjdGlvbiAmJiB0eXBlb2YgY29ubmVjdGlvbi5leGVjID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7e2V4ZWM6IChzcWw6IHN0cmluZykgPT4gUHJvbWlzZTw/Pn19ICovIChjb25uZWN0aW9uKVxuICAgIH1cbiAgfVxufVxuIl19
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy9kYi9zY2hlbWEvbG9hZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFdBQVcsTUFBTSx1Q0FBdUMsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQ3ZCLE9BQU8sa0JBQWtCLE1BQU0sb0RBQW9ELENBQUE7QUFFbkYsMkRBQTJEO0FBQzNELE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBYSxTQUFRLFdBQVc7SUFDbkQ7O2tDQUU4QjtJQUM5QixLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDdEYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDL0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFBO1lBRXZDLEtBQUssTUFBTSxVQUFVLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7Z0JBQzFCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxVQUFVLE1BQU0sQ0FBQyxDQUFBO2dCQUN6RSxNQUFNLFlBQVksR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUE7Z0JBRWpFLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFBO1lBQ3ZDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlQ29tbWFuZCBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCBTdHJ1Y3R1cmVTcWxMb2FkZXIgZnJvbSBcIi4uLy4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3N0cnVjdHVyZS1zcWwtbG9hZGVyLmpzXCJcblxuLyoqIE5vZGUgQ0xJIGNvbW1hbmQgZm9yIGxvYWRpbmcgREIgc3RydWN0dXJlIFNRTCBmaWxlcy4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERiU2NoZW1hTG9hZCBleHRlbmRzIEJhc2VDb21tYW5kIHtcbiAgLyoqXG4gICAqIFJ1bnMgZXhlY3V0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgYXdhaXQgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IFwiREIgc2NoZW1hIGxvYWRcIn0sIGFzeW5jIChkYnMpID0+IHtcbiAgICAgIGNvbnN0IGRiRGlyID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5KCksIFwiZGJcIilcbiAgICAgIGNvbnN0IGxvYWRlciA9IG5ldyBTdHJ1Y3R1cmVTcWxMb2FkZXIoKVxuXG4gICAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgT2JqZWN0LmtleXMoZGJzKSkge1xuICAgICAgICBjb25zdCBkYiA9IGRic1tpZGVudGlmaWVyXVxuICAgICAgICBjb25zdCBzdHJ1Y3R1cmVGaWxlUGF0aCA9IHBhdGguam9pbihkYkRpciwgYHN0cnVjdHVyZS0ke2lkZW50aWZpZXJ9LnNxbGApXG4gICAgICAgIGNvbnN0IHN0cnVjdHVyZVNxbCA9IGF3YWl0IGZzLnJlYWRGaWxlKHN0cnVjdHVyZUZpbGVQYXRoLCBcInV0ZjhcIilcblxuICAgICAgICBhd2FpdCBsb2FkZXIubG9hZCh7ZGIsIHN0cnVjdHVyZVNxbH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuIl19
@@ -103,6 +103,7 @@ export const testEvents: import("eventemitter3").EventEmitter<string | symbol, a
103
103
  * Tests.
104
104
  * @type {import("./test-runner.js").TestsArgument} */
105
105
  export const tests: import("./test-runner.js").TestsArgument;
106
+ import waitForEvent from "./wait-for-event.js";
106
107
  import Expect from "./expect.js";
107
- export { arrayContaining, objectContaining };
108
+ export { arrayContaining, objectContaining, waitForEvent };
108
109
  //# sourceMappingURL=test.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/testing/test.js"],"names":[],"mappings":";;;;;;;mBAqWc,SAAS,GAAG,MAAM;;;;iBAClB,MAAM,EAAE;;;;2BACR,MAAM;;;;iCACN,MAAM;;AAxKpB;;;;GAIG;AACH,mCAHW,OAAO,kBAAkB,EAAE,0BAA0B,GACnD,IAAI,CAMhB;AApBD;;;;GAIG;AACH,oCAHW,OAAO,kBAAkB,EAAE,2BAA2B,GACpD,IAAI,CAMhB;AApBD;;;;GAIG;AACH,oCAHW,OAAO,kBAAkB,EAAE,0BAA0B,GACnD,IAAI,CAMhB;AApBD;;;;GAIG;AACH,qCAHW,OAAO,kBAAkB,EAAE,2BAA2B,GACpD,IAAI,CAMhB;AA3DD;;;;;;;;GAQG;AACH,oHANG;IAAkC,aAAa;IACd,WAAW;IACtB,qBAAqB;IACrB,2BAA2B;CACjD,GAAU,IAAI,CAsBhB;AAkED;;;;;;GAMG;AACH,sCALW,MAAM,QACN,MAAM,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SACnC,SAAS,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CA8CzB;AAED;;;;GAIG;AACH,4BAHW,OAAC,GACC,MAAM,CAIlB;;;;;AA8CD;;;;;;GAMG;AACH,iCALW,MAAM,QACN,MAAM,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SACnC,SAAS,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GACpC,IAAI,CAwBhB;AAtED;;;;;;GAMG;AACH,gCALW,MAAM,QACN,MAAM,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SACnC,SAAS,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GACpC,IAAI,CAkChB;gCA9S+C,mBAAmB;iCAAnB,mBAAmB;AA6FnE;;iCAEiC;AACjC,yBADU,mBAAmB,CAM5B;AAvED,oFAAqC;AA5BrC;;sDAEsD;AACtD,oBADU,OAAO,kBAAkB,EAAE,aAAa,CAwBjD;mBA7BkB,aAAa"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/testing/test.js"],"names":[],"mappings":";;;;;;;mBAsWc,SAAS,GAAG,MAAM;;;;iBAClB,MAAM,EAAE;;;;2BACR,MAAM;;;;iCACN,MAAM;;AAxKpB;;;;GAIG;AACH,mCAHW,OAAO,kBAAkB,EAAE,0BAA0B,GACnD,IAAI,CAMhB;AApBD;;;;GAIG;AACH,oCAHW,OAAO,kBAAkB,EAAE,2BAA2B,GACpD,IAAI,CAMhB;AApBD;;;;GAIG;AACH,oCAHW,OAAO,kBAAkB,EAAE,0BAA0B,GACnD,IAAI,CAMhB;AApBD;;;;GAIG;AACH,qCAHW,OAAO,kBAAkB,EAAE,2BAA2B,GACpD,IAAI,CAMhB;AA3DD;;;;;;;;GAQG;AACH,oHANG;IAAkC,aAAa;IACd,WAAW;IACtB,qBAAqB;IACrB,2BAA2B;CACjD,GAAU,IAAI,CAsBhB;AAkED;;;;;;GAMG;AACH,sCALW,MAAM,QACN,MAAM,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SACnC,SAAS,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CA8CzB;AAED;;;;GAIG;AACH,4BAHW,OAAC,GACC,MAAM,CAIlB;;;;;AA8CD;;;;;;GAMG;AACH,iCALW,MAAM,QACN,MAAM,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SACnC,SAAS,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GACpC,IAAI,CAwBhB;AAtED;;;;;;GAMG;AACH,gCALW,MAAM,QACN,MAAM,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SACnC,SAAS,GAAC,CAAC,MAAM,CAAC,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GACpC,IAAI,CAkChB;gCA9S+C,mBAAmB;iCAAnB,mBAAmB;AA6FnE;;iCAEiC;AACjC,yBADU,mBAAmB,CAM5B;AAvED,oFAAqC;AA5BrC;;sDAEsD;AACtD,oBADU,OAAO,kBAAkB,EAAE,aAAa,CAwBjD;yBA7BwB,qBAAqB;mBAD3B,aAAa"}
@@ -3,6 +3,7 @@ import path from "path";
3
3
  import { fileURLToPath } from "url";
4
4
  import EventEmitter from "../utils/event-emitter.js";
5
5
  import Expect from "./expect.js";
6
+ import waitForEvent from "./wait-for-event.js";
6
7
  import { arrayContaining, objectContaining } from "./expect-utils.js";
7
8
  /**
8
9
  * Tests.
@@ -306,7 +307,7 @@ globalThis.it = it;
306
307
  globalThis.fit = fit;
307
308
  globalThis.testEvents = testEvents;
308
309
  globalThis.configureTests = configureTests;
309
- export { afterAll, afterEach, beforeAll, beforeEach, configureTests, describe, expect, fit, it, arrayContaining, objectContaining, testConfig, testEvents, tests };
310
+ export { afterAll, afterEach, beforeAll, beforeEach, configureTests, describe, expect, fit, it, arrayContaining, objectContaining, testConfig, testEvents, tests, waitForEvent };
310
311
  /**
311
312
  * VelociousTestConfig type.
312
313
  * @typedef {object} VelociousTestConfig
@@ -315,4 +316,4 @@ export { afterAll, afterEach, beforeAll, beforeEach, configureTests, describe, e
315
316
  * @property {number} defaultTimeoutSeconds - Default timeout in seconds.
316
317
  * @property {number} failedConsoleOutputMaxLines - Maximum failed console lines to print inline.
317
318
  */
318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3Rlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUN2QixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sS0FBSyxDQUFBO0FBQ2pDLE9BQU8sWUFBWSxNQUFNLDJCQUEyQixDQUFBO0FBQ3BELE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQTtBQUNoQyxPQUFPLEVBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFFbkU7O3NEQUVzRDtBQUN0RCxNQUFNLEtBQUssR0FBRztJQUNaOztnRkFFNEU7SUFDNUUsV0FBVyxFQUFFLEVBQUU7SUFDZjs7K0VBRTJFO0lBQzNFLFNBQVMsRUFBRSxFQUFFO0lBQ2IsSUFBSSxFQUFFLEVBQUU7SUFFUjs7K0VBRTJFO0lBQzNFLFVBQVUsRUFBRSxFQUFFO0lBQ2Q7O2dGQUU0RTtJQUM1RSxZQUFZLEVBQUUsRUFBRTtJQUNoQixRQUFRLEVBQUUsU0FBUztJQUNuQixJQUFJLEVBQUUsU0FBUztJQUNmLElBQUksRUFBRSxFQUFFO0lBQ1IsS0FBSyxFQUFFLEVBQUU7Q0FDVixDQUFBO0FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtBQUVyQyxJQUFJLFdBQVcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBRXpCOzs7R0FHRztBQUNILFNBQVMsZUFBZTtJQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFBO0lBQ3pCLE1BQU0sS0FBSyxHQUFHLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFFNUUsS0FBSyxNQUFNLElBQUksSUFB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QUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFBO0FBQ2hLOzs7Ozs7O0dBT0ciLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tIFwidXJsXCJcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IEV4cGVjdCBmcm9tIFwiLi9leHBlY3QuanNcIlxuaW1wb3J0IHthcnJheUNvbnRhaW5pbmcsIG9iamVjdENvbnRhaW5pbmd9IGZyb20gXCIuL2V4cGVjdC11dGlscy5qc1wiXG5cbi8qKlxuICogVGVzdHMuXG4gKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5UZXN0c0FyZ3VtZW50fSAqL1xuY29uc3QgdGVzdHMgPSB7XG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkFmdGVyQmVmb3JlRWFjaENhbGxiYWNrT2JqZWN0VHlwZVtdfSAqL1xuICBhZnRlckVhY2hlczogW10sXG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkJlZm9yZUFmdGVyQWxsQ2FsbGJhY2tPYmplY3RUeXBlW119ICovXG4gIGFmdGVyQWxsczogW10sXG4gIGFyZ3M6IHt9LFxuXG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkJlZm9yZUFmdGVyQWxsQ2FsbGJhY2tPYmplY3RUeXBlW119ICovXG4gIGJlZm9yZUFsbHM6IFtdLFxuICAvKipcbiAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5BZnRlckJlZm9yZUVhY2hDYWxsYmFja09iamVjdFR5cGVbXX0gKi9cbiAgYmVmb3JlRWFjaGVzOiBbXSxcbiAgZmlsZVBhdGg6IHVuZGVmaW5lZCxcbiAgbGluZTogdW5kZWZpbmVkLFxuICBzdWJzOiB7fSxcbiAgdGVzdHM6IHt9XG59XG5cbmNvbnN0IHRlc3RFdmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxubGV0IGN1cnJlbnRQYXRoID0gW3Rlc3RzXVxuXG4vKipcbiAqIFJ1bnMgY2FwdHVyZSBsb2NhdGlvbi5cbiAqIEByZXR1cm5zIHt7ZmlsZVBhdGg/OiBzdHJpbmcsIGxpbmU/OiBudW1iZXJ9fSAtIExvY2F0aW9uLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlTG9jYXRpb24oKSB7XG4gIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKClcbiAgY29uc3Qgc3RhY2sgPSB0eXBlb2YgZXJyb3Iuc3RhY2sgPT09IFwic3RyaW5nXCIgPyBlcnJvci5zdGFjay5zcGxpdChcIlxcblwiKSA6IFtdXG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0YWNrKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpXG5cbiAgICBpZiAoIXRyaW1tZWQuaW5jbHVkZXMoXCJhdFwiKSkgY29udGludWVcbiAgICBpZiAodHJpbW1lZC5pbmNsdWRlcyhcIi9zcmMvdGVzdGluZy90ZXN0LmpzXCIpKSBjb250aW51ZVxuXG4gICAgY29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKC8oPzpcXCh8XFxzKShmaWxlOlxcL1xcLy4qP3xcXC8uKj8pOihcXGQrKTooXFxkKylcXCk/JC8pXG5cbiAgICBpZiAoIW1hdGNoKSBjb250aW51ZVxuXG4gICAgY29uc3QgcmF3UGF0aCA9IG1hdGNoWzFdXG4gICAgY29uc3QgbGluZU51bWJlciA9IE51bWJlcihtYXRjaFsyXSlcbiAgICBjb25zdCBmaWxlUGF0aCA9IHJhd1BhdGguc3RhcnRzV2l0aChcImZpbGU6Ly9cIilcbiAgICAgID8gZmlsZVVSTFRvUGF0aChyYXdQYXRoKVxuICAgICAgOiByYXdQYXRoXG5cbiAgICByZXR1cm4ge1xuICAgICAgZmlsZVBhdGg6IHBhdGgucmVzb2x2ZShmaWxlUGF0aCksXG4gICAgICBsaW5lOiBOdW1iZXIuaXNGaW5pdGUobGluZU51bWJlcikgPyBsaW5lTnVtYmVyIDogdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHt9XG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgdGFncy5cbiAqIEBwYXJhbSB7c3RyaW5nW10gfCBzdHJpbmcgfCB1bmRlZmluZWR9IHRhZ3MgLSBUYWdzLlxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIE5vcm1hbGl6ZWQgdGFncy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplVGFncyh0YWdzKSB7XG4gIGlmICghdGFncykgcmV0dXJuIFtdXG5cbiAgY29uc3QgdmFsdWVzID0gW11cbiAgY29uc3QgcmF3VGFncyA9IEFycmF5LmlzQXJyYXkodGFncykgPyB0YWdzIDogW3RhZ3NdXG5cbiAgZm9yIChjb25zdCByYXdUYWcgb2YgcmF3VGFncykge1xuICAgIGlmIChyYXdUYWcgPT09IHVuZGVmaW5lZCB8fCByYXdUYWcgPT09IG51bGwpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBwYXJ0cyA9IFN0cmluZyhyYXdUYWcpLnNwbGl0KFwiLFwiKVxuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gcGFydC50cmltKClcblxuICAgICAgaWYgKHRyaW1tZWQpIHZhbHVlcy5wdXNoKHRyaW1tZWQpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMpKVxufVxuXG4vKipcbiAqIFRlc3QgY29uZmlnLlxuICogQHR5cGUge1ZlbG9jaW91c1Rlc3RDb25maWd9ICovXG5jb25zdCB0ZXN0Q29uZmlnID0ge1xuICBjb25zb2xlT3V0cHV0OiBcImZhaWx1cmVcIixcbiAgZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzOiAyMDAsXG4gIGV4Y2x1ZGVUYWdzOiBbXSxcbiAgZGVmYXVsdFRpbWVvdXRTZWNvbmRzOiA2MFxufVxuXG4vKipcbiAqIFJ1bnMgY29uZmlndXJlIHRlc3RzLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtcImZhaWx1cmVcIiB8IFwibGl2ZVwifSBbYXJncy5jb25zb2xlT3V0cHV0XSAtIENvbnNvbGUgb3V0cHV0IG1vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgc3RyaW5nfSBbYXJncy5leGNsdWRlVGFnc10gLSBUYWdzIHRvIGV4Y2x1ZGUuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuZGVmYXVsdFRpbWVvdXRTZWNvbmRzXSAtIERlZmF1bHQgdGltZW91dCBpbiBzZWNvbmRzLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmZhaWxlZENvbnNvbGVPdXRwdXRNYXhMaW5lc10gLSBNYXhpbXVtIGZhaWxlZCBjb25zb2xlIGxpbmVzIHRvIHByaW50IGlubGluZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBjb25maWd1cmVUZXN0cyh7Y29uc29sZU91dHB1dCwgZXhjbHVkZVRhZ3MsIGRlZmF1bHRUaW1lb3V0U2Vjb25kcywgZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzfSA9IHt9KSB7XG4gIGlmIChleGNsdWRlVGFncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGVzdENvbmZpZy5leGNsdWRlVGFncyA9IG5vcm1hbGl6ZVRhZ3MoZXhjbHVkZVRhZ3MpXG4gIH1cblxuICBpZiAoY29uc29sZU91dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGNvbnNvbGVPdXRwdXQgIT09IFwiZmFpbHVyZVwiICYmIGNvbnNvbGVPdXRwdXQgIT09IFwibGl2ZVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29uc29sZU91dHB1dCBjb25maWc6ICR7Y29uc29sZU91dHB1dH1gKVxuICAgIH1cblxuICAgIHRlc3RDb25maWcuY29uc29sZU91dHB1dCA9IGNvbnNvbGVPdXRwdXRcbiAgfVxuXG4gIGlmICh0eXBlb2YgZGVmYXVsdFRpbWVvdXRTZWNvbmRzID09PSBcIm51bWJlclwiKSB7XG4gICAgdGVzdENvbmZpZy5kZWZhdWx0VGltZW91dFNlY29uZHMgPSBkZWZhdWx0VGltZW91dFNlY29uZHNcbiAgfVxuXG4gIGlmICh0eXBlb2YgZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzID09PSBcIm51bWJlclwiKSB7XG4gICAgdGVzdENvbmZpZy5mYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXMgPSBmYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXNcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgbWVyZ2UgdGVzdCBhcmdzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gYmFzZUFyZ3MgLSBCYXNlIGFyZ3MuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBleHRyYUFyZ3MgLSBFeHRyYSBhcmdzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSAtIE1lcmdlZCBhcmdzLlxuICovXG5mdW5jdGlvbiBtZXJnZVRlc3RBcmdzKGJhc2VBcmdzLCBleHRyYUFyZ3MpIHtcbiAgY29uc3QgbWVyZ2VkID0gT2JqZWN0LmFzc2lnbih7fSwgYmFzZUFyZ3MsIGV4dHJhQXJncylcbiAgY29uc3QgbWVyZ2VkVGFncyA9IFsuLi5ub3JtYWxpemVUYWdzKGJhc2VBcmdzPy50YWdzKSwgLi4ubm9ybWFsaXplVGFncyhleHRyYUFyZ3M/LnRhZ3MpXVxuXG4gIGlmIChtZXJnZWRUYWdzLmxlbmd0aCA+IDApIHtcbiAgICBtZXJnZWQudGFncyA9IEFycmF5LmZyb20obmV3IFNldChtZXJnZWRUYWdzKSlcbiAgfSBlbHNlIGlmIChcInRhZ3NcIiBpbiBtZXJnZWQpIHtcbiAgICBkZWxldGUgbWVyZ2VkLnRhZ3NcbiAgfVxuXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqXG4gKiBSdW5zIGJlZm9yZSBlYWNoLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkFmdGVyQmVmb3JlRWFjaENhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmVmb3JlRWFjaChjYWxsYmFjaykge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG5cbiAgY3VycmVudFRlc3QuYmVmb3JlRWFjaGVzLnB1c2goe2NhbGxiYWNrfSlcbn1cblxuLyoqXG4gKiBSdW5zIGJlZm9yZSBhbGwuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQmVmb3JlQWZ0ZXJBbGxDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJlZm9yZUFsbChjYWxsYmFjaykge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG5cbiAgY3VycmVudFRlc3QuYmVmb3JlQWxscy5wdXNoKHtjYWxsYmFja30pXG59XG5cbi8qKlxuICogUnVucyBhZnRlciBlYWNoLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkFmdGVyQmVmb3JlRWFjaENhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYWZ0ZXJFYWNoKGNhbGxiYWNrKSB7XG4gIGNvbnN0IGN1cnJlbnRUZXN0ID0gY3VycmVudFBhdGhbY3VycmVudFBhdGgubGVuZ3RoIC0gMV1cblxuICBjdXJyZW50VGVzdC5hZnRlckVhY2hlcy5wdXNoKHtjYWxsYmFja30pXG59XG5cbi8qKlxuICogUnVucyBhZnRlciBhbGwuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQmVmb3JlQWZ0ZXJBbGxDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGFmdGVyQWxsKGNhbGxiYWNrKSB7XG4gIGNvbnN0IGN1cnJlbnRUZXN0ID0gY3VycmVudFBhdGhbY3VycmVudFBhdGgubGVuZ3RoIC0gMV1cblxuICBjdXJyZW50VGVzdC5hZnRlckFsbHMucHVzaCh7Y2FsbGJhY2t9KVxufVxuXG5cbi8qKlxuICogUnVucyBkZXNjcmliZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiAtIERlc2NyaXB0aW9uLlxuICogQHBhcmFtIHtvYmplY3R8KCgpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pKX0gYXJnMSAtIEFyZzEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZHwoKCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPikpfSBbYXJnMl0gLSBBcmcyLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVzY3JpYmUoZGVzY3JpcHRpb24sIGFyZzEsIGFyZzIpIHtcbiAgLyoqXG4gICAqIERlZmluZXMgdGVzdEFyZ3MuXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgbGV0IHRlc3RBcmdzLCB0ZXN0RnVuY3Rpb25cblxuICBpZiAodHlwZW9mIGFyZzIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGVzdEZ1bmN0aW9uID0gYXJnMlxuICAgIHRlc3RBcmdzID0gYXJnMVxuICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcxID09IFwiZnVuY3Rpb25cIikge1xuICAgIHRlc3RGdW5jdGlvbiA9IGFyZzFcbiAgICB0ZXN0QXJncyA9IHt9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgZGVzY3JpYmU6ICR7YXJnMX0sICR7YXJnMn1gKVxuICB9XG5cbiAgY29uc3QgY3VycmVudFRlc3QgPSBjdXJyZW50UGF0aFtjdXJyZW50UGF0aC5sZW5ndGggLSAxXVxuICBjb25zdCBuZXdUZXN0QXJncyA9IG1lcmdlVGVzdEFyZ3MoY3VycmVudFRlc3QuYXJncywgdGVzdEFyZ3MpXG5cbiAgaWYgKGRlc2NyaXB0aW9uIGluIGN1cnJlbnRUZXN0LnN1YnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSB0ZXN0IGRlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufWApXG4gIH1cblxuICBjb25zdCBsb2NhdGlvbiA9IGNhcHR1cmVMb2NhdGlvbigpXG4gIGNvbnN0IG5ld1Rlc3REYXRhID0ge1xuICAgIGFmdGVyRWFjaGVzOiBbXSxcbiAgICBhZnRlckFsbHM6IFtdLFxuICAgIGFyZ3M6IG5ld1Rlc3RBcmdzLFxuICAgIGJlZm9yZUFsbHM6IFtdLFxuICAgIGJlZm9yZUVhY2hlczogW10sXG4gICAgZmlsZVBhdGg6IGxvY2F0aW9uLmZpbGVQYXRoLFxuICAgIGxpbmU6IGxvY2F0aW9uLmxpbmUsXG4gICAgc3Viczoge30sXG4gICAgdGVzdHM6IHt9XG4gIH1cblxuICBjdXJyZW50VGVzdC5zdWJzW2Rlc2NyaXB0aW9uXSA9IG5ld1Rlc3REYXRhXG4gIGN1cnJlbnRQYXRoLnB1c2gobmV3VGVzdERhdGEpXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0ZXN0RnVuY3Rpb24oKVxuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQYXRoLnBvcCgpXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIGV4cGVjdC5cbiAqIEBwYXJhbSB7P30gYXJnIC0gQXJnLlxuICogQHJldHVybnMge0V4cGVjdH0gLSBUaGUgZXhwZWN0LlxuICovXG5mdW5jdGlvbiBleHBlY3QoYXJnKSB7XG4gIHJldHVybiBuZXcgRXhwZWN0KGFyZylcbn1cblxuZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcgPSBvYmplY3RDb250YWluaW5nXG5leHBlY3QuYXJyYXlDb250YWluaW5nID0gYXJyYXlDb250YWluaW5nXG5cbi8qKlxuICogUnVucyBpdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiAtIERlc2NyaXB0aW9uLlxuICogQHBhcmFtIHtvYmplY3R8KCgpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pKX0gYXJnMSAtIEFyZzEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZHwoKCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPikpfSBbYXJnMl0gLSBBcmcyLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBpdChkZXNjcmlwdGlvbiwgYXJnMSwgYXJnMikge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRlc3RBcmdzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gIGxldCB0ZXN0QXJnc1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRlc3RGdW5jdGlvbi5cbiAgICogQHR5cGUgeygpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pfSAqL1xuICBsZXQgdGVzdEZ1bmN0aW9uXG5cbiAgaWYgKHR5cGVvZiBhcmcxID09IFwiZnVuY3Rpb25cIikge1xuICAgIHRlc3RGdW5jdGlvbiA9IC8qKiBAdHlwZSB7KCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPil9ICovIChhcmcxKVxuICAgIHRlc3RBcmdzID0ge31cbiAgfSBlbHNlIGlmICh0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0ZXN0RnVuY3Rpb24gPSAvKiogQHR5cGUgeygpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pfSAqLyAoYXJnMilcbiAgICB0ZXN0QXJncyA9IGFyZzFcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXJndW1lbnRzIGZvciBpdDogJHtkZXNjcmlwdGlvbn0sICR7YXJnMX1gKVxuICB9XG5cbiAgY29uc3QgbmV3VGVzdEFyZ3MgPSBtZXJnZVRlc3RBcmdzKGN1cnJlbnRUZXN0LmFyZ3MsIHRlc3RBcmdzKVxuXG4gIGNvbnN0IGxvY2F0aW9uID0gY2FwdHVyZUxvY2F0aW9uKClcblxuICBjdXJyZW50VGVzdC50ZXN0c1tkZXNjcmlwdGlvbl0gPSB7XG4gICAgYXJnczogbmV3VGVzdEFyZ3MsXG4gICAgZnVuY3Rpb246IHRlc3RGdW5jdGlvbixcbiAgICBmaWxlUGF0aDogbG9jYXRpb24uZmlsZVBhdGgsXG4gICAgbGluZTogbG9jYXRpb24ubGluZVxuICB9XG59XG5cbi8qKlxuICogUnVucyBmaXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbi5cbiAqIEBwYXJhbSB7b2JqZWN0fCgoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KSl9IGFyZzEgLSBBcmcxLlxuICogQHBhcmFtIHt1bmRlZmluZWR8KCgpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pKX0gW2FyZzJdIC0gQXJnMi5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZml0KGRlc2NyaXB0aW9uLCBhcmcxLCBhcmcyKSB7XG4gIC8qKlxuICAgKiBEZWZpbmVzIHRlc3RBcmdzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gIGxldCB0ZXN0QXJnc1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRlc3RGdW5jdGlvbi5cbiAgICogQHR5cGUgeygpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pfSAqL1xuICBsZXQgdGVzdEZ1bmN0aW9uXG5cbiAgaWYgKHR5cGVvZiBhcmcxID09IFwiZnVuY3Rpb25cIikge1xuICAgIHRlc3RGdW5jdGlvbiA9IC8qKiBAdHlwZSB7KCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPil9ICovIChhcmcxKVxuICAgIHRlc3RBcmdzID0ge2ZvY3VzOiB0cnVlfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcyID09IFwiZnVuY3Rpb25cIikge1xuICAgIHRlc3RGdW5jdGlvbiA9IC8qKiBAdHlwZSB7KCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPil9ICovIChhcmcyKVxuICAgIHRlc3RBcmdzID0gT2JqZWN0LmFzc2lnbih7Zm9jdXM6IHRydWV9LCBhcmcxKVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcmd1bWVudHMgZm9yIGl0OiAke2Rlc2NyaXB0aW9ufSwgJHthcmcxfWApXG4gIH1cblxuICByZXR1cm4gaXQoZGVzY3JpcHRpb24sIHRlc3RBcmdzLCB0ZXN0RnVuY3Rpb24pXG59XG5cbi8vIE1ha2UgdGhlIG1ldGhvZHMgZ2xvYmFsIHNvIHRoZXkgY2FuIGJlIHVzZWQgaW4gdGVzdCBmaWxlc1xuZ2xvYmFsVGhpcy5hZnRlckVhY2ggPSBhZnRlckVhY2hcbmdsb2JhbFRoaXMuYWZ0ZXJBbGwgPSBhZnRlckFsbFxuZ2xvYmFsVGhpcy5iZWZvcmVFYWNoID0gYmVmb3JlRWFjaFxuZ2xvYmFsVGhpcy5iZWZvcmVBbGwgPSBiZWZvcmVBbGxcbmdsb2JhbFRoaXMuZGVzY3JpYmUgPSBkZXNjcmliZVxuZ2xvYmFsVGhpcy5leHBlY3QgPSBleHBlY3Rcbmdsb2JhbFRoaXMuaXQgPSBpdFxuZ2xvYmFsVGhpcy5maXQgPSBmaXRcbmdsb2JhbFRoaXMudGVzdEV2ZW50cyA9IHRlc3RFdmVudHNcbmdsb2JhbFRoaXMuY29uZmlndXJlVGVzdHMgPSBjb25maWd1cmVUZXN0c1xuXG5leHBvcnQge2FmdGVyQWxsLCBhZnRlckVhY2gsIGJlZm9yZUFsbCwgYmVmb3JlRWFjaCwgY29uZmlndXJlVGVzdHMsIGRlc2NyaWJlLCBleHBlY3QsIGZpdCwgaXQsIGFycmF5Q29udGFpbmluZywgb2JqZWN0Q29udGFpbmluZywgdGVzdENvbmZpZywgdGVzdEV2ZW50cywgdGVzdHN9XG4vKipcbiAqIFZlbG9jaW91c1Rlc3RDb25maWcgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZlbG9jaW91c1Rlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7XCJmYWlsdXJlXCIgfCBcImxpdmVcIn0gY29uc29sZU91dHB1dCAtIENvbnNvbGUgb3V0cHV0IG1vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBleGNsdWRlVGFncyAtIFRhZ3MgZXhjbHVkZWQgYnkgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkZWZhdWx0VGltZW91dFNlY29uZHMgLSBEZWZhdWx0IHRpbWVvdXQgaW4gc2Vjb25kcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBmYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXMgLSBNYXhpbXVtIGZhaWxlZCBjb25zb2xlIGxpbmVzIHRvIHByaW50IGlubGluZS5cbiAqL1xuIl19
319
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3Rlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUN2QixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sS0FBSyxDQUFBO0FBQ2pDLE9BQU8sWUFBWSxNQUFNLDJCQUEyQixDQUFBO0FBQ3BELE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQTtBQUNoQyxPQUFPLFlBQVksTUFBTSxxQkFBcUIsQ0FBQTtBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFFbkU7O3NEQUVzRDtBQUN0RCxNQUFNLEtBQUssR0FBRztJQUNaOztnRkFFNEU7SUFDNUUsV0FBVyxFQUFFLEVBQUU7SUFDZjs7K0VBRTJFO0lBQzNFLFNBQVMsRUFBRSxFQUFFO0lBQ2IsSUFBSSxFQUFFLEVBQUU7SUFFUjs7K0VBRTJFO0lBQzNFLFVBQVUsRUFBRSxFQUFFO0lBQ2Q7O2dGQUU0RTtJQUM1RSxZQUFZLEVBQUUsRUFBRTtJQUNoQixRQUFRLEVBQUUsU0FBUztJQUNuQixJQUFJLEVBQUUsU0FBUztJQUNmLElBQUksRUFBRSxFQUFFO0lBQ1IsS0FBSyxFQUFFLEVBQUU7Q0FDVixDQUFBO0FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtBQUVyQyxJQUFJLFdBQVcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBRXpCOzs7R0FHRztBQUNILFNBQVMsZUFBZTtJQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFBO0lBQ3pCLE1BQU0sS0FBSyxHQUFHLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxF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TyxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUMsQ0FBQTtBQUM5Szs7Ozs7OztHQU9HIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7ZmlsZVVSTFRvUGF0aH0gZnJvbSBcInVybFwiXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCBFeHBlY3QgZnJvbSBcIi4vZXhwZWN0LmpzXCJcbmltcG9ydCB3YWl0Rm9yRXZlbnQgZnJvbSBcIi4vd2FpdC1mb3ItZXZlbnQuanNcIlxuaW1wb3J0IHthcnJheUNvbnRhaW5pbmcsIG9iamVjdENvbnRhaW5pbmd9IGZyb20gXCIuL2V4cGVjdC11dGlscy5qc1wiXG5cbi8qKlxuICogVGVzdHMuXG4gKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5UZXN0c0FyZ3VtZW50fSAqL1xuY29uc3QgdGVzdHMgPSB7XG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkFmdGVyQmVmb3JlRWFjaENhbGxiYWNrT2JqZWN0VHlwZVtdfSAqL1xuICBhZnRlckVhY2hlczogW10sXG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkJlZm9yZUFmdGVyQWxsQ2FsbGJhY2tPYmplY3RUeXBlW119ICovXG4gIGFmdGVyQWxsczogW10sXG4gIGFyZ3M6IHt9LFxuXG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkJlZm9yZUFmdGVyQWxsQ2FsbGJhY2tPYmplY3RUeXBlW119ICovXG4gIGJlZm9yZUFsbHM6IFtdLFxuICAvKipcbiAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi90ZXN0LXJ1bm5lci5qc1wiKS5BZnRlckJlZm9yZUVhY2hDYWxsYmFja09iamVjdFR5cGVbXX0gKi9cbiAgYmVmb3JlRWFjaGVzOiBbXSxcbiAgZmlsZVBhdGg6IHVuZGVmaW5lZCxcbiAgbGluZTogdW5kZWZpbmVkLFxuICBzdWJzOiB7fSxcbiAgdGVzdHM6IHt9XG59XG5cbmNvbnN0IHRlc3RFdmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxubGV0IGN1cnJlbnRQYXRoID0gW3Rlc3RzXVxuXG4vKipcbiAqIFJ1bnMgY2FwdHVyZSBsb2NhdGlvbi5cbiAqIEByZXR1cm5zIHt7ZmlsZVBhdGg/OiBzdHJpbmcsIGxpbmU/OiBudW1iZXJ9fSAtIExvY2F0aW9uLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlTG9jYXRpb24oKSB7XG4gIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKClcbiAgY29uc3Qgc3RhY2sgPSB0eXBlb2YgZXJyb3Iuc3RhY2sgPT09IFwic3RyaW5nXCIgPyBlcnJvci5zdGFjay5zcGxpdChcIlxcblwiKSA6IFtdXG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0YWNrKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpXG5cbiAgICBpZiAoIXRyaW1tZWQuaW5jbHVkZXMoXCJhdFwiKSkgY29udGludWVcbiAgICBpZiAodHJpbW1lZC5pbmNsdWRlcyhcIi9zcmMvdGVzdGluZy90ZXN0LmpzXCIpKSBjb250aW51ZVxuXG4gICAgY29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKC8oPzpcXCh8XFxzKShmaWxlOlxcL1xcLy4qP3xcXC8uKj8pOihcXGQrKTooXFxkKylcXCk/JC8pXG5cbiAgICBpZiAoIW1hdGNoKSBjb250aW51ZVxuXG4gICAgY29uc3QgcmF3UGF0aCA9IG1hdGNoWzFdXG4gICAgY29uc3QgbGluZU51bWJlciA9IE51bWJlcihtYXRjaFsyXSlcbiAgICBjb25zdCBmaWxlUGF0aCA9IHJhd1BhdGguc3RhcnRzV2l0aChcImZpbGU6Ly9cIilcbiAgICAgID8gZmlsZVVSTFRvUGF0aChyYXdQYXRoKVxuICAgICAgOiByYXdQYXRoXG5cbiAgICByZXR1cm4ge1xuICAgICAgZmlsZVBhdGg6IHBhdGgucmVzb2x2ZShmaWxlUGF0aCksXG4gICAgICBsaW5lOiBOdW1iZXIuaXNGaW5pdGUobGluZU51bWJlcikgPyBsaW5lTnVtYmVyIDogdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHt9XG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgdGFncy5cbiAqIEBwYXJhbSB7c3RyaW5nW10gfCBzdHJpbmcgfCB1bmRlZmluZWR9IHRhZ3MgLSBUYWdzLlxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIE5vcm1hbGl6ZWQgdGFncy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplVGFncyh0YWdzKSB7XG4gIGlmICghdGFncykgcmV0dXJuIFtdXG5cbiAgY29uc3QgdmFsdWVzID0gW11cbiAgY29uc3QgcmF3VGFncyA9IEFycmF5LmlzQXJyYXkodGFncykgPyB0YWdzIDogW3RhZ3NdXG5cbiAgZm9yIChjb25zdCByYXdUYWcgb2YgcmF3VGFncykge1xuICAgIGlmIChyYXdUYWcgPT09IHVuZGVmaW5lZCB8fCByYXdUYWcgPT09IG51bGwpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBwYXJ0cyA9IFN0cmluZyhyYXdUYWcpLnNwbGl0KFwiLFwiKVxuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gcGFydC50cmltKClcblxuICAgICAgaWYgKHRyaW1tZWQpIHZhbHVlcy5wdXNoKHRyaW1tZWQpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMpKVxufVxuXG4vKipcbiAqIFRlc3QgY29uZmlnLlxuICogQHR5cGUge1ZlbG9jaW91c1Rlc3RDb25maWd9ICovXG5jb25zdCB0ZXN0Q29uZmlnID0ge1xuICBjb25zb2xlT3V0cHV0OiBcImZhaWx1cmVcIixcbiAgZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzOiAyMDAsXG4gIGV4Y2x1ZGVUYWdzOiBbXSxcbiAgZGVmYXVsdFRpbWVvdXRTZWNvbmRzOiA2MFxufVxuXG4vKipcbiAqIFJ1bnMgY29uZmlndXJlIHRlc3RzLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtcImZhaWx1cmVcIiB8IFwibGl2ZVwifSBbYXJncy5jb25zb2xlT3V0cHV0XSAtIENvbnNvbGUgb3V0cHV0IG1vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgc3RyaW5nfSBbYXJncy5leGNsdWRlVGFnc10gLSBUYWdzIHRvIGV4Y2x1ZGUuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuZGVmYXVsdFRpbWVvdXRTZWNvbmRzXSAtIERlZmF1bHQgdGltZW91dCBpbiBzZWNvbmRzLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmZhaWxlZENvbnNvbGVPdXRwdXRNYXhMaW5lc10gLSBNYXhpbXVtIGZhaWxlZCBjb25zb2xlIGxpbmVzIHRvIHByaW50IGlubGluZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBjb25maWd1cmVUZXN0cyh7Y29uc29sZU91dHB1dCwgZXhjbHVkZVRhZ3MsIGRlZmF1bHRUaW1lb3V0U2Vjb25kcywgZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzfSA9IHt9KSB7XG4gIGlmIChleGNsdWRlVGFncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGVzdENvbmZpZy5leGNsdWRlVGFncyA9IG5vcm1hbGl6ZVRhZ3MoZXhjbHVkZVRhZ3MpXG4gIH1cblxuICBpZiAoY29uc29sZU91dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGNvbnNvbGVPdXRwdXQgIT09IFwiZmFpbHVyZVwiICYmIGNvbnNvbGVPdXRwdXQgIT09IFwibGl2ZVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29uc29sZU91dHB1dCBjb25maWc6ICR7Y29uc29sZU91dHB1dH1gKVxuICAgIH1cblxuICAgIHRlc3RDb25maWcuY29uc29sZU91dHB1dCA9IGNvbnNvbGVPdXRwdXRcbiAgfVxuXG4gIGlmICh0eXBlb2YgZGVmYXVsdFRpbWVvdXRTZWNvbmRzID09PSBcIm51bWJlclwiKSB7XG4gICAgdGVzdENvbmZpZy5kZWZhdWx0VGltZW91dFNlY29uZHMgPSBkZWZhdWx0VGltZW91dFNlY29uZHNcbiAgfVxuXG4gIGlmICh0eXBlb2YgZmFpbGVkQ29uc29sZU91dHB1dE1heExpbmVzID09PSBcIm51bWJlclwiKSB7XG4gICAgdGVzdENvbmZpZy5mYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXMgPSBmYWlsZWRDb25zb2xlT3V0cHV0TWF4TGluZXNcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgbWVyZ2UgdGVzdCBhcmdzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gYmFzZUFyZ3MgLSBCYXNlIGFyZ3MuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBleHRyYUFyZ3MgLSBFeHRyYSBhcmdzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSAtIE1lcmdlZCBhcmdzLlxuICovXG5mdW5jdGlvbiBtZXJnZVRlc3RBcmdzKGJhc2VBcmdzLCBleHRyYUFyZ3MpIHtcbiAgY29uc3QgbWVyZ2VkID0gT2JqZWN0LmFzc2lnbih7fSwgYmFzZUFyZ3MsIGV4dHJhQXJncylcbiAgY29uc3QgbWVyZ2VkVGFncyA9IFsuLi5ub3JtYWxpemVUYWdzKGJhc2VBcmdzPy50YWdzKSwgLi4ubm9ybWFsaXplVGFncyhleHRyYUFyZ3M/LnRhZ3MpXVxuXG4gIGlmIChtZXJnZWRUYWdzLmxlbmd0aCA+IDApIHtcbiAgICBtZXJnZWQudGFncyA9IEFycmF5LmZyb20obmV3IFNldChtZXJnZWRUYWdzKSlcbiAgfSBlbHNlIGlmIChcInRhZ3NcIiBpbiBtZXJnZWQpIHtcbiAgICBkZWxldGUgbWVyZ2VkLnRhZ3NcbiAgfVxuXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqXG4gKiBSdW5zIGJlZm9yZSBlYWNoLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkFmdGVyQmVmb3JlRWFjaENhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmVmb3JlRWFjaChjYWxsYmFjaykge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG5cbiAgY3VycmVudFRlc3QuYmVmb3JlRWFjaGVzLnB1c2goe2NhbGxiYWNrfSlcbn1cblxuLyoqXG4gKiBSdW5zIGJlZm9yZSBhbGwuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQmVmb3JlQWZ0ZXJBbGxDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJlZm9yZUFsbChjYWxsYmFjaykge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG5cbiAgY3VycmVudFRlc3QuYmVmb3JlQWxscy5wdXNoKHtjYWxsYmFja30pXG59XG5cbi8qKlxuICogUnVucyBhZnRlciBlYWNoLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3Rlc3QtcnVubmVyLmpzXCIpLkFmdGVyQmVmb3JlRWFjaENhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYWZ0ZXJFYWNoKGNhbGxiYWNrKSB7XG4gIGNvbnN0IGN1cnJlbnRUZXN0ID0gY3VycmVudFBhdGhbY3VycmVudFBhdGgubGVuZ3RoIC0gMV1cblxuICBjdXJyZW50VGVzdC5hZnRlckVhY2hlcy5wdXNoKHtjYWxsYmFja30pXG59XG5cbi8qKlxuICogUnVucyBhZnRlciBhbGwuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdGVzdC1ydW5uZXIuanNcIikuQmVmb3JlQWZ0ZXJBbGxDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGFmdGVyQWxsKGNhbGxiYWNrKSB7XG4gIGNvbnN0IGN1cnJlbnRUZXN0ID0gY3VycmVudFBhdGhbY3VycmVudFBhdGgubGVuZ3RoIC0gMV1cblxuICBjdXJyZW50VGVzdC5hZnRlckFsbHMucHVzaCh7Y2FsbGJhY2t9KVxufVxuXG5cbi8qKlxuICogUnVucyBkZXNjcmliZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiAtIERlc2NyaXB0aW9uLlxuICogQHBhcmFtIHtvYmplY3R8KCgpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pKX0gYXJnMSAtIEFyZzEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZHwoKCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPikpfSBbYXJnMl0gLSBBcmcyLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVzY3JpYmUoZGVzY3JpcHRpb24sIGFyZzEsIGFyZzIpIHtcbiAgLyoqXG4gICAqIERlZmluZXMgdGVzdEFyZ3MuXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgbGV0IHRlc3RBcmdzLCB0ZXN0RnVuY3Rpb25cblxuICBpZiAodHlwZW9mIGFyZzIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGVzdEZ1bmN0aW9uID0gYXJnMlxuICAgIHRlc3RBcmdzID0gYXJnMVxuICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcxID09IFwiZnVuY3Rpb25cIikge1xuICAgIHRlc3RGdW5jdGlvbiA9IGFyZzFcbiAgICB0ZXN0QXJncyA9IHt9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgZGVzY3JpYmU6ICR7YXJnMX0sICR7YXJnMn1gKVxuICB9XG5cbiAgY29uc3QgY3VycmVudFRlc3QgPSBjdXJyZW50UGF0aFtjdXJyZW50UGF0aC5sZW5ndGggLSAxXVxuICBjb25zdCBuZXdUZXN0QXJncyA9IG1lcmdlVGVzdEFyZ3MoY3VycmVudFRlc3QuYXJncywgdGVzdEFyZ3MpXG5cbiAgaWYgKGRlc2NyaXB0aW9uIGluIGN1cnJlbnRUZXN0LnN1YnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSB0ZXN0IGRlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufWApXG4gIH1cblxuICBjb25zdCBsb2NhdGlvbiA9IGNhcHR1cmVMb2NhdGlvbigpXG4gIGNvbnN0IG5ld1Rlc3REYXRhID0ge1xuICAgIGFmdGVyRWFjaGVzOiBbXSxcbiAgICBhZnRlckFsbHM6IFtdLFxuICAgIGFyZ3M6IG5ld1Rlc3RBcmdzLFxuICAgIGJlZm9yZUFsbHM6IFtdLFxuICAgIGJlZm9yZUVhY2hlczogW10sXG4gICAgZmlsZVBhdGg6IGxvY2F0aW9uLmZpbGVQYXRoLFxuICAgIGxpbmU6IGxvY2F0aW9uLmxpbmUsXG4gICAgc3Viczoge30sXG4gICAgdGVzdHM6IHt9XG4gIH1cblxuICBjdXJyZW50VGVzdC5zdWJzW2Rlc2NyaXB0aW9uXSA9IG5ld1Rlc3REYXRhXG4gIGN1cnJlbnRQYXRoLnB1c2gobmV3VGVzdERhdGEpXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0ZXN0RnVuY3Rpb24oKVxuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQYXRoLnBvcCgpXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIGV4cGVjdC5cbiAqIEBwYXJhbSB7P30gYXJnIC0gQXJnLlxuICogQHJldHVybnMge0V4cGVjdH0gLSBUaGUgZXhwZWN0LlxuICovXG5mdW5jdGlvbiBleHBlY3QoYXJnKSB7XG4gIHJldHVybiBuZXcgRXhwZWN0KGFyZylcbn1cblxuZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcgPSBvYmplY3RDb250YWluaW5nXG5leHBlY3QuYXJyYXlDb250YWluaW5nID0gYXJyYXlDb250YWluaW5nXG5cbi8qKlxuICogUnVucyBpdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiAtIERlc2NyaXB0aW9uLlxuICogQHBhcmFtIHtvYmplY3R8KCgpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pKX0gYXJnMSAtIEFyZzEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZHwoKCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPikpfSBbYXJnMl0gLSBBcmcyLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBpdChkZXNjcmlwdGlvbiwgYXJnMSwgYXJnMikge1xuICBjb25zdCBjdXJyZW50VGVzdCA9IGN1cnJlbnRQYXRoW2N1cnJlbnRQYXRoLmxlbmd0aCAtIDFdXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRlc3RBcmdzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gIGxldCB0ZXN0QXJnc1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRlc3RGdW5jdGlvbi5cbiAgICogQHR5cGUgeygpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pfSAqL1xuICBsZXQgdGVzdEZ1bmN0aW9uXG5cbiAgaWYgKHR5cGVvZiBhcmcxID09IFwiZnVuY3Rpb25cIikge1xuICAgIHRlc3RGdW5jdGlvbiA9IC8qKiBAdHlwZSB7KCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPil9ICovIChhcmcxKVxuICAgIHRlc3RBcmdzID0ge31cbiAgfSBlbHNlIGlmICh0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0ZXN0RnVuY3Rpb24gPSAvKiogQHR5cGUgeygpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pfSAqLyAoYXJnMilcbiAgICB0ZXN0QXJncyA9IGFyZzFcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXJndW1lbnRzIGZvciBpdDogJHtkZXNjcmlwdGlvbn0sICR7YXJnMX1gKVxuICB9XG5cbiAgY29uc3QgbmV3VGVzdEFyZ3MgPSBtZXJnZVRlc3RBcmdzKGN1cnJlbnRUZXN0LmFyZ3MsIHRlc3RBcmdzKVxuXG4gIGNvbnN0IGxvY2F0aW9uID0gY2FwdHVyZUxvY2F0aW9uKClcblxuICBjdXJyZW50VGVzdC50ZXN0c1tkZXNjcmlwdGlvbl0gPSB7XG4gICAgYXJnczogbmV3VGVzdEFyZ3MsXG4gICAgZnVuY3Rpb246IHRlc3RGdW5jdGlvbixcbiAgICBmaWxlUGF0aDogbG9jYXRpb24uZmlsZVBhdGgsXG4gICAgbGluZTogbG9jYXRpb24ubGluZVxuICB9XG59XG5cbi8qKlxuICogUnVucyBmaXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbi5cbiAqIEBwYXJhbSB7b2JqZWN0fCgoKSA9PiAodm9pZHxQcm9taXNlPHZvaWQ+KSl9IGFyZzEgLSBBcmcxLlxuICogQHBhcmFtIHt1bmRlZmluZWR8KCgpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pKX0gW2FyZzJdIC0gQXJnMi5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZml0KGRlc2NyaXB0aW9uLCBhcmcxLCBhcmcyKSB7XG4gIC8qKlxuICAgKiBEZWZpbmVzIHRlc3RBcmdzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gIGxldCB0ZXN0QXJnc1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRlc3RGdW5jdGlvbi5cbiAgICogQHR5cGUgeygpID0+ICh2b2lkfFByb21pc2U8dm9pZD4pfSAqL1xuICBsZXQgdGVzdEZ1bmN0aW9uXG5cbiAgaWYgKHR5cGVvZiBhcmcxID09IFwiZnVuY3Rpb25cIikge1xuICAgIHRlc3RGdW5jdGlvbiA9IC8qKiBAdHlwZSB7KCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPil9ICovIChhcmcxKVxuICAgIHRlc3RBcmdzID0ge2ZvY3VzOiB0cnVlfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcyID09IFwiZnVuY3Rpb25cIikge1xuICAgIHRlc3RGdW5jdGlvbiA9IC8qKiBAdHlwZSB7KCkgPT4gKHZvaWR8UHJvbWlzZTx2b2lkPil9ICovIChhcmcyKVxuICAgIHRlc3RBcmdzID0gT2JqZWN0LmFzc2lnbih7Zm9jdXM6IHRydWV9LCBhcmcxKVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcmd1bWVudHMgZm9yIGl0OiAke2Rlc2NyaXB0aW9ufSwgJHthcmcxfWApXG4gIH1cblxuICByZXR1cm4gaXQoZGVzY3JpcHRpb24sIHRlc3RBcmdzLCB0ZXN0RnVuY3Rpb24pXG59XG5cbi8vIE1ha2UgdGhlIG1ldGhvZHMgZ2xvYmFsIHNvIHRoZXkgY2FuIGJlIHVzZWQgaW4gdGVzdCBmaWxlc1xuZ2xvYmFsVGhpcy5hZnRlckVhY2ggPSBhZnRlckVhY2hcbmdsb2JhbFRoaXMuYWZ0ZXJBbGwgPSBhZnRlckFsbFxuZ2xvYmFsVGhpcy5iZWZvcmVFYWNoID0gYmVmb3JlRWFjaFxuZ2xvYmFsVGhpcy5iZWZvcmVBbGwgPSBiZWZvcmVBbGxcbmdsb2JhbFRoaXMuZGVzY3JpYmUgPSBkZXNjcmliZVxuZ2xvYmFsVGhpcy5leHBlY3QgPSBleHBlY3Rcbmdsb2JhbFRoaXMuaXQgPSBpdFxuZ2xvYmFsVGhpcy5maXQgPSBmaXRcbmdsb2JhbFRoaXMudGVzdEV2ZW50cyA9IHRlc3RFdmVudHNcbmdsb2JhbFRoaXMuY29uZmlndXJlVGVzdHMgPSBjb25maWd1cmVUZXN0c1xuXG5leHBvcnQge2FmdGVyQWxsLCBhZnRlckVhY2gsIGJlZm9yZUFsbCwgYmVmb3JlRWFjaCwgY29uZmlndXJlVGVzdHMsIGRlc2NyaWJlLCBleHBlY3QsIGZpdCwgaXQsIGFycmF5Q29udGFpbmluZywgb2JqZWN0Q29udGFpbmluZywgdGVzdENvbmZpZywgdGVzdEV2ZW50cywgdGVzdHMsIHdhaXRGb3JFdmVudH1cbi8qKlxuICogVmVsb2Npb3VzVGVzdENvbmZpZyB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzVGVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtcImZhaWx1cmVcIiB8IFwibGl2ZVwifSBjb25zb2xlT3V0cHV0IC0gQ29uc29sZSBvdXRwdXQgbW9kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGV4Y2x1ZGVUYWdzIC0gVGFncyBleGNsdWRlZCBieSBkZWZhdWx0LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlZmF1bHRUaW1lb3V0U2Vjb25kcyAtIERlZmF1bHQgdGltZW91dCBpbiBzZWNvbmRzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGZhaWxlZENvbnNvbGVPdXRwdXRNYXhMaW5lcyAtIE1heGltdW0gZmFpbGVkIGNvbnNvbGUgbGluZXMgdG8gcHJpbnQgaW5saW5lLlxuICovXG4iXX0=
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @typedef {object} WaitForEventOptions
3
+ * @property {number} [timeoutMs] Timeout in milliseconds (default: 5000).
4
+ * @property {(...args: Array<?>) => boolean} [filter] Only resolve when this predicate returns true for the emitted arguments.
5
+ */
6
+ /**
7
+ * @typedef {object} EventEmitterLike
8
+ * @property {(event: string, listener: (...args: Array<?>) => void) => void} on Registers a listener.
9
+ * @property {(event: string, listener: (...args: Array<?>) => void) => void} off Removes a listener.
10
+ */
11
+ /**
12
+ * Resolves the moment `eventName` fires on `emitter` — optionally only when `filter`
13
+ * matches the emitted arguments — instead of sleeping a fixed duration. Rejects with a
14
+ * timeout error if the event does not fire within `timeoutMs`. The listener is always
15
+ * removed (on resolve and on timeout).
16
+ *
17
+ * Use this to await a real signal (a background job finishing, a model update, a
18
+ * websocket message) rather than guessing a delay. To poll an arbitrary condition
19
+ * instead of a discrete event, use awaitery's `waitFor`.
20
+ * @param {EventEmitterLike} emitter - Event emitter exposing `on`/`off` (Node EventEmitter, eventemitter3, velocious `testEvents`, ...).
21
+ * @param {string} eventName - The event to wait for.
22
+ * @param {WaitForEventOptions} [options] - Options.
23
+ * @returns {Promise<?>} - Resolves with the single emitted argument, an array when the event emits multiple, or undefined when it emits none.
24
+ */
25
+ export default function waitForEvent(emitter: EventEmitterLike, eventName: string, options?: WaitForEventOptions): Promise<unknown>;
26
+ export type WaitForEventOptions = {
27
+ /**
28
+ * Timeout in milliseconds (default: 5000).
29
+ */
30
+ timeoutMs?: number | undefined;
31
+ /**
32
+ * Only resolve when this predicate returns true for the emitted arguments.
33
+ */
34
+ filter?: ((...args: Array<unknown>) => boolean) | undefined;
35
+ };
36
+ export type EventEmitterLike = {
37
+ /**
38
+ * Registers a listener.
39
+ */
40
+ on: (event: string, listener: (...args: Array<unknown>) => void) => void;
41
+ /**
42
+ * Removes a listener.
43
+ */
44
+ off: (event: string, listener: (...args: Array<unknown>) => void) => void;
45
+ };
46
+ //# sourceMappingURL=wait-for-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait-for-event.d.ts","sourceRoot":"","sources":["../../../src/testing/wait-for-event.js"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH;;;;GAIG;AAEH;;;;;;;;;;;;;GAaG;AACH,8CALW,gBAAgB,aAChB,MAAM,YACN,mBAAmB,GACjB,OAAO,CAAC,OAAC,CAAC,CA6CtB;;;;;;;;;wBAlEuB,KAAK,CAAC,OAAC,CAAC,KAAK,OAAO;;;;;;QAK9B,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,OAAC,CAAC,KAAK,IAAI,KAAK,IAAI;;;;SAC9D,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,OAAC,CAAC,KAAK,IAAI,KAAK,IAAI"}
@@ -0,0 +1,64 @@
1
+ // @ts-check
2
+ /**
3
+ * @typedef {object} WaitForEventOptions
4
+ * @property {number} [timeoutMs] Timeout in milliseconds (default: 5000).
5
+ * @property {(...args: Array<?>) => boolean} [filter] Only resolve when this predicate returns true for the emitted arguments.
6
+ */
7
+ /**
8
+ * @typedef {object} EventEmitterLike
9
+ * @property {(event: string, listener: (...args: Array<?>) => void) => void} on Registers a listener.
10
+ * @property {(event: string, listener: (...args: Array<?>) => void) => void} off Removes a listener.
11
+ */
12
+ /**
13
+ * Resolves the moment `eventName` fires on `emitter` — optionally only when `filter`
14
+ * matches the emitted arguments — instead of sleeping a fixed duration. Rejects with a
15
+ * timeout error if the event does not fire within `timeoutMs`. The listener is always
16
+ * removed (on resolve and on timeout).
17
+ *
18
+ * Use this to await a real signal (a background job finishing, a model update, a
19
+ * websocket message) rather than guessing a delay. To poll an arbitrary condition
20
+ * instead of a discrete event, use awaitery's `waitFor`.
21
+ * @param {EventEmitterLike} emitter - Event emitter exposing `on`/`off` (Node EventEmitter, eventemitter3, velocious `testEvents`, ...).
22
+ * @param {string} eventName - The event to wait for.
23
+ * @param {WaitForEventOptions} [options] - Options.
24
+ * @returns {Promise<?>} - Resolves with the single emitted argument, an array when the event emits multiple, or undefined when it emits none.
25
+ */
26
+ export default function waitForEvent(emitter, eventName, options = {}) {
27
+ const { timeoutMs = 5000, filter } = options;
28
+ return new Promise((resolve, reject) => {
29
+ /** @type {ReturnType<typeof setTimeout>} */
30
+ let timer;
31
+ /**
32
+ * Resolves the wait when a matching event fires, removing itself first. A filter
33
+ * that throws (e.g. it assumes an event shape an intermediate emission doesn't
34
+ * have) rejects immediately rather than leaving the waiter pending until timeout.
35
+ * @param {...?} args - Emitted arguments.
36
+ * @returns {void}
37
+ */
38
+ const listener = (...args) => {
39
+ if (filter) {
40
+ let matched;
41
+ try {
42
+ matched = filter(...args);
43
+ }
44
+ catch (error) {
45
+ clearTimeout(timer);
46
+ emitter.off(eventName, listener);
47
+ reject(error);
48
+ return;
49
+ }
50
+ if (!matched)
51
+ return;
52
+ }
53
+ clearTimeout(timer);
54
+ emitter.off(eventName, listener);
55
+ resolve(args.length > 1 ? args : args[0]);
56
+ };
57
+ timer = setTimeout(() => {
58
+ emitter.off(eventName, listener);
59
+ reject(new Error(`Timed out after ${timeoutMs}ms waiting for event ${JSON.stringify(eventName)}`));
60
+ }, timeoutMs);
61
+ emitter.on(eventName, listener);
62
+ });
63
+ }
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC1mb3ItZXZlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy93YWl0LWZvci1ldmVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVo7Ozs7R0FJRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sVUFBVSxZQUFZLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEdBQUcsRUFBRTtJQUNuRSxNQUFNLEVBQUMsU0FBUyxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUMsR0FBRyxPQUFPLENBQUE7SUFFMUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyw0Q0FBNEM7UUFDNUMsSUFBSSxLQUFLLENBQUE7UUFFVDs7Ozs7O1dBTUc7UUFDSCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUU7WUFDM0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLE9BQU8sQ0FBQTtnQkFFWCxJQUFJLENBQUM7b0JBQ0gsT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO2dCQUMzQixDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO29CQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQTtvQkFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO29CQUViLE9BQU07Z0JBQ1IsQ0FBQztnQkFFRCxJQUFJLENBQUMsT0FBTztvQkFBRSxPQUFNO1lBQ3RCLENBQUM7WUFFRCxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzNDLENBQUMsQ0FBQTtRQUVELEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQ2hDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsU0FBUyx3QkFBd0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNwRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFFYixPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNqQyxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXYWl0Rm9yRXZlbnRPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRNc10gVGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDUwMDApLlxuICogQHByb3BlcnR5IHsoLi4uYXJnczogQXJyYXk8Pz4pID0+IGJvb2xlYW59IFtmaWx0ZXJdIE9ubHkgcmVzb2x2ZSB3aGVuIHRoaXMgcHJlZGljYXRlIHJldHVybnMgdHJ1ZSBmb3IgdGhlIGVtaXR0ZWQgYXJndW1lbnRzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRXZlbnRFbWl0dGVyTGlrZVxuICogQHByb3BlcnR5IHsoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBBcnJheTw/PikgPT4gdm9pZCkgPT4gdm9pZH0gb24gUmVnaXN0ZXJzIGEgbGlzdGVuZXIuXG4gKiBAcHJvcGVydHkgeyhldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IEFycmF5PD8+KSA9PiB2b2lkKSA9PiB2b2lkfSBvZmYgUmVtb3ZlcyBhIGxpc3RlbmVyLlxuICovXG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIG1vbWVudCBgZXZlbnROYW1lYCBmaXJlcyBvbiBgZW1pdHRlcmAg4oCUIG9wdGlvbmFsbHkgb25seSB3aGVuIGBmaWx0ZXJgXG4gKiBtYXRjaGVzIHRoZSBlbWl0dGVkIGFyZ3VtZW50cyDigJQgaW5zdGVhZCBvZiBzbGVlcGluZyBhIGZpeGVkIGR1cmF0aW9uLiBSZWplY3RzIHdpdGggYVxuICogdGltZW91dCBlcnJvciBpZiB0aGUgZXZlbnQgZG9lcyBub3QgZmlyZSB3aXRoaW4gYHRpbWVvdXRNc2AuIFRoZSBsaXN0ZW5lciBpcyBhbHdheXNcbiAqIHJlbW92ZWQgKG9uIHJlc29sdmUgYW5kIG9uIHRpbWVvdXQpLlxuICpcbiAqIFVzZSB0aGlzIHRvIGF3YWl0IGEgcmVhbCBzaWduYWwgKGEgYmFja2dyb3VuZCBqb2IgZmluaXNoaW5nLCBhIG1vZGVsIHVwZGF0ZSwgYVxuICogd2Vic29ja2V0IG1lc3NhZ2UpIHJhdGhlciB0aGFuIGd1ZXNzaW5nIGEgZGVsYXkuIFRvIHBvbGwgYW4gYXJiaXRyYXJ5IGNvbmRpdGlvblxuICogaW5zdGVhZCBvZiBhIGRpc2NyZXRlIGV2ZW50LCB1c2UgYXdhaXRlcnkncyBgd2FpdEZvcmAuXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlckxpa2V9IGVtaXR0ZXIgLSBFdmVudCBlbWl0dGVyIGV4cG9zaW5nIGBvbmAvYG9mZmAgKE5vZGUgRXZlbnRFbWl0dGVyLCBldmVudGVtaXR0ZXIzLCB2ZWxvY2lvdXMgYHRlc3RFdmVudHNgLCAuLi4pLlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIFRoZSBldmVudCB0byB3YWl0IGZvci5cbiAqIEBwYXJhbSB7V2FpdEZvckV2ZW50T3B0aW9uc30gW29wdGlvbnNdIC0gT3B0aW9ucy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSAtIFJlc29sdmVzIHdpdGggdGhlIHNpbmdsZSBlbWl0dGVkIGFyZ3VtZW50LCBhbiBhcnJheSB3aGVuIHRoZSBldmVudCBlbWl0cyBtdWx0aXBsZSwgb3IgdW5kZWZpbmVkIHdoZW4gaXQgZW1pdHMgbm9uZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2FpdEZvckV2ZW50KGVtaXR0ZXIsIGV2ZW50TmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHt0aW1lb3V0TXMgPSA1MDAwLCBmaWx0ZXJ9ID0gb3B0aW9uc1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pn0gKi9cbiAgICBsZXQgdGltZXJcblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSB3YWl0IHdoZW4gYSBtYXRjaGluZyBldmVudCBmaXJlcywgcmVtb3ZpbmcgaXRzZWxmIGZpcnN0LiBBIGZpbHRlclxuICAgICAqIHRoYXQgdGhyb3dzIChlLmcuIGl0IGFzc3VtZXMgYW4gZXZlbnQgc2hhcGUgYW4gaW50ZXJtZWRpYXRlIGVtaXNzaW9uIGRvZXNuJ3RcbiAgICAgKiBoYXZlKSByZWplY3RzIGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIGxlYXZpbmcgdGhlIHdhaXRlciBwZW5kaW5nIHVudGlsIHRpbWVvdXQuXG4gICAgICogQHBhcmFtIHsuLi4/fSBhcmdzIC0gRW1pdHRlZCBhcmd1bWVudHMuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgY29uc3QgbGlzdGVuZXIgPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICBsZXQgbWF0Y2hlZFxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWF0Y2hlZCA9IGZpbHRlciguLi5hcmdzKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAgICAgICBlbWl0dGVyLm9mZihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgICAgICAgIHJlamVjdChlcnJvcilcblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFtYXRjaGVkKSByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgICAgZW1pdHRlci5vZmYoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICAgIHJlc29sdmUoYXJncy5sZW5ndGggPiAxID8gYXJncyA6IGFyZ3NbMF0pXG4gICAgfVxuXG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGVtaXR0ZXIub2ZmKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgICByZWplY3QobmV3IEVycm9yKGBUaW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0TXN9bXMgd2FpdGluZyBmb3IgZXZlbnQgJHtKU09OLnN0cmluZ2lmeShldmVudE5hbWUpfWApKVxuICAgIH0sIHRpbWVvdXRNcylcblxuICAgIGVtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgfSlcbn1cbiJdfQ==
@@ -4,6 +4,7 @@ import path from "path"
4
4
  import {fileURLToPath} from "url"
5
5
  import EventEmitter from "../utils/event-emitter.js"
6
6
  import Expect from "./expect.js"
7
+ import waitForEvent from "./wait-for-event.js"
7
8
  import {arrayContaining, objectContaining} from "./expect-utils.js"
8
9
 
9
10
  /**
@@ -351,7 +352,7 @@ globalThis.fit = fit
351
352
  globalThis.testEvents = testEvents
352
353
  globalThis.configureTests = configureTests
353
354
 
354
- export {afterAll, afterEach, beforeAll, beforeEach, configureTests, describe, expect, fit, it, arrayContaining, objectContaining, testConfig, testEvents, tests}
355
+ export {afterAll, afterEach, beforeAll, beforeEach, configureTests, describe, expect, fit, it, arrayContaining, objectContaining, testConfig, testEvents, tests, waitForEvent}
355
356
  /**
356
357
  * VelociousTestConfig type.
357
358
  * @typedef {object} VelociousTestConfig
@@ -0,0 +1,72 @@
1
+ // @ts-check
2
+
3
+ /**
4
+ * @typedef {object} WaitForEventOptions
5
+ * @property {number} [timeoutMs] Timeout in milliseconds (default: 5000).
6
+ * @property {(...args: Array<?>) => boolean} [filter] Only resolve when this predicate returns true for the emitted arguments.
7
+ */
8
+
9
+ /**
10
+ * @typedef {object} EventEmitterLike
11
+ * @property {(event: string, listener: (...args: Array<?>) => void) => void} on Registers a listener.
12
+ * @property {(event: string, listener: (...args: Array<?>) => void) => void} off Removes a listener.
13
+ */
14
+
15
+ /**
16
+ * Resolves the moment `eventName` fires on `emitter` — optionally only when `filter`
17
+ * matches the emitted arguments — instead of sleeping a fixed duration. Rejects with a
18
+ * timeout error if the event does not fire within `timeoutMs`. The listener is always
19
+ * removed (on resolve and on timeout).
20
+ *
21
+ * Use this to await a real signal (a background job finishing, a model update, a
22
+ * websocket message) rather than guessing a delay. To poll an arbitrary condition
23
+ * instead of a discrete event, use awaitery's `waitFor`.
24
+ * @param {EventEmitterLike} emitter - Event emitter exposing `on`/`off` (Node EventEmitter, eventemitter3, velocious `testEvents`, ...).
25
+ * @param {string} eventName - The event to wait for.
26
+ * @param {WaitForEventOptions} [options] - Options.
27
+ * @returns {Promise<?>} - Resolves with the single emitted argument, an array when the event emits multiple, or undefined when it emits none.
28
+ */
29
+ export default function waitForEvent(emitter, eventName, options = {}) {
30
+ const {timeoutMs = 5000, filter} = options
31
+
32
+ return new Promise((resolve, reject) => {
33
+ /** @type {ReturnType<typeof setTimeout>} */
34
+ let timer
35
+
36
+ /**
37
+ * Resolves the wait when a matching event fires, removing itself first. A filter
38
+ * that throws (e.g. it assumes an event shape an intermediate emission doesn't
39
+ * have) rejects immediately rather than leaving the waiter pending until timeout.
40
+ * @param {...?} args - Emitted arguments.
41
+ * @returns {void}
42
+ */
43
+ const listener = (...args) => {
44
+ if (filter) {
45
+ let matched
46
+
47
+ try {
48
+ matched = filter(...args)
49
+ } catch (error) {
50
+ clearTimeout(timer)
51
+ emitter.off(eventName, listener)
52
+ reject(error)
53
+
54
+ return
55
+ }
56
+
57
+ if (!matched) return
58
+ }
59
+
60
+ clearTimeout(timer)
61
+ emitter.off(eventName, listener)
62
+ resolve(args.length > 1 ? args : args[0])
63
+ }
64
+
65
+ timer = setTimeout(() => {
66
+ emitter.off(eventName, listener)
67
+ reject(new Error(`Timed out after ${timeoutMs}ms waiting for event ${JSON.stringify(eventName)}`))
68
+ }, timeoutMs)
69
+
70
+ emitter.on(eventName, listener)
71
+ })
72
+ }
@@ -1 +1 @@
1
- {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current-configuration.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/record-payload-values.js","../src/time-zone.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/cron-expression.js","../src/background-jobs/forked-runner-child.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/normalize-error.js","../src/background-jobs/pooled-runner-child.js","../src/background-jobs/runner-process-title.js","../src/background-jobs/scheduler.js","../src/background-jobs/socket-request.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/beacon.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/base-command.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/drop.js","../src/cli/commands/db/tenants/migrate.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/cli/commands/lint/relationships.js","../src/database/advisory-lock-runner.js","../src/database/annotations-async-hooks.js","../src/database/annotations.js","../src/database/column-types.js","../src/database/datetime-storage.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/live-query.js","../src/database/migrations-ledger.js","../src/database/migrator.js","../src/database/record-changes.js","../src/database/use-database.js","../src/database/use-live-query.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-database.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/remove-index.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mssql/sql/upsert.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query-stream.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-database.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/remove-index.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/mysql/sql/upsert.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-database.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/remove-index.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/pgsql/sql/upsert.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table-rebuilder.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/web-persistence.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/remove-index.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/sqlite/sql/upsert.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-database-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.js","../src/database/query/remove-index-base.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/upsert-base.js","../src/database/query/where-base.js","../src/database/query/where-combinator.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query/preloader/selection.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/acts-as-list.js","../src/database/record/auditing.js","../src/database/record/counter-cache-magnitude.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/validation-messages.js","../src/database/record/attachments/attachment-record.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/format.js","../src/database/record/validators/length.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/database/tenants/data-copier.js","../src/database/tenants/schema-cloner.js","../src/database/tenants/tenant-table-plan.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/beacon.js","../src/environment-handlers/node/cli/commands/cli-command-context.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/generated-file-banner.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/environment-handlers/node/cli/commands/lint/relationships.js","../src/error-reporting/request-details.js","../src/frontend-model-resource/base-resource.js","../src/frontend-model-resource/velocious-attachment-resource.js","../src/frontend-models/base.js","../src/frontend-models/built-in-resources.js","../src/frontend-models/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.js","../src/frontend-models/preloader.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/server-lock.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request-timing.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/channel-subscriber-dispatch.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/jobs/prune-terminal-background-jobs.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/packages/velocious-package.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/api-manifest/controller.js","../src/routes/built-in/debug/controller.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/sync/conflict-strategy.js","../src/sync/device-identity.js","../src/sync/local-mutation-log.js","../src/sync/offline-grant.js","../src/sync/peer-mutation-bundle.js","../src/sync/query-scope.js","../src/sync/server-change-feed.js","../src/sync/server-sequence-allocator.js","../src/sync/stable-json.js","../src/sync/sync-api-client-types.js","../src/sync/sync-api-client.js","../src/sync/sync-api-controller.js","../src/sync/sync-change-fanout.js","../src/sync/sync-channel-name.js","../src/sync/sync-client-registry.js","../src/sync/sync-client-types.js","../src/sync/sync-client.js","../src/sync/sync-envelope-replay-service.js","../src/sync/sync-model-change-feed-service.js","../src/sync/sync-publish-suppression.js","../src/sync/sync-publisher-types.js","../src/sync/sync-publisher.js","../src/sync/sync-realtime-bridge.js","../src/sync/sync-replay-upsert-applier.js","../src/sync/sync-resource-base.js","../src/sync/sync-scope-attributes.js","../src/sync/sync-scope-store.js","../src/sync/sync-websocket-channel.js","../src/tenants/default-tenant-database-provisioning.js","../src/tenants/tenant-aggregator.js","../src/tenants/tenant-iterator.js","../src/tenants/tenant.js","../src/testing/base-expect.js","../src/testing/browser-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner-node.js","../src/utils/backtrace-cleaner.js","../src/utils/deburr-column-name.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/is-date.js","../src/utils/model-scope.js","../src/utils/nest-callbacks.js","../src/utils/plain-object.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.3"}
1
+ {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current-configuration.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/record-payload-values.js","../src/time-zone.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/cron-expression.js","../src/background-jobs/forked-runner-child.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/normalize-error.js","../src/background-jobs/pooled-runner-child.js","../src/background-jobs/runner-process-title.js","../src/background-jobs/scheduler.js","../src/background-jobs/socket-request.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/beacon.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/base-command.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/drop.js","../src/cli/commands/db/tenants/migrate.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/cli/commands/lint/relationships.js","../src/database/advisory-lock-runner.js","../src/database/annotations-async-hooks.js","../src/database/annotations.js","../src/database/column-types.js","../src/database/datetime-storage.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/live-query.js","../src/database/migrations-ledger.js","../src/database/migrator.js","../src/database/record-changes.js","../src/database/structure-sql-loader.js","../src/database/use-database.js","../src/database/use-live-query.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-database.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/remove-index.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mssql/sql/upsert.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query-stream.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-database.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/remove-index.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/mysql/sql/upsert.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-database.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/remove-index.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/pgsql/sql/upsert.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table-rebuilder.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/web-persistence.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/remove-index.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/sqlite/sql/upsert.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-database-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.js","../src/database/query/remove-index-base.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/upsert-base.js","../src/database/query/where-base.js","../src/database/query/where-combinator.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query/preloader/selection.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/acts-as-list.js","../src/database/record/auditing.js","../src/database/record/counter-cache-magnitude.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/validation-messages.js","../src/database/record/attachments/attachment-record.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/format.js","../src/database/record/validators/length.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/database/tenants/data-copier.js","../src/database/tenants/schema-cloner.js","../src/database/tenants/tenant-table-plan.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/beacon.js","../src/environment-handlers/node/cli/commands/cli-command-context.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/generated-file-banner.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/environment-handlers/node/cli/commands/lint/relationships.js","../src/error-reporting/request-details.js","../src/frontend-model-resource/base-resource.js","../src/frontend-model-resource/velocious-attachment-resource.js","../src/frontend-models/base.js","../src/frontend-models/built-in-resources.js","../src/frontend-models/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.js","../src/frontend-models/preloader.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/server-lock.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request-timing.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/channel-subscriber-dispatch.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/jobs/prune-terminal-background-jobs.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/packages/velocious-package.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/api-manifest/controller.js","../src/routes/built-in/debug/controller.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/sync/conflict-strategy.js","../src/sync/device-identity.js","../src/sync/local-mutation-log.js","../src/sync/offline-grant.js","../src/sync/peer-mutation-bundle.js","../src/sync/query-scope.js","../src/sync/server-change-feed.js","../src/sync/server-sequence-allocator.js","../src/sync/stable-json.js","../src/sync/sync-api-client-types.js","../src/sync/sync-api-client.js","../src/sync/sync-api-controller.js","../src/sync/sync-change-fanout.js","../src/sync/sync-channel-name.js","../src/sync/sync-client-registry.js","../src/sync/sync-client-types.js","../src/sync/sync-client.js","../src/sync/sync-envelope-replay-service.js","../src/sync/sync-model-change-feed-service.js","../src/sync/sync-publish-suppression.js","../src/sync/sync-publisher-types.js","../src/sync/sync-publisher.js","../src/sync/sync-realtime-bridge.js","../src/sync/sync-replay-upsert-applier.js","../src/sync/sync-resource-base.js","../src/sync/sync-scope-attributes.js","../src/sync/sync-scope-store.js","../src/sync/sync-websocket-channel.js","../src/tenants/default-tenant-database-provisioning.js","../src/tenants/tenant-aggregator.js","../src/tenants/tenant-iterator.js","../src/tenants/tenant.js","../src/testing/base-expect.js","../src/testing/browser-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/testing/wait-for-event.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner-node.js","../src/utils/backtrace-cleaner.js","../src/utils/deburr-column-name.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/is-date.js","../src/utils/model-scope.js","../src/utils/nest-callbacks.js","../src/utils/plain-object.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.3"}