@wbce/projen-d9 0.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +552 -0
- package/API.md +8472 -0
- package/CHANGELOG.md +189 -0
- package/LICENSE +674 -0
- package/README.md +82 -0
- package/lib/cli/commands/init.d.ts +1 -0
- package/lib/cli/commands/init.js +8 -0
- package/lib/cli/commands/save/apply-snapshot.d.ts +7 -0
- package/lib/cli/commands/save/apply-snapshot.js +278 -0
- package/lib/cli/commands/save/cli.d.ts +8 -0
- package/lib/cli/commands/save/cli.js +33 -0
- package/lib/cli/commands/save/draft.d.ts +0 -0
- package/lib/cli/commands/save/draft.js +2 -0
- package/lib/cli/commands/save/utils.d.ts +9 -0
- package/lib/cli/commands/save/utils.js +123 -0
- package/lib/cli/commands/sync.d.ts +5 -0
- package/lib/cli/commands/sync.js +13 -0
- package/lib/cli/index.d.ts +2 -0
- package/lib/cli/index.js +44 -0
- package/lib/index.d.ts +59 -0
- package/lib/index.js +322 -0
- package/node_modules/@types/node/LICENSE +21 -0
- package/node_modules/@types/node/README.md +16 -0
- package/node_modules/@types/node/assert.d.ts +117 -0
- package/node_modules/@types/node/async_hooks.d.ts +246 -0
- package/node_modules/@types/node/buffer.d.ts +22 -0
- package/node_modules/@types/node/child_process.d.ts +507 -0
- package/node_modules/@types/node/cluster.d.ts +260 -0
- package/node_modules/@types/node/console.d.ts +3 -0
- package/node_modules/@types/node/constants.d.ts +448 -0
- package/node_modules/@types/node/crypto.d.ts +1183 -0
- package/node_modules/@types/node/dgram.d.ts +118 -0
- package/node_modules/@types/node/dns.d.ts +372 -0
- package/node_modules/@types/node/domain.d.ts +16 -0
- package/node_modules/@types/node/events.d.ts +47 -0
- package/node_modules/@types/node/fs.d.ts +2567 -0
- package/node_modules/@types/node/globals.d.ts +1351 -0
- package/node_modules/@types/node/globals.global.d.ts +1 -0
- package/node_modules/@types/node/http.d.ts +456 -0
- package/node_modules/@types/node/http2.d.ts +952 -0
- package/node_modules/@types/node/https.d.ts +156 -0
- package/node_modules/@types/node/index.d.ts +91 -0
- package/node_modules/@types/node/inspector.d.ts +3040 -0
- package/node_modules/@types/node/module.d.ts +3 -0
- package/node_modules/@types/node/net.d.ts +290 -0
- package/node_modules/@types/node/os.d.ts +263 -0
- package/node_modules/@types/node/package.json +195 -0
- package/node_modules/@types/node/path.d.ts +159 -0
- package/node_modules/@types/node/perf_hooks.d.ts +259 -0
- package/node_modules/@types/node/process.d.ts +15 -0
- package/node_modules/@types/node/punycode.d.ts +75 -0
- package/node_modules/@types/node/querystring.d.ts +29 -0
- package/node_modules/@types/node/readline.d.ts +158 -0
- package/node_modules/@types/node/repl.d.ts +390 -0
- package/node_modules/@types/node/stream.d.ts +334 -0
- package/node_modules/@types/node/string_decoder.d.ts +7 -0
- package/node_modules/@types/node/timers.d.ts +16 -0
- package/node_modules/@types/node/tls.d.ts +713 -0
- package/node_modules/@types/node/trace_events.d.ts +61 -0
- package/node_modules/@types/node/tty.d.ts +66 -0
- package/node_modules/@types/node/url.d.ts +147 -0
- package/node_modules/@types/node/util.d.ts +200 -0
- package/node_modules/@types/node/v8.d.ts +197 -0
- package/node_modules/@types/node/vm.d.ts +112 -0
- package/node_modules/@types/node/wasi.d.ts +55 -0
- package/node_modules/@types/node/worker_threads.d.ts +207 -0
- package/node_modules/@types/node/zlib.d.ts +356 -0
- package/node_modules/@types/pg/LICENSE +21 -0
- package/node_modules/@types/pg/README.md +15 -0
- package/node_modules/@types/pg/index.d.mts +56 -0
- package/node_modules/@types/pg/index.d.ts +360 -0
- package/node_modules/@types/pg/lib/connection-parameters.d.ts +58 -0
- package/node_modules/@types/pg/lib/type-overrides.d.ts +77 -0
- package/node_modules/@types/pg/package.json +38 -0
- package/node_modules/@types/pg-copy-streams/LICENSE +21 -0
- package/node_modules/@types/pg-copy-streams/README.md +38 -0
- package/node_modules/@types/pg-copy-streams/index.d.ts +19 -0
- package/node_modules/@types/pg-copy-streams/package.json +28 -0
- package/node_modules/commander/LICENSE +22 -0
- package/node_modules/commander/Readme.md +1176 -0
- package/node_modules/commander/esm.mjs +16 -0
- package/node_modules/commander/index.js +24 -0
- package/node_modules/commander/lib/argument.js +150 -0
- package/node_modules/commander/lib/command.js +2777 -0
- package/node_modules/commander/lib/error.js +39 -0
- package/node_modules/commander/lib/help.js +747 -0
- package/node_modules/commander/lib/option.js +380 -0
- package/node_modules/commander/lib/suggestSimilar.js +101 -0
- package/node_modules/commander/package-support.json +19 -0
- package/node_modules/commander/package.json +82 -0
- package/node_modules/commander/typings/esm.d.mts +3 -0
- package/node_modules/commander/typings/index.d.ts +1113 -0
- package/node_modules/pg/LICENSE +21 -0
- package/node_modules/pg/README.md +95 -0
- package/node_modules/pg/esm/index.mjs +20 -0
- package/node_modules/pg/lib/client.js +743 -0
- package/node_modules/pg/lib/connection-parameters.js +171 -0
- package/node_modules/pg/lib/connection.js +221 -0
- package/node_modules/pg/lib/crypto/cert-signatures.js +122 -0
- package/node_modules/pg/lib/crypto/sasl.js +212 -0
- package/node_modules/pg/lib/crypto/utils-legacy.js +43 -0
- package/node_modules/pg/lib/crypto/utils-webcrypto.js +89 -0
- package/node_modules/pg/lib/crypto/utils.js +9 -0
- package/node_modules/pg/lib/defaults.js +91 -0
- package/node_modules/pg/lib/index.js +73 -0
- package/node_modules/pg/lib/native/client.js +323 -0
- package/node_modules/pg/lib/native/index.js +2 -0
- package/node_modules/pg/lib/native/query.js +165 -0
- package/node_modules/pg/lib/query.js +252 -0
- package/node_modules/pg/lib/result.js +109 -0
- package/node_modules/pg/lib/stream.js +83 -0
- package/node_modules/pg/lib/type-overrides.js +35 -0
- package/node_modules/pg/lib/utils.js +217 -0
- package/node_modules/pg/package.json +76 -0
- package/node_modules/pg-copy-streams/Makefile +19 -0
- package/node_modules/pg-copy-streams/README.md +315 -0
- package/node_modules/pg-copy-streams/copy-both.js +267 -0
- package/node_modules/pg-copy-streams/copy-from.js +173 -0
- package/node_modules/pg-copy-streams/copy-to.js +177 -0
- package/node_modules/pg-copy-streams/eslint.config.js +55 -0
- package/node_modules/pg-copy-streams/index.js +17 -0
- package/node_modules/pg-copy-streams/message-formats.js +27 -0
- package/node_modules/pg-copy-streams/obuf.js +376 -0
- package/node_modules/pg-copy-streams/package.json +51 -0
- package/package.json +136 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sync = sync;
|
|
4
|
+
async function sync(options) {
|
|
5
|
+
if (options.dryRun) {
|
|
6
|
+
console.log('Dry run — showing what would be synced...');
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
console.log('Syncing Directus schema and extensions...');
|
|
10
|
+
}
|
|
11
|
+
// TODO: implement
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGkvY29tbWFuZHMvc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLG9CQU9DO0FBUE0sS0FBSyxVQUFVLElBQUksQ0FBQyxPQUFvQjtJQUM3QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUNELGtCQUFrQjtBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW50ZXJmYWNlIFN5bmNPcHRpb25zIHtcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN5bmMob3B0aW9uczogU3luY09wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgY29uc29sZS5sb2coJ0RyeSBydW4g4oCUIHNob3dpbmcgd2hhdCB3b3VsZCBiZSBzeW5jZWQuLi4nKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZygnU3luY2luZyBEaXJlY3R1cyBzY2hlbWEgYW5kIGV4dGVuc2lvbnMuLi4nKTtcbiAgfVxuICAvLyBUT0RPOiBpbXBsZW1lbnRcbn1cbiJdfQ==
|
package/lib/cli/index.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const init_1 = require("./commands/init");
|
|
6
|
+
const apply_snapshot_1 = require("./commands/save/apply-snapshot");
|
|
7
|
+
const sync_1 = require("./commands/sync");
|
|
8
|
+
const program = new commander_1.Command();
|
|
9
|
+
program
|
|
10
|
+
.name('wbce-directus')
|
|
11
|
+
.description('CLI tools for Directus project management')
|
|
12
|
+
.version('0.0.1');
|
|
13
|
+
program
|
|
14
|
+
.command('init')
|
|
15
|
+
.description('Initialize a new Directus project')
|
|
16
|
+
.argument('[directory]', 'target directory', '.')
|
|
17
|
+
.action(init_1.init);
|
|
18
|
+
program
|
|
19
|
+
.command('sync')
|
|
20
|
+
.description('Sync Directus schema and extensions')
|
|
21
|
+
.option('--dry-run', 'show what would be synced without making changes')
|
|
22
|
+
.action(sync_1.sync);
|
|
23
|
+
program
|
|
24
|
+
.command('apply-snapshot')
|
|
25
|
+
.description('Apply a SQL snapshot to a Directus database')
|
|
26
|
+
.requiredOption('--host <host>', 'database host')
|
|
27
|
+
.requiredOption('--user <user>', 'database user')
|
|
28
|
+
.requiredOption('--password <password>', 'database password')
|
|
29
|
+
.requiredOption('--database <database>', 'database name')
|
|
30
|
+
.option('--ssl', 'enable SSL for database connections', false)
|
|
31
|
+
.action(async (opts) => {
|
|
32
|
+
await (0, apply_snapshot_1.applySQLSnapshot)({
|
|
33
|
+
host: opts.host,
|
|
34
|
+
user: opts.user,
|
|
35
|
+
pwd: opts.password,
|
|
36
|
+
database: opts.database,
|
|
37
|
+
ssl: opts.ssl,
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
void program.parseAsync().catch((err) => {
|
|
41
|
+
console.error(err);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUFvQztBQUNwQywwQ0FBdUM7QUFDdkMsbUVBQWtFO0FBQ2xFLDBDQUF1QztBQUV2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFPLEVBQUUsQ0FBQztBQUU5QixPQUFPO0tBQ0osSUFBSSxDQUFDLGVBQWUsQ0FBQztLQUNyQixXQUFXLENBQUMsMkNBQTJDLENBQUM7S0FDeEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRXBCLE9BQU87S0FDSixPQUFPLENBQUMsTUFBTSxDQUFDO0tBQ2YsV0FBVyxDQUFDLG1DQUFtQyxDQUFDO0tBQ2hELFFBQVEsQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxDQUFDO0tBQ2hELE1BQU0sQ0FBQyxXQUFJLENBQUMsQ0FBQztBQUVoQixPQUFPO0tBQ0osT0FBTyxDQUFDLE1BQU0sQ0FBQztLQUNmLFdBQVcsQ0FBQyxxQ0FBcUMsQ0FBQztLQUNsRCxNQUFNLENBQUMsV0FBVyxFQUFFLGtEQUFrRCxDQUFDO0tBQ3ZFLE1BQU0sQ0FBQyxXQUFJLENBQUMsQ0FBQztBQUVoQixPQUFPO0tBQ0osT0FBTyxDQUFDLGdCQUFnQixDQUFDO0tBQ3pCLFdBQVcsQ0FBQyw2Q0FBNkMsQ0FBQztLQUMxRCxjQUFjLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztLQUNoRCxjQUFjLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztLQUNoRCxjQUFjLENBQUMsdUJBQXVCLEVBQUUsbUJBQW1CLENBQUM7S0FDNUQsY0FBYyxDQUFDLHVCQUF1QixFQUFFLGVBQWUsQ0FBQztLQUN4RCxNQUFNLENBQUMsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLEtBQUssQ0FBQztLQUM3RCxNQUFNLENBQUMsS0FBSyxFQUFFLElBQXNGLEVBQUUsRUFBRTtJQUN2RyxNQUFNLElBQUEsaUNBQWdCLEVBQUM7UUFDckIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRO1FBQ2xCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtRQUN2QixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7S0FDZCxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVMLEtBQUssT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO0lBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgaW5pdCB9IGZyb20gJy4vY29tbWFuZHMvaW5pdCc7XG5pbXBvcnQgeyBhcHBseVNRTFNuYXBzaG90IH0gZnJvbSAnLi9jb21tYW5kcy9zYXZlL2FwcGx5LXNuYXBzaG90JztcbmltcG9ydCB7IHN5bmMgfSBmcm9tICcuL2NvbW1hbmRzL3N5bmMnO1xuXG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxucHJvZ3JhbVxuICAubmFtZSgnd2JjZS1kaXJlY3R1cycpXG4gIC5kZXNjcmlwdGlvbignQ0xJIHRvb2xzIGZvciBEaXJlY3R1cyBwcm9qZWN0IG1hbmFnZW1lbnQnKVxuICAudmVyc2lvbignMC4wLjEnKTtcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnaW5pdCcpXG4gIC5kZXNjcmlwdGlvbignSW5pdGlhbGl6ZSBhIG5ldyBEaXJlY3R1cyBwcm9qZWN0JylcbiAgLmFyZ3VtZW50KCdbZGlyZWN0b3J5XScsICd0YXJnZXQgZGlyZWN0b3J5JywgJy4nKVxuICAuYWN0aW9uKGluaXQpO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdzeW5jJylcbiAgLmRlc2NyaXB0aW9uKCdTeW5jIERpcmVjdHVzIHNjaGVtYSBhbmQgZXh0ZW5zaW9ucycpXG4gIC5vcHRpb24oJy0tZHJ5LXJ1bicsICdzaG93IHdoYXQgd291bGQgYmUgc3luY2VkIHdpdGhvdXQgbWFraW5nIGNoYW5nZXMnKVxuICAuYWN0aW9uKHN5bmMpO1xuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdhcHBseS1zbmFwc2hvdCcpXG4gIC5kZXNjcmlwdGlvbignQXBwbHkgYSBTUUwgc25hcHNob3QgdG8gYSBEaXJlY3R1cyBkYXRhYmFzZScpXG4gIC5yZXF1aXJlZE9wdGlvbignLS1ob3N0IDxob3N0PicsICdkYXRhYmFzZSBob3N0JylcbiAgLnJlcXVpcmVkT3B0aW9uKCctLXVzZXIgPHVzZXI+JywgJ2RhdGFiYXNlIHVzZXInKVxuICAucmVxdWlyZWRPcHRpb24oJy0tcGFzc3dvcmQgPHBhc3N3b3JkPicsICdkYXRhYmFzZSBwYXNzd29yZCcpXG4gIC5yZXF1aXJlZE9wdGlvbignLS1kYXRhYmFzZSA8ZGF0YWJhc2U+JywgJ2RhdGFiYXNlIG5hbWUnKVxuICAub3B0aW9uKCctLXNzbCcsICdlbmFibGUgU1NMIGZvciBkYXRhYmFzZSBjb25uZWN0aW9ucycsIGZhbHNlKVxuICAuYWN0aW9uKGFzeW5jIChvcHRzOiB7IGhvc3Q6IHN0cmluZzsgdXNlcjogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nOyBkYXRhYmFzZTogc3RyaW5nOyBzc2w6IGJvb2xlYW4gfSkgPT4ge1xuICAgIGF3YWl0IGFwcGx5U1FMU25hcHNob3Qoe1xuICAgICAgaG9zdDogb3B0cy5ob3N0LFxuICAgICAgdXNlcjogb3B0cy51c2VyLFxuICAgICAgcHdkOiBvcHRzLnBhc3N3b3JkLFxuICAgICAgZGF0YWJhc2U6IG9wdHMuZGF0YWJhc2UsXG4gICAgICBzc2w6IG9wdHMuc3NsLFxuICAgIH0pO1xuICB9KTtcblxudm9pZCBwcm9ncmFtLnBhcnNlQXN5bmMoKS5jYXRjaCgoZXJyKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG4iXX0=
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { AddExtensionOptions, D9ExtensionType, ExtensionFolder } from '@wbce/projen-d9-extension';
|
|
2
|
+
import { GitHubConfig, GitHubConfigOptions, Dockerfile } from '@wbce/projen-shared';
|
|
3
|
+
import { DockerCompose, DockerComposeService, javascript, Task, typescript } from 'projen';
|
|
4
|
+
export interface PackageVersions {
|
|
5
|
+
readonly d9?: string;
|
|
6
|
+
/**
|
|
7
|
+
* The version of @ariga/atlas to use.
|
|
8
|
+
* @default "0.32.0"
|
|
9
|
+
*/
|
|
10
|
+
readonly atlas?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface D9ProjectOptions extends typescript.TypeScriptProjectOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Options for the GitHub configuration.
|
|
15
|
+
* Set to false to disable GitHub config entirely.
|
|
16
|
+
* @default - default GitHubConfig with project defaults
|
|
17
|
+
*/
|
|
18
|
+
readonly githubConfig?: GitHubConfigOptions | false;
|
|
19
|
+
/**
|
|
20
|
+
* The name of the extensions folder.
|
|
21
|
+
* @default "extension-packages"
|
|
22
|
+
*/
|
|
23
|
+
readonly extensionsFolderName?: string;
|
|
24
|
+
readonly packageVersions?: PackageVersions;
|
|
25
|
+
}
|
|
26
|
+
export declare class D9Project extends javascript.NodeProject {
|
|
27
|
+
protected options: D9ProjectOptions;
|
|
28
|
+
readonly githubConfig?: GitHubConfig;
|
|
29
|
+
extensions: ExtensionFolder;
|
|
30
|
+
extensionFolder: string;
|
|
31
|
+
applySchemaTask: Task;
|
|
32
|
+
buildExtensionTask: Task;
|
|
33
|
+
dockerfile: Dockerfile;
|
|
34
|
+
dockerComposeFile: DockerCompose;
|
|
35
|
+
directusService: DockerComposeService;
|
|
36
|
+
databaseService: DockerComposeService;
|
|
37
|
+
cacheService: DockerComposeService;
|
|
38
|
+
constructor(options: D9ProjectOptions);
|
|
39
|
+
private addExtensionFolder;
|
|
40
|
+
addExtension(name: string, extensionTypes: D9ExtensionType[], options?: AddExtensionOptions): import("@wbce/projen-d9-extension").D9ExtensionProject;
|
|
41
|
+
private addFirstRunTask;
|
|
42
|
+
private addCreateAdminUserTask;
|
|
43
|
+
private addRunTask;
|
|
44
|
+
private addApplySchemaTask;
|
|
45
|
+
private addBuildExtensionTask;
|
|
46
|
+
private addDockerCompose;
|
|
47
|
+
private addSaveBranchWorkflow;
|
|
48
|
+
private addDockerfile;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* @deprecated Use {@link D9ProjectOptions} instead. The package was renamed to `@wbce/projen-d9` to reflect that it targets the d9 fork, not upstream Directus.
|
|
52
|
+
*/
|
|
53
|
+
export interface DirectusProjectOptions extends D9ProjectOptions {
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* @deprecated Use {@link D9Project} instead. The package was renamed to `@wbce/projen-d9` to reflect that it targets the d9 fork, not upstream Directus.
|
|
57
|
+
*/
|
|
58
|
+
export declare class DirectusProject extends D9Project {
|
|
59
|
+
}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.DirectusProject = exports.D9Project = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const projen_d9_extension_1 = require("@wbce/projen-d9-extension");
|
|
7
|
+
const projen_shared_1 = require("@wbce/projen-shared");
|
|
8
|
+
const projen_1 = require("projen");
|
|
9
|
+
const workflows_model_1 = require("projen/lib/github/workflows-model");
|
|
10
|
+
const javascript_1 = require("projen/lib/javascript");
|
|
11
|
+
class D9Project extends projen_1.javascript.NodeProject {
|
|
12
|
+
constructor(options) {
|
|
13
|
+
const d9Version = options.packageVersions?.d9 || '12.0.1';
|
|
14
|
+
const atlasVersion = options.packageVersions?.atlas || '0.32.0';
|
|
15
|
+
super({
|
|
16
|
+
...options,
|
|
17
|
+
packageManager: options.packageManager ?? projen_1.javascript.NodePackageManager.NPM,
|
|
18
|
+
github: false, // We use our own GitHubConfig instead
|
|
19
|
+
depsUpgrade: true,
|
|
20
|
+
depsUpgradeOptions: {
|
|
21
|
+
workflowOptions: {
|
|
22
|
+
schedule: javascript_1.UpgradeDependenciesSchedule.DAILY,
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
licensed: false,
|
|
26
|
+
readme: options.readme ?? {
|
|
27
|
+
contents: [
|
|
28
|
+
`# ${options.name}`,
|
|
29
|
+
'',
|
|
30
|
+
'A [d9](https://github.com/LaWebcapsule/d9) (Directus 9 fork) project scaffolded with [`@wbce/projen-d9`](https://www.npmjs.com/package/@wbce/projen-d9). Develop locally against Docker Compose, then build a Docker image to deploy anywhere.',
|
|
31
|
+
'',
|
|
32
|
+
'## Local development',
|
|
33
|
+
'',
|
|
34
|
+
'```sh',
|
|
35
|
+
'npx projen install # install dependencies',
|
|
36
|
+
'npx projen first-run # boot stack, create admin, start d9',
|
|
37
|
+
'```',
|
|
38
|
+
'',
|
|
39
|
+
'Open http://localhost:8055 and sign in as `admin@example.com` / `totototo`. Extensions auto-reload (`EXTENSIONS_AUTO_RELOAD=true`).',
|
|
40
|
+
'',
|
|
41
|
+
'## Deploy',
|
|
42
|
+
'',
|
|
43
|
+
'A `Dockerfile` is included. Build and push the image for your target environment:',
|
|
44
|
+
'',
|
|
45
|
+
'```sh',
|
|
46
|
+
'docker build -t <registry>/<image>:<tag> .',
|
|
47
|
+
'docker push <registry>/<image>:<tag>',
|
|
48
|
+
'```',
|
|
49
|
+
'',
|
|
50
|
+
'Configure the deployed instance with environment variables (database, cache, secrets) — see the d9 docs.',
|
|
51
|
+
'',
|
|
52
|
+
'## Common tasks',
|
|
53
|
+
'',
|
|
54
|
+
'| Task | Description |',
|
|
55
|
+
'| --- | --- |',
|
|
56
|
+
'| `npx projen run` | Start d9 (`docker compose up directus`) |',
|
|
57
|
+
'| `npx projen build-extensions` | Install and build all extensions |',
|
|
58
|
+
'| `npx projen create-an-admin` | Create the default admin user |',
|
|
59
|
+
'',
|
|
60
|
+
'See `.projen/tasks.json` for the full list.',
|
|
61
|
+
'',
|
|
62
|
+
'## Configuration',
|
|
63
|
+
'',
|
|
64
|
+
'Edit `.projenrc.js` and run `npx projen` to regenerate project files. Local environment overrides go in `.env.local`.',
|
|
65
|
+
'',
|
|
66
|
+
'## Extensions',
|
|
67
|
+
'',
|
|
68
|
+
'Extensions live under `./plugins/`. Add new ones in `.projenrc.js`:',
|
|
69
|
+
'',
|
|
70
|
+
'```js',
|
|
71
|
+
"import { D9ExtensionType } from '@wbce/projen-d9-extension';",
|
|
72
|
+
'',
|
|
73
|
+
"project.addExtension('my-hook', [D9ExtensionType.HOOK]);",
|
|
74
|
+
'```',
|
|
75
|
+
'',
|
|
76
|
+
'Then `npx projen && npx projen build-extensions`.',
|
|
77
|
+
].join('\n'),
|
|
78
|
+
},
|
|
79
|
+
devDeps: [
|
|
80
|
+
'@wbce/projen-d9',
|
|
81
|
+
'@wbce/projen-d9-extension',
|
|
82
|
+
`@ariga/atlas@${atlasVersion}`,
|
|
83
|
+
...(options.devDeps ?? []),
|
|
84
|
+
],
|
|
85
|
+
deps: [`@wbce-d9/directus9@${d9Version}`],
|
|
86
|
+
});
|
|
87
|
+
this.options = options;
|
|
88
|
+
// No tsconfig means no tsc --build in compile
|
|
89
|
+
this.compileTask.reset();
|
|
90
|
+
this.addExtensionFolder();
|
|
91
|
+
this.addDockerCompose();
|
|
92
|
+
this.addApplySchemaTask();
|
|
93
|
+
this.addFirstRunTask();
|
|
94
|
+
this.addBuildExtensionTask();
|
|
95
|
+
this.addRunTask();
|
|
96
|
+
this.addDockerfile();
|
|
97
|
+
this.addCreateAdminUserTask();
|
|
98
|
+
new projen_1.AiInstructions(this, {
|
|
99
|
+
agents: [projen_1.AiAgent.CLAUDE],
|
|
100
|
+
});
|
|
101
|
+
if (options.githubConfig !== false) {
|
|
102
|
+
this.githubConfig = new projen_shared_1.GitHubConfig(this, options.githubConfig);
|
|
103
|
+
this.addSaveBranchWorkflow();
|
|
104
|
+
}
|
|
105
|
+
this.gitignore.addPatterns('uploads');
|
|
106
|
+
this.gitignore.addPatterns('**/.DS_Store');
|
|
107
|
+
this.gitignore.addPatterns('.env.local');
|
|
108
|
+
// Create an empty .env.local if it doesn't exist, so Docker doesn't mount a directory
|
|
109
|
+
new projen_1.SampleFile(this, '.env.local', { contents: '# Local environment overrides for Directus' });
|
|
110
|
+
}
|
|
111
|
+
addExtensionFolder() {
|
|
112
|
+
const folderName = this.options.extensionsFolderName ?? 'plugins';
|
|
113
|
+
this.extensions = new projen_d9_extension_1.ExtensionFolder({ parent: this, name: folderName });
|
|
114
|
+
this.extensionFolder = folderName;
|
|
115
|
+
this.gitignore.exclude('extensions/*');
|
|
116
|
+
this.gitignore.include('extensions/templates/');
|
|
117
|
+
}
|
|
118
|
+
addExtension(name, extensionTypes, options) {
|
|
119
|
+
return this.extensions.add(name, extensionTypes, options);
|
|
120
|
+
}
|
|
121
|
+
addFirstRunTask() {
|
|
122
|
+
const task = this.addTask('first-run', {
|
|
123
|
+
description: 'Initialize and start a fresh Directus instance',
|
|
124
|
+
});
|
|
125
|
+
const adminEmail = 'admin@example.com';
|
|
126
|
+
const userNotExistsCondition = `docker compose exec database psql -U directus -d directus -tAc "SELECT count(*) FROM directus_users WHERE email = '${adminEmail}'" | grep -q '^0$'`;
|
|
127
|
+
task.exec('docker compose up -d --wait database cache');
|
|
128
|
+
task.spawn(this.applySchemaTask);
|
|
129
|
+
task.exec(`ADMIN_ROLE_ID=$(docker compose exec database psql -U directus -d directus -tAc "SELECT id FROM directus_roles WHERE admin_access = true LIMIT 1") && docker compose run --rm directus npx directus users create --email ${adminEmail} --password totototo --role "$ADMIN_ROLE_ID"`, {
|
|
130
|
+
condition: userNotExistsCondition,
|
|
131
|
+
});
|
|
132
|
+
task.say(`User ${adminEmail} has been created with password totototo`, {
|
|
133
|
+
condition: userNotExistsCondition,
|
|
134
|
+
});
|
|
135
|
+
task.say(`User ${adminEmail} already exists, skipping creation`, {
|
|
136
|
+
condition: `! ${userNotExistsCondition}`,
|
|
137
|
+
});
|
|
138
|
+
task.exec('docker compose up directus');
|
|
139
|
+
}
|
|
140
|
+
addCreateAdminUserTask() {
|
|
141
|
+
const task = this.addTask('create-an-admin', {
|
|
142
|
+
description: 'Create an admin user',
|
|
143
|
+
});
|
|
144
|
+
const adminEmail = 'admin@example.com';
|
|
145
|
+
const userNotExistsCondition = `docker compose exec database psql -U directus -d directus -tAc "SELECT count(*) FROM directus_users WHERE email = '${adminEmail}'" | grep -q '^0$'`;
|
|
146
|
+
task.exec('docker compose up -d --wait database cache');
|
|
147
|
+
task.exec(`ADMIN_ROLE_ID=$(docker compose exec database psql -U directus -d directus -tAc "SELECT id FROM directus_roles WHERE admin_access = true LIMIT 1") && docker compose run --rm directus npx directus users create --email ${adminEmail} --password totototo --role "$ADMIN_ROLE_ID"`, {
|
|
148
|
+
condition: userNotExistsCondition,
|
|
149
|
+
});
|
|
150
|
+
task.say(`User ${adminEmail} has been created with password totototo`, {
|
|
151
|
+
condition: userNotExistsCondition,
|
|
152
|
+
});
|
|
153
|
+
task.say(`User ${adminEmail} already exists, skipping creation`, {
|
|
154
|
+
condition: `! ${userNotExistsCondition}`,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
addRunTask() {
|
|
158
|
+
const task = this.addTask('run', {
|
|
159
|
+
description: 'start the Directus instance',
|
|
160
|
+
});
|
|
161
|
+
task.exec('docker compose up directus');
|
|
162
|
+
}
|
|
163
|
+
addApplySchemaTask() {
|
|
164
|
+
this.applySchemaTask = this.addTask('apply-schema', {
|
|
165
|
+
description: 'Apply SQL snapshot to the local Directus database',
|
|
166
|
+
});
|
|
167
|
+
this.applySchemaTask.exec('npx wbce-directus apply-snapshot --host localhost --user directus --password directus --database directus', {
|
|
168
|
+
condition: 'test -d ./sql',
|
|
169
|
+
});
|
|
170
|
+
this.applySchemaTask.exec('docker compose run --rm directus npx directus bootstrap', {
|
|
171
|
+
condition: 'test ! -d ./sql',
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
addBuildExtensionTask() {
|
|
175
|
+
this.buildExtensionTask = this.addTask('build-extensions', {
|
|
176
|
+
description: 'Build the directus extensions',
|
|
177
|
+
});
|
|
178
|
+
this.buildExtensionTask.exec(`cd ${this.extensionFolder} && pnpm install`);
|
|
179
|
+
this.buildExtensionTask.exec(`cd ${this.extensionFolder} && pnpm run --recursive build`);
|
|
180
|
+
}
|
|
181
|
+
addDockerCompose() {
|
|
182
|
+
const dc = new projen_1.DockerCompose(this);
|
|
183
|
+
this.databaseService = dc.addService('database', {
|
|
184
|
+
image: 'postgis/postgis:13-master',
|
|
185
|
+
volumes: [
|
|
186
|
+
projen_1.DockerCompose.namedVolume('pgdata', '/var/lib/postgresql/data'),
|
|
187
|
+
],
|
|
188
|
+
ports: [
|
|
189
|
+
projen_1.DockerCompose.portMapping(5432, 5432),
|
|
190
|
+
],
|
|
191
|
+
environment: {
|
|
192
|
+
POSTGRES_USER: 'directus',
|
|
193
|
+
POSTGRES_PASSWORD: 'directus',
|
|
194
|
+
POSTGRES_DB: 'directus',
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
this.cacheService = dc.addService('cache', {
|
|
198
|
+
image: 'redis:6',
|
|
199
|
+
volumes: [
|
|
200
|
+
projen_1.DockerCompose.namedVolume('redis_storage', '/data'),
|
|
201
|
+
],
|
|
202
|
+
ports: [
|
|
203
|
+
projen_1.DockerCompose.portMapping(6379, 6379),
|
|
204
|
+
],
|
|
205
|
+
});
|
|
206
|
+
this.directusService = dc.addService('directus', {
|
|
207
|
+
imageBuild: { context: '.' },
|
|
208
|
+
ports: [
|
|
209
|
+
projen_1.DockerCompose.portMapping(8055, 8055),
|
|
210
|
+
],
|
|
211
|
+
volumes: [
|
|
212
|
+
projen_1.DockerCompose.bindVolume('./uploads', '/app/uploads'),
|
|
213
|
+
projen_1.DockerCompose.bindVolume('./extensions', '/app/extensions'),
|
|
214
|
+
],
|
|
215
|
+
// dependsOn is set via addOverride below with condition: service_healthy
|
|
216
|
+
environment: {
|
|
217
|
+
KEY: 'some-random-key',
|
|
218
|
+
SECRET: 'another-random-key',
|
|
219
|
+
CONFIG_PATH: '.env.local',
|
|
220
|
+
DB_CLIENT: 'pg',
|
|
221
|
+
DB_HOST: 'database',
|
|
222
|
+
DB_PORT: '5432',
|
|
223
|
+
DB_DATABASE: 'directus',
|
|
224
|
+
DB_USER: 'directus',
|
|
225
|
+
DB_PASSWORD: 'directus',
|
|
226
|
+
CACHE_ENABLED: 'false',
|
|
227
|
+
CACHE_REDIS_HOST: 'cache',
|
|
228
|
+
CACHE_STATUS_HEADER: 'cache-hit',
|
|
229
|
+
CORS_ENABLED: 'true',
|
|
230
|
+
CORS_ORIGIN: 'true',
|
|
231
|
+
LOG_LEVEL: 'info',
|
|
232
|
+
ADMIN_EMAIL: 'admin@example.com',
|
|
233
|
+
ADMIN_PASSWORD: 'totototo',
|
|
234
|
+
EXTENSIONS_AUTO_RELOAD: 'true',
|
|
235
|
+
VALIDATE_ENTITIES_TOKENS_API_KEY: 'toto',
|
|
236
|
+
AWS_KMS_KEY_ID: 'tutu',
|
|
237
|
+
},
|
|
238
|
+
command: ['sh', '-c', 'npx directus start'],
|
|
239
|
+
});
|
|
240
|
+
this.directusService.addVolume(projen_1.DockerCompose.bindVolume('./.env.local', '/app/.env.local'));
|
|
241
|
+
// Add healthcheck for database (not natively supported by projen DockerCompose)
|
|
242
|
+
dc.file.addOverride('services.database.healthcheck', {
|
|
243
|
+
test: ['CMD', 'pg_isready', '--host=localhost', '--username=directus'],
|
|
244
|
+
interval: '10s',
|
|
245
|
+
timeout: '5s',
|
|
246
|
+
retries: 5,
|
|
247
|
+
start_interval: '5s',
|
|
248
|
+
start_period: '30s',
|
|
249
|
+
});
|
|
250
|
+
// Add healthcheck for cache
|
|
251
|
+
dc.file.addOverride('services.cache.healthcheck', {
|
|
252
|
+
test: ['CMD-SHELL', '[ $(redis-cli ping) = \'PONG\' ]'],
|
|
253
|
+
interval: '10s',
|
|
254
|
+
timeout: '5s',
|
|
255
|
+
retries: 5,
|
|
256
|
+
start_interval: '5s',
|
|
257
|
+
start_period: '30s',
|
|
258
|
+
});
|
|
259
|
+
// Override depends_on to use condition syntax
|
|
260
|
+
dc.file.addOverride('services.directus.depends_on', {
|
|
261
|
+
cache: { condition: 'service_healthy' },
|
|
262
|
+
database: { condition: 'service_healthy' },
|
|
263
|
+
});
|
|
264
|
+
this.dockerComposeFile = dc;
|
|
265
|
+
return dc;
|
|
266
|
+
}
|
|
267
|
+
addSaveBranchWorkflow() {
|
|
268
|
+
const workflow = this.githubConfig.addWorkflow('save-branch');
|
|
269
|
+
workflow.on({ push: { branches: ['*-save'] } });
|
|
270
|
+
workflow.addJob('create-pr', {
|
|
271
|
+
name: 'Create Pull Request',
|
|
272
|
+
runsOn: ['ubuntu-latest'],
|
|
273
|
+
permissions: {
|
|
274
|
+
contents: workflows_model_1.JobPermission.READ,
|
|
275
|
+
pullRequests: workflows_model_1.JobPermission.WRITE,
|
|
276
|
+
},
|
|
277
|
+
steps: [
|
|
278
|
+
{ name: 'Checkout', uses: 'actions/checkout@v4' },
|
|
279
|
+
{
|
|
280
|
+
name: 'Create Pull Request',
|
|
281
|
+
run: 'gh pr create --title "Save: ${GITHUB_REF_NAME%-save}" --body "Auto-generated PR from branch \\`${GITHUB_REF_NAME%-save}\\`" --base "${GITHUB_REF_NAME%-save}" || echo "PR already exists"',
|
|
282
|
+
env: { GH_TOKEN: '${{ secrets.GITHUB_TOKEN }}' },
|
|
283
|
+
},
|
|
284
|
+
],
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
addDockerfile() {
|
|
288
|
+
this.dockerfile = new projen_shared_1.Dockerfile(this)
|
|
289
|
+
.from('node', '22-bookworm-slim')
|
|
290
|
+
.step('update-npm', 'Update npm to fix dependencies')
|
|
291
|
+
.run('npm install -g npm@11.8.0')
|
|
292
|
+
.step('install-pnpm', 'install pnpm')
|
|
293
|
+
.run('npm install -g pnpm@10.33.0')
|
|
294
|
+
.step('copy-package', 'Copy package.json and package-lock.json first to leverage Docker layer caching')
|
|
295
|
+
.copy('package*.json', '/app/')
|
|
296
|
+
.step('workdir', 'Set working directory')
|
|
297
|
+
.workdir('/app')
|
|
298
|
+
.step('install-deps', 'Install dependencies - without dev dependencies')
|
|
299
|
+
.run('NODE_ENV=production npm install')
|
|
300
|
+
.step('cleanup', 'Cleaning benchmarks folder in tedious module for security')
|
|
301
|
+
.run('rm -rf node_modules/tedious/benchmarks')
|
|
302
|
+
.step('copy-source', 'Copy the rest of the application code')
|
|
303
|
+
.copy('.', '.')
|
|
304
|
+
.step('build-extension', 'build extensions')
|
|
305
|
+
.run('npx projen build-extensions')
|
|
306
|
+
.step('start', 'Start Directus server')
|
|
307
|
+
.cmdExec(['npx', 'directus', 'start']);
|
|
308
|
+
return this.dockerfile;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
exports.D9Project = D9Project;
|
|
312
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
313
|
+
D9Project[_a] = { fqn: "@wbce/projen-d9.D9Project", version: "0.0.25" };
|
|
314
|
+
/**
|
|
315
|
+
* @deprecated Use {@link D9Project} instead. The package was renamed to `@wbce/projen-d9` to reflect that it targets the d9 fork, not upstream Directus.
|
|
316
|
+
*/
|
|
317
|
+
class DirectusProject extends D9Project {
|
|
318
|
+
}
|
|
319
|
+
exports.DirectusProject = DirectusProject;
|
|
320
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
321
|
+
DirectusProject[_b] = { fqn: "@wbce/projen-d9.DirectusProject", version: "0.0.25" };
|
|
322
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtRUFBa0c7QUFDbEcsdURBQW9GO0FBQ3BGLG1DQUFnSTtBQUNoSSx1RUFBa0U7QUFDbEUsc0RBQW9FO0FBNEJwRSxNQUFhLFNBQVUsU0FBUSxtQkFBVSxDQUFDLFdBQVc7SUFhbkQsWUFBc0IsT0FBeUI7UUFDN0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksUUFBUSxDQUFDO1FBQzFELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyxJQUFJLFFBQVEsQ0FBQztRQUNoRSxLQUFLLENBQUM7WUFDSixHQUFHLE9BQU87WUFDVixjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWMsSUFBSSxtQkFBVSxDQUFDLGtCQUFrQixDQUFDLEdBQUc7WUFDM0UsTUFBTSxFQUFFLEtBQUssRUFBRSxzQ0FBc0M7WUFDckQsV0FBVyxFQUFFLElBQUk7WUFDakIsa0JBQWtCLEVBQUU7Z0JBQ2xCLGVBQWUsRUFBRTtvQkFDZixRQUFRLEVBQUUsd0NBQTJCLENBQUMsS0FBSztpQkFDNUM7YUFDRjtZQUNELFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUk7Z0JBQ3hCLFFBQVEsRUFBRTtvQkFDUixLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUU7b0JBQ25CLEVBQUU7b0JBQ0YsZ1BBQWdQO29CQUNoUCxFQUFFO29CQUNGLHNCQUFzQjtvQkFDdEIsRUFBRTtvQkFDRixPQUFPO29CQUNQLGdEQUFnRDtvQkFDaEQsOERBQThEO29CQUM5RCxLQUFLO29CQUNMLEVBQUU7b0JBQ0YscUlBQXFJO29CQUNySSxFQUFFO29CQUNGLFdBQVc7b0JBQ1gsRUFBRTtvQkFDRixtRkFBbUY7b0JBQ25GLEVBQUU7b0JBQ0YsT0FBTztvQkFDUCw0Q0FBNEM7b0JB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RSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDOztBQTlVSCw4QkFnVkM7OztBQVFEOztHQUVHO0FBQ0gsTUFBYSxlQUFnQixTQUFRLFNBQVM7O0FBQTlDLDBDQUFpRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFkZEV4dGVuc2lvbk9wdGlvbnMsIEQ5RXh0ZW5zaW9uVHlwZSwgRXh0ZW5zaW9uRm9sZGVyIH0gZnJvbSAnQHdiY2UvcHJvamVuLWQ5LWV4dGVuc2lvbic7XG5pbXBvcnQgeyBHaXRIdWJDb25maWcsIEdpdEh1YkNvbmZpZ09wdGlvbnMsIERvY2tlcmZpbGUgfSBmcm9tICdAd2JjZS9wcm9qZW4tc2hhcmVkJztcbmltcG9ydCB7IEFpQWdlbnQsIEFpSW5zdHJ1Y3Rpb25zLCBEb2NrZXJDb21wb3NlLCBEb2NrZXJDb21wb3NlU2VydmljZSwgamF2YXNjcmlwdCwgU2FtcGxlRmlsZSwgVGFzaywgdHlwZXNjcmlwdCB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBKb2JQZXJtaXNzaW9uIH0gZnJvbSAncHJvamVuL2xpYi9naXRodWIvd29ya2Zsb3dzLW1vZGVsJztcbmltcG9ydCB7IFVwZ3JhZGVEZXBlbmRlbmNpZXNTY2hlZHVsZSB9IGZyb20gJ3Byb2plbi9saWIvamF2YXNjcmlwdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZVZlcnNpb25zIHtcbiAgcmVhZG9ubHkgZDk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiBAYXJpZ2EvYXRsYXMgdG8gdXNlLlxuICAgKiBAZGVmYXVsdCBcIjAuMzIuMFwiXG4gICAqL1xuICByZWFkb25seSBhdGxhcz86IHN0cmluZztcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIEQ5UHJvamVjdE9wdGlvbnMgZXh0ZW5kcyB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciB0aGUgR2l0SHViIGNvbmZpZ3VyYXRpb24uXG4gICAqIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIEdpdEh1YiBjb25maWcgZW50aXJlbHkuXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBHaXRIdWJDb25maWcgd2l0aCBwcm9qZWN0IGRlZmF1bHRzXG4gICAqL1xuICByZWFkb25seSBnaXRodWJDb25maWc/OiBHaXRIdWJDb25maWdPcHRpb25zIHwgZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb25zIGZvbGRlci5cbiAgICogQGRlZmF1bHQgXCJleHRlbnNpb24tcGFja2FnZXNcIlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9uc0ZvbGRlck5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhY2thZ2VWZXJzaW9ucz86IFBhY2thZ2VWZXJzaW9ucztcbn1cblxuZXhwb3J0IGNsYXNzIEQ5UHJvamVjdCBleHRlbmRzIGphdmFzY3JpcHQuTm9kZVByb2plY3Qge1xuXG4gIHB1YmxpYyByZWFkb25seSBnaXRodWJDb25maWc/OiBHaXRIdWJDb25maWc7XG4gIHB1YmxpYyBleHRlbnNpb25zITogRXh0ZW5zaW9uRm9sZGVyO1xuICBwdWJsaWMgZXh0ZW5zaW9uRm9sZGVyITogc3RyaW5nO1xuICBwdWJsaWMgYXBwbHlTY2hlbWFUYXNrITogVGFzaztcbiAgcHVibGljIGJ1aWxkRXh0ZW5zaW9uVGFzayE6IFRhc2s7XG4gIHB1YmxpYyBkb2NrZXJmaWxlITogRG9ja2VyZmlsZTtcbiAgcHVibGljIGRvY2tlckNvbXBvc2VGaWxlITogRG9ja2VyQ29tcG9zZTtcbiAgcHVibGljIGRpcmVjdHVzU2VydmljZSE6IERvY2tlckNvbXBvc2VTZXJ2aWNlO1xuICBwdWJsaWMgZGF0YWJhc2VTZXJ2aWNlITogRG9ja2VyQ29tcG9zZVNlcnZpY2U7XG4gIHB1YmxpYyBjYWNoZVNlcnZpY2UhOiBEb2NrZXJDb21wb3NlU2VydmljZTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgb3B0aW9uczogRDlQcm9qZWN0T3B0aW9ucykge1xuICAgIGNvbnN0IGQ5VmVyc2lvbiA9IG9wdGlvbnMucGFja2FnZVZlcnNpb25zPy5kOSB8fCAnMTIuMC4xJztcbiAgICBjb25zdCBhdGxhc1ZlcnNpb24gPSBvcHRpb25zLnBhY2thZ2VWZXJzaW9ucz8uYXRsYXMgfHwgJzAuMzIuMCc7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHBhY2thZ2VNYW5hZ2VyOiBvcHRpb25zLnBhY2thZ2VNYW5hZ2VyID8/IGphdmFzY3JpcHQuTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTSxcbiAgICAgIGdpdGh1YjogZmFsc2UsIC8vIFdlIHVzZSBvdXIgb3duIEdpdEh1YkNvbmZpZyBpbnN0ZWFkXG4gICAgICBkZXBzVXBncmFkZTogdHJ1ZSxcbiAgICAgIGRlcHNVcGdyYWRlT3B0aW9uczoge1xuICAgICAgICB3b3JrZmxvd09wdGlvbnM6IHtcbiAgICAgICAgICBzY2hlZHVsZTogVXBncmFkZURlcGVuZGVuY2llc1NjaGVkdWxlLkRBSUxZLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxpY2Vuc2VkOiBmYWxzZSxcbiAgICAgIHJlYWRtZTogb3B0aW9ucy5yZWFkbWUgPz8ge1xuICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgIGAjICR7b3B0aW9ucy5uYW1lfWAsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ0EgW2Q5XShodHRwczovL2dpdGh1Yi5jb20vTGFXZWJjYXBzdWxlL2Q5KSAoRGlyZWN0dXMgOSBmb3JrKSBwcm9qZWN0IHNjYWZmb2xkZWQgd2l0aCBbYEB3YmNlL3Byb2plbi1kOWBdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0B3YmNlL3Byb2plbi1kOSkuIERldmVsb3AgbG9jYWxseSBhZ2FpbnN0IERvY2tlciBDb21wb3NlLCB0aGVuIGJ1aWxkIGEgRG9ja2VyIGltYWdlIHRvIGRlcGxveSBhbnl3aGVyZS4nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIyBMb2NhbCBkZXZlbG9wbWVudCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ2BgYHNoJyxcbiAgICAgICAgICAnbnB4IHByb2plbiBpbnN0YWxsICAgICAgIyBpbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgICAgICAgJ25weCBwcm9qZW4gZmlyc3QtcnVuICAgICMgYm9vdCBzdGFjaywgY3JlYXRlIGFkbWluLCBzdGFydCBkOScsXG4gICAgICAgICAgJ2BgYCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ09wZW4gaHR0cDovL2xvY2FsaG9zdDo4MDU1IGFuZCBzaWduIGluIGFzIGBhZG1pbkBleGFtcGxlLmNvbWAgLyBgdG90b3RvdG9gLiBFeHRlbnNpb25zIGF1dG8tcmVsb2FkIChgRVhURU5TSU9OU19BVVRPX1JFTE9BRD10cnVlYCkuJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnIyMgRGVwbG95JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnQSBgRG9ja2VyZmlsZWAgaXMgaW5jbHVkZWQuIEJ1aWxkIGFuZCBwdXNoIHRoZSBpbWFnZSBmb3IgeW91ciB0YXJnZXQgZW52aXJvbm1lbnQ6JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnYGBgc2gnLFxuICAgICAgICAgICdkb2NrZXIgYnVpbGQgLXQgPHJlZ2lzdHJ5Pi88aW1hZ2U+Ojx0YWc+IC4nLFxuICAgICAgICAgICdkb2NrZXIgcHVzaCA8cmVnaXN0cnk+LzxpbWFnZT46PHRhZz4nLFxuICAgICAgICAgICdgYGAnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdDb25maWd1cmUgdGhlIGRlcGxveWVkIGluc3RhbmNlIHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGVzIChkYXRhYmFzZSwgY2FjaGUsIHNlY3JldHMpIOKAlCBzZWUgdGhlIGQ5IGRvY3MuJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnIyMgQ29tbW9uIHRhc2tzJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnfCBUYXNrIHwgRGVzY3JpcHRpb24gfCcsXG4gICAgICAgICAgJ3wgLS0tIHwgLS0tIHwnLFxuICAgICAgICAgICd8IGBucHggcHJvamVuIHJ1bmAgfCBTdGFydCBkOSAoYGRvY2tlciBjb21wb3NlIHVwIGRpcmVjdHVzYCkgfCcsXG4gICAgICAgICAgJ3wgYG5weCBwcm9qZW4gYnVpbGQtZXh0ZW5zaW9uc2AgfCBJbnN0YWxsIGFuZCBidWlsZCBhbGwgZXh0ZW5zaW9ucyB8JyxcbiAgICAgICAgICAnfCBgbnB4IHByb2plbiBjcmVhdGUtYW4tYWRtaW5gIHwgQ3JlYXRlIHRoZSBkZWZhdWx0IGFkbWluIHVzZXIgfCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ1NlZSBgLnByb2plbi90YXNrcy5qc29uYCBmb3IgdGhlIGZ1bGwgbGlzdC4nLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICcjIyBDb25maWd1cmF0aW9uJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnRWRpdCBgLnByb2plbnJjLmpzYCBhbmQgcnVuIGBucHggcHJvamVuYCB0byByZWdlbmVyYXRlIHByb2plY3QgZmlsZXMuIExvY2FsIGVudmlyb25tZW50IG92ZXJyaWRlcyBnbyBpbiBgLmVudi5sb2NhbGAuJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICAnIyMgRXh0ZW5zaW9ucycsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ0V4dGVuc2lvbnMgbGl2ZSB1bmRlciBgLi9wbHVnaW5zL2AuIEFkZCBuZXcgb25lcyBpbiBgLnByb2plbnJjLmpzYDonLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdgYGBqcycsXG4gICAgICAgICAgXCJpbXBvcnQgeyBEOUV4dGVuc2lvblR5cGUgfSBmcm9tICdAd2JjZS9wcm9qZW4tZDktZXh0ZW5zaW9uJztcIixcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBcInByb2plY3QuYWRkRXh0ZW5zaW9uKCdteS1ob29rJywgW0Q5RXh0ZW5zaW9uVHlwZS5IT09LXSk7XCIsXG4gICAgICAgICAgJ2BgYCcsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ1RoZW4gYG5weCBwcm9qZW4gJiYgbnB4IHByb2plbiBidWlsZC1leHRlbnNpb25zYC4nLFxuICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgfSxcbiAgICAgIGRldkRlcHM6IFtcbiAgICAgICAgJ0B3YmNlL3Byb2plbi1kOScsXG4gICAgICAgICdAd2JjZS9wcm9qZW4tZDktZXh0ZW5zaW9uJyxcbiAgICAgICAgYEBhcmlnYS9hdGxhc0Ake2F0bGFzVmVyc2lvbn1gLFxuICAgICAgICAuLi4ob3B0aW9ucy5kZXZEZXBzID8/IFtdKSxcbiAgICAgIF0sXG4gICAgICBkZXBzOiBbYEB3YmNlLWQ5L2RpcmVjdHVzOUAke2Q5VmVyc2lvbn1gXSxcbiAgICB9KTtcblxuICAgIC8vIE5vIHRzY29uZmlnIG1lYW5zIG5vIHRzYyAtLWJ1aWxkIGluIGNvbXBpbGVcbiAgICB0aGlzLmNvbXBpbGVUYXNrLnJlc2V0KCk7XG5cbiAgICB0aGlzLmFkZEV4dGVuc2lvbkZvbGRlcigpO1xuICAgIHRoaXMuYWRkRG9ja2VyQ29tcG9zZSgpO1xuICAgIHRoaXMuYWRkQXBwbHlTY2hlbWFUYXNrKCk7XG4gICAgdGhpcy5hZGRGaXJzdFJ1blRhc2soKTtcbiAgICB0aGlzLmFkZEJ1aWxkRXh0ZW5zaW9uVGFzaygpO1xuICAgIHRoaXMuYWRkUnVuVGFzaygpO1xuICAgIHRoaXMuYWRkRG9ja2VyZmlsZSgpO1xuICAgIHRoaXMuYWRkQ3JlYXRlQWRtaW5Vc2VyVGFzaygpO1xuXG4gICAgbmV3IEFpSW5zdHJ1Y3Rpb25zKHRoaXMsIHtcbiAgICAgIGFnZW50czogW0FpQWdlbnQuQ0xBVURFXSxcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLmdpdGh1YkNvbmZpZyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZ2l0aHViQ29uZmlnID0gbmV3IEdpdEh1YkNvbmZpZyh0aGlzLCBvcHRpb25zLmdpdGh1YkNvbmZpZyk7XG4gICAgICB0aGlzLmFkZFNhdmVCcmFuY2hXb3JrZmxvdygpO1xuICAgIH1cbiAgICB0aGlzLmdpdGlnbm9yZS5hZGRQYXR0ZXJucygndXBsb2FkcycpO1xuICAgIHRoaXMuZ2l0aWdub3JlLmFkZFBhdHRlcm5zKCcqKi8uRFNfU3RvcmUnKTtcbiAgICB0aGlzLmdpdGlnbm9yZS5hZGRQYXR0ZXJucygnLmVudi5sb2NhbCcpO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGVtcHR5IC5lbnYubG9jYWwgaWYgaXQgZG9lc24ndCBleGlzdCwgc28gRG9ja2VyIGRvZXNuJ3QgbW91bnQgYSBkaXJlY3RvcnlcbiAgICBuZXcgU2FtcGxlRmlsZSh0aGlzLCAnLmVudi5sb2NhbCcsIHsgY29udGVudHM6ICcjIExvY2FsIGVudmlyb25tZW50IG92ZXJyaWRlcyBmb3IgRGlyZWN0dXMnIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFeHRlbnNpb25Gb2xkZXIoKSB7XG4gICAgY29uc3QgZm9sZGVyTmFtZSA9IHRoaXMub3B0aW9ucy5leHRlbnNpb25zRm9sZGVyTmFtZSA/PyAncGx1Z2lucyc7XG4gICAgdGhpcy5leHRlbnNpb25zID0gbmV3IEV4dGVuc2lvbkZvbGRlcih7IHBhcmVudDogdGhpcywgbmFtZTogZm9sZGVyTmFtZSB9KTtcbiAgICB0aGlzLmV4dGVuc2lvbkZvbGRlciA9IGZvbGRlck5hbWU7XG4gICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZSgnZXh0ZW5zaW9ucy8qJyk7XG4gICAgdGhpcy5naXRpZ25vcmUuaW5jbHVkZSgnZXh0ZW5zaW9ucy90ZW1wbGF0ZXMvJyk7XG4gIH1cblxuICBwdWJsaWMgYWRkRXh0ZW5zaW9uKG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uVHlwZXM6IEQ5RXh0ZW5zaW9uVHlwZVtdLCBvcHRpb25zPzogQWRkRXh0ZW5zaW9uT3B0aW9ucyApIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25zLmFkZChuYW1lLCBleHRlbnNpb25UeXBlcywgb3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFkZEZpcnN0UnVuVGFzaygpIHtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5hZGRUYXNrKCdmaXJzdC1ydW4nLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0luaXRpYWxpemUgYW5kIHN0YXJ0IGEgZnJlc2ggRGlyZWN0dXMgaW5zdGFuY2UnLFxuICAgIH0pO1xuICAgIGNvbnN0IGFkbWluRW1haWwgPSAnYWRtaW5AZXhhbXBsZS5jb20nO1xuICAgIGNvbnN0IHVzZXJOb3RFeGlzdHNDb25kaXRpb24gPSBgZG9ja2VyIGNvbXBvc2UgZXhlYyBkYXRhYmFzZSBwc3FsIC1VIGRpcmVjdHVzIC1kIGRpcmVjdHVzIC10QWMgXCJTRUxFQ1QgY291bnQoKikgRlJPTSBkaXJlY3R1c191c2VycyBXSEVSRSBlbWFpbCA9ICcke2FkbWluRW1haWx9J1wiIHwgZ3JlcCAtcSAnXjAkJ2A7XG4gICAgdGFzay5leGVjKCdkb2NrZXIgY29tcG9zZSB1cCAtZCAtLXdhaXQgZGF0YWJhc2UgY2FjaGUnKTtcbiAgICB0YXNrLnNwYXduKHRoaXMuYXBwbHlTY2hlbWFUYXNrKTtcbiAgICB0YXNrLmV4ZWMoYEFETUlOX1JPTEVfSUQ9JChkb2NrZXIgY29tcG9zZSBleGVjIGRhdGFiYXNlIHBzcWwgLVUgZGlyZWN0dXMgLWQgZGlyZWN0dXMgLXRBYyBcIlNFTEVDVCBpZCBGUk9NIGRpcmVjdHVzX3JvbGVzIFdIRVJFIGFkbWluX2FjY2VzcyA9IHRydWUgTElNSVQgMVwiKSAmJiBkb2NrZXIgY29tcG9zZSBydW4gLS1ybSBkaXJlY3R1cyBucHggZGlyZWN0dXMgdXNlcnMgY3JlYXRlIC0tZW1haWwgJHthZG1pbkVtYWlsfSAtLXBhc3N3b3JkIHRvdG90b3RvIC0tcm9sZSBcIiRBRE1JTl9ST0xFX0lEXCJgLCB7XG4gICAgICBjb25kaXRpb246IHVzZXJOb3RFeGlzdHNDb25kaXRpb24sXG4gICAgfSk7XG4gICAgdGFzay5zYXkoYFVzZXIgJHthZG1pbkVtYWlsfSBoYXMgYmVlbiBjcmVhdGVkIHdpdGggcGFzc3dvcmQgdG90b3RvdG9gLCB7XG4gICAgICBjb25kaXRpb246IHVzZXJOb3RFeGlzdHNDb25kaXRpb24sXG4gICAgfSk7XG4gICAgdGFzay5zYXkoYFVzZXIgJHthZG1pbkVtYWlsfSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcgY3JlYXRpb25gLCB7XG4gICAgICBjb25kaXRpb246IGAhICR7dXNlck5vdEV4aXN0c0NvbmRpdGlvbn1gLFxuICAgIH0pO1xuICAgIHRhc2suZXhlYygnZG9ja2VyIGNvbXBvc2UgdXAgZGlyZWN0dXMnKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ3JlYXRlQWRtaW5Vc2VyVGFzaygpIHtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5hZGRUYXNrKCdjcmVhdGUtYW4tYWRtaW4nLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhbiBhZG1pbiB1c2VyJyxcbiAgICB9KTtcbiAgICBjb25zdCBhZG1pbkVtYWlsID0gJ2FkbWluQGV4YW1wbGUuY29tJztcbiAgICBjb25zdCB1c2VyTm90RXhpc3RzQ29uZGl0aW9uID0gYGRvY2tlciBjb21wb3NlIGV4ZWMgZGF0YWJhc2UgcHNxbCAtVSBkaXJlY3R1cyAtZCBkaXJlY3R1cyAtdEFjIFwiU0VMRUNUIGNvdW50KCopIEZST00gZGlyZWN0dXNfdXNlcnMgV0hFUkUgZW1haWwgPSAnJHthZG1pbkVtYWlsfSdcIiB8IGdyZXAgLXEgJ14wJCdgO1xuICAgIHRhc2suZXhlYygnZG9ja2VyIGNvbXBvc2UgdXAgLWQgLS13YWl0IGRhdGFiYXNlIGNhY2hlJyk7XG4gICAgdGFzay5leGVjKGBBRE1JTl9ST0xFX0lEPSQoZG9ja2VyIGNvbXBvc2UgZXhlYyBkYXRhYmFzZSBwc3FsIC1VIGRpcmVjdHVzIC1kIGRpcmVjdHVzIC10QWMgXCJTRUxFQ1QgaWQgRlJPTSBkaXJlY3R1c19yb2xlcyBXSEVSRSBhZG1pbl9hY2Nlc3MgPSB0cnVlIExJTUlUIDFcIikgJiYgZG9ja2VyIGNvbXBvc2UgcnVuIC0tcm0gZGlyZWN0dXMgbnB4IGRpcmVjdHVzIHVzZXJzIGNyZWF0ZSAtLWVtYWlsICR7YWRtaW5FbWFpbH0gLS1wYXNzd29yZCB0b3RvdG90byAtLXJvbGUgXCIkQURNSU5fUk9MRV9JRFwiYCwge1xuICAgICAgY29uZGl0aW9uOiB1c2VyTm90RXhpc3RzQ29uZGl0aW9uLFxuICAgIH0pO1xuICAgIHRhc2suc2F5KGBVc2VyICR7YWRtaW5FbWFpbH0gaGFzIGJlZW4gY3JlYXRlZCB3aXRoIHBhc3N3b3JkIHRvdG90b3RvYCwge1xuICAgICAgY29uZGl0aW9uOiB1c2VyTm90RXhpc3RzQ29uZGl0aW9uLFxuICAgIH0pO1xuICAgIHRhc2suc2F5KGBVc2VyICR7YWRtaW5FbWFpbH0gYWxyZWFkeSBleGlzdHMsIHNraXBwaW5nIGNyZWF0aW9uYCwge1xuICAgICAgY29uZGl0aW9uOiBgISAke3VzZXJOb3RFeGlzdHNDb25kaXRpb259YCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUnVuVGFzaygpIHtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5hZGRUYXNrKCdydW4nLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3N0YXJ0IHRoZSBEaXJlY3R1cyBpbnN0YW5jZScsXG4gICAgfSk7XG4gICAgdGFzay5leGVjKCdkb2NrZXIgY29tcG9zZSB1cCBkaXJlY3R1cycpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRBcHBseVNjaGVtYVRhc2soKSB7XG4gICAgdGhpcy5hcHBseVNjaGVtYVRhc2sgPSB0aGlzLmFkZFRhc2soJ2FwcGx5LXNjaGVtYScsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQXBwbHkgU1FMIHNuYXBzaG90IHRvIHRoZSBsb2NhbCBEaXJlY3R1cyBkYXRhYmFzZScsXG4gICAgfSk7XG4gICAgdGhpcy5hcHBseVNjaGVtYVRhc2suZXhlYygnbnB4IHdiY2UtZGlyZWN0dXMgYXBwbHktc25hcHNob3QgLS1ob3N0IGxvY2FsaG9zdCAtLXVzZXIgZGlyZWN0dXMgLS1wYXNzd29yZCBkaXJlY3R1cyAtLWRhdGFiYXNlIGRpcmVjdHVzJywge1xuICAgICAgY29uZGl0aW9uOiAndGVzdCAtZCAuL3NxbCcsXG4gICAgfSk7XG4gICAgdGhpcy5hcHBseVNjaGVtYVRhc2suZXhlYygnZG9ja2VyIGNvbXBvc2UgcnVuIC0tcm0gZGlyZWN0dXMgbnB4IGRpcmVjdHVzIGJvb3RzdHJhcCcsIHtcbiAgICAgIGNvbmRpdGlvbjogJ3Rlc3QgISAtZCAuL3NxbCcsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEJ1aWxkRXh0ZW5zaW9uVGFzaygpIHtcbiAgICB0aGlzLmJ1aWxkRXh0ZW5zaW9uVGFzayA9IHRoaXMuYWRkVGFzaygnYnVpbGQtZXh0ZW5zaW9ucycsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgdGhlIGRpcmVjdHVzIGV4dGVuc2lvbnMnLFxuICAgIH0pO1xuICAgIHRoaXMuYnVpbGRFeHRlbnNpb25UYXNrLmV4ZWMoYGNkICR7dGhpcy5leHRlbnNpb25Gb2xkZXJ9ICYmIHBucG0gaW5zdGFsbGApO1xuICAgIHRoaXMuYnVpbGRFeHRlbnNpb25UYXNrLmV4ZWMoYGNkICR7dGhpcy5leHRlbnNpb25Gb2xkZXJ9ICYmIHBucG0gcnVuIC0tcmVjdXJzaXZlIGJ1aWxkYCk7XG4gIH1cblxuXG4gIHByaXZhdGUgYWRkRG9ja2VyQ29tcG9zZSgpIHtcbiAgICBjb25zdCBkYyA9IG5ldyBEb2NrZXJDb21wb3NlKHRoaXMpO1xuXG4gICAgdGhpcy5kYXRhYmFzZVNlcnZpY2UgPSBkYy5hZGRTZXJ2aWNlKCdkYXRhYmFzZScsIHtcbiAgICAgIGltYWdlOiAncG9zdGdpcy9wb3N0Z2lzOjEzLW1hc3RlcicsXG4gICAgICB2b2x1bWVzOiBbXG4gICAgICAgIERvY2tlckNvbXBvc2UubmFtZWRWb2x1bWUoJ3BnZGF0YScsICcvdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGEnKSxcbiAgICAgIF0sXG4gICAgICBwb3J0czogW1xuICAgICAgICBEb2NrZXJDb21wb3NlLnBvcnRNYXBwaW5nKDU0MzIsIDU0MzIpLFxuICAgICAgXSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFBPU1RHUkVTX1VTRVI6ICdkaXJlY3R1cycsXG4gICAgICAgIFBPU1RHUkVTX1BBU1NXT1JEOiAnZGlyZWN0dXMnLFxuICAgICAgICBQT1NUR1JFU19EQjogJ2RpcmVjdHVzJyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmNhY2hlU2VydmljZSA9IGRjLmFkZFNlcnZpY2UoJ2NhY2hlJywge1xuICAgICAgaW1hZ2U6ICdyZWRpczo2JyxcbiAgICAgIHZvbHVtZXM6IFtcbiAgICAgICAgRG9ja2VyQ29tcG9zZS5uYW1lZFZvbHVtZSgncmVkaXNfc3RvcmFnZScsICcvZGF0YScpLFxuICAgICAgXSxcbiAgICAgIHBvcnRzOiBbXG4gICAgICAgIERvY2tlckNvbXBvc2UucG9ydE1hcHBpbmcoNjM3OSwgNjM3OSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kaXJlY3R1c1NlcnZpY2UgPSBkYy5hZGRTZXJ2aWNlKCdkaXJlY3R1cycsIHtcbiAgICAgIGltYWdlQnVpbGQ6IHsgY29udGV4dDogJy4nIH0sXG4gICAgICBwb3J0czogW1xuICAgICAgICBEb2NrZXJDb21wb3NlLnBvcnRNYXBwaW5nKDgwNTUsIDgwNTUpLFxuICAgICAgXSxcbiAgICAgIHZvbHVtZXM6IFtcbiAgICAgICAgRG9ja2VyQ29tcG9zZS5iaW5kVm9sdW1lKCcuL3VwbG9hZHMnLCAnL2FwcC91cGxvYWRzJyksXG4gICAgICAgIERvY2tlckNvbXBvc2UuYmluZFZvbHVtZSgnLi9leHRlbnNpb25zJywgJy9hcHAvZXh0ZW5zaW9ucycpLFxuICAgICAgXSxcbiAgICAgIC8vIGRlcGVuZHNPbiBpcyBzZXQgdmlhIGFkZE92ZXJyaWRlIGJlbG93IHdpdGggY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIEtFWTogJ3NvbWUtcmFuZG9tLWtleScsXG4gICAgICAgIFNFQ1JFVDogJ2Fub3RoZXItcmFuZG9tLWtleScsXG4gICAgICAgIENPTkZJR19QQVRIOiAnLmVudi5sb2NhbCcsXG4gICAgICAgIERCX0NMSUVOVDogJ3BnJyxcbiAgICAgICAgREJfSE9TVDogJ2RhdGFiYXNlJyxcbiAgICAgICAgREJfUE9SVDogJzU0MzInLFxuICAgICAgICBEQl9EQVRBQkFTRTogJ2RpcmVjdHVzJyxcbiAgICAgICAgREJfVVNFUjogJ2RpcmVjdHVzJyxcbiAgICAgICAgREJfUEFTU1dPUkQ6ICdkaXJlY3R1cycsXG4gICAgICAgIENBQ0hFX0VOQUJMRUQ6ICdmYWxzZScsXG4gICAgICAgIENBQ0hFX1JFRElTX0hPU1Q6ICdjYWNoZScsXG4gICAgICAgIENBQ0hFX1NUQVRVU19IRUFERVI6ICdjYWNoZS1oaXQnLFxuICAgICAgICBDT1JTX0VOQUJMRUQ6ICd0cnVlJyxcbiAgICAgICAgQ09SU19PUklHSU46ICd0cnVlJyxcbiAgICAgICAgTE9HX0xFVkVMOiAnaW5mbycsXG4gICAgICAgIEFETUlOX0VNQUlMOiAnYWRtaW5AZXhhbXBsZS5jb20nLFxuICAgICAgICBBRE1JTl9QQVNTV09SRDogJ3RvdG90b3RvJyxcbiAgICAgICAgRVhURU5TSU9OU19BVVRPX1JFTE9BRDogJ3RydWUnLFxuICAgICAgICBWQUxJREFURV9FTlRJVElFU19UT0tFTlNfQVBJX0tFWTogJ3RvdG8nLFxuICAgICAgICBBV1NfS01TX0tFWV9JRDogJ3R1dHUnLFxuICAgICAgfSxcbiAgICAgIGNvbW1hbmQ6IFsnc2gnLCAnLWMnLCAnbnB4IGRpcmVjdHVzIHN0YXJ0J10sXG4gICAgfSk7XG5cbiAgICB0aGlzLmRpcmVjdHVzU2VydmljZS5hZGRWb2x1bWUoRG9ja2VyQ29tcG9zZS5iaW5kVm9sdW1lKCcuLy5lbnYubG9jYWwnLCAnL2FwcC8uZW52LmxvY2FsJykpO1xuXG4gICAgLy8gQWRkIGhlYWx0aGNoZWNrIGZvciBkYXRhYmFzZSAobm90IG5hdGl2ZWx5IHN1cHBvcnRlZCBieSBwcm9qZW4gRG9ja2VyQ29tcG9zZSlcbiAgICBkYy5maWxlLmFkZE92ZXJyaWRlKCdzZXJ2aWNlcy5kYXRhYmFzZS5oZWFsdGhjaGVjaycsIHtcbiAgICAgIHRlc3Q6IFsnQ01EJywgJ3BnX2lzcmVhZHknLCAnLS1ob3N0PWxvY2FsaG9zdCcsICctLXVzZXJuYW1lPWRpcmVjdHVzJ10sXG4gICAgICBpbnRlcnZhbDogJzEwcycsXG4gICAgICB0aW1lb3V0OiAnNXMnLFxuICAgICAgcmV0cmllczogNSxcbiAgICAgIHN0YXJ0X2ludGVydmFsOiAnNXMnLFxuICAgICAgc3RhcnRfcGVyaW9kOiAnMzBzJyxcbiAgICB9KTtcblxuICAgIC8vIEFkZCBoZWFsdGhjaGVjayBmb3IgY2FjaGVcbiAgICBkYy5maWxlLmFkZE92ZXJyaWRlKCdzZXJ2aWNlcy5jYWNoZS5oZWFsdGhjaGVjaycsIHtcbiAgICAgIHRlc3Q6IFsnQ01ELVNIRUxMJywgJ1sgJChyZWRpcy1jbGkgcGluZykgPSBcXCdQT05HXFwnIF0nXSxcbiAgICAgIGludGVydmFsOiAnMTBzJyxcbiAgICAgIHRpbWVvdXQ6ICc1cycsXG4gICAgICByZXRyaWVzOiA1LFxuICAgICAgc3RhcnRfaW50ZXJ2YWw6ICc1cycsXG4gICAgICBzdGFydF9wZXJpb2Q6ICczMHMnLFxuICAgIH0pO1xuXG4gICAgLy8gT3ZlcnJpZGUgZGVwZW5kc19vbiB0byB1c2UgY29uZGl0aW9uIHN5bnRheFxuICAgIGRjLmZpbGUuYWRkT3ZlcnJpZGUoJ3NlcnZpY2VzLmRpcmVjdHVzLmRlcGVuZHNfb24nLCB7XG4gICAgICBjYWNoZTogeyBjb25kaXRpb246ICdzZXJ2aWNlX2hlYWx0aHknIH0sXG4gICAgICBkYXRhYmFzZTogeyBjb25kaXRpb246ICdzZXJ2aWNlX2hlYWx0aHknIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmRvY2tlckNvbXBvc2VGaWxlID0gZGM7XG5cbiAgICByZXR1cm4gZGM7XG4gIH1cblxuICBwcml2YXRlIGFkZFNhdmVCcmFuY2hXb3JrZmxvdygpIHtcbiAgICBjb25zdCB3b3JrZmxvdyA9IHRoaXMuZ2l0aHViQ29uZmlnIS5hZGRXb3JrZmxvdygnc2F2ZS1icmFuY2gnKTtcbiAgICB3b3JrZmxvdy5vbih7IHB1c2g6IHsgYnJhbmNoZXM6IFsnKi1zYXZlJ10gfSB9KTtcbiAgICB3b3JrZmxvdy5hZGRKb2IoJ2NyZWF0ZS1wcicsIHtcbiAgICAgIG5hbWU6ICdDcmVhdGUgUHVsbCBSZXF1ZXN0JyxcbiAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICBjb250ZW50czogSm9iUGVybWlzc2lvbi5SRUFELFxuICAgICAgICBwdWxsUmVxdWVzdHM6IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICB9LFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAgeyBuYW1lOiAnQ2hlY2tvdXQnLCB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NCcgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdDcmVhdGUgUHVsbCBSZXF1ZXN0JyxcbiAgICAgICAgICBydW46ICdnaCBwciBjcmVhdGUgLS10aXRsZSBcIlNhdmU6ICR7R0lUSFVCX1JFRl9OQU1FJS1zYXZlfVwiIC0tYm9keSBcIkF1dG8tZ2VuZXJhdGVkIFBSIGZyb20gYnJhbmNoIFxcXFxgJHtHSVRIVUJfUkVGX05BTUUlLXNhdmV9XFxcXGBcIiAtLWJhc2UgXCIke0dJVEhVQl9SRUZfTkFNRSUtc2F2ZX1cIiB8fCBlY2hvIFwiUFIgYWxyZWFkeSBleGlzdHNcIicsXG4gICAgICAgICAgZW52OiB7IEdIX1RPS0VOOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRG9ja2VyZmlsZSgpIHtcbiAgICB0aGlzLmRvY2tlcmZpbGUgPSBuZXcgRG9ja2VyZmlsZSh0aGlzKVxuICAgICAgLmZyb20oJ25vZGUnLCAnMjItYm9va3dvcm0tc2xpbScpXG4gICAgICAuc3RlcCgndXBkYXRlLW5wbScsICdVcGRhdGUgbnBtIHRvIGZpeCBkZXBlbmRlbmNpZXMnKVxuICAgICAgLnJ1bignbnBtIGluc3RhbGwgLWcgbnBtQDExLjguMCcpXG4gICAgICAuc3RlcCgnaW5zdGFsbC1wbnBtJywgJ2luc3RhbGwgcG5wbScpXG4gICAgICAucnVuKCducG0gaW5zdGFsbCAtZyBwbnBtQDEwLjMzLjAnKVxuICAgICAgLnN0ZXAoJ2NvcHktcGFja2FnZScsICdDb3B5IHBhY2thZ2UuanNvbiBhbmQgcGFja2FnZS1sb2NrLmpzb24gZmlyc3QgdG8gbGV2ZXJhZ2UgRG9ja2VyIGxheWVyIGNhY2hpbmcnKVxuICAgICAgLmNvcHkoJ3BhY2thZ2UqLmpzb24nLCAnL2FwcC8nKVxuICAgICAgLnN0ZXAoJ3dvcmtkaXInLCAnU2V0IHdvcmtpbmcgZGlyZWN0b3J5JylcbiAgICAgIC53b3JrZGlyKCcvYXBwJylcbiAgICAgIC5zdGVwKCdpbnN0YWxsLWRlcHMnLCAnSW5zdGFsbCBkZXBlbmRlbmNpZXMgLSB3aXRob3V0IGRldiBkZXBlbmRlbmNpZXMnKVxuICAgICAgLnJ1bignTk9ERV9FTlY9cHJvZHVjdGlvbiBucG0gaW5zdGFsbCcpXG4gICAgICAuc3RlcCgnY2xlYW51cCcsICdDbGVhbmluZyBiZW5jaG1hcmtzIGZvbGRlciBpbiB0ZWRpb3VzIG1vZHVsZSBmb3Igc2VjdXJpdHknKVxuICAgICAgLnJ1bigncm0gLXJmIG5vZGVfbW9kdWxlcy90ZWRpb3VzL2JlbmNobWFya3MnKVxuICAgICAgLnN0ZXAoJ2NvcHktc291cmNlJywgJ0NvcHkgdGhlIHJlc3Qgb2YgdGhlIGFwcGxpY2F0aW9uIGNvZGUnKVxuICAgICAgLmNvcHkoJy4nLCAnLicpXG4gICAgICAuc3RlcCgnYnVpbGQtZXh0ZW5zaW9uJywgJ2J1aWxkIGV4dGVuc2lvbnMnKVxuICAgICAgLnJ1bignbnB4IHByb2plbiBidWlsZC1leHRlbnNpb25zJylcbiAgICAgIC5zdGVwKCdzdGFydCcsICdTdGFydCBEaXJlY3R1cyBzZXJ2ZXInKVxuICAgICAgLmNtZEV4ZWMoWyducHgnLCAnZGlyZWN0dXMnLCAnc3RhcnQnXSk7XG4gICAgcmV0dXJuIHRoaXMuZG9ja2VyZmlsZTtcbiAgfVxuXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBEOVByb2plY3RPcHRpb25zfSBpbnN0ZWFkLiBUaGUgcGFja2FnZSB3YXMgcmVuYW1lZCB0byBgQHdiY2UvcHJvamVuLWQ5YCB0byByZWZsZWN0IHRoYXQgaXQgdGFyZ2V0cyB0aGUgZDkgZm9yaywgbm90IHVwc3RyZWFtIERpcmVjdHVzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LW9iamVjdC10eXBlXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdHVzUHJvamVjdE9wdGlvbnMgZXh0ZW5kcyBEOVByb2plY3RPcHRpb25zIHt9XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBEOVByb2plY3R9IGluc3RlYWQuIFRoZSBwYWNrYWdlIHdhcyByZW5hbWVkIHRvIGBAd2JjZS9wcm9qZW4tZDlgIHRvIHJlZmxlY3QgdGhhdCBpdCB0YXJnZXRzIHRoZSBkOSBmb3JrLCBub3QgdXBzdHJlYW0gRGlyZWN0dXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXJlY3R1c1Byb2plY3QgZXh0ZW5kcyBEOVByb2plY3Qge31cbiJdfQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Microsoft Corporation.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Installation
|
|
2
|
+
> `npm install --save @types/node`
|
|
3
|
+
|
|
4
|
+
# Summary
|
|
5
|
+
This package contains type definitions for Node.js (https://nodejs.org/).
|
|
6
|
+
|
|
7
|
+
# Details
|
|
8
|
+
Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node/v12.
|
|
9
|
+
|
|
10
|
+
### Additional Details
|
|
11
|
+
* Last updated: Tue, 07 Jun 2022 19:01:37 GMT
|
|
12
|
+
* Dependencies: none
|
|
13
|
+
* Global values: `Buffer`, `NodeJS`, `__dirname`, `__filename`, `clearImmediate`, `clearInterval`, `clearTimeout`, `console`, `exports`, `global`, `module`, `process`, `queueMicrotask`, `require`, `setImmediate`, `setInterval`, `setTimeout`
|
|
14
|
+
|
|
15
|
+
# Credits
|
|
16
|
+
These definitions were written by [Microsoft TypeScript](https://github.com/Microsoft), [DefinitelyTyped](https://github.com/DefinitelyTyped), [Alberto Schiabel](https://github.com/jkomyno), [Alvis HT Tang](https://github.com/alvis), [Andrew Makarov](https://github.com/r3nya), [Benjamin Toueg](https://github.com/btoueg), [Chigozirim C.](https://github.com/smac89), [David Junger](https://github.com/touffy), [Deividas Bakanas](https://github.com/DeividasBakanas), [Eugene Y. Q. Shen](https://github.com/eyqs), [Hannes Magnusson](https://github.com/Hannes-Magnusson-CK), [Hoàng Văn Khải](https://github.com/KSXGitHub), [Huw](https://github.com/hoo29), [Kelvin Jin](https://github.com/kjin), [Klaus Meinhardt](https://github.com/ajafff), [Lishude](https://github.com/islishude), [Mariusz Wiktorczyk](https://github.com/mwiktorczyk), [Mohsen Azimi](https://github.com/mohsen1), [Nicolas Even](https://github.com/n-e), [Nikita Galkin](https://github.com/galkin), [Parambir Singh](https://github.com/parambirs), [Sebastian Silbermann](https://github.com/eps1lon), [Simon Schick](https://github.com/SimonSchick), [Thomas den Hollander](https://github.com/ThomasdenH), [Wilco Bakker](https://github.com/WilcoBakker), [wwwy3y3](https://github.com/wwwy3y3), [Zane Hannan AU](https://github.com/ZaneHannanAU), [Samuel Ainsworth](https://github.com/samuela), [Kyle Uehlein](https://github.com/kuehlein), [Thanik Bhongbhibhat](https://github.com/bhongy), [Marcin Kopacz](https://github.com/chyzwar), [Trivikram Kamat](https://github.com/trivikr), [Junxiao Shi](https://github.com/yoursunny), [Ilia Baryshnikov](https://github.com/qwelias), and [ExE Boss](https://github.com/ExE-Boss).
|