@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
package/README.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# @wbce/projen-d9
|
|
2
|
+
|
|
3
|
+
Projen template for [d9](https://github.com/LaWebcapsule/d9) projects (fork of Directus v9). Scaffolds a local development setup with Docker Compose (Postgres + Redis), extension management, and GitHub workflows — then produces a Docker image you can deploy to any environment.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
Companion package: [`@wbce/projen-d9-extension`](../directus-extension) for authoring extensions.
|
|
7
|
+
|
|
8
|
+
## Bootstrap a new project
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
npx projen new --from @wbce/projen-d9
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
This creates a `.projenrc.js` and synthesizes the project.
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
`.projenrc.js`:
|
|
19
|
+
|
|
20
|
+
```js
|
|
21
|
+
import { D9Project } from '@wbce/projen-d9';
|
|
22
|
+
import { D9ExtensionType } from '@wbce/projen-d9-extension';
|
|
23
|
+
|
|
24
|
+
const project = new D9Project({
|
|
25
|
+
name: 'my-d9',
|
|
26
|
+
defaultReleaseBranch: 'main',
|
|
27
|
+
eslintOptions: {
|
|
28
|
+
dirs: ['src', 'test'],
|
|
29
|
+
prettier: true,
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// A shared package other extensions can depend on
|
|
34
|
+
project.addExtension('shared', []);
|
|
35
|
+
|
|
36
|
+
// A hook extension that depends on the shared package
|
|
37
|
+
const myHook = project.addExtension('my-hook', [D9ExtensionType.HOOK]);
|
|
38
|
+
myHook.addDeps('shared@workspace:');
|
|
39
|
+
|
|
40
|
+
project.synth();
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Then synth and start it:
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
npx projen
|
|
47
|
+
npx projen first-run # boot stack + create admin user
|
|
48
|
+
npx projen run # start d9 (port 8055)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
The default admin user is `admin@example.com` / `totototo`.
|
|
52
|
+
|
|
53
|
+
### Extension types
|
|
54
|
+
|
|
55
|
+
`D9ExtensionType` values: `INTERFACE`, `DISPLAY`, `LAYOUT`, `MODULE`, `PANEL`, `ENDPOINT`, `HOOK`, `OPERATION`. Pass an empty array for a shared (non-extension) package.
|
|
56
|
+
|
|
57
|
+
Extensions live under `./plugins/` (configurable via `extensionsFolderName`) and are built by the `build-extensions` task.
|
|
58
|
+
|
|
59
|
+
## Generated tasks
|
|
60
|
+
|
|
61
|
+
| Task | Description |
|
|
62
|
+
| --- | --- |
|
|
63
|
+
| `first-run` | Boot the stack, create admin, start d9 |
|
|
64
|
+
| `run` | Start d9 (`docker compose up directus`) |
|
|
65
|
+
| `build-extensions` | Install and build all extensions |
|
|
66
|
+
| `create-an-admin` | Create the default admin user |
|
|
67
|
+
|
|
68
|
+
## What gets generated
|
|
69
|
+
|
|
70
|
+
- `docker-compose.yml` — d9, Postgres (PostGIS), Redis with healthchecks
|
|
71
|
+
- `Dockerfile` — Node 22 + pnpm, builds extensions
|
|
72
|
+
- `.env.local` — sample for local environment overrides
|
|
73
|
+
- GitHub workflows via [`@wbce/projen-shared`](../shared) (set `githubConfig: false` to disable)
|
|
74
|
+
|
|
75
|
+
## Options
|
|
76
|
+
|
|
77
|
+
See [API.md](./API.md) for the full `D9ProjectOptions` reference. Highlights:
|
|
78
|
+
|
|
79
|
+
- `extensionsFolderName` — folder for extension packages (default: `plugins`)
|
|
80
|
+
- `packageVersions.d9` — version of `@wbce-d9/directus9` (default: `12.0.1`)
|
|
81
|
+
- `packageVersions.atlas` — version of `@ariga/atlas` (default: `0.32.0`)
|
|
82
|
+
- `githubConfig` — `GitHubConfigOptions` or `false` to disable
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function init(directory: string): Promise<void>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.init = init;
|
|
4
|
+
async function init(directory) {
|
|
5
|
+
console.log(`Initializing Directus project in "${directory}"...`);
|
|
6
|
+
// TODO: implement
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGkvY29tbWFuZHMvaW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG9CQUdDO0FBSE0sS0FBSyxVQUFVLElBQUksQ0FBQyxTQUFpQjtJQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxTQUFTLE1BQU0sQ0FBQyxDQUFDO0lBQ2xFLGtCQUFrQjtBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXQoZGlyZWN0b3J5OiBzdHJpbmcpIHtcbiAgY29uc29sZS5sb2coYEluaXRpYWxpemluZyBEaXJlY3R1cyBwcm9qZWN0IGluIFwiJHtkaXJlY3Rvcnl9XCIuLi5gKTtcbiAgLy8gVE9ETzogaW1wbGVtZW50XG59XG4iXX0=
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applySQLSnapshot = applySQLSnapshot;
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const stream_1 = require("stream");
|
|
6
|
+
const util_1 = require("util");
|
|
7
|
+
const pg = require("pg");
|
|
8
|
+
const pg_copy_streams_1 = require("pg-copy-streams");
|
|
9
|
+
const cli_1 = require("./cli");
|
|
10
|
+
const utils_1 = require("./utils");
|
|
11
|
+
const readdir = (0, util_1.promisify)(fs.readdir);
|
|
12
|
+
const pipeline = (0, util_1.promisify)(stream_1.pipeline);
|
|
13
|
+
async function applySQLSnapshot(dbConfig) {
|
|
14
|
+
let pgClient;
|
|
15
|
+
const connectionProps = {
|
|
16
|
+
user: dbConfig.user,
|
|
17
|
+
host: dbConfig.host,
|
|
18
|
+
password: dbConfig.pwd,
|
|
19
|
+
database: 'postgres',
|
|
20
|
+
...(dbConfig.ssl ? { ssl: { rejectUnauthorized: false } } : {}),
|
|
21
|
+
};
|
|
22
|
+
//SCHEMA
|
|
23
|
+
//1. we create an empty db
|
|
24
|
+
//2. we populate with the schema
|
|
25
|
+
//3. we calculate the diff
|
|
26
|
+
pgClient = new pg.Client(connectionProps);
|
|
27
|
+
console.info('creating empty tmp database');
|
|
28
|
+
await pgClient.connect();
|
|
29
|
+
try {
|
|
30
|
+
await pgClient.query(`DROP DATABASE IF EXISTS ${dbConfig.database}_tmp_bis`);
|
|
31
|
+
await pgClient.query(`CREATE DATABASE ${dbConfig.database}_tmp_bis;`);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
await pgClient.end();
|
|
35
|
+
}
|
|
36
|
+
connectionProps.database = `${dbConfig.database}_tmp_bis`;
|
|
37
|
+
pgClient = new pg.Client(connectionProps);
|
|
38
|
+
const endDbClient = new pg.Client({
|
|
39
|
+
...connectionProps,
|
|
40
|
+
database: dbConfig.database,
|
|
41
|
+
});
|
|
42
|
+
await Promise.all([pgClient.connect(), endDbClient.connect()]);
|
|
43
|
+
let sqlMigration = '';
|
|
44
|
+
try {
|
|
45
|
+
console.info('populating with target schema');
|
|
46
|
+
//we manually install postgis and some extensions. We should do a dump of sql extensions but we are waiting for atlasgo to support this (time of writing : 19/03 - atlasgo released extensions support but not in the community version)
|
|
47
|
+
let extensionQuery = `
|
|
48
|
+
create extension if not exists postgis;
|
|
49
|
+
create extension if not exists fuzzystrmatch;
|
|
50
|
+
create extension if not exists postgis_tiger_geocoder ;
|
|
51
|
+
create extension if not exists postgis_raster ;
|
|
52
|
+
create extension if not exists postgis_topology ;
|
|
53
|
+
create extension if not exists address_standardizer ;
|
|
54
|
+
`;
|
|
55
|
+
//there is a problem with the dump in atlas : schema are created with CREATE and not create if not exits...
|
|
56
|
+
//so we insert extension creation after schema creation in order to avoid getting "schema already exists"
|
|
57
|
+
const sqlSchema = fs.readFileSync('./sql/schema.sql').toString();
|
|
58
|
+
const sqlSchemaWithExtension = sqlSchema
|
|
59
|
+
.replace('CREATE TABLE', `${extensionQuery}
|
|
60
|
+
CREATE TABLE`) //only first occurrence will be replaced
|
|
61
|
+
.replace(/CREATE SCHEMA IF NOT EXISTS/g, 'CREATE SCHEMA')
|
|
62
|
+
.replace(/CREATE SCHEMA/g, 'CREATE SCHEMA IF NOT EXISTS'); //ensure all create schema use "if not exists"
|
|
63
|
+
//if target database does not contain any directus tables we just need to populate the base schema.
|
|
64
|
+
const countTablesReq = `
|
|
65
|
+
SELECT COUNT(*)
|
|
66
|
+
FROM information_schema.tables
|
|
67
|
+
WHERE table_schema = 'public' AND table_name LIKE 'directus_%';
|
|
68
|
+
`;
|
|
69
|
+
const countTables = await endDbClient.query(countTablesReq);
|
|
70
|
+
if (Number(countTables.rows[0].count) === 0) {
|
|
71
|
+
//we drop the extension and reapply the schema with directus
|
|
72
|
+
console.info('Target database is empty ; populating it and exiting.');
|
|
73
|
+
//note that finally block will be executed, even if we return
|
|
74
|
+
await endDbClient.query(sqlSchemaWithExtension);
|
|
75
|
+
}
|
|
76
|
+
await pgClient.query(sqlSchemaWithExtension);
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
await pgClient.end();
|
|
80
|
+
await endDbClient.end();
|
|
81
|
+
}
|
|
82
|
+
//we calculate the diff
|
|
83
|
+
const migrationStream = new stream_1.Writable({
|
|
84
|
+
write: (chunk, _encoding, next) => {
|
|
85
|
+
sqlMigration += chunk.toString();
|
|
86
|
+
next();
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
console.info('calculating migration diff');
|
|
90
|
+
const cli = new cli_1.Cli();
|
|
91
|
+
await cli.command('npx', [
|
|
92
|
+
'atlas',
|
|
93
|
+
'schema',
|
|
94
|
+
'diff',
|
|
95
|
+
'--from',
|
|
96
|
+
`postgres://${dbConfig.user}:${dbConfig.pwd}@${dbConfig.host}/${dbConfig.database}?sslmode=${dbConfig.ssl ? 'require' : 'disable'}`,
|
|
97
|
+
'--to',
|
|
98
|
+
`postgres://${dbConfig.user}:${dbConfig.pwd}@${dbConfig.host}/${dbConfig.database}_tmp_bis?sslmode=${dbConfig.ssl ? 'require' : 'disable'}`,
|
|
99
|
+
], {
|
|
100
|
+
env: {
|
|
101
|
+
...process.env,
|
|
102
|
+
ATLAS_NO_UPDATE_NOTIFIER: 'true', //if not set, atlas end a final line with "a new version of atlas is available"
|
|
103
|
+
},
|
|
104
|
+
stdout: migrationStream,
|
|
105
|
+
});
|
|
106
|
+
if (sqlMigration.includes('no changes to be made')) {
|
|
107
|
+
sqlMigration = '';
|
|
108
|
+
}
|
|
109
|
+
//we apply the diffs in schema and data in one transaction
|
|
110
|
+
const pgTmpClient = new pg.Client(connectionProps);
|
|
111
|
+
connectionProps.database = dbConfig.database;
|
|
112
|
+
pgClient = new pg.Client(connectionProps);
|
|
113
|
+
await Promise.all([pgClient.connect(), pgTmpClient.connect()]);
|
|
114
|
+
try {
|
|
115
|
+
await pgClient.query('BEGIN');
|
|
116
|
+
console.info('apply schema');
|
|
117
|
+
await pgClient.query(sqlMigration);
|
|
118
|
+
console.info('apply data');
|
|
119
|
+
//strategy to apply data :
|
|
120
|
+
//- remove the constraint
|
|
121
|
+
//- upsert the data
|
|
122
|
+
//- apply the constraint
|
|
123
|
+
//always be sure the ci user exists
|
|
124
|
+
await pgClient.query(`
|
|
125
|
+
INSERT INTO public.directus_users (id, first_name, last_name, email)
|
|
126
|
+
VALUES ('49bcde5d-90aa-4be8-ab10-f9ae1a07546f', 'CI', 'Webcapsule', 'ci@webcapsule.io')
|
|
127
|
+
ON CONFLICT DO NOTHING
|
|
128
|
+
`);
|
|
129
|
+
//for constraints see this :
|
|
130
|
+
//https://confluence.atlassian.com/kb/how-to-drop-and-recreate-the-database-constraints-on-postgresql-776812450.html
|
|
131
|
+
//we get all the constraints except the primary keys
|
|
132
|
+
console.info('remove the constraints on the table');
|
|
133
|
+
const constraints = await pgClient.query(`
|
|
134
|
+
SELECT nspname, relname, conname, pg_get_constraintdef(pg_constraint.oid)
|
|
135
|
+
FROM pg_constraint
|
|
136
|
+
INNER JOIN pg_class ON conrelid=pg_class.oid
|
|
137
|
+
INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace
|
|
138
|
+
WHERE NOT nspname = 'pg_catalog' AND NOT contype = 'p'
|
|
139
|
+
ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END DESC,contype DESC,nspname DESC,relname DESC,conname DESC
|
|
140
|
+
`);
|
|
141
|
+
//remove the constraints
|
|
142
|
+
//the query above is both for adding or dropping order. For dropping, we need to reverse the order
|
|
143
|
+
for (let i = 0; i < constraints.rows.length; i++) {
|
|
144
|
+
const constraint = constraints.rows[constraints.rows.length - 1 - i];
|
|
145
|
+
await pgClient.query(`
|
|
146
|
+
ALTER TABLE ${constraint.nspname}."${constraint.relname}" DROP CONSTRAINT "${constraint.conname}"
|
|
147
|
+
`);
|
|
148
|
+
}
|
|
149
|
+
//replace data
|
|
150
|
+
console.info('replacing with data');
|
|
151
|
+
const csvFiles = await readdir('./sql/data');
|
|
152
|
+
console.log(csvFiles);
|
|
153
|
+
for (const file of csvFiles) {
|
|
154
|
+
if (file.endsWith('.csv')) {
|
|
155
|
+
const nonParsedTableName = file.slice(0, -4);
|
|
156
|
+
const originalTableName = pg.escapeIdentifier(nonParsedTableName);
|
|
157
|
+
let copyTableName = originalTableName;
|
|
158
|
+
let existingRowsCanCauseConflict = false;
|
|
159
|
+
if (['directus_files', 'directus_folders'].includes(nonParsedTableName)) {
|
|
160
|
+
//delete all files and folders that are inside the "common" folder
|
|
161
|
+
const commonFolderName = 'common';
|
|
162
|
+
const folderKey = {
|
|
163
|
+
directus_files: 'folder',
|
|
164
|
+
directus_folders: 'parent',
|
|
165
|
+
};
|
|
166
|
+
await pgClient.query(`
|
|
167
|
+
WITH RECURSIVE folder_tree AS (
|
|
168
|
+
-- Anchor: the "common" folder
|
|
169
|
+
SELECT id
|
|
170
|
+
FROM directus_folders
|
|
171
|
+
WHERE name = '${commonFolderName}'
|
|
172
|
+
UNION
|
|
173
|
+
-- Recursive step: find subfolders
|
|
174
|
+
SELECT f.id
|
|
175
|
+
FROM directus_folders f
|
|
176
|
+
JOIN folder_tree ft ON f.parent = ft.id
|
|
177
|
+
)
|
|
178
|
+
DELETE FROM public.${copyTableName} AS t
|
|
179
|
+
WHERE t.${folderKey[nonParsedTableName]} IN (SELECT id FROM folder_tree);
|
|
180
|
+
`);
|
|
181
|
+
if (nonParsedTableName === 'directus_folders') {
|
|
182
|
+
existingRowsCanCauseConflict = true;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
await pgClient.query(`DELETE FROM public.${copyTableName}`);
|
|
187
|
+
}
|
|
188
|
+
if (existingRowsCanCauseConflict) {
|
|
189
|
+
//we will import data in a temporary table, then do the insert
|
|
190
|
+
copyTableName = pg.escapeIdentifier(`${nonParsedTableName}_wbce_tmp`);
|
|
191
|
+
await pgClient.query(`CREATE TEMP TABLE ${copyTableName} ON COMMIT DROP AS SELECT * FROM public.${originalTableName} WITH NO DATA`);
|
|
192
|
+
}
|
|
193
|
+
//read first line
|
|
194
|
+
let firstLine = await (0, utils_1.readFirstLineOfFile)(`./sql/data/${file}`);
|
|
195
|
+
firstLine = firstLine
|
|
196
|
+
.split(',')
|
|
197
|
+
.map((c) => `"${c}"`)
|
|
198
|
+
.join(',');
|
|
199
|
+
const ingestStream = pgClient.query((0, pg_copy_streams_1.from)(`COPY ${copyTableName} (${firstLine}) FROM STDIN DELIMITER ',' CSV HEADER`));
|
|
200
|
+
const sourceStream = fs.createReadStream(`./sql/data/${file}`);
|
|
201
|
+
ingestStream.on('close', () => {
|
|
202
|
+
console.info(`ingested ${file}`);
|
|
203
|
+
});
|
|
204
|
+
console.info(`ingesting ${file}`);
|
|
205
|
+
await pipeline(sourceStream, ingestStream);
|
|
206
|
+
if (existingRowsCanCauseConflict) {
|
|
207
|
+
await pgClient.query(`
|
|
208
|
+
DELETE FROM public.${originalTableName}
|
|
209
|
+
WHERE id IN (SELECT id FROM ${copyTableName});
|
|
210
|
+
`);
|
|
211
|
+
await pgClient.query(`
|
|
212
|
+
INSERT INTO public.${originalTableName}
|
|
213
|
+
SELECT * FROM ${copyTableName};
|
|
214
|
+
`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//reestablish the constraints
|
|
219
|
+
console.info('reestablish the constraints');
|
|
220
|
+
for (const constraint of constraints.rows) {
|
|
221
|
+
await pgClient.query(`
|
|
222
|
+
ALTER TABLE ${constraint.nspname}."${constraint.relname}" ADD CONSTRAINT "${constraint.conname}" ${constraint.pg_get_constraintdef}
|
|
223
|
+
`);
|
|
224
|
+
}
|
|
225
|
+
//update the sequences
|
|
226
|
+
//when adding with COPY, all sequences are not up to date
|
|
227
|
+
//we need to find all sequences and then to find the max on the managed column and then to update the sequence
|
|
228
|
+
console.info('find sequences');
|
|
229
|
+
const sequences = await pgClient.query(`
|
|
230
|
+
SELECT n.nspname as "schema",
|
|
231
|
+
c.relname as "name",
|
|
232
|
+
CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 't' THEN 'TOAST table' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'partitioned table' WHEN 'I' THEN 'partitioned index' END as "Type",
|
|
233
|
+
pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
|
|
234
|
+
FROM pg_catalog.pg_class c
|
|
235
|
+
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
|
|
236
|
+
WHERE c.relkind IN ('S','')
|
|
237
|
+
AND n.nspname <> 'pg_catalog'
|
|
238
|
+
AND n.nspname !~ '^pg_toast'
|
|
239
|
+
AND n.nspname <> 'information_schema'
|
|
240
|
+
AND pg_catalog.pg_table_is_visible(c.oid)
|
|
241
|
+
ORDER BY 1,2;
|
|
242
|
+
`);
|
|
243
|
+
for (const seq of sequences.rows) {
|
|
244
|
+
console.info(`find column managed by ${seq.name}`);
|
|
245
|
+
const relation = await pgClient.query(`
|
|
246
|
+
SELECT d.refobjid::regclass as "table", a.attname as "field"
|
|
247
|
+
FROM pg_depend d
|
|
248
|
+
JOIN pg_attribute a ON a.attrelid = d.refobjid
|
|
249
|
+
AND a.attnum = d.refobjsubid
|
|
250
|
+
WHERE d.objid = '${seq.schema}."${seq.name}"'::regclass
|
|
251
|
+
AND d.refobjsubid > 0
|
|
252
|
+
AND d.classid = 'pg_class'::regclass;
|
|
253
|
+
`);
|
|
254
|
+
console.info(`find max of ${relation.rows[0].table} ${relation.rows[0].field}`);
|
|
255
|
+
const max = await pgClient.query(`
|
|
256
|
+
SELECT MAX(${relation.rows[0].field})
|
|
257
|
+
FROM ${relation.rows[0].table}
|
|
258
|
+
`);
|
|
259
|
+
if (max.rows[0].max !== null) {
|
|
260
|
+
console.info('alter the sequence');
|
|
261
|
+
await pgClient.query(`alter sequence ${seq.schema}."${seq.name}" restart with ${max.rows[0].max + 1};`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
await pgClient.query('COMMIT');
|
|
265
|
+
console.log('success');
|
|
266
|
+
}
|
|
267
|
+
catch (e) {
|
|
268
|
+
await pgClient.query('ROLLBACK');
|
|
269
|
+
console.log('error');
|
|
270
|
+
throw e;
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
await pgClient.end();
|
|
274
|
+
await pgTmpClient.end();
|
|
275
|
+
console.log('end of the query');
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktc25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL3NhdmUvYXBwbHktc25hcHNob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFZQSw0Q0E0U0M7QUF4VEQseUJBQXlCO0FBQ3pCLG1DQUE4RDtBQUM5RCwrQkFBaUM7QUFDakMseUJBQXlCO0FBQ3pCLHFEQUFtRDtBQUNuRCwrQkFBNEI7QUFDNUIsbUNBQThDO0FBRTlDLE1BQU0sT0FBTyxHQUFHLElBQUEsZ0JBQVMsRUFBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBQSxnQkFBUyxFQUFDLGlCQUFjLENBQUMsQ0FBQztBQUdwQyxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsUUFNdEM7SUFDQyxJQUFJLFFBQW1CLENBQUM7SUFDeEIsTUFBTSxlQUFlLEdBQW9CO1FBQ3ZDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtRQUNuQixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDbkIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHO1FBQ3RCLFFBQVEsRUFBRSxVQUFVO1FBQ3BCLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNoRSxDQUFDO0lBQ0EsUUFBUTtJQUNSLDBCQUEwQjtJQUMxQixnQ0FBZ0M7SUFDaEMsMEJBQTBCO0lBQzVCLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDMUMsT0FBTyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3pCLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxD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QUFDLENBQUM7Z0JBQ25DLE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FDbEIsa0JBQWtCLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUNsRixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV6QixDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXJCLE1BQU0sQ0FBQyxDQUFDO0lBQ1YsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbEMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBwaXBlbGluZSBhcyBzdHJlYW1QaXBlbGluZSwgV3JpdGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgKiBhcyBwZyBmcm9tICdwZyc7XG5pbXBvcnQgeyBmcm9tIGFzIGNvcHlGcm9tIH0gZnJvbSAncGctY29weS1zdHJlYW1zJztcbmltcG9ydCB7IENsaSB9IGZyb20gJy4vY2xpJztcbmltcG9ydCB7IHJlYWRGaXJzdExpbmVPZkZpbGUgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgcmVhZGRpciA9IHByb21pc2lmeShmcy5yZWFkZGlyKTtcbmNvbnN0IHBpcGVsaW5lID0gcHJvbWlzaWZ5KHN0cmVhbVBpcGVsaW5lKTtcblxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlTUUxTbmFwc2hvdChkYkNvbmZpZzoge1xuICBob3N0OiBzdHJpbmc7XG4gIHVzZXI6IHN0cmluZztcbiAgcHdkOiBzdHJpbmc7XG4gIGRhdGFiYXNlOiBzdHJpbmc7XG4gIHNzbD86IGJvb2xlYW47XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBwZ0NsaWVudDogcGcuQ2xpZW50O1xuICBjb25zdCBjb25uZWN0aW9uUHJvcHM6IHBnLkNsaWVudENvbmZpZyA9IHtcbiAgICB1c2VyOiBkYkNvbmZpZy51c2VyLFxuICAgIGhvc3Q6IGRiQ29uZmlnLmhvc3QsXG4gICAgcGFzc3dvcmQ6IGRiQ29uZmlnLnB3ZCxcbiAgICBkYXRhYmFzZTogJ3Bvc3RncmVzJyxcbiAgICAuLi4oZGJDb25maWcuc3NsID8geyBzc2w6IHsgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9IH0gOiB7fSksXG4gIH07XG4gICAgLy9TQ0hFTUFcbiAgICAvLzEuIHdlIGNyZWF0ZSBhbiBlbXB0eSBkYlxuICAgIC8vMi4gd2UgcG9wdWxhdGUgd2l0aCB0aGUgc2NoZW1hXG4gICAgLy8zLiB3ZSBjYWxjdWxhdGUgdGhlIGRpZmZcbiAgcGdDbGllbnQgPSBuZXcgcGcuQ2xpZW50KGNvbm5lY3Rpb25Qcm9wcyk7XG4gIGNvbnNvbGUuaW5mbygnY3JlYXRpbmcgZW1wdHkgdG1wIGRhdGFiYXNlJyk7XG4gIGF3YWl0IHBnQ2xpZW50LmNvbm5lY3QoKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2Jpc2ApO1xuICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBDUkVBVEUgREFUQUJBU0UgJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2JpcztgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5lbmQoKTtcbiAgfVxuICBjb25uZWN0aW9uUHJvcHMuZGF0YWJhc2UgPSBgJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2Jpc2A7XG4gIHBnQ2xpZW50ID0gbmV3IHBnLkNsaWVudChjb25uZWN0aW9uUHJvcHMpO1xuXG4gIGNvbnN0IGVuZERiQ2xpZW50ID0gbmV3IHBnLkNsaWVudCh7XG4gICAgLi4uY29ubmVjdGlvblByb3BzLFxuICAgIGRhdGFiYXNlOiBkYkNvbmZpZy5kYXRhYmFzZSxcbiAgfSk7XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW3BnQ2xpZW50LmNvbm5lY3QoKSwgZW5kRGJDbGllbnQuY29ubmVjdCgpXSk7XG5cbiAgbGV0IHNxbE1pZ3JhdGlvbiA9ICcnO1xuICB0cnkge1xuICAgIGNvbnNvbGUuaW5mbygncG9wdWxhdGluZyB3aXRoIHRhcmdldCBzY2hlbWEnKTtcbiAgICAvL3dlIG1hbnVhbGx5IGluc3RhbGwgcG9zdGdpcyBhbmQgc29tZSBleHRlbnNpb25zLiBXZSBzaG91bGQgZG8gYSBkdW1wIG9mIHNxbCBleHRlbnNpb25zIGJ1dCB3ZSBhcmUgd2FpdGluZyBmb3IgYXRsYXNnbyB0byBzdXBwb3J0IHRoaXMgKHRpbWUgb2Ygd3JpdGluZyA6IDE5LzAzIC0gYXRsYXNnbyByZWxlYXNlZCBleHRlbnNpb25zIHN1cHBvcnQgYnV0IG5vdCBpbiB0aGUgY29tbXVuaXR5IHZlcnNpb24pXG4gICAgbGV0IGV4dGVuc2lvblF1ZXJ5ID0gYFxuICAgICAgICAgICAgY3JlYXRlIGV4dGVuc2lvbiBpZiBub3QgZXhpc3RzIHBvc3RnaXM7XG4gICAgICAgICAgICBjcmVhdGUgZXh0ZW5zaW9uIGlmIG5vdCBleGlzdHMgZnV6enlzdHJtYXRjaDtcbiAgICAgICAgICAgIGNyZWF0ZSBleHRlbnNpb24gaWYgbm90IGV4aXN0cyBwb3N0Z2lzX3RpZ2VyX2dlb2NvZGVyIDtcbiAgICAgICAgICAgIGNyZWF0ZSBleHRlbnNpb24gaWYgbm90IGV4aXN0cyBwb3N0Z2lzX3Jhc3RlciA7XG4gICAgICAgICAgICBjcmVhdGUgZXh0ZW5zaW9uIGlmIG5vdCBleGlzdHMgcG9zdGdpc190b3BvbG9neSA7XG4gICAgICAgICAgICBjcmVhdGUgZXh0ZW5zaW9uIGlmIG5vdCBleGlzdHMgYWRkcmVzc19zdGFuZGFyZGl6ZXIgO1xuICAgICAgICBgO1xuICAgIC8vdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGR1bXAgaW4gYXRsYXMgOiBzY2hlbWEgYXJlIGNyZWF0ZWQgd2l0aCBDUkVBVEUgYW5kIG5vdCBjcmVhdGUgaWYgbm90IGV4aXRzLi4uXG4gICAgLy9zbyB3ZSBpbnNlcnQgZXh0ZW5zaW9uIGNyZWF0aW9uIGFmdGVyIHNjaGVtYSBjcmVhdGlvbiBpbiBvcmRlciB0byBhdm9pZCBnZXR0aW5nIFwic2NoZW1hIGFscmVhZHkgZXhpc3RzXCJcbiAgICBjb25zdCBzcWxTY2hlbWEgPSBmcy5yZWFkRmlsZVN5bmMoJy4vc3FsL3NjaGVtYS5zcWwnKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHNxbFNjaGVtYVdpdGhFeHRlbnNpb24gPSBzcWxTY2hlbWFcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICAnQ1JFQVRFIFRBQkxFJyxcbiAgICAgICAgYCR7ZXh0ZW5zaW9uUXVlcnl9XG4gICAgICAgICAgICBDUkVBVEUgVEFCTEVgLFxuICAgICAgKSAvL29ubHkgZmlyc3Qgb2NjdXJyZW5jZSB3aWxsIGJlIHJlcGxhY2VkXG4gICAgICAucmVwbGFjZSgvQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTL2csICdDUkVBVEUgU0NIRU1BJylcbiAgICAgIC5yZXBsYWNlKC9DUkVBVEUgU0NIRU1BL2csICdDUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFMnKTsgLy9lbnN1cmUgYWxsIGNyZWF0ZSBzY2hlbWEgdXNlIFwiaWYgbm90IGV4aXN0c1wiXG4gICAgLy9pZiB0YXJnZXQgZGF0YWJhc2UgZG9lcyBub3QgY29udGFpbiBhbnkgZGlyZWN0dXMgdGFibGVzIHdlIGp1c3QgbmVlZCB0byBwb3B1bGF0ZSB0aGUgYmFzZSBzY2hlbWEuXG4gICAgY29uc3QgY291bnRUYWJsZXNSZXEgPSBgXG4gICAgICAgICAgICBTRUxFQ1QgQ09VTlQoKikgXG4gICAgICAgICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgXG4gICAgICAgICAgICBXSEVSRSB0YWJsZV9zY2hlbWEgPSAncHVibGljJyBBTkQgdGFibGVfbmFtZSBMSUtFICdkaXJlY3R1c18lJztcbiAgICAgICAgYDtcbiAgICBjb25zdCBjb3VudFRhYmxlcyA9IGF3YWl0IGVuZERiQ2xpZW50LnF1ZXJ5KGNvdW50VGFibGVzUmVxKTtcbiAgICBpZiAoTnVtYmVyKGNvdW50VGFibGVzLnJvd3NbMF0uY291bnQpID09PSAwKSB7XG4gICAgICAvL3dlIGRyb3AgdGhlIGV4dGVuc2lvbiBhbmQgcmVhcHBseSB0aGUgc2NoZW1hIHdpdGggZGlyZWN0dXNcbiAgICAgIGNvbnNvbGUuaW5mbygnVGFyZ2V0IGRhdGFiYXNlIGlzIGVtcHR5IDsgcG9wdWxhdGluZyBpdCBhbmQgZXhpdGluZy4nKTtcbiAgICAgIC8vbm90ZSB0aGF0IGZpbmFsbHkgYmxvY2sgd2lsbCBiZSBleGVjdXRlZCwgZXZlbiBpZiB3ZSByZXR1cm5cbiAgICAgIGF3YWl0IGVuZERiQ2xpZW50LnF1ZXJ5KHNxbFNjaGVtYVdpdGhFeHRlbnNpb24pO1xuICAgIH1cblxuICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KHNxbFNjaGVtYVdpdGhFeHRlbnNpb24pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHBnQ2xpZW50LmVuZCgpO1xuICAgIGF3YWl0IGVuZERiQ2xpZW50LmVuZCgpO1xuICB9XG5cbiAgLy93ZSBjYWxjdWxhdGUgdGhlIGRpZmZcbiAgY29uc3QgbWlncmF0aW9uU3RyZWFtID0gbmV3IFdyaXRhYmxlKHtcbiAgICB3cml0ZTogKGNodW5rLCBfZW5jb2RpbmcsIG5leHQpID0+IHtcbiAgICAgIHNxbE1pZ3JhdGlvbiArPSBjaHVuay50b1N0cmluZygpO1xuICAgICAgbmV4dCgpO1xuICAgIH0sXG4gIH0pO1xuICBjb25zb2xlLmluZm8oJ2NhbGN1bGF0aW5nIG1pZ3JhdGlvbiBkaWZmJyk7XG4gIGNvbnN0IGNsaSA9IG5ldyBDbGkoKTtcbiAgYXdhaXQgY2xpLmNvbW1hbmQoXG4gICAgJ25weCcsXG4gICAgW1xuICAgICAgJ2F0bGFzJyxcbiAgICAgICdzY2hlbWEnLFxuICAgICAgJ2RpZmYnLFxuICAgICAgJy0tZnJvbScsXG4gICAgICBgcG9zdGdyZXM6Ly8ke2RiQ29uZmlnLnVzZXJ9OiR7ZGJDb25maWcucHdkfUAke2RiQ29uZmlnLmhvc3R9LyR7ZGJDb25maWcuZGF0YWJhc2V9P3NzbG1vZGU9JHtkYkNvbmZpZy5zc2wgPyAncmVxdWlyZScgOiAnZGlzYWJsZSd9YCxcbiAgICAgICctLXRvJyxcbiAgICAgIGBwb3N0Z3JlczovLyR7ZGJDb25maWcudXNlcn06JHtkYkNvbmZpZy5wd2R9QCR7ZGJDb25maWcuaG9zdH0vJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2Jpcz9zc2xtb2RlPSR7ZGJDb25maWcuc3NsID8gJ3JlcXVpcmUnIDogJ2Rpc2FibGUnfWAsXG4gICAgXSxcbiAgICB7XG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIEFUTEFTX05PX1VQREFURV9OT1RJRklFUjogJ3RydWUnLCAvL2lmIG5vdCBzZXQsIGF0bGFzIGVuZCBhIGZpbmFsIGxpbmUgd2l0aCBcImEgbmV3IHZlcnNpb24gb2YgYXRsYXMgaXMgYXZhaWxhYmxlXCJcbiAgICAgIH0sXG4gICAgICBzdGRvdXQ6IG1pZ3JhdGlvblN0cmVhbSxcbiAgICB9LFxuICApO1xuICBpZiAoc3FsTWlncmF0aW9uLmluY2x1ZGVzKCdubyBjaGFuZ2VzIHRvIGJlIG1hZGUnKSkge1xuICAgIHNxbE1pZ3JhdGlvbiA9ICcnO1xuICB9XG4gIC8vd2UgYXBwbHkgdGhlIGRpZmZzIGluIHNjaGVtYSBhbmQgZGF0YSBpbiBvbmUgdHJhbnNhY3Rpb25cbiAgY29uc3QgcGdUbXBDbGllbnQgPSBuZXcgcGcuQ2xpZW50KGNvbm5lY3Rpb25Qcm9wcyk7XG4gIGNvbm5lY3Rpb25Qcm9wcy5kYXRhYmFzZSA9IGRiQ29uZmlnLmRhdGFiYXNlO1xuICBwZ0NsaWVudCA9IG5ldyBwZy5DbGllbnQoY29ubmVjdGlvblByb3BzKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW3BnQ2xpZW50LmNvbm5lY3QoKSwgcGdUbXBDbGllbnQuY29ubmVjdCgpXSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgcGdDbGllbnQucXVlcnkoJ0JFR0lOJyk7XG4gICAgY29uc29sZS5pbmZvKCdhcHBseSBzY2hlbWEnKTtcbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShzcWxNaWdyYXRpb24pO1xuICAgIGNvbnNvbGUuaW5mbygnYXBwbHkgZGF0YScpO1xuICAgIC8vc3RyYXRlZ3kgdG8gYXBwbHkgZGF0YSA6XG4gICAgLy8tIHJlbW92ZSB0aGUgY29uc3RyYWludFxuICAgIC8vLSB1cHNlcnQgdGhlIGRhdGFcbiAgICAvLy0gYXBwbHkgdGhlIGNvbnN0cmFpbnRcblxuICAgIC8vYWx3YXlzIGJlIHN1cmUgdGhlIGNpIHVzZXIgZXhpc3RzXG4gICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYFxuICAgICAgICAgICAgSU5TRVJUIElOVE8gcHVibGljLmRpcmVjdHVzX3VzZXJzIChpZCwgZmlyc3RfbmFtZSwgbGFzdF9uYW1lLCBlbWFpbClcbiAgICAgICAgICAgIFZBTFVFUyAoJzQ5YmNkZTVkLTkwYWEtNGJlOC1hYjEwLWY5YWUxYTA3NTQ2ZicsICdDSScsICdXZWJjYXBzdWxlJywgJ2NpQHdlYmNhcHN1bGUuaW8nKVxuICAgICAgICAgICAgT04gQ09ORkxJQ1QgRE8gTk9USElOR1xuICAgICAgICBgKTtcblxuICAgIC8vZm9yIGNvbnN0cmFpbnRzIHNlZSB0aGlzIDpcbiAgICAvL2h0dHBzOi8vY29uZmx1ZW5jZS5hdGxhc3NpYW4uY29tL2tiL2hvdy10by1kcm9wLWFuZC1yZWNyZWF0ZS10aGUtZGF0YWJhc2UtY29uc3RyYWludHMtb24tcG9zdGdyZXNxbC03NzY4MTI0NTAuaHRtbFxuICAgIC8vd2UgZ2V0IGFsbCB0aGUgY29uc3RyYWludHMgZXhjZXB0IHRoZSBwcmltYXJ5IGtleXNcbiAgICBjb25zb2xlLmluZm8oJ3JlbW92ZSB0aGUgY29uc3RyYWludHMgb24gdGhlIHRhYmxlJyk7XG4gICAgY29uc3QgY29uc3RyYWludHMgPSBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICBTRUxFQ1QgbnNwbmFtZSwgcmVsbmFtZSwgY29ubmFtZSwgcGdfZ2V0X2NvbnN0cmFpbnRkZWYocGdfY29uc3RyYWludC5vaWQpXG4gICAgICAgICAgICBGUk9NIHBnX2NvbnN0cmFpbnRcbiAgICAgICAgICAgIElOTkVSIEpPSU4gcGdfY2xhc3MgT04gY29ucmVsaWQ9cGdfY2xhc3Mub2lkXG4gICAgICAgICAgICBJTk5FUiBKT0lOIHBnX25hbWVzcGFjZSBPTiBwZ19uYW1lc3BhY2Uub2lkPXBnX2NsYXNzLnJlbG5hbWVzcGFjZVxuICAgICAgICAgICAgV0hFUkUgTk9UIG5zcG5hbWUgPSAncGdfY2F0YWxvZycgQU5EIE5PVCBjb250eXBlID0gJ3AnXG4gICAgICAgICAgICBPUkRFUiBCWSBDQVNFIFdIRU4gY29udHlwZT0nZicgVEhFTiAwIEVMU0UgMSBFTkQgREVTQyxjb250eXBlIERFU0MsbnNwbmFtZSBERVNDLHJlbG5hbWUgREVTQyxjb25uYW1lIERFU0NcbiAgICAgICAgYCk7XG5cbiAgICAvL3JlbW92ZSB0aGUgY29uc3RyYWludHNcbiAgICAvL3RoZSBxdWVyeSBhYm92ZSBpcyBib3RoIGZvciBhZGRpbmcgb3IgZHJvcHBpbmcgb3JkZXIuIEZvciBkcm9wcGluZywgd2UgbmVlZCB0byByZXZlcnNlIHRoZSBvcmRlclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uc3RyYWludHMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzLnJvd3NbY29uc3RyYWludHMucm93cy5sZW5ndGggLSAxIC0gaV07XG4gICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICAgICAgQUxURVIgVEFCTEUgJHtjb25zdHJhaW50Lm5zcG5hbWV9LlwiJHtjb25zdHJhaW50LnJlbG5hbWV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtjb25zdHJhaW50LmNvbm5hbWV9XCJcbiAgICAgICAgICAgIGApO1xuICAgIH1cblxuICAgIC8vcmVwbGFjZSBkYXRhXG4gICAgY29uc29sZS5pbmZvKCdyZXBsYWNpbmcgd2l0aCBkYXRhJyk7XG4gICAgY29uc3QgY3N2RmlsZXMgPSBhd2FpdCByZWFkZGlyKCcuL3NxbC9kYXRhJyk7XG4gICAgY29uc29sZS5sb2coY3N2RmlsZXMpO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBjc3ZGaWxlcykge1xuICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoJy5jc3YnKSkge1xuICAgICAgICBjb25zdCBub25QYXJzZWRUYWJsZU5hbWUgPSBmaWxlLnNsaWNlKDAsIC00KTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxUYWJsZU5hbWUgPSBwZy5lc2NhcGVJZGVudGlmaWVyKG5vblBhcnNlZFRhYmxlTmFtZSk7XG4gICAgICAgIGxldCBjb3B5VGFibGVOYW1lID0gb3JpZ2luYWxUYWJsZU5hbWU7XG4gICAgICAgIGxldCBleGlzdGluZ1Jvd3NDYW5DYXVzZUNvbmZsaWN0ID0gZmFsc2U7XG4gICAgICAgIGlmIChbJ2RpcmVjdHVzX2ZpbGVzJywgJ2RpcmVjdHVzX2ZvbGRlcnMnXS5pbmNsdWRlcyhub25QYXJzZWRUYWJsZU5hbWUpKSB7XG4gICAgICAgICAgLy9kZWxldGUgYWxsIGZpbGVzIGFuZCBmb2xkZXJzIHRoYXQgYXJlIGluc2lkZSB0aGUgXCJjb21tb25cIiBmb2xkZXJcbiAgICAgICAgICBjb25zdCBjb21tb25Gb2xkZXJOYW1lID0gJ2NvbW1vbic7XG4gICAgICAgICAgY29uc3QgZm9sZGVyS2V5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgZGlyZWN0dXNfZmlsZXM6ICdmb2xkZXInLFxuICAgICAgICAgICAgZGlyZWN0dXNfZm9sZGVyczogJ3BhcmVudCcsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgIFxuICAgICAgICAgICAgICAgICAgICAgICAgV0lUSCBSRUNVUlNJVkUgZm9sZGVyX3RyZWUgQVMgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gQW5jaG9yOiB0aGUgXCJjb21tb25cIiBmb2xkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGRpcmVjdHVzX2ZvbGRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBuYW1lID0gJyR7Y29tbW9uRm9sZGVyTmFtZX0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklPTlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFJlY3Vyc2l2ZSBzdGVwOiBmaW5kIHN1YmZvbGRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgZi5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gZGlyZWN0dXNfZm9sZGVycyBmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSk9JTiBmb2xkZXJfdHJlZSBmdCBPTiBmLnBhcmVudCA9IGZ0LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBERUxFVEUgRlJPTSBwdWJsaWMuJHtjb3B5VGFibGVOYW1lfSBBUyB0XG4gICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSB0LiR7Zm9sZGVyS2V5W25vblBhcnNlZFRhYmxlTmFtZV19IElOIChTRUxFQ1QgaWQgRlJPTSBmb2xkZXJfdHJlZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBgKTtcbiAgICAgICAgICBpZiAobm9uUGFyc2VkVGFibGVOYW1lID09PSAnZGlyZWN0dXNfZm9sZGVycycpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nUm93c0NhbkNhdXNlQ29uZmxpY3QgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgREVMRVRFIEZST00gcHVibGljLiR7Y29weVRhYmxlTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhpc3RpbmdSb3dzQ2FuQ2F1c2VDb25mbGljdCkge1xuICAgICAgICAgIC8vd2Ugd2lsbCBpbXBvcnQgZGF0YSBpbiBhIHRlbXBvcmFyeSB0YWJsZSwgdGhlbiBkbyB0aGUgaW5zZXJ0XG4gICAgICAgICAgY29weVRhYmxlTmFtZSA9IHBnLmVzY2FwZUlkZW50aWZpZXIoYCR7bm9uUGFyc2VkVGFibGVOYW1lfV93YmNlX3RtcGApO1xuICAgICAgICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KFxuICAgICAgICAgICAgYENSRUFURSBURU1QIFRBQkxFICR7Y29weVRhYmxlTmFtZX0gT04gQ09NTUlUIERST1AgQVMgU0VMRUNUICogRlJPTSBwdWJsaWMuJHtvcmlnaW5hbFRhYmxlTmFtZX0gV0lUSCBOTyBEQVRBYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vcmVhZCBmaXJzdCBsaW5lXG4gICAgICAgIGxldCBmaXJzdExpbmUgPSBhd2FpdCByZWFkRmlyc3RMaW5lT2ZGaWxlKGAuL3NxbC9kYXRhLyR7ZmlsZX1gKTtcbiAgICAgICAgZmlyc3RMaW5lID0gZmlyc3RMaW5lXG4gICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAubWFwKChjKSA9PiBgXCIke2N9XCJgKVxuICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IGluZ2VzdFN0cmVhbSA9IHBnQ2xpZW50LnF1ZXJ5KFxuICAgICAgICAgIGNvcHlGcm9tKFxuICAgICAgICAgICAgYENPUFkgJHtjb3B5VGFibGVOYW1lfSAoJHtmaXJzdExpbmV9KSAgRlJPTSBTVERJTiAgREVMSU1JVEVSICcsJyBDU1YgSEVBREVSYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzb3VyY2VTdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGAuL3NxbC9kYXRhLyR7ZmlsZX1gKTtcbiAgICAgICAgaW5nZXN0U3RyZWFtLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYGluZ2VzdGVkICR7ZmlsZX1gKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgaW5nZXN0aW5nICR7ZmlsZX1gKTtcblxuICAgICAgICBhd2FpdCBwaXBlbGluZShzb3VyY2VTdHJlYW0sIGluZ2VzdFN0cmVhbSk7XG4gICAgICAgIGlmIChleGlzdGluZ1Jvd3NDYW5DYXVzZUNvbmZsaWN0KSB7XG4gICAgICAgICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYFxuXHRcdFx0XHRcdFx0XHRERUxFVEUgRlJPTSBwdWJsaWMuJHtvcmlnaW5hbFRhYmxlTmFtZX1cblx0XHRcdFx0XHRcdFx0V0hFUkUgaWQgSU4gKFNFTEVDVCBpZCBGUk9NICR7Y29weVRhYmxlTmFtZX0pO1xuXHRcdFx0XHRcdFx0YCk7XG4gICAgICAgICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYFxuXHRcdFx0XHRcdFx0XHRJTlNFUlQgSU5UTyBwdWJsaWMuJHtvcmlnaW5hbFRhYmxlTmFtZX1cblx0XHRcdFx0XHRcdFx0U0VMRUNUICogRlJPTSAke2NvcHlUYWJsZU5hbWV9O1xuXHRcdFx0XHRcdFx0YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL3JlZXN0YWJsaXNoIHRoZSBjb25zdHJhaW50c1xuICAgIGNvbnNvbGUuaW5mbygncmVlc3RhYmxpc2ggdGhlIGNvbnN0cmFpbnRzJyk7XG4gICAgZm9yIChjb25zdCBjb25zdHJhaW50IG9mIGNvbnN0cmFpbnRzLnJvd3MpIHtcbiAgICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcbiAgICAgICAgICAgICAgICBBTFRFUiBUQUJMRSAke2NvbnN0cmFpbnQubnNwbmFtZX0uXCIke2NvbnN0cmFpbnQucmVsbmFtZX1cIiBBREQgQ09OU1RSQUlOVCBcIiR7Y29uc3RyYWludC5jb25uYW1lfVwiICAke2NvbnN0cmFpbnQucGdfZ2V0X2NvbnN0cmFpbnRkZWZ9XG4gICAgICAgICAgICBgKTtcbiAgICB9XG5cbiAgICAvL3VwZGF0ZSB0aGUgc2VxdWVuY2VzXG4gICAgLy93aGVuIGFkZGluZyB3aXRoIENPUFksIGFsbCBzZXF1ZW5jZXMgYXJlIG5vdCB1cCB0byBkYXRlXG4gICAgLy93ZSBuZWVkIHRvIGZpbmQgYWxsIHNlcXVlbmNlcyBhbmQgdGhlbiB0byBmaW5kIHRoZSBtYXggb24gdGhlIG1hbmFnZWQgY29sdW1uIGFuZCB0aGVuIHRvIHVwZGF0ZSB0aGUgc2VxdWVuY2VcblxuICAgIGNvbnNvbGUuaW5mbygnZmluZCBzZXF1ZW5jZXMnKTtcbiAgICBjb25zdCBzZXF1ZW5jZXMgPSBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICBTRUxFQ1Qgbi5uc3BuYW1lIGFzIFwic2NoZW1hXCIsXG4gICAgICAgICAgICAgICAgYy5yZWxuYW1lIGFzIFwibmFtZVwiLFxuICAgICAgICAgICAgICAgIENBU0UgYy5yZWxraW5kIFdIRU4gJ3InIFRIRU4gJ3RhYmxlJyBXSEVOICd2JyBUSEVOICd2aWV3JyBXSEVOICdtJyBUSEVOICdtYXRlcmlhbGl6ZWQgdmlldycgV0hFTiAnaScgVEhFTiAnaW5kZXgnIFdIRU4gJ1MnIFRIRU4gJ3NlcXVlbmNlJyBXSEVOICdzJyBUSEVOICdzcGVjaWFsJyBXSEVOICd0JyBUSEVOICdUT0FTVCB0YWJsZScgV0hFTiAnZicgVEhFTiAnZm9yZWlnbiB0YWJsZScgV0hFTiAncCcgVEhFTiAncGFydGl0aW9uZWQgdGFibGUnIFdIRU4gJ0knIFRIRU4gJ3BhcnRpdGlvbmVkIGluZGV4JyBFTkQgYXMgXCJUeXBlXCIsXG4gICAgICAgICAgICAgICAgcGdfY2F0YWxvZy5wZ19nZXRfdXNlcmJ5aWQoYy5yZWxvd25lcikgYXMgXCJPd25lclwiXG4gICAgICAgICAgICBGUk9NIHBnX2NhdGFsb2cucGdfY2xhc3MgY1xuICAgICAgICAgICAgICAgIExFRlQgSk9JTiBwZ19jYXRhbG9nLnBnX25hbWVzcGFjZSBuIE9OIG4ub2lkID0gYy5yZWxuYW1lc3BhY2VcbiAgICAgICAgICAgIFdIRVJFIGMucmVsa2luZCBJTiAoJ1MnLCcnKVxuICAgICAgICAgICAgICAgIEFORCBuLm5zcG5hbWUgPD4gJ3BnX2NhdGFsb2cnXG4gICAgICAgICAgICAgICAgQU5EIG4ubnNwbmFtZSAhfiAnXnBnX3RvYXN0J1xuICAgICAgICAgICAgICAgIEFORCBuLm5zcG5hbWUgPD4gJ2luZm9ybWF0aW9uX3NjaGVtYSdcbiAgICAgICAgICAgIEFORCBwZ19jYXRhbG9nLnBnX3RhYmxlX2lzX3Zpc2libGUoYy5vaWQpXG4gICAgICAgICAgICBPUkRFUiBCWSAxLDI7XG4gICAgICAgIGApO1xuXG4gICAgZm9yIChjb25zdCBzZXEgb2Ygc2VxdWVuY2VzLnJvd3MpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgZmluZCBjb2x1bW4gbWFuYWdlZCBieSAke3NlcS5uYW1lfWApO1xuICAgICAgY29uc3QgcmVsYXRpb24gPSBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICAgICAgU0VMRUNUIGQucmVmb2JqaWQ6OnJlZ2NsYXNzIGFzIFwidGFibGVcIiwgYS5hdHRuYW1lIGFzIFwiZmllbGRcIlxuICAgICAgICAgICAgICAgIEZST00gICBwZ19kZXBlbmQgICAgZFxuICAgICAgICAgICAgICAgIEpPSU4gICBwZ19hdHRyaWJ1dGUgYSBPTiBhLmF0dHJlbGlkID0gZC5yZWZvYmppZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EIGEuYXR0bnVtICAgPSBkLnJlZm9ianN1YmlkXG4gICAgICAgICAgICAgICAgV0hFUkUgIGQub2JqaWQgPSAnJHtzZXEuc2NoZW1hfS5cIiR7c2VxLm5hbWV9XCInOjpyZWdjbGFzc1xuICAgICAgICAgICAgICAgIEFORCAgICBkLnJlZm9ianN1YmlkID4gMFxuICAgICAgICAgICAgICAgIEFORCAgICBkLmNsYXNzaWQgPSAncGdfY2xhc3MnOjpyZWdjbGFzcztcbiAgICAgICAgICAgIGApO1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBgZmluZCBtYXggb2YgJHtyZWxhdGlvbi5yb3dzWzBdLnRhYmxlfSAke3JlbGF0aW9uLnJvd3NbMF0uZmllbGR9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCBtYXggPSBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICAgICAgU0VMRUNUIE1BWCgke3JlbGF0aW9uLnJvd3NbMF0uZmllbGR9KVxuICAgICAgICAgICAgICAgIEZST00gJHtyZWxhdGlvbi5yb3dzWzBdLnRhYmxlfVxuICAgICAgICAgICAgYCk7XG5cbiAgICAgIGlmIChtYXgucm93c1swXS5tYXggIT09IG51bGwpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdhbHRlciB0aGUgc2VxdWVuY2UnKTtcbiAgICAgICAgYXdhaXQgcGdDbGllbnQucXVlcnkoXG4gICAgICAgICAgYGFsdGVyIHNlcXVlbmNlICR7c2VxLnNjaGVtYX0uXCIke3NlcS5uYW1lfVwiIHJlc3RhcnQgd2l0aCAke21heC5yb3dzWzBdLm1heCArIDF9O2AsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcGdDbGllbnQucXVlcnkoJ0NPTU1JVCcpO1xuICAgIGNvbnNvbGUubG9nKCdzdWNjZXNzJyk7XG5cbiAgfSBjYXRjaCAoZSkge1xuICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KCdST0xMQkFDSycpO1xuICAgIGNvbnNvbGUubG9nKCdlcnJvcicpO1xuXG4gICAgdGhyb3cgZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5lbmQoKTtcbiAgICBhd2FpdCBwZ1RtcENsaWVudC5lbmQoKTtcbiAgICBjb25zb2xlLmxvZygnZW5kIG9mIHRoZSBxdWVyeScpO1xuICB9XG59XG5cbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { SpawnOptionsWithoutStdio } from 'child_process';
|
|
2
|
+
import { Writable } from 'stream';
|
|
3
|
+
export declare class Cli {
|
|
4
|
+
command(command: string, args: string[], options?: SpawnOptionsWithoutStdio & {
|
|
5
|
+
stderr?: Writable;
|
|
6
|
+
stdout?: Writable;
|
|
7
|
+
}): Promise<void>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Cli = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
class Cli {
|
|
6
|
+
command(command, args, options = {}) {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const childProcess = (0, child_process_1.spawn)(command, args, { ...options });
|
|
9
|
+
let error;
|
|
10
|
+
childProcess.on('error', (err) => {
|
|
11
|
+
error = new Error();
|
|
12
|
+
error.message = String(err);
|
|
13
|
+
});
|
|
14
|
+
childProcess.stderr.pipe(options.stderr || process.stderr);
|
|
15
|
+
childProcess.stdout.pipe(options.stdout || process.stdout);
|
|
16
|
+
childProcess.on('close', (code) => {
|
|
17
|
+
if (error) {
|
|
18
|
+
reject(error);
|
|
19
|
+
}
|
|
20
|
+
else if (code === 0) {
|
|
21
|
+
resolve();
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
error = new Error();
|
|
25
|
+
error.message = `Process ${command} exited with code ${code}`;
|
|
26
|
+
reject(error);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.Cli = Cli;
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9zYXZlL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBZ0U7QUFHaEUsTUFBYSxHQUFHO0lBQ2QsT0FBTyxDQUNMLE9BQWUsRUFDZixJQUFjLEVBQ2QsVUFHSSxFQUFFO1FBRU4sT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMzQyxNQUFNLFlBQVksR0FBRyxJQUFBLHFCQUFLLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUMxRCxJQUFJLEtBQVksQ0FBQztZQUNqQixZQUFZLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUMvQixLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDcEIsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFDLENBQUM7WUFDSCxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzRCxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUUzRCxZQUFZLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNoQyxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEIsQ0FBQztxQkFBTSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdEIsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztxQkFBTSxDQUFDO29CQUNOLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNwQixLQUFLLENBQUMsT0FBTyxHQUFHLFdBQVcsT0FBTyxxQkFBcUIsSUFBSSxFQUFFLENBQUM7b0JBQzlELE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFoQ0Qsa0JBZ0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3Bhd24sIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgV3JpdGFibGUgfSBmcm9tICdzdHJlYW0nO1xuXG5leHBvcnQgY2xhc3MgQ2xpIHtcbiAgY29tbWFuZChcbiAgICBjb21tYW5kOiBzdHJpbmcsXG4gICAgYXJnczogc3RyaW5nW10sXG4gICAgb3B0aW9uczogU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvICYge1xuICAgICAgc3RkZXJyPzogV3JpdGFibGU7XG4gICAgICBzdGRvdXQ/OiBXcml0YWJsZTtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZFByb2Nlc3MgPSBzcGF3bihjb21tYW5kLCBhcmdzLCB7IC4uLm9wdGlvbnMgfSk7XG4gICAgICBsZXQgZXJyb3I6IEVycm9yO1xuICAgICAgY2hpbGRQcm9jZXNzLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgZXJyb3IubWVzc2FnZSA9IFN0cmluZyhlcnIpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZFByb2Nlc3Muc3RkZXJyLnBpcGUob3B0aW9ucy5zdGRlcnIgfHwgcHJvY2Vzcy5zdGRlcnIpO1xuICAgICAgY2hpbGRQcm9jZXNzLnN0ZG91dC5waXBlKG9wdGlvbnMuc3Rkb3V0IHx8IHByb2Nlc3Muc3Rkb3V0KTtcblxuICAgICAgY2hpbGRQcm9jZXNzLm9uKCdjbG9zZScsIChjb2RlKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcigpO1xuICAgICAgICAgIGVycm9yLm1lc3NhZ2UgPSBgUHJvY2VzcyAke2NvbW1hbmR9IGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWA7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn0iXX0=
|
|
File without changes
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const deepCopy: (src: Record<string, any>, dest: Record<string, any>) => void;
|
|
2
|
+
export declare const testPath: (obj: any, ...args: string[]) => any;
|
|
3
|
+
export type BasicType = 'string' | 'number' | 'bigint' | 'boolean' | 'symbol' | 'undefined' | 'object' | 'function' | 'array' | 'date' | 'buffer';
|
|
4
|
+
export declare const getBasicType: (object: any) => BasicType;
|
|
5
|
+
export declare const getStackTracePaths: () => string[];
|
|
6
|
+
export declare const readFirstLineOfFile: (filePath: string) => Promise<string>;
|
|
7
|
+
export declare const readCsvFile: (filePath: string) => Promise<{
|
|
8
|
+
[key: string]: string;
|
|
9
|
+
}[]>;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readCsvFile = exports.readFirstLineOfFile = exports.getStackTracePaths = exports.getBasicType = exports.testPath = exports.deepCopy = void 0;
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const util_1 = require("util");
|
|
6
|
+
const readFile = (0, util_1.promisify)(fs.readFile);
|
|
7
|
+
const deepCopy = (src, dest) => {
|
|
8
|
+
for (const key in src) {
|
|
9
|
+
if (typeof src[key] !== 'object') {
|
|
10
|
+
//est une feuille
|
|
11
|
+
dest[key] = src[key];
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
if (!dest[key]) {
|
|
15
|
+
if (Array.isArray(src[key])) {
|
|
16
|
+
dest[key] = [];
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
dest[key] = {};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
(0, exports.deepCopy)(src[key], dest[key]);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
exports.deepCopy = deepCopy;
|
|
27
|
+
const testPath = (obj, ...args) => {
|
|
28
|
+
for (const key of args) {
|
|
29
|
+
if (obj && obj[key] !== undefined) {
|
|
30
|
+
// false positive : https://semgrep.dev/r?q=javascript.lang.security.audit.prototype-pollution.prototype-pollution-loop.prototype-pollution-loop
|
|
31
|
+
// we are read-only here
|
|
32
|
+
obj = obj[key]; // nosemgrep
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return obj;
|
|
39
|
+
};
|
|
40
|
+
exports.testPath = testPath;
|
|
41
|
+
const getBasicType = (object) => {
|
|
42
|
+
let currentType = typeof object;
|
|
43
|
+
if (currentType === 'object') {
|
|
44
|
+
if (object instanceof Date) {
|
|
45
|
+
currentType = 'date';
|
|
46
|
+
}
|
|
47
|
+
if (Array.isArray(object)) {
|
|
48
|
+
currentType = 'array';
|
|
49
|
+
}
|
|
50
|
+
if (Buffer.isBuffer(object)) {
|
|
51
|
+
currentType = 'buffer';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return currentType;
|
|
55
|
+
};
|
|
56
|
+
exports.getBasicType = getBasicType;
|
|
57
|
+
const getStackTracePaths = () => {
|
|
58
|
+
/**
|
|
59
|
+
* The pattern of an error is :
|
|
60
|
+
* Error: this is a test to see stack traces!
|
|
61
|
+
at __decorate (/home/louis/webcapsule/app/app-api/src/actions/action-manager.ts:5:95)
|
|
62
|
+
at Object.<anonymous> (/home/louis/webcapsule/app/app-api/src/actions/action-manager.ts:601:27)
|
|
63
|
+
at Module._compile (node:internal/modules/cjs/loader:1105:14)
|
|
64
|
+
*
|
|
65
|
+
*/
|
|
66
|
+
const error = new Error();
|
|
67
|
+
const stacks = error.stack.split('\n');
|
|
68
|
+
stacks.shift();
|
|
69
|
+
const result = [];
|
|
70
|
+
for (let i = 0; i < stacks.length; i++) {
|
|
71
|
+
const line = stacks[i];
|
|
72
|
+
const pattern = /at[^(]+(?:\(([^)]+):[0-9]+:[0-9]+\)|(.*))/;
|
|
73
|
+
result.push(pattern.exec(line)[1]);
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
};
|
|
77
|
+
exports.getStackTracePaths = getStackTracePaths;
|
|
78
|
+
const readFirstLineOfFile = (filePath) => {
|
|
79
|
+
return new Promise((resolve, reject) => {
|
|
80
|
+
const rs = fs.createReadStream(filePath);
|
|
81
|
+
let acc = '';
|
|
82
|
+
let pos = 0;
|
|
83
|
+
let index;
|
|
84
|
+
rs
|
|
85
|
+
.on('data', (chunk) => {
|
|
86
|
+
acc += chunk;
|
|
87
|
+
index = chunk.indexOf('\n');
|
|
88
|
+
if (index === -1) {
|
|
89
|
+
pos += chunk.length;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
pos += index;
|
|
93
|
+
rs.close();
|
|
94
|
+
}
|
|
95
|
+
})
|
|
96
|
+
.on('close', () => resolve(acc.slice(acc.charCodeAt(0) === 0xfeff ? 1 : 0, pos)))
|
|
97
|
+
.on('error', (err) => reject(err));
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
exports.readFirstLineOfFile = readFirstLineOfFile;
|
|
101
|
+
const readCsvFile = async (filePath) => {
|
|
102
|
+
const result = [];
|
|
103
|
+
const fileContent = (await readFile(filePath)).toString();
|
|
104
|
+
const lines = fileContent
|
|
105
|
+
.split('\n')
|
|
106
|
+
.map((line) => line.trim())
|
|
107
|
+
.filter((line) => line); // Trim and remove empty lines;
|
|
108
|
+
const firstLine = lines[0].split(',').map((key) => key.trim());
|
|
109
|
+
const otherLines = lines.slice(1);
|
|
110
|
+
for (const line of otherLines) {
|
|
111
|
+
const values = line.split(',');
|
|
112
|
+
const item = {};
|
|
113
|
+
for (let i = 0; i < values.length; i++) {
|
|
114
|
+
const key = firstLine[i];
|
|
115
|
+
const value = values[i];
|
|
116
|
+
item[key] = value;
|
|
117
|
+
}
|
|
118
|
+
result.push(item);
|
|
119
|
+
}
|
|
120
|
+
return result;
|
|
121
|
+
};
|
|
122
|
+
exports.readCsvFile = readCsvFile;
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL3NhdmUvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUJBQXlCO0FBQ3pCLCtCQUFpQztBQUVqQyxNQUFNLFFBQVEsR0FBRyxJQUFBLGdCQUFTLEVBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRWpDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBd0IsRUFBRSxJQUF5QixFQUFFLEVBQUU7SUFDOUUsS0FBSyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLGlCQUFpQjtZQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNmLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNqQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDakIsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFBLGdCQUFRLEVBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBaEJXLFFBQUEsUUFBUSxZQWdCbkI7QUFFSyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQVEsRUFBRSxHQUFHLElBQWMsRUFBRSxFQUFFO0lBQ3RELEtBQUssTUFB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LElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQTJCLEVBQUUsQ0FBQztRQUN4QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNwQixDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBeEJXLFFBQUEsV0FBVyxlQXdCdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJztcblxuY29uc3QgcmVhZEZpbGUgPSBwcm9taXNpZnkoZnMucmVhZEZpbGUpO1xuXG5leHBvcnQgY29uc3QgZGVlcENvcHkgPSAoc3JjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBkZXN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB7XG4gIGZvciAoY29uc3Qga2V5IGluIHNyYykge1xuICAgIGlmICh0eXBlb2Ygc3JjW2tleV0gIT09ICdvYmplY3QnKSB7XG4gICAgICAvL2VzdCB1bmUgZmV1aWxsZVxuICAgICAgZGVzdFtrZXldID0gc3JjW2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZGVzdFtrZXldKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNyY1trZXldKSkge1xuICAgICAgICAgIGRlc3Rba2V5XSA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlc3Rba2V5XSA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZWVwQ29weShzcmNba2V5XSwgZGVzdFtrZXldKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB0ZXN0UGF0aCA9IChvYmo6IGFueSwgLi4uYXJnczogc3RyaW5nW10pID0+IHtcbiAgZm9yIChjb25zdCBrZXkgb2YgYXJncykge1xuICAgIGlmIChvYmogJiYgb2JqW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZmFsc2UgcG9zaXRpdmUgOiBodHRwczovL3NlbWdyZXAuZGV2L3I/cT1qYXZhc2NyaXB0Lmxhbmcuc2VjdXJpdHkuYXVkaXQucHJvdG90eXBlLXBvbGx1dGlvbi5wcm90b3R5cGUtcG9sbHV0aW9uLWxvb3AucHJvdG90eXBlLXBvbGx1dGlvbi1sb29wXG4gICAgICAvLyB3ZSBhcmUgcmVhZC1vbmx5IGhlcmVcbiAgICAgIG9iaiA9IG9ialtrZXldOyAvLyBub3NlbWdyZXBcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufTtcblxuZXhwb3J0IHR5cGUgQmFzaWNUeXBlID1cblx0fCAnc3RyaW5nJ1xuXHR8ICdudW1iZXInXG5cdHwgJ2JpZ2ludCdcblx0fCAnYm9vbGVhbidcblx0fCAnc3ltYm9sJ1xuXHR8ICd1bmRlZmluZWQnXG5cdHwgJ29iamVjdCdcblx0fCAnZnVuY3Rpb24nXG5cdHwgJ2FycmF5J1xuXHR8ICdkYXRlJ1xuXHR8ICdidWZmZXInO1xuXG5leHBvcnQgY29uc3QgZ2V0QmFzaWNUeXBlID0gKG9iamVjdDogYW55KTogQmFzaWNUeXBlID0+IHtcbiAgbGV0IGN1cnJlbnRUeXBlOiBCYXNpY1R5cGUgPSB0eXBlb2Ygb2JqZWN0O1xuICBpZiAoY3VycmVudFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIGN1cnJlbnRUeXBlID0gJ2RhdGUnO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICBjdXJyZW50VHlwZSA9ICdhcnJheSc7XG4gICAgfVxuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqZWN0KSkge1xuICAgICAgY3VycmVudFR5cGUgPSAnYnVmZmVyJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnRUeXBlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFN0YWNrVHJhY2VQYXRoczogKCkgPT4gc3RyaW5nW10gPSAoKSA9PiB7XG4gIC8qKlxuICAgICAqIFRoZSBwYXR0ZXJuIG9mIGFuIGVycm9yIGlzIDpcbiAgICAgKiBFcnJvcjogdGhpcyBpcyBhIHRlc3QgdG8gc2VlIHN0YWNrIHRyYWNlcyFcbiAgICAgICAgYXQgX19kZWNvcmF0ZSAoL2hvbWUvbG91aXMvd2ViY2Fwc3VsZS9hcHAvYXBwLWFwaS9zcmMvYWN0aW9ucy9hY3Rpb24tbWFuYWdlci50czo1Ojk1KVxuICAgICAgICBhdCBPYmplY3QuPGFub255bW91cz4gKC9ob21lL2xvdWlzL3dlYmNhcHN1bGUvYXBwL2FwcC1hcGkvc3JjL2FjdGlvbnMvYWN0aW9uLW1hbmFnZXIudHM6NjAxOjI3KVxuICAgICAgICBhdCBNb2R1bGUuX2NvbXBpbGUgKG5vZGU6aW50ZXJuYWwvbW9kdWxlcy9janMvbG9hZGVyOjExMDU6MTQpXG4gICAgICpcbiAgICAgKi9cbiAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgY29uc3Qgc3RhY2tzID0gZXJyb3Iuc3RhY2shLnNwbGl0KCdcXG4nKTtcbiAgc3RhY2tzLnNoaWZ0KCk7XG4gIGNvbnN0IHJlc3VsdCA6IHN0cmluZ1tdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbGluZSA9IHN0YWNrc1tpXTtcbiAgICBjb25zdCBwYXR0ZXJuID0gL2F0W14oXSsoPzpcXCgoW14pXSspOlswLTldKzpbMC05XStcXCl8KC4qKSkvO1xuICAgIHJlc3VsdC5wdXNoKHBhdHRlcm4uZXhlYyhsaW5lKSFbMV0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3QgcmVhZEZpcnN0TGluZU9mRmlsZTogKGZpbGVQYXRoOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPiA9IChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbikgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoKTtcbiAgICBsZXQgYWNjID0gJyc7XG4gICAgbGV0IHBvcyA9IDA7XG4gICAgbGV0IGluZGV4O1xuICAgIHJzXG4gICAgICAub24oJ2RhdGEnLCAoY2h1bms6IHN0cmluZyB8IEJ1ZmZlcikgPT4ge1xuICAgICAgICBhY2MgKz0gY2h1bms7XG4gICAgICAgIGluZGV4ID0gY2h1bmsuaW5kZXhPZignXFxuJyk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBvcyArPSBpbmRleDtcbiAgICAgICAgICBycy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdjbG9zZScsICgpID0+XG4gICAgICAgIHJlc29sdmUoYWNjLnNsaWNlKGFjYy5jaGFyQ29kZUF0KDApID09PSAweGZlZmYgPyAxIDogMCwgcG9zKSksXG4gICAgICApXG4gICAgICAub24oJ2Vycm9yJywgKGVycjogRXJyb3IpID0+IHJlamVjdChlcnIpKTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVhZENzdkZpbGU6IChmaWxlUGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPFxuICB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICB9W11cbj4gPSBhc3luYyAoZmlsZVBhdGgpID0+IHtcbiAgY29uc3QgcmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9W10gPSBbXTtcbiAgY29uc3QgZmlsZUNvbnRlbnQgPSAoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgpKS50b1N0cmluZygpO1xuICBjb25zdCBsaW5lcyA9IGZpbGVDb250ZW50XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmU6IHN0cmluZykgPT4gbGluZS50cmltKCkpXG4gICAgLmZpbHRlcigobGluZTogc3RyaW5nKSA9PiBsaW5lKTsgLy8gVHJpbSBhbmQgcmVtb3ZlIGVtcHR5IGxpbmVzO1xuICBjb25zdCBmaXJzdExpbmUgPSBsaW5lc1swXS5zcGxpdCgnLCcpLm1hcCgoa2V5OiBzdHJpbmcpID0+IGtleS50cmltKCkpO1xuICBjb25zdCBvdGhlckxpbmVzID0gbGluZXMuc2xpY2UoMSk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBvdGhlckxpbmVzKSB7XG4gICAgY29uc3QgdmFsdWVzID0gbGluZS5zcGxpdCgnLCcpO1xuICAgIGNvbnN0IGl0ZW06IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gZmlyc3RMaW5lW2ldO1xuICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG4gICAgICBpdGVtW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmVzdWx0LnB1c2goaXRlbSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07Il19
|