velocious 1.0.504 → 1.0.505

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.
@@ -52,6 +52,23 @@ export default class VelociousDatabaseDriversSqliteTableRebuilder {
52
52
  const targetTableData = this.targetTableData
53
53
  const previousTargetName = targetTableData.getName()
54
54
 
55
+ // Column-level `index: true` indexes are named after the table they are created with, and
56
+ // ALTER TABLE ... RENAME does not rename indexes - creating them inside the temp table's
57
+ // CREATE would leak the temp rebuild name permanently. Strip the flags for the temp CREATE
58
+ // and create those indexes explicitly on the temp table with their FINAL names BEFORE the
59
+ // copy: index names are database-global and survive the rename, and a violation (e.g. a new
60
+ // unique index over rows that all receive the same default) fails during INSERT...SELECT,
61
+ // while the original table still exists - never after the swap.
62
+ /** @type {Array<{column: import("../../table-data/table-column.js").default, index: ?, indexArgs: ?}>} */
63
+ const strippedColumnIndexes = []
64
+
65
+ for (const column of targetTableData.getColumns()) {
66
+ if (!column.getIndex()) continue
67
+
68
+ strippedColumnIndexes.push({column, index: column.getIndex(), indexArgs: column.getIndexArgs()})
69
+ column.setIndex(false)
70
+ }
71
+
55
72
  targetTableData.setName(tempTableName)
56
73
 
57
74
  let createTableSQLs
@@ -60,6 +77,8 @@ export default class VelociousDatabaseDriversSqliteTableRebuilder {
60
77
  createTableSQLs = await driver.createTableSql(targetTableData)
61
78
  } finally {
62
79
  targetTableData.setName(previousTargetName)
80
+
81
+ for (const {column, index} of strippedColumnIndexes) column.setIndex(index)
63
82
  }
64
83
 
65
84
  const newColumnsSQL = this.columnPairs.map(([, newName]) => options.quoteColumnName(newName)).join(", ")
@@ -69,6 +88,22 @@ export default class VelociousDatabaseDriversSqliteTableRebuilder {
69
88
 
70
89
  for (const sql of createTableSQLs) sqls.push(sql)
71
90
 
91
+ for (const {column, indexArgs} of strippedColumnIndexes) {
92
+ const {unique, ...restIndexArgs} = indexArgs || {}
93
+
94
+ restArgsError(restIndexArgs)
95
+
96
+ const createIndexSQLs = await new CreateIndexBase({
97
+ columns: [column.getName()],
98
+ driver,
99
+ name: `index_on_${originalTableName}_${column.getName()}`,
100
+ tableName: tempTableName,
101
+ unique
102
+ }).toSQLs()
103
+
104
+ for (const sql of createIndexSQLs) sqls.push(sql)
105
+ }
106
+
72
107
  if (this.columnPairs.length > 0) {
73
108
  sqls.push(
74
109
  `INSERT INTO ${options.quoteTableName(tempTableName)} (${newColumnsSQL}) ` +
@@ -1 +1 @@
1
- {"version":3,"file":"table-rebuilder.d.ts","sourceRoot":"","sources":["../../../../../src/database/drivers/sqlite/table-rebuilder.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;GAeG;AACH;IACE;;;;;;;OAOG;IACH,sFALG;QAA2C,MAAM,EAAzC,OAAO,YAAY,EAAE,OAAO;QACf,iBAAiB,EAA9B,MAAM;QACU,eAAe,EAA/B,SAAS;QACqB,WAAW,EAAzC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACjC,EAUA;IAJC,qCAAoB;IACpB,0BAA0C;IAC1C,2BAAsC;IACtC,gCAA8B;IAGhC;;;OAGG;IACH,UAFa,OAAO,CAAC,MAAM,EAAE,CAAC,CAkD7B;CACF;sBA3FqB,2BAA2B"}
1
+ {"version":3,"file":"table-rebuilder.d.ts","sourceRoot":"","sources":["../../../../../src/database/drivers/sqlite/table-rebuilder.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;GAeG;AACH;IACE;;;;;;;OAOG;IACH,sFALG;QAA2C,MAAM,EAAzC,OAAO,YAAY,EAAE,OAAO;QACf,iBAAiB,EAA9B,MAAM;QACU,eAAe,EAA/B,SAAS;QACqB,WAAW,EAAzC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACjC,EAUA;IAJC,qCAAoB;IACpB,0BAA0C;IAC1C,2BAAsC;IACtC,gCAA8B;IAGhC;;;OAGG;IACH,UAFa,OAAO,CAAC,MAAM,EAAE,CAAC,CAqF7B;CACF;sBA9HqB,2BAA2B"}
@@ -47,6 +47,21 @@ export default class VelociousDatabaseDriversSqliteTableRebuilder {
47
47
  const tempTableName = `${originalTableName}_velocious_rebuild`;
48
48
  const targetTableData = this.targetTableData;
49
49
  const previousTargetName = targetTableData.getName();
50
+ // Column-level `index: true` indexes are named after the table they are created with, and
51
+ // ALTER TABLE ... RENAME does not rename indexes - creating them inside the temp table's
52
+ // CREATE would leak the temp rebuild name permanently. Strip the flags for the temp CREATE
53
+ // and create those indexes explicitly on the temp table with their FINAL names BEFORE the
54
+ // copy: index names are database-global and survive the rename, and a violation (e.g. a new
55
+ // unique index over rows that all receive the same default) fails during INSERT...SELECT,
56
+ // while the original table still exists - never after the swap.
57
+ /** @type {Array<{column: import("../../table-data/table-column.js").default, index: ?, indexArgs: ?}>} */
58
+ const strippedColumnIndexes = [];
59
+ for (const column of targetTableData.getColumns()) {
60
+ if (!column.getIndex())
61
+ continue;
62
+ strippedColumnIndexes.push({ column, index: column.getIndex(), indexArgs: column.getIndexArgs() });
63
+ column.setIndex(false);
64
+ }
50
65
  targetTableData.setName(tempTableName);
51
66
  let createTableSQLs;
52
67
  try {
@@ -54,12 +69,27 @@ export default class VelociousDatabaseDriversSqliteTableRebuilder {
54
69
  }
55
70
  finally {
56
71
  targetTableData.setName(previousTargetName);
72
+ for (const { column, index } of strippedColumnIndexes)
73
+ column.setIndex(index);
57
74
  }
58
75
  const newColumnsSQL = this.columnPairs.map(([, newName]) => options.quoteColumnName(newName)).join(", ");
59
76
  const oldColumnsSQL = this.columnPairs.map(([oldName]) => options.quoteColumnName(oldName)).join(", ");
60
77
  const sqls = [];
61
78
  for (const sql of createTableSQLs)
62
79
  sqls.push(sql);
80
+ for (const { column, indexArgs } of strippedColumnIndexes) {
81
+ const { unique, ...restIndexArgs } = indexArgs || {};
82
+ restArgsError(restIndexArgs);
83
+ const createIndexSQLs = await new CreateIndexBase({
84
+ columns: [column.getName()],
85
+ driver,
86
+ name: `index_on_${originalTableName}_${column.getName()}`,
87
+ tableName: tempTableName,
88
+ unique
89
+ }).toSQLs();
90
+ for (const sql of createIndexSQLs)
91
+ sqls.push(sql);
92
+ }
63
93
  if (this.columnPairs.length > 0) {
64
94
  sqls.push(`INSERT INTO ${options.quoteTableName(tempTableName)} (${newColumnsSQL}) ` +
65
95
  `SELECT ${oldColumnsSQL} FROM ${options.quoteTableName(originalTableName)}`);
@@ -80,4 +110,4 @@ export default class VelociousDatabaseDriversSqliteTableRebuilder {
80
110
  return sqls;
81
111
  }
82
112
  }
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcmVidWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL2RyaXZlcnMvc3FsaXRlL3RhYmxlLXJlYnVpbGRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxlQUFlLE1BQU0sa0NBQWtDLENBQUE7QUFDOUQsT0FBTyxhQUFhLE1BQU0sbUNBQW1DLENBQUE7QUFDN0QsT0FBTyxTQUFTLE1BQU0sMkJBQTJCLENBQUE7QUFFakQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyw0Q0FBNEM7SUFDL0Q7Ozs7Ozs7T0FPRztJQUNILFlBQVksRUFBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxHQUFHLFFBQVEsRUFBQztRQUNoRixhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkIsSUFBSSxDQUFDLENBQUMsZUFBZSxZQUFZLFNBQVMsQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtRQUVuRyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUE7UUFDMUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUE7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUE7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtRQUMxQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDaEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUE7UUFDaEQsTUFBTSxhQUFhLEdBQUcsR0FBRyxpQkFBaUIsb0JBQW9CLENBQUE7UUFDOUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQTtRQUM1QyxNQUFNLGtCQUFrQixHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUVwRCxlQUFlLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRXRDLElBQUksZUFBZSxDQUFBO1FBRW5CLElBQUksQ0FBQztZQUNILGVBQWUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDaEUsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsZUFBZSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQzdDLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN4RyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFdEcsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRWYsS0FBSyxNQUFNLEdBQUcsSUFBSSxlQUFlO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUVqRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxJQUFJLENBQ1AsZUFBZSxPQUFPLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxLQUFLLGFBQWEsSUFBSTtnQkFDMUUsVUFBVSxhQUFhLFNBQVMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQzVFLENBQUE7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLE9BQU8sQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLE9BQU8sQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLGNBQWMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUV4SCxLQUFLLE1BQU0sY0FBYyxJQUFJLGVBQWUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQzFELE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxlQUFlLENBQUM7Z0JBQ2hELE9BQU8sRUFBRSxjQUFjLENBQUMsVUFBVSxFQUFFO2dCQUNwQyxNQUFNO2dCQUNOLElBQUksRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFO2dCQUM5QixTQUFTLEVBQUUsaUJBQWlCO2dCQUM1QixNQUFNLEVBQUUsY0FBYyxDQUFDLFNBQVMsRUFBRTthQUNuQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUE7WUFFWCxLQUFLLE1BQU0sR0FBRyxJQUFJLGVBQWU7Z0JBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNuRCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IENyZWF0ZUluZGV4QmFzZSBmcm9tIFwiLi4vLi4vcXVlcnkvY3JlYXRlLWluZGV4LWJhc2UuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQgVGFibGVEYXRhIGZyb20gXCIuLi8uLi90YWJsZS1kYXRhL2luZGV4LmpzXCJcblxuLyoqXG4gKiBFbWl0cyB0aGUgU1FMIHNlcXVlbmNlIGZvciBTUUxpdGUncyBcInJlYnVpbGRcIiBhcHByb2FjaCB0byBzY2hlbWEgY2hhbmdlcy5cbiAqXG4gKiBTUUxpdGUgY2Fubm90IGFkZC9kcm9wIGZvcmVpZ24ta2V5IGNvbnN0cmFpbnRzLCBkcm9wIGNvbHVtbnMgb24gb2xkZXJcbiAqIHZlcnNpb25zLCBjaGFuZ2UgY29sdW1uIHR5cGVzLCBvciBhZGQgQ0hFQ0sgY29uc3RyYWludHMgdmlhIEFMVEVSIFRBQkxFLlxuICogVGhlIHN0YW5kYXJkIHdvcmthcm91bmQgKGh0dHBzOi8vc3FsaXRlLm9yZy9sYW5nX2FsdGVydGFibGUuaHRtbCkgaXMgdG9cbiAqIGNyZWF0ZSBhIG5ldyB0YWJsZSB3aXRoIHRoZSBkZXNpcmVkIHNjaGVtYSwgY29weSByb3dzIG92ZXIsIGRyb3AgdGhlXG4gKiBvcmlnaW5hbCwgYW5kIHJlbmFtZSB0aGUgcmVwbGFjZW1lbnQuXG4gKlxuICogQ2FsbGVyIHBhc3NlcyB0aGUgZGVzaXJlZCBmaW5hbCBzY2hlbWE7IHRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgbWVjaGFuaWNhbFxuICogc2VxdWVuY2UgKENSRUFURSB0ZW1wIC8gSU5TRVJULi4uU0VMRUNUIC8gRFJPUCAvIFJFTkFNRSAvIHJlY3JlYXRlXG4gKiBpbmRleGVzKS4gQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbnkgRksgdG9nZ2xpbmcgb3IgdHJhbnNhY3Rpb24gc2V0dXBcbiAqIGFyb3VuZCB0aGUgcmV0dXJuZWQgU1FMIOKAlCBgUFJBR01BIGZvcmVpZ25fa2V5c2AgaXMgY29ubmVjdGlvbi1zY29wZWQgYW5kXG4gKiBjYW5ub3QgYmUgZmxpcHBlZCBpbnNpZGUgYSB0cmFuc2FjdGlvbiwgc28gd3JhcHBpbmcgcG9saWN5IGlzIGxlZnQgdG8gdGhlXG4gKiBjYWxsZXIgKHNlZSBgc3FsL2FsdGVyLXRhYmxlLmpzYCkuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlRHJpdmVyc1NxbGl0ZVRhYmxlUmVidWlsZGVyIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5kZWZhdWx0fSBhcmdzLmRyaXZlciAtIERhdGFiYXNlIGRyaXZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Mub3JpZ2luYWxUYWJsZU5hbWUgLSBOYW1lIG9mIHRoZSBleGlzdGluZyB0YWJsZSB0byByZWJ1aWxkLlxuICAgKiBAcGFyYW0ge1RhYmxlRGF0YX0gYXJncy50YXJnZXRUYWJsZURhdGEgLSBEZXNpcmVkIGZpbmFsIHNjaGVtYSAoY29sdW1ucyArIGZvcmVpZ24ga2V5cyArIGluZGV4ZXMpLiBUaGUgaW5zdGFuY2UncyBuYW1lIGlzIG92ZXJ3cml0dGVuIGludGVybmFsbHkgZHVyaW5nIGVtaXNzaW9uLlxuICAgKiBAcGFyYW0ge0FycmF5PFtzdHJpbmcsIHN0cmluZ10+fSBhcmdzLmNvbHVtblBhaXJzIC0gUGFpcnMgb2YgW29sZENvbHVtbk5hbWUsIG5ld0NvbHVtbk5hbWVdIGRlc2NyaWJpbmcgaG93IHJvd3MgZnJvbSB0aGUgb3JpZ2luYWwgdGFibGUgc2hvdWxkIHBvcHVsYXRlIHRoZSByZWJ1aWx0IHRhYmxlLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2RyaXZlciwgb3JpZ2luYWxUYWJsZU5hbWUsIHRhcmdldFRhYmxlRGF0YSwgY29sdW1uUGFpcnMsIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBpZiAoISh0YXJnZXRUYWJsZURhdGEgaW5zdGFuY2VvZiBUYWJsZURhdGEpKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhcmdldCB0YWJsZSBkYXRhIHdhcyBnaXZlblwiKVxuXG4gICAgdGhpcy5kcml2ZXIgPSBkcml2ZXJcbiAgICB0aGlzLm9yaWdpbmFsVGFibGVOYW1lID0gb3JpZ2luYWxUYWJsZU5hbWVcbiAgICB0aGlzLnRhcmdldFRhYmxlRGF0YSA9IHRhcmdldFRhYmxlRGF0YVxuICAgIHRoaXMuY29sdW1uUGFpcnMgPSBjb2x1bW5QYWlyc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gc3Fscy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFJlc29sdmVzIHdpdGggU1FMIHN0YXRlbWVudHMgdG8gZXhlY3V0ZSBpbiBvcmRlci5cbiAgICovXG4gIGFzeW5jIHRvU1FMcygpIHtcbiAgICBjb25zdCBkcml2ZXIgPSB0aGlzLmRyaXZlclxuICAgIGNvbnN0IG9wdGlvbnMgPSBkcml2ZXIub3B0aW9ucygpXG4gICAgY29uc3Qgb3JpZ2luYWxUYWJsZU5hbWUgPSB0aGlzLm9yaWdpbmFsVGFibGVOYW1lXG4gICAgY29uc3QgdGVtcFRhYmxlTmFtZSA9IGAke29yaWdpbmFsVGFibGVOYW1lfV92ZWxvY2lvdXNfcmVidWlsZGBcbiAgICBjb25zdCB0YXJnZXRUYWJsZURhdGEgPSB0aGlzLnRhcmdldFRhYmxlRGF0YVxuICAgIGNvbnN0IHByZXZpb3VzVGFyZ2V0TmFtZSA9IHRhcmdldFRhYmxlRGF0YS5nZXROYW1lKClcblxuICAgIHRhcmdldFRhYmxlRGF0YS5zZXROYW1lKHRlbXBUYWJsZU5hbWUpXG5cbiAgICBsZXQgY3JlYXRlVGFibGVTUUxzXG5cbiAgICB0cnkge1xuICAgICAgY3JlYXRlVGFibGVTUUxzID0gYXdhaXQgZHJpdmVyLmNyZWF0ZVRhYmxlU3FsKHRhcmdldFRhYmxlRGF0YSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGFyZ2V0VGFibGVEYXRhLnNldE5hbWUocHJldmlvdXNUYXJnZXROYW1lKVxuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbHVtbnNTUUwgPSB0aGlzLmNvbHVtblBhaXJzLm1hcCgoWywgbmV3TmFtZV0pID0+IG9wdGlvbnMucXVvdGVDb2x1bW5OYW1lKG5ld05hbWUpKS5qb2luKFwiLCBcIilcbiAgICBjb25zdCBvbGRDb2x1bW5zU1FMID0gdGhpcy5jb2x1bW5QYWlycy5tYXAoKFtvbGROYW1lXSkgPT4gb3B0aW9ucy5xdW90ZUNvbHVtbk5hbWUob2xkTmFtZSkpLmpvaW4oXCIsIFwiKVxuXG4gICAgY29uc3Qgc3FscyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHNxbCBvZiBjcmVhdGVUYWJsZVNRTHMpIHNxbHMucHVzaChzcWwpXG5cbiAgICBpZiAodGhpcy5jb2x1bW5QYWlycy5sZW5ndGggPiAwKSB7XG4gICAgICBzcWxzLnB1c2goXG4gICAgICAgIGBJTlNFUlQgSU5UTyAke29wdGlvbnMucXVvdGVUYWJsZU5hbWUodGVtcFRhYmxlTmFtZSl9ICgke25ld0NvbHVtbnNTUUx9KSBgICtcbiAgICAgICAgYFNFTEVDVCAke29sZENvbHVtbnNTUUx9IEZST00gJHtvcHRpb25zLnF1b3RlVGFibGVOYW1lKG9yaWdpbmFsVGFibGVOYW1lKX1gXG4gICAgICApXG4gICAgfVxuXG4gICAgc3Fscy5wdXNoKGBEUk9QIFRBQkxFICR7b3B0aW9ucy5xdW90ZVRhYmxlTmFtZShvcmlnaW5hbFRhYmxlTmFtZSl9YClcbiAgICBzcWxzLnB1c2goYEFMVEVSIFRBQkxFICR7b3B0aW9ucy5xdW90ZVRhYmxlTmFtZSh0ZW1wVGFibGVOYW1lKX0gUkVOQU1FIFRPICR7b3B0aW9ucy5xdW90ZVRhYmxlTmFtZShvcmlnaW5hbFRhYmxlTmFtZSl9YClcblxuICAgIGZvciAoY29uc3QgdGFibGVEYXRhSW5kZXggb2YgdGFyZ2V0VGFibGVEYXRhLmdldEluZGV4ZXMoKSkge1xuICAgICAgY29uc3QgY3JlYXRlSW5kZXhTUUxzID0gYXdhaXQgbmV3IENyZWF0ZUluZGV4QmFzZSh7XG4gICAgICAgIGNvbHVtbnM6IHRhYmxlRGF0YUluZGV4LmdldENvbHVtbnMoKSxcbiAgICAgICAgZHJpdmVyLFxuICAgICAgICBuYW1lOiB0YWJsZURhdGFJbmRleC5nZXROYW1lKCksXG4gICAgICAgIHRhYmxlTmFtZTogb3JpZ2luYWxUYWJsZU5hbWUsXG4gICAgICAgIHVuaXF1ZTogdGFibGVEYXRhSW5kZXguZ2V0VW5pcXVlKClcbiAgICAgIH0pLnRvU1FMcygpXG5cbiAgICAgIGZvciAoY29uc3Qgc3FsIG9mIGNyZWF0ZUluZGV4U1FMcykgc3Fscy5wdXNoKHNxbClcbiAgICB9XG5cbiAgICByZXR1cm4gc3Fsc1xuICB9XG59XG4iXX0=
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcmVidWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL2RyaXZlcnMvc3FsaXRlL3RhYmxlLXJlYnVpbGRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxlQUFlLE1BQU0sa0NBQWtDLENBQUE7QUFDOUQsT0FBTyxhQUFhLE1BQU0sbUNBQW1DLENBQUE7QUFDN0QsT0FBTyxTQUFTLE1BQU0sMkJBQTJCLENBQUE7QUFFakQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyw0Q0FBNEM7SUFDL0Q7Ozs7Ozs7T0FPRztJQUNILFlBQVksRUFBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxHQUFHLFFBQVEsRUFBQztRQUNoRixhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkIsSUFBSSxDQUFDLENBQUMsZUFBZSxZQUFZLFNBQVMsQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtRQUVuRyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUE7UUFDMUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUE7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUE7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtRQUMxQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDaEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUE7UUFDaEQsTUFBTSxhQUFhLEdBQUcsR0FBRyxpQkFBaUIsb0JBQW9CLENBQUE7UUFDOUQsTUFB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QUMxRSxVQUFVLGFBQWEsU0FBUyxPQUFPLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FDNUUsQ0FBQTtRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsY0FBYyxPQUFPLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRXhILEtBQUssTUFBTSxjQUFjLElBQUksZUFBZSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDMUQsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLGVBQWUsQ0FBQztnQkFDaEQsT0FBTyxFQUFFLGNBQWMsQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BDLE1BQU07Z0JBQ04sSUFBSSxFQUFFLGNBQWMsQ0FBQyxPQUFPLEVBQUU7Z0JBQzlCLFNBQVMsRUFBRSxpQkFBaUI7Z0JBQzVCLE1BQU0sRUFBRSxjQUFjLENBQUMsU0FBUyxFQUFFO2FBQ25DLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtZQUVYLEtBQUssTUFBTSxHQUFHLElBQUksZUFBZTtnQkFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ25ELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQ3JlYXRlSW5kZXhCYXNlIGZyb20gXCIuLi8uLi9xdWVyeS9jcmVhdGUtaW5kZXgtYmFzZS5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcbmltcG9ydCBUYWJsZURhdGEgZnJvbSBcIi4uLy4uL3RhYmxlLWRhdGEvaW5kZXguanNcIlxuXG4vKipcbiAqIEVtaXRzIHRoZSBTUUwgc2VxdWVuY2UgZm9yIFNRTGl0ZSdzIFwicmVidWlsZFwiIGFwcHJvYWNoIHRvIHNjaGVtYSBjaGFuZ2VzLlxuICpcbiAqIFNRTGl0ZSBjYW5ub3QgYWRkL2Ryb3AgZm9yZWlnbi1rZXkgY29uc3RyYWludHMsIGRyb3AgY29sdW1ucyBvbiBvbGRlclxuICogdmVyc2lvbnMsIGNoYW5nZSBjb2x1bW4gdHlwZXMsIG9yIGFkZCBDSEVDSyBjb25zdHJhaW50cyB2aWEgQUxURVIgVEFCTEUuXG4gKiBUaGUgc3RhbmRhcmQgd29ya2Fyb3VuZCAoaHR0cHM6Ly9zcWxpdGUub3JnL2xhbmdfYWx0ZXJ0YWJsZS5odG1sKSBpcyB0b1xuICogY3JlYXRlIGEgbmV3IHRhYmxlIHdpdGggdGhlIGRlc2lyZWQgc2NoZW1hLCBjb3B5IHJvd3Mgb3ZlciwgZHJvcCB0aGVcbiAqIG9yaWdpbmFsLCBhbmQgcmVuYW1lIHRoZSByZXBsYWNlbWVudC5cbiAqXG4gKiBDYWxsZXIgcGFzc2VzIHRoZSBkZXNpcmVkIGZpbmFsIHNjaGVtYTsgdGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBtZWNoYW5pY2FsXG4gKiBzZXF1ZW5jZSAoQ1JFQVRFIHRlbXAgLyBJTlNFUlQuLi5TRUxFQ1QgLyBEUk9QIC8gUkVOQU1FIC8gcmVjcmVhdGVcbiAqIGluZGV4ZXMpLiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFueSBGSyB0b2dnbGluZyBvciB0cmFuc2FjdGlvbiBzZXR1cFxuICogYXJvdW5kIHRoZSByZXR1cm5lZCBTUUwg4oCUIGBQUkFHTUEgZm9yZWlnbl9rZXlzYCBpcyBjb25uZWN0aW9uLXNjb3BlZCBhbmRcbiAqIGNhbm5vdCBiZSBmbGlwcGVkIGluc2lkZSBhIHRyYW5zYWN0aW9uLCBzbyB3cmFwcGluZyBwb2xpY3kgaXMgbGVmdCB0byB0aGVcbiAqIGNhbGxlciAoc2VlIGBzcWwvYWx0ZXItdGFibGUuanNgKS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VEcml2ZXJzU3FsaXRlVGFibGVSZWJ1aWxkZXIge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MuZHJpdmVyIC0gRGF0YWJhc2UgZHJpdmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5vcmlnaW5hbFRhYmxlTmFtZSAtIE5hbWUgb2YgdGhlIGV4aXN0aW5nIHRhYmxlIHRvIHJlYnVpbGQuXG4gICAqIEBwYXJhbSB7VGFibGVEYXRhfSBhcmdzLnRhcmdldFRhYmxlRGF0YSAtIERlc2lyZWQgZmluYWwgc2NoZW1hIChjb2x1bW5zICsgZm9yZWlnbiBrZXlzICsgaW5kZXhlcykuIFRoZSBpbnN0YW5jZSdzIG5hbWUgaXMgb3ZlcndyaXR0ZW4gaW50ZXJuYWxseSBkdXJpbmcgZW1pc3Npb24uXG4gICAqIEBwYXJhbSB7QXJyYXk8W3N0cmluZywgc3RyaW5nXT59IGFyZ3MuY29sdW1uUGFpcnMgLSBQYWlycyBvZiBbb2xkQ29sdW1uTmFtZSwgbmV3Q29sdW1uTmFtZV0gZGVzY3JpYmluZyBob3cgcm93cyBmcm9tIHRoZSBvcmlnaW5hbCB0YWJsZSBzaG91bGQgcG9wdWxhdGUgdGhlIHJlYnVpbHQgdGFibGUuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7ZHJpdmVyLCBvcmlnaW5hbFRhYmxlTmFtZSwgdGFyZ2V0VGFibGVEYXRhLCBjb2x1bW5QYWlycywgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGlmICghKHRhcmdldFRhYmxlRGF0YSBpbnN0YW5jZW9mIFRhYmxlRGF0YSkpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFyZ2V0IHRhYmxlIGRhdGEgd2FzIGdpdmVuXCIpXG5cbiAgICB0aGlzLmRyaXZlciA9IGRyaXZlclxuICAgIHRoaXMub3JpZ2luYWxUYWJsZU5hbWUgPSBvcmlnaW5hbFRhYmxlTmFtZVxuICAgIHRoaXMudGFyZ2V0VGFibGVEYXRhID0gdGFyZ2V0VGFibGVEYXRhXG4gICAgdGhpcy5jb2x1bW5QYWlycyA9IGNvbHVtblBhaXJzXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBzcWxzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RhdGVtZW50cyB0byBleGVjdXRlIGluIG9yZGVyLlxuICAgKi9cbiAgYXN5bmMgdG9TUUxzKCkge1xuICAgIGNvbnN0IGRyaXZlciA9IHRoaXMuZHJpdmVyXG4gICAgY29uc3Qgb3B0aW9ucyA9IGRyaXZlci5vcHRpb25zKClcbiAgICBjb25zdCBvcmlnaW5hbFRhYmxlTmFtZSA9IHRoaXMub3JpZ2luYWxUYWJsZU5hbWVcbiAgICBjb25zdCB0ZW1wVGFibGVOYW1lID0gYCR7b3JpZ2luYWxUYWJsZU5hbWV9X3ZlbG9jaW91c19yZWJ1aWxkYFxuICAgIGNvbnN0IHRhcmdldFRhYmxlRGF0YSA9IHRoaXMudGFyZ2V0VGFibGVEYXRhXG4gICAgY29uc3QgcHJldmlvdXNUYXJnZXROYW1lID0gdGFyZ2V0VGFibGVEYXRhLmdldE5hbWUoKVxuXG4gICAgLy8gQ29sdW1uLWxldmVsIGBpbmRleDogdHJ1ZWAgaW5kZXhlcyBhcmUgbmFtZWQgYWZ0ZXIgdGhlIHRhYmxlIHRoZXkgYXJlIGNyZWF0ZWQgd2l0aCwgYW5kXG4gICAgLy8gQUxURVIgVEFCTEUgLi4uIFJFTkFNRSBkb2VzIG5vdCByZW5hbWUgaW5kZXhlcyAtIGNyZWF0aW5nIHRoZW0gaW5zaWRlIHRoZSB0ZW1wIHRhYmxlJ3NcbiAgICAvLyBDUkVBVEUgd291bGQgbGVhayB0aGUgdGVtcCByZWJ1aWxkIG5hbWUgcGVybWFuZW50bHkuIFN0cmlwIHRoZSBmbGFncyBmb3IgdGhlIHRlbXAgQ1JFQVRFXG4gICAgLy8gYW5kIGNyZWF0ZSB0aG9zZSBpbmRleGVzIGV4cGxpY2l0bHkgb24gdGhlIHRlbXAgdGFibGUgd2l0aCB0aGVpciBGSU5BTCBuYW1lcyBCRUZPUkUgdGhlXG4gICAgLy8gY29weTogaW5kZXggbmFtZXMgYXJlIGRhdGFiYXNlLWdsb2JhbCBhbmQgc3Vydml2ZSB0aGUgcmVuYW1lLCBhbmQgYSB2aW9sYXRpb24gKGUuZy4gYSBuZXdcbiAgICAvLyB1bmlxdWUgaW5kZXggb3ZlciByb3dzIHRoYXQgYWxsIHJlY2VpdmUgdGhlIHNhbWUgZGVmYXVsdCkgZmFpbHMgZHVyaW5nIElOU0VSVC4uLlNFTEVDVCxcbiAgICAvLyB3aGlsZSB0aGUgb3JpZ2luYWwgdGFibGUgc3RpbGwgZXhpc3RzIC0gbmV2ZXIgYWZ0ZXIgdGhlIHN3YXAuXG4gICAgLyoqIEB0eXBlIHtBcnJheTx7Y29sdW1uOiBpbXBvcnQoXCIuLi8uLi90YWJsZS1kYXRhL3RhYmxlLWNvbHVtbi5qc1wiKS5kZWZhdWx0LCBpbmRleDogPywgaW5kZXhBcmdzOiA/fT59ICovXG4gICAgY29uc3Qgc3RyaXBwZWRDb2x1bW5JbmRleGVzID0gW11cblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRhcmdldFRhYmxlRGF0YS5nZXRDb2x1bW5zKCkpIHtcbiAgICAgIGlmICghY29sdW1uLmdldEluZGV4KCkpIGNvbnRpbnVlXG5cbiAgICAgIHN0cmlwcGVkQ29sdW1uSW5kZXhlcy5wdXNoKHtjb2x1bW4sIGluZGV4OiBjb2x1bW4uZ2V0SW5kZXgoKSwgaW5kZXhBcmdzOiBjb2x1bW4uZ2V0SW5kZXhBcmdzKCl9KVxuICAgICAgY29sdW1uLnNldEluZGV4KGZhbHNlKVxuICAgIH1cblxuICAgIHRhcmdldFRhYmxlRGF0YS5zZXROYW1lKHRlbXBUYWJsZU5hbWUpXG5cbiAgICBsZXQgY3JlYXRlVGFibGVTUUxzXG5cbiAgICB0cnkge1xuICAgICAgY3JlYXRlVGFibGVTUUxzID0gYXdhaXQgZHJpdmVyLmNyZWF0ZVRhYmxlU3FsKHRhcmdldFRhYmxlRGF0YSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGFyZ2V0VGFibGVEYXRhLnNldE5hbWUocHJldmlvdXNUYXJnZXROYW1lKVxuXG4gICAgICBmb3IgKGNvbnN0IHtjb2x1bW4sIGluZGV4fSBvZiBzdHJpcHBlZENvbHVtbkluZGV4ZXMpIGNvbHVtbi5zZXRJbmRleChpbmRleClcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb2x1bW5zU1FMID0gdGhpcy5jb2x1bW5QYWlycy5tYXAoKFssIG5ld05hbWVdKSA9PiBvcHRpb25zLnF1b3RlQ29sdW1uTmFtZShuZXdOYW1lKSkuam9pbihcIiwgXCIpXG4gICAgY29uc3Qgb2xkQ29sdW1uc1NRTCA9IHRoaXMuY29sdW1uUGFpcnMubWFwKChbb2xkTmFtZV0pID0+IG9wdGlvbnMucXVvdGVDb2x1bW5OYW1lKG9sZE5hbWUpKS5qb2luKFwiLCBcIilcblxuICAgIGNvbnN0IHNxbHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2YgY3JlYXRlVGFibGVTUUxzKSBzcWxzLnB1c2goc3FsKVxuXG4gICAgZm9yIChjb25zdCB7Y29sdW1uLCBpbmRleEFyZ3N9IG9mIHN0cmlwcGVkQ29sdW1uSW5kZXhlcykge1xuICAgICAgY29uc3Qge3VuaXF1ZSwgLi4ucmVzdEluZGV4QXJnc30gPSBpbmRleEFyZ3MgfHwge31cblxuICAgICAgcmVzdEFyZ3NFcnJvcihyZXN0SW5kZXhBcmdzKVxuXG4gICAgICBjb25zdCBjcmVhdGVJbmRleFNRTHMgPSBhd2FpdCBuZXcgQ3JlYXRlSW5kZXhCYXNlKHtcbiAgICAgICAgY29sdW1uczogW2NvbHVtbi5nZXROYW1lKCldLFxuICAgICAgICBkcml2ZXIsXG4gICAgICAgIG5hbWU6IGBpbmRleF9vbl8ke29yaWdpbmFsVGFibGVOYW1lfV8ke2NvbHVtbi5nZXROYW1lKCl9YCxcbiAgICAgICAgdGFibGVOYW1lOiB0ZW1wVGFibGVOYW1lLFxuICAgICAgICB1bmlxdWVcbiAgICAgIH0pLnRvU1FMcygpXG5cbiAgICAgIGZvciAoY29uc3Qgc3FsIG9mIGNyZWF0ZUluZGV4U1FMcykgc3Fscy5wdXNoKHNxbClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb2x1bW5QYWlycy5sZW5ndGggPiAwKSB7XG4gICAgICBzcWxzLnB1c2goXG4gICAgICAgIGBJTlNFUlQgSU5UTyAke29wdGlvbnMucXVvdGVUYWJsZU5hbWUodGVtcFRhYmxlTmFtZSl9ICgke25ld0NvbHVtbnNTUUx9KSBgICtcbiAgICAgICAgYFNFTEVDVCAke29sZENvbHVtbnNTUUx9IEZST00gJHtvcHRpb25zLnF1b3RlVGFibGVOYW1lKG9yaWdpbmFsVGFibGVOYW1lKX1gXG4gICAgICApXG4gICAgfVxuXG4gICAgc3Fscy5wdXNoKGBEUk9QIFRBQkxFICR7b3B0aW9ucy5xdW90ZVRhYmxlTmFtZShvcmlnaW5hbFRhYmxlTmFtZSl9YClcbiAgICBzcWxzLnB1c2goYEFMVEVSIFRBQkxFICR7b3B0aW9ucy5xdW90ZVRhYmxlTmFtZSh0ZW1wVGFibGVOYW1lKX0gUkVOQU1FIFRPICR7b3B0aW9ucy5xdW90ZVRhYmxlTmFtZShvcmlnaW5hbFRhYmxlTmFtZSl9YClcblxuICAgIGZvciAoY29uc3QgdGFibGVEYXRhSW5kZXggb2YgdGFyZ2V0VGFibGVEYXRhLmdldEluZGV4ZXMoKSkge1xuICAgICAgY29uc3QgY3JlYXRlSW5kZXhTUUxzID0gYXdhaXQgbmV3IENyZWF0ZUluZGV4QmFzZSh7XG4gICAgICAgIGNvbHVtbnM6IHRhYmxlRGF0YUluZGV4LmdldENvbHVtbnMoKSxcbiAgICAgICAgZHJpdmVyLFxuICAgICAgICBuYW1lOiB0YWJsZURhdGFJbmRleC5nZXROYW1lKCksXG4gICAgICAgIHRhYmxlTmFtZTogb3JpZ2luYWxUYWJsZU5hbWUsXG4gICAgICAgIHVuaXF1ZTogdGFibGVEYXRhSW5kZXguZ2V0VW5pcXVlKClcbiAgICAgIH0pLnRvU1FMcygpXG5cbiAgICAgIGZvciAoY29uc3Qgc3FsIG9mIGNyZWF0ZUluZGV4U1FMcykgc3Fscy5wdXNoKHNxbClcbiAgICB9XG5cbiAgICByZXR1cm4gc3Fsc1xuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.504",
6
+ "version": "1.0.505",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -52,6 +52,23 @@ export default class VelociousDatabaseDriversSqliteTableRebuilder {
52
52
  const targetTableData = this.targetTableData
53
53
  const previousTargetName = targetTableData.getName()
54
54
 
55
+ // Column-level `index: true` indexes are named after the table they are created with, and
56
+ // ALTER TABLE ... RENAME does not rename indexes - creating them inside the temp table's
57
+ // CREATE would leak the temp rebuild name permanently. Strip the flags for the temp CREATE
58
+ // and create those indexes explicitly on the temp table with their FINAL names BEFORE the
59
+ // copy: index names are database-global and survive the rename, and a violation (e.g. a new
60
+ // unique index over rows that all receive the same default) fails during INSERT...SELECT,
61
+ // while the original table still exists - never after the swap.
62
+ /** @type {Array<{column: import("../../table-data/table-column.js").default, index: ?, indexArgs: ?}>} */
63
+ const strippedColumnIndexes = []
64
+
65
+ for (const column of targetTableData.getColumns()) {
66
+ if (!column.getIndex()) continue
67
+
68
+ strippedColumnIndexes.push({column, index: column.getIndex(), indexArgs: column.getIndexArgs()})
69
+ column.setIndex(false)
70
+ }
71
+
55
72
  targetTableData.setName(tempTableName)
56
73
 
57
74
  let createTableSQLs
@@ -60,6 +77,8 @@ export default class VelociousDatabaseDriversSqliteTableRebuilder {
60
77
  createTableSQLs = await driver.createTableSql(targetTableData)
61
78
  } finally {
62
79
  targetTableData.setName(previousTargetName)
80
+
81
+ for (const {column, index} of strippedColumnIndexes) column.setIndex(index)
63
82
  }
64
83
 
65
84
  const newColumnsSQL = this.columnPairs.map(([, newName]) => options.quoteColumnName(newName)).join(", ")
@@ -69,6 +88,22 @@ export default class VelociousDatabaseDriversSqliteTableRebuilder {
69
88
 
70
89
  for (const sql of createTableSQLs) sqls.push(sql)
71
90
 
91
+ for (const {column, indexArgs} of strippedColumnIndexes) {
92
+ const {unique, ...restIndexArgs} = indexArgs || {}
93
+
94
+ restArgsError(restIndexArgs)
95
+
96
+ const createIndexSQLs = await new CreateIndexBase({
97
+ columns: [column.getName()],
98
+ driver,
99
+ name: `index_on_${originalTableName}_${column.getName()}`,
100
+ tableName: tempTableName,
101
+ unique
102
+ }).toSQLs()
103
+
104
+ for (const sql of createIndexSQLs) sqls.push(sql)
105
+ }
106
+
72
107
  if (this.columnPairs.length > 0) {
73
108
  sqls.push(
74
109
  `INSERT INTO ${options.quoteTableName(tempTableName)} (${newColumnsSQL}) ` +