wfu-migrate 0.1.28 → 0.1.29
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.
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User Sync command - Fix user ID mismatches between environments
|
|
3
|
+
*
|
|
4
|
+
* When users are auto-synced from PROD to PPRD, they can end up with
|
|
5
|
+
* different auto-increment IDs. This command copies the user row and
|
|
6
|
+
* all usermeta from a source environment to a target, ensuring the
|
|
7
|
+
* user ID matches.
|
|
8
|
+
*
|
|
9
|
+
* Uses MySQL HEX()/UNHEX() for all string data transfer to safely
|
|
10
|
+
* handle serialized PHP, HTML, special characters, and passwords
|
|
11
|
+
* without any escaping issues.
|
|
12
|
+
*
|
|
13
|
+
* Usage: wfu-migrate user-sync --from <env> --to <env> --user-id <id> [--dry-run]
|
|
14
|
+
*/
|
|
15
|
+
import { Command } from 'commander';
|
|
16
|
+
export declare const userSyncCommand: Command;
|
|
17
|
+
//# sourceMappingURL=user-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-sync.d.ts","sourceRoot":"","sources":["../../src/commands/user-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuTpC,eAAO,MAAM,eAAe,SAQxB,CAAC"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User Sync command - Fix user ID mismatches between environments
|
|
3
|
+
*
|
|
4
|
+
* When users are auto-synced from PROD to PPRD, they can end up with
|
|
5
|
+
* different auto-increment IDs. This command copies the user row and
|
|
6
|
+
* all usermeta from a source environment to a target, ensuring the
|
|
7
|
+
* user ID matches.
|
|
8
|
+
*
|
|
9
|
+
* Uses MySQL HEX()/UNHEX() for all string data transfer to safely
|
|
10
|
+
* handle serialized PHP, HTML, special characters, and passwords
|
|
11
|
+
* without any escaping issues.
|
|
12
|
+
*
|
|
13
|
+
* Usage: wfu-migrate user-sync --from <env> --to <env> --user-id <id> [--dry-run]
|
|
14
|
+
*/
|
|
15
|
+
import { Command } from 'commander';
|
|
16
|
+
import { spawn } from 'child_process';
|
|
17
|
+
import chalk from 'chalk';
|
|
18
|
+
import { readConfig } from '../lib/config-manager.js';
|
|
19
|
+
import { testDbConnection, checkMySqlAvailable } from '../lib/database.js';
|
|
20
|
+
const VALID_ENVS = ['dev', 'uat', 'pprd', 'prod'];
|
|
21
|
+
function runMysqlQuery(config, query, useDocker) {
|
|
22
|
+
return new Promise((resolve) => {
|
|
23
|
+
const baseArgs = [
|
|
24
|
+
'-h', config.host,
|
|
25
|
+
'-P', String(config.port),
|
|
26
|
+
'-u', config.user,
|
|
27
|
+
`-p${config.password}`,
|
|
28
|
+
config.database,
|
|
29
|
+
'-N',
|
|
30
|
+
'-e', query,
|
|
31
|
+
'--connect-timeout=10',
|
|
32
|
+
];
|
|
33
|
+
const args = useDocker
|
|
34
|
+
? ['run', '--rm', '--network', 'host', 'mysql:8.0', 'mysql', ...baseArgs]
|
|
35
|
+
: baseArgs;
|
|
36
|
+
const cmd = useDocker ? 'docker' : 'mysql';
|
|
37
|
+
const proc = spawn(cmd, args, { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
38
|
+
let stdout = '';
|
|
39
|
+
let stderr = '';
|
|
40
|
+
proc.stdout.on('data', (data) => { stdout += data.toString(); });
|
|
41
|
+
proc.stderr.on('data', (data) => { stderr += data.toString(); });
|
|
42
|
+
proc.on('close', (code) => {
|
|
43
|
+
resolve({ success: code === 0, stdout, stderr });
|
|
44
|
+
});
|
|
45
|
+
proc.on('error', (err) => {
|
|
46
|
+
resolve({ success: false, stdout: '', stderr: err.message });
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function runMysqlStdin(config, sql, useDocker) {
|
|
51
|
+
return new Promise((resolve) => {
|
|
52
|
+
const baseArgs = [
|
|
53
|
+
'-h', config.host,
|
|
54
|
+
'-P', String(config.port),
|
|
55
|
+
'-u', config.user,
|
|
56
|
+
`-p${config.password}`,
|
|
57
|
+
config.database,
|
|
58
|
+
'--connect-timeout=10',
|
|
59
|
+
];
|
|
60
|
+
const args = useDocker
|
|
61
|
+
? ['run', '--rm', '--network', 'host', '-i', 'mysql:8.0', 'mysql', ...baseArgs]
|
|
62
|
+
: baseArgs;
|
|
63
|
+
const cmd = useDocker ? 'docker' : 'mysql';
|
|
64
|
+
const proc = spawn(cmd, args, { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
65
|
+
let stdout = '';
|
|
66
|
+
let stderr = '';
|
|
67
|
+
let stdinError = '';
|
|
68
|
+
proc.stdin.on('error', (err) => { stdinError = err.message; });
|
|
69
|
+
proc.stdout.on('data', (data) => { stdout += data.toString(); });
|
|
70
|
+
proc.stderr.on('data', (data) => { stderr += data.toString(); });
|
|
71
|
+
proc.on('close', (code) => {
|
|
72
|
+
resolve({ success: code === 0, stdout, stderr: stderr || stdinError });
|
|
73
|
+
});
|
|
74
|
+
proc.on('error', (err) => {
|
|
75
|
+
resolve({ success: false, stdout: '', stderr: err.message });
|
|
76
|
+
});
|
|
77
|
+
proc.stdin.write(sql);
|
|
78
|
+
proc.stdin.end();
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async function runUserSync(options) {
|
|
82
|
+
const fromEnv = options.from;
|
|
83
|
+
const toEnv = options.to;
|
|
84
|
+
const userId = parseInt(options.userId, 10);
|
|
85
|
+
if (!VALID_ENVS.includes(fromEnv)) {
|
|
86
|
+
console.error(chalk.red(`Error: Invalid source environment: ${fromEnv}`));
|
|
87
|
+
console.error(chalk.gray(`Valid environments: ${VALID_ENVS.join(', ')}`));
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
if (!VALID_ENVS.includes(toEnv)) {
|
|
91
|
+
console.error(chalk.red(`Error: Invalid target environment: ${toEnv}`));
|
|
92
|
+
console.error(chalk.gray(`Valid environments: ${VALID_ENVS.join(', ')}`));
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
if (fromEnv === toEnv) {
|
|
96
|
+
console.error(chalk.red('Error: Source and target environments must be different'));
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
if (isNaN(userId) || userId <= 0) {
|
|
100
|
+
console.error(chalk.red('Error: --user-id must be a positive integer'));
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
const config = readConfig();
|
|
104
|
+
if (!config) {
|
|
105
|
+
console.error(chalk.red('Error: Configuration not found'));
|
|
106
|
+
console.error(chalk.gray('Run "wfu-migrate config wizard" to set up configuration'));
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
const sourceConfig = config.environments[fromEnv];
|
|
110
|
+
const targetConfig = config.environments[toEnv];
|
|
111
|
+
if (!sourceConfig.host) {
|
|
112
|
+
console.error(chalk.red(`Error: Environment ${fromEnv} is not configured`));
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
if (!targetConfig.host) {
|
|
116
|
+
console.error(chalk.red(`Error: Environment ${toEnv} is not configured`));
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
console.log(chalk.bold(`\nUser Sync: ${fromEnv} → ${toEnv} (user ID ${userId})\n`));
|
|
120
|
+
console.log(chalk.gray('Testing database connections...'));
|
|
121
|
+
const [sourceConn, targetConn] = await Promise.all([
|
|
122
|
+
testDbConnection(sourceConfig, fromEnv),
|
|
123
|
+
testDbConnection(targetConfig, toEnv),
|
|
124
|
+
]);
|
|
125
|
+
if (!sourceConn.success) {
|
|
126
|
+
console.error(chalk.red(`Error: ${sourceConn.error}`));
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
if (!targetConn.success) {
|
|
130
|
+
console.error(chalk.red(`Error: ${targetConn.error}`));
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
console.log(chalk.green(' Both connections OK\n'));
|
|
134
|
+
const useDocker = !checkMySqlAvailable().available;
|
|
135
|
+
console.log(chalk.gray(`Looking up user ID ${userId} on ${fromEnv}...`));
|
|
136
|
+
const sourceUserResult = await runMysqlQuery(sourceConfig, `SELECT ID, user_email FROM wp_users WHERE ID = ${userId}`, useDocker);
|
|
137
|
+
if (!sourceUserResult.success) {
|
|
138
|
+
console.error(chalk.red(`Error querying source: ${sourceUserResult.stderr}`));
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
const sourceUserLine = sourceUserResult.stdout.trim();
|
|
142
|
+
if (!sourceUserLine) {
|
|
143
|
+
console.error(chalk.red(`Error: User ID ${userId} not found on ${fromEnv}`));
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
const sourceUserParts = sourceUserLine.split('\t');
|
|
147
|
+
const userEmail = sourceUserParts[1];
|
|
148
|
+
console.log(chalk.green(` Found: ${userEmail}\n`));
|
|
149
|
+
console.log(chalk.gray(`Looking up "${userEmail}" on ${toEnv}...`));
|
|
150
|
+
const targetUserResult = await runMysqlQuery(targetConfig, `SELECT ID, user_email FROM wp_users WHERE user_email = '${userEmail.replace(/'/g, "\\'")}'`, useDocker);
|
|
151
|
+
if (!targetUserResult.success) {
|
|
152
|
+
console.error(chalk.red(`Error querying target: ${targetUserResult.stderr}`));
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
const targetUserLine = targetUserResult.stdout.trim();
|
|
156
|
+
if (!targetUserLine) {
|
|
157
|
+
console.log(chalk.yellow(` User not found on ${toEnv} — nothing to fix`));
|
|
158
|
+
process.exit(0);
|
|
159
|
+
}
|
|
160
|
+
const targetUserParts = targetUserLine.split('\t');
|
|
161
|
+
const targetUserId = parseInt(targetUserParts[0], 10);
|
|
162
|
+
if (targetUserId === userId) {
|
|
163
|
+
console.log(chalk.green(` User ID already matches (${userId}) — nothing to fix`));
|
|
164
|
+
process.exit(0);
|
|
165
|
+
}
|
|
166
|
+
console.log(chalk.yellow(` Found with wrong ID: ${targetUserId} (should be ${userId})\n`));
|
|
167
|
+
const [sourceMetaResult, targetMetaResult] = await Promise.all([
|
|
168
|
+
runMysqlQuery(sourceConfig, `SELECT COUNT(*) FROM wp_usermeta WHERE user_id = ${userId}`, useDocker),
|
|
169
|
+
runMysqlQuery(targetConfig, `SELECT COUNT(*) FROM wp_usermeta WHERE user_id = ${targetUserId}`, useDocker),
|
|
170
|
+
]);
|
|
171
|
+
const sourceMetaCount = sourceMetaResult.success ? parseInt(sourceMetaResult.stdout.trim(), 10) : 0;
|
|
172
|
+
const targetMetaCount = targetMetaResult.success ? parseInt(targetMetaResult.stdout.trim(), 10) : 0;
|
|
173
|
+
console.log(chalk.bold('Sync Plan:'));
|
|
174
|
+
console.log(` ${chalk.red('DELETE')} target wp_users row (ID ${targetUserId})`);
|
|
175
|
+
console.log(` ${chalk.red('DELETE')} target wp_usermeta rows for user_id ${targetUserId} (${targetMetaCount} rows)`);
|
|
176
|
+
console.log(` ${chalk.green('INSERT')} source wp_users row (ID ${userId})`);
|
|
177
|
+
console.log(` ${chalk.green('INSERT')} source wp_usermeta rows (${sourceMetaCount} rows)\n`);
|
|
178
|
+
if (options.dryRun) {
|
|
179
|
+
console.log(chalk.yellow('Dry run — no changes made'));
|
|
180
|
+
process.exit(0);
|
|
181
|
+
}
|
|
182
|
+
console.log(chalk.gray('Deleting wrong user from target...'));
|
|
183
|
+
const deleteUserResult = await runMysqlQuery(targetConfig, `DELETE FROM wp_users WHERE ID = ${targetUserId}`, useDocker);
|
|
184
|
+
if (!deleteUserResult.success) {
|
|
185
|
+
console.error(chalk.red(`Error deleting target user: ${deleteUserResult.stderr}`));
|
|
186
|
+
process.exit(1);
|
|
187
|
+
}
|
|
188
|
+
const deleteMetaResult = await runMysqlQuery(targetConfig, `DELETE FROM wp_usermeta WHERE user_id = ${targetUserId}`, useDocker);
|
|
189
|
+
if (!deleteMetaResult.success) {
|
|
190
|
+
console.error(chalk.red(`Error deleting target usermeta: ${deleteMetaResult.stderr}`));
|
|
191
|
+
process.exit(1);
|
|
192
|
+
}
|
|
193
|
+
console.log(chalk.green(' Deleted\n'));
|
|
194
|
+
console.log(chalk.gray('Reading source user row (HEX-encoded)...'));
|
|
195
|
+
const sourceRowResult = await runMysqlQuery(sourceConfig, `SELECT ID, HEX(user_login), HEX(user_pass), HEX(user_nicename), HEX(user_email), HEX(user_url), HEX(user_registered), HEX(user_activation_key), user_status, HEX(display_name) FROM wp_users WHERE ID = ${userId}`, useDocker);
|
|
196
|
+
if (!sourceRowResult.success || !sourceRowResult.stdout.trim()) {
|
|
197
|
+
console.error(chalk.red(`Error reading source user: ${sourceRowResult.stderr}`));
|
|
198
|
+
process.exit(1);
|
|
199
|
+
}
|
|
200
|
+
const cols = sourceRowResult.stdout.trim().split('\t');
|
|
201
|
+
const insertUserSql = `INSERT INTO wp_users (ID, user_login, user_pass, user_nicename, user_email, user_url, user_registered, user_activation_key, user_status, display_name) VALUES (${cols[0]}, UNHEX('${cols[1]}'), UNHEX('${cols[2]}'), UNHEX('${cols[3]}'), UNHEX('${cols[4]}'), UNHEX('${cols[5]}'), UNHEX('${cols[6]}'), UNHEX('${cols[7]}'), ${cols[8]}, UNHEX('${cols[9]}'));`;
|
|
202
|
+
console.log(chalk.gray('Inserting user row into target...'));
|
|
203
|
+
const insertUserResult = await runMysqlStdin(targetConfig, insertUserSql, useDocker);
|
|
204
|
+
if (!insertUserResult.success) {
|
|
205
|
+
console.error(chalk.red(`Error inserting user: ${insertUserResult.stderr}`));
|
|
206
|
+
process.exit(1);
|
|
207
|
+
}
|
|
208
|
+
console.log(chalk.green(' Inserted\n'));
|
|
209
|
+
console.log(chalk.gray('Reading source usermeta (HEX-encoded)...'));
|
|
210
|
+
const sourceMetaRows = await runMysqlQuery(sourceConfig, `SELECT user_id, HEX(meta_key), HEX(meta_value) FROM wp_usermeta WHERE user_id = ${userId}`, useDocker);
|
|
211
|
+
if (!sourceMetaRows.success) {
|
|
212
|
+
console.error(chalk.red(`Error reading source usermeta: ${sourceMetaRows.stderr}`));
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
const metaLines = sourceMetaRows.stdout.trim().split('\n').filter(Boolean);
|
|
216
|
+
if (metaLines.length > 0) {
|
|
217
|
+
console.log(chalk.gray(`Inserting ${metaLines.length} usermeta rows into target...`));
|
|
218
|
+
const valuesClauses = [];
|
|
219
|
+
for (const line of metaLines) {
|
|
220
|
+
const parts = line.split('\t');
|
|
221
|
+
const metaUserId = parts[0];
|
|
222
|
+
const hexKey = parts[1];
|
|
223
|
+
const hexValue = parts[2];
|
|
224
|
+
if (!hexValue || hexValue === 'NULL') {
|
|
225
|
+
valuesClauses.push(`(${metaUserId}, UNHEX('${hexKey}'), NULL)`);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
valuesClauses.push(`(${metaUserId}, UNHEX('${hexKey}'), UNHEX('${hexValue}'))`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const BATCH_SIZE = 100;
|
|
232
|
+
for (let i = 0; i < valuesClauses.length; i += BATCH_SIZE) {
|
|
233
|
+
const batch = valuesClauses.slice(i, i + BATCH_SIZE);
|
|
234
|
+
const insertMetaSql = `INSERT INTO wp_usermeta (user_id, meta_key, meta_value) VALUES ${batch.join(', ')};`;
|
|
235
|
+
const insertMetaResult = await runMysqlStdin(targetConfig, insertMetaSql, useDocker);
|
|
236
|
+
if (!insertMetaResult.success) {
|
|
237
|
+
console.error(chalk.red(`Error inserting usermeta batch: ${insertMetaResult.stderr}`));
|
|
238
|
+
process.exit(1);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
console.log(chalk.green(` Inserted ${metaLines.length} rows\n`));
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
console.log(chalk.yellow(' No usermeta rows to insert\n'));
|
|
245
|
+
}
|
|
246
|
+
console.log(chalk.gray('Fixing AUTO_INCREMENT on target wp_users...'));
|
|
247
|
+
const fixAutoIncResult = await runMysqlQuery(targetConfig, `SELECT COALESCE(MAX(ID), 0) + 1 FROM wp_users`, useDocker);
|
|
248
|
+
if (fixAutoIncResult.success) {
|
|
249
|
+
const nextId = fixAutoIncResult.stdout.trim();
|
|
250
|
+
await runMysqlQuery(targetConfig, `ALTER TABLE wp_users AUTO_INCREMENT = ${nextId}`, useDocker);
|
|
251
|
+
console.log(chalk.green(` Set to ${nextId}\n`));
|
|
252
|
+
}
|
|
253
|
+
console.log(chalk.gray('Verifying...'));
|
|
254
|
+
const [verifyUser, verifyMeta] = await Promise.all([
|
|
255
|
+
runMysqlQuery(targetConfig, `SELECT ID, user_email FROM wp_users WHERE ID = ${userId}`, useDocker),
|
|
256
|
+
runMysqlQuery(targetConfig, `SELECT COUNT(*) FROM wp_usermeta WHERE user_id = ${userId}`, useDocker),
|
|
257
|
+
]);
|
|
258
|
+
const verifyUserLine = verifyUser.success ? verifyUser.stdout.trim() : '';
|
|
259
|
+
const verifyMetaCount = verifyMeta.success ? parseInt(verifyMeta.stdout.trim(), 10) : 0;
|
|
260
|
+
if (!verifyUserLine) {
|
|
261
|
+
console.error(chalk.red('Verification FAILED: User not found on target after sync'));
|
|
262
|
+
process.exit(1);
|
|
263
|
+
}
|
|
264
|
+
const verifyParts = verifyUserLine.split('\t');
|
|
265
|
+
const verifiedId = parseInt(verifyParts[0], 10);
|
|
266
|
+
const verifiedEmail = verifyParts[1];
|
|
267
|
+
if (verifiedId !== userId) {
|
|
268
|
+
console.error(chalk.red(`Verification FAILED: Expected ID ${userId}, got ${verifiedId}`));
|
|
269
|
+
process.exit(1);
|
|
270
|
+
}
|
|
271
|
+
console.log(chalk.green('\nVerification passed:'));
|
|
272
|
+
console.log(` User ID: ${chalk.bold(String(verifiedId))} ${chalk.green('✓')}`);
|
|
273
|
+
console.log(` Email: ${chalk.bold(verifiedEmail)} ${chalk.green('✓')}`);
|
|
274
|
+
console.log(` Meta: ${chalk.bold(String(verifyMetaCount))} rows (source had ${sourceMetaCount}) ${verifyMetaCount === sourceMetaCount ? chalk.green('✓') : chalk.yellow('~')}`);
|
|
275
|
+
console.log(chalk.green(`\nUser ${userId} synced from ${fromEnv} to ${toEnv}`));
|
|
276
|
+
}
|
|
277
|
+
export const userSyncCommand = new Command('user-sync')
|
|
278
|
+
.description('Fix user ID mismatch between environments by syncing wp_users and wp_usermeta')
|
|
279
|
+
.requiredOption('--from <env>', 'Source environment (dev, uat, pprd, prod)')
|
|
280
|
+
.requiredOption('--to <env>', 'Target environment (dev, uat, pprd, prod)')
|
|
281
|
+
.requiredOption('--user-id <id>', 'User ID on the source environment')
|
|
282
|
+
.option('--dry-run', 'Show what would be done without making changes', false)
|
|
283
|
+
.action(async (options) => {
|
|
284
|
+
await runUserSync(options);
|
|
285
|
+
});
|
|
286
|
+
//# sourceMappingURL=user-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-sync.js","sourceRoot":"","sources":["../../src/commands/user-sync.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -21,6 +21,7 @@ import { configCommand } from './commands/config.js';
|
|
|
21
21
|
import { doctorCommand } from './commands/doctor.js';
|
|
22
22
|
import { cleanupCommand } from './commands/cleanup.js';
|
|
23
23
|
import { listSitesCommand } from './commands/list-sites.js';
|
|
24
|
+
import { userSyncCommand } from './commands/user-sync.js';
|
|
24
25
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
25
26
|
const packageJson = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
|
|
26
27
|
const VERSION = packageJson.version;
|
|
@@ -34,5 +35,6 @@ program.addCommand(configCommand);
|
|
|
34
35
|
program.addCommand(doctorCommand);
|
|
35
36
|
program.addCommand(cleanupCommand);
|
|
36
37
|
program.addCommand(listSitesCommand);
|
|
38
|
+
program.addCommand(userSyncCommand);
|
|
37
39
|
program.parse();
|
|
38
40
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7F,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;AAEpC,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,+EAA+E,CAAC;KAC5F,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,4BAA4B,CAAC,CAAC;AAEnE,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AAEpC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|