@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.
Files changed (125) hide show
  1. package/.jsii +552 -0
  2. package/API.md +8472 -0
  3. package/CHANGELOG.md +189 -0
  4. package/LICENSE +674 -0
  5. package/README.md +82 -0
  6. package/lib/cli/commands/init.d.ts +1 -0
  7. package/lib/cli/commands/init.js +8 -0
  8. package/lib/cli/commands/save/apply-snapshot.d.ts +7 -0
  9. package/lib/cli/commands/save/apply-snapshot.js +278 -0
  10. package/lib/cli/commands/save/cli.d.ts +8 -0
  11. package/lib/cli/commands/save/cli.js +33 -0
  12. package/lib/cli/commands/save/draft.d.ts +0 -0
  13. package/lib/cli/commands/save/draft.js +2 -0
  14. package/lib/cli/commands/save/utils.d.ts +9 -0
  15. package/lib/cli/commands/save/utils.js +123 -0
  16. package/lib/cli/commands/sync.d.ts +5 -0
  17. package/lib/cli/commands/sync.js +13 -0
  18. package/lib/cli/index.d.ts +2 -0
  19. package/lib/cli/index.js +44 -0
  20. package/lib/index.d.ts +59 -0
  21. package/lib/index.js +322 -0
  22. package/node_modules/@types/node/LICENSE +21 -0
  23. package/node_modules/@types/node/README.md +16 -0
  24. package/node_modules/@types/node/assert.d.ts +117 -0
  25. package/node_modules/@types/node/async_hooks.d.ts +246 -0
  26. package/node_modules/@types/node/buffer.d.ts +22 -0
  27. package/node_modules/@types/node/child_process.d.ts +507 -0
  28. package/node_modules/@types/node/cluster.d.ts +260 -0
  29. package/node_modules/@types/node/console.d.ts +3 -0
  30. package/node_modules/@types/node/constants.d.ts +448 -0
  31. package/node_modules/@types/node/crypto.d.ts +1183 -0
  32. package/node_modules/@types/node/dgram.d.ts +118 -0
  33. package/node_modules/@types/node/dns.d.ts +372 -0
  34. package/node_modules/@types/node/domain.d.ts +16 -0
  35. package/node_modules/@types/node/events.d.ts +47 -0
  36. package/node_modules/@types/node/fs.d.ts +2567 -0
  37. package/node_modules/@types/node/globals.d.ts +1351 -0
  38. package/node_modules/@types/node/globals.global.d.ts +1 -0
  39. package/node_modules/@types/node/http.d.ts +456 -0
  40. package/node_modules/@types/node/http2.d.ts +952 -0
  41. package/node_modules/@types/node/https.d.ts +156 -0
  42. package/node_modules/@types/node/index.d.ts +91 -0
  43. package/node_modules/@types/node/inspector.d.ts +3040 -0
  44. package/node_modules/@types/node/module.d.ts +3 -0
  45. package/node_modules/@types/node/net.d.ts +290 -0
  46. package/node_modules/@types/node/os.d.ts +263 -0
  47. package/node_modules/@types/node/package.json +195 -0
  48. package/node_modules/@types/node/path.d.ts +159 -0
  49. package/node_modules/@types/node/perf_hooks.d.ts +259 -0
  50. package/node_modules/@types/node/process.d.ts +15 -0
  51. package/node_modules/@types/node/punycode.d.ts +75 -0
  52. package/node_modules/@types/node/querystring.d.ts +29 -0
  53. package/node_modules/@types/node/readline.d.ts +158 -0
  54. package/node_modules/@types/node/repl.d.ts +390 -0
  55. package/node_modules/@types/node/stream.d.ts +334 -0
  56. package/node_modules/@types/node/string_decoder.d.ts +7 -0
  57. package/node_modules/@types/node/timers.d.ts +16 -0
  58. package/node_modules/@types/node/tls.d.ts +713 -0
  59. package/node_modules/@types/node/trace_events.d.ts +61 -0
  60. package/node_modules/@types/node/tty.d.ts +66 -0
  61. package/node_modules/@types/node/url.d.ts +147 -0
  62. package/node_modules/@types/node/util.d.ts +200 -0
  63. package/node_modules/@types/node/v8.d.ts +197 -0
  64. package/node_modules/@types/node/vm.d.ts +112 -0
  65. package/node_modules/@types/node/wasi.d.ts +55 -0
  66. package/node_modules/@types/node/worker_threads.d.ts +207 -0
  67. package/node_modules/@types/node/zlib.d.ts +356 -0
  68. package/node_modules/@types/pg/LICENSE +21 -0
  69. package/node_modules/@types/pg/README.md +15 -0
  70. package/node_modules/@types/pg/index.d.mts +56 -0
  71. package/node_modules/@types/pg/index.d.ts +360 -0
  72. package/node_modules/@types/pg/lib/connection-parameters.d.ts +58 -0
  73. package/node_modules/@types/pg/lib/type-overrides.d.ts +77 -0
  74. package/node_modules/@types/pg/package.json +38 -0
  75. package/node_modules/@types/pg-copy-streams/LICENSE +21 -0
  76. package/node_modules/@types/pg-copy-streams/README.md +38 -0
  77. package/node_modules/@types/pg-copy-streams/index.d.ts +19 -0
  78. package/node_modules/@types/pg-copy-streams/package.json +28 -0
  79. package/node_modules/commander/LICENSE +22 -0
  80. package/node_modules/commander/Readme.md +1176 -0
  81. package/node_modules/commander/esm.mjs +16 -0
  82. package/node_modules/commander/index.js +24 -0
  83. package/node_modules/commander/lib/argument.js +150 -0
  84. package/node_modules/commander/lib/command.js +2777 -0
  85. package/node_modules/commander/lib/error.js +39 -0
  86. package/node_modules/commander/lib/help.js +747 -0
  87. package/node_modules/commander/lib/option.js +380 -0
  88. package/node_modules/commander/lib/suggestSimilar.js +101 -0
  89. package/node_modules/commander/package-support.json +19 -0
  90. package/node_modules/commander/package.json +82 -0
  91. package/node_modules/commander/typings/esm.d.mts +3 -0
  92. package/node_modules/commander/typings/index.d.ts +1113 -0
  93. package/node_modules/pg/LICENSE +21 -0
  94. package/node_modules/pg/README.md +95 -0
  95. package/node_modules/pg/esm/index.mjs +20 -0
  96. package/node_modules/pg/lib/client.js +743 -0
  97. package/node_modules/pg/lib/connection-parameters.js +171 -0
  98. package/node_modules/pg/lib/connection.js +221 -0
  99. package/node_modules/pg/lib/crypto/cert-signatures.js +122 -0
  100. package/node_modules/pg/lib/crypto/sasl.js +212 -0
  101. package/node_modules/pg/lib/crypto/utils-legacy.js +43 -0
  102. package/node_modules/pg/lib/crypto/utils-webcrypto.js +89 -0
  103. package/node_modules/pg/lib/crypto/utils.js +9 -0
  104. package/node_modules/pg/lib/defaults.js +91 -0
  105. package/node_modules/pg/lib/index.js +73 -0
  106. package/node_modules/pg/lib/native/client.js +323 -0
  107. package/node_modules/pg/lib/native/index.js +2 -0
  108. package/node_modules/pg/lib/native/query.js +165 -0
  109. package/node_modules/pg/lib/query.js +252 -0
  110. package/node_modules/pg/lib/result.js +109 -0
  111. package/node_modules/pg/lib/stream.js +83 -0
  112. package/node_modules/pg/lib/type-overrides.js +35 -0
  113. package/node_modules/pg/lib/utils.js +217 -0
  114. package/node_modules/pg/package.json +76 -0
  115. package/node_modules/pg-copy-streams/Makefile +19 -0
  116. package/node_modules/pg-copy-streams/README.md +315 -0
  117. package/node_modules/pg-copy-streams/copy-both.js +267 -0
  118. package/node_modules/pg-copy-streams/copy-from.js +173 -0
  119. package/node_modules/pg-copy-streams/copy-to.js +177 -0
  120. package/node_modules/pg-copy-streams/eslint.config.js +55 -0
  121. package/node_modules/pg-copy-streams/index.js +17 -0
  122. package/node_modules/pg-copy-streams/message-formats.js +27 -0
  123. package/node_modules/pg-copy-streams/obuf.js +376 -0
  124. package/node_modules/pg-copy-streams/package.json +51 -0
  125. 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,7 @@
1
+ export declare function applySQLSnapshot(dbConfig: {
2
+ host: string;
3
+ user: string;
4
+ pwd: string;
5
+ database: string;
6
+ ssl?: boolean;
7
+ }): Promise<void>;
@@ -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,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL3NhdmUvZHJhZnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIiJdfQ==
@@ -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