@push.rocks/smartnpm 2.1.2 → 2.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/smartnpm.classes.npmpackage.js +1 -1
- package/dist_ts/smartnpm.classes.npmregistry.js +6 -8
- package/dist_ts/smartnpm.ini.d.ts +4 -0
- package/dist_ts/smartnpm.ini.js +143 -0
- package/dist_ts/smartnpm.npmrc.d.ts +44 -0
- package/dist_ts/smartnpm.npmrc.js +342 -0
- package/dist_ts/smartnpm.packument.d.ts +29 -0
- package/dist_ts/smartnpm.packument.js +177 -0
- package/dist_ts/smartnpm.paths.js +1 -1
- package/dist_ts/smartnpm.plugins.d.ts +4 -3
- package/dist_ts/smartnpm.plugins.js +5 -5
- package/dist_ts/smartnpm.registryurl.d.ts +4 -0
- package/dist_ts/smartnpm.registryurl.js +367 -0
- package/package.json +10 -11
- package/readme.md +2 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/smartnpm.classes.npmregistry.ts +9 -11
- package/ts/smartnpm.ini.ts +147 -0
- package/ts/smartnpm.npmrc.ts +382 -0
- package/ts/smartnpm.packument.ts +200 -0
- package/ts/smartnpm.plugins.ts +4 -6
- package/ts/smartnpm.registryurl.ts +364 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import * as plugins from './smartnpm.plugins.js';
|
|
2
|
+
import { parseIni } from './smartnpm.ini.js';
|
|
3
|
+
/**
|
|
4
|
+
* npm configuration and registry authentication, read the way npm reads it:
|
|
5
|
+
* cli < builtin npmrc < npm_config_* env < project .npmrc < workspace .npmrc < user npmrc < global npmrc < defaults
|
|
6
|
+
* (earlier layers win).
|
|
7
|
+
*/
|
|
8
|
+
// rc reads the home directory as it was before npm exported it
|
|
9
|
+
export const homeBeforeNpmrc = process.platform === 'win32' ? process.env.USERPROFILE : process.env.HOME;
|
|
10
|
+
// npm resolves the home directory once and exports it as HOME for everything that follows
|
|
11
|
+
const homeDir = plugins.os.homedir();
|
|
12
|
+
if (homeDir) {
|
|
13
|
+
process.env.HOME = homeDir;
|
|
14
|
+
}
|
|
15
|
+
let defaultsCache;
|
|
16
|
+
const getDefaults = () => {
|
|
17
|
+
if (defaultsCache) {
|
|
18
|
+
return defaultsCache;
|
|
19
|
+
}
|
|
20
|
+
const home = homeDir ||
|
|
21
|
+
plugins.path.resolve(plugins.os.tmpdir(), 'npm-' + (process.getuid ? process.getuid() : process.pid));
|
|
22
|
+
let globalPrefix;
|
|
23
|
+
if (process.env.PREFIX) {
|
|
24
|
+
globalPrefix = process.env.PREFIX;
|
|
25
|
+
}
|
|
26
|
+
else if (process.platform === 'win32') {
|
|
27
|
+
globalPrefix = plugins.path.dirname(process.execPath);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
globalPrefix = plugins.path.dirname(plugins.path.dirname(process.execPath));
|
|
31
|
+
if (process.env.DESTDIR) {
|
|
32
|
+
globalPrefix = plugins.path.join(process.env.DESTDIR, globalPrefix);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// only the defaults that take part in locating config files and credentials
|
|
36
|
+
defaultsCache = {
|
|
37
|
+
cafile: null,
|
|
38
|
+
global: false,
|
|
39
|
+
globalconfig: plugins.path.resolve(globalPrefix, 'etc', 'npmrc'),
|
|
40
|
+
prefix: globalPrefix,
|
|
41
|
+
registry: 'https://registry.npmjs.org/',
|
|
42
|
+
userconfig: plugins.path.resolve(home, '.npmrc'),
|
|
43
|
+
};
|
|
44
|
+
return defaultsCache;
|
|
45
|
+
};
|
|
46
|
+
const ENV_EXPR = /(?<!\\)(\\*)\$\{([^${}]+)\}/g;
|
|
47
|
+
const ENV_VALUE = /([^:-]+)(:?)-(.+)/;
|
|
48
|
+
/**
|
|
49
|
+
* replaces ${VAR}, ${VAR-fallback} and ${VAR:-fallback} references; throws on unset variables
|
|
50
|
+
*/
|
|
51
|
+
export const envReplace = (settingValue, env) => {
|
|
52
|
+
return settingValue.replace(ENV_EXPR, (orig, escape, name) => {
|
|
53
|
+
if (escape.length % 2) {
|
|
54
|
+
return orig.slice((escape.length + 1) / 2);
|
|
55
|
+
}
|
|
56
|
+
let envValue;
|
|
57
|
+
const matched = name.match(ENV_VALUE);
|
|
58
|
+
if (!matched) {
|
|
59
|
+
envValue = env[name];
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const [, variableName, colon, fallback] = matched;
|
|
63
|
+
envValue = Object.prototype.hasOwnProperty.call(env, variableName)
|
|
64
|
+
? !env[variableName] && colon
|
|
65
|
+
? fallback
|
|
66
|
+
: env[variableName]
|
|
67
|
+
: fallback;
|
|
68
|
+
}
|
|
69
|
+
if (envValue === undefined) {
|
|
70
|
+
throw new Error(`Failed to replace env in config: ${orig}`);
|
|
71
|
+
}
|
|
72
|
+
return `${escape.slice(escape.length / 2)}${envValue}`;
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
const parseField = (field, key) => {
|
|
76
|
+
if (typeof field !== 'string') {
|
|
77
|
+
return field;
|
|
78
|
+
}
|
|
79
|
+
field = field.trim();
|
|
80
|
+
if (/^".*"$/.test(field)) {
|
|
81
|
+
try {
|
|
82
|
+
field = JSON.parse(field);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
throw new Error(`Failed parsing JSON config key ${key}: ${field}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
switch (field) {
|
|
89
|
+
case 'true':
|
|
90
|
+
return true;
|
|
91
|
+
case 'false':
|
|
92
|
+
return false;
|
|
93
|
+
case 'null':
|
|
94
|
+
return null;
|
|
95
|
+
case 'undefined':
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
return envReplace(field, process.env);
|
|
99
|
+
};
|
|
100
|
+
const parseLayer = (data) => {
|
|
101
|
+
for (const [key, value] of Object.entries(data)) {
|
|
102
|
+
const substKey = envReplace(key, process.env);
|
|
103
|
+
if (substKey !== key) {
|
|
104
|
+
delete data[key];
|
|
105
|
+
}
|
|
106
|
+
data[substKey] = parseField(value, substKey);
|
|
107
|
+
}
|
|
108
|
+
return data;
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* normalizes the part after npm_config_ to the setting name
|
|
112
|
+
*/
|
|
113
|
+
const envKeyToSetting = (x) => {
|
|
114
|
+
const normalize = (s) => {
|
|
115
|
+
s = s.toLowerCase();
|
|
116
|
+
if (s === '_authtoken') {
|
|
117
|
+
return '_authToken';
|
|
118
|
+
}
|
|
119
|
+
let r = s[0];
|
|
120
|
+
for (let i = 1; i < s.length; i++) {
|
|
121
|
+
r += s[i] === '_' ? '-' : s[i];
|
|
122
|
+
}
|
|
123
|
+
return r;
|
|
124
|
+
};
|
|
125
|
+
const colonIndex = x.indexOf(':');
|
|
126
|
+
if (colonIndex === -1) {
|
|
127
|
+
return normalize(x);
|
|
128
|
+
}
|
|
129
|
+
return `${normalize(x.substr(0, colonIndex))}:${normalize(x.substr(colonIndex + 1))}`;
|
|
130
|
+
};
|
|
131
|
+
const findPrefix = (nameArg) => {
|
|
132
|
+
let name = plugins.path.resolve(nameArg);
|
|
133
|
+
let walkedUp = false;
|
|
134
|
+
while (plugins.path.basename(name) === 'node_modules') {
|
|
135
|
+
name = plugins.path.dirname(name);
|
|
136
|
+
walkedUp = true;
|
|
137
|
+
}
|
|
138
|
+
if (walkedUp) {
|
|
139
|
+
return name;
|
|
140
|
+
}
|
|
141
|
+
const find = (dir, original) => {
|
|
142
|
+
if (dir === '/' || (process.platform === 'win32' && /^[a-zA-Z]:(\\|\/)?$/.test(dir))) {
|
|
143
|
+
return original;
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
const files = plugins.fs.readdirSync(dir);
|
|
147
|
+
if (files.includes('node_modules') ||
|
|
148
|
+
files.includes('package.json') ||
|
|
149
|
+
files.includes('package.json5') ||
|
|
150
|
+
files.includes('package.yaml') ||
|
|
151
|
+
files.includes('pnpm-workspace.yaml')) {
|
|
152
|
+
return dir;
|
|
153
|
+
}
|
|
154
|
+
const dirname = plugins.path.dirname(dir);
|
|
155
|
+
if (dirname === dir) {
|
|
156
|
+
return original;
|
|
157
|
+
}
|
|
158
|
+
return find(dirname, original);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
if (dir === original) {
|
|
162
|
+
if (error.code === 'ENOENT') {
|
|
163
|
+
return original;
|
|
164
|
+
}
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
167
|
+
return original;
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
return find(name, name);
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* the layered npm configuration
|
|
174
|
+
*/
|
|
175
|
+
export class NpmrcConfig {
|
|
176
|
+
constructor() {
|
|
177
|
+
this.layers = [];
|
|
178
|
+
this.root = { ...getDefaults() };
|
|
179
|
+
}
|
|
180
|
+
get(key) {
|
|
181
|
+
for (const layer of [...this.layers, this.root]) {
|
|
182
|
+
if (Object.prototype.hasOwnProperty.call(layer, key)) {
|
|
183
|
+
return layer[key];
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* adds an npmrc file; a file that is missing or fails to parse contributes nothing
|
|
190
|
+
*/
|
|
191
|
+
addFile(file) {
|
|
192
|
+
try {
|
|
193
|
+
const contents = plugins.fs.readFileSync(file, 'utf8');
|
|
194
|
+
this.layers.push(parseLayer(parseIni(contents)));
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
this.layers.push({});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
addEnv() {
|
|
201
|
+
const conf = {};
|
|
202
|
+
for (const envKey of Object.keys(process.env)) {
|
|
203
|
+
if (!/^npm_config_/i.test(envKey) || !process.env[envKey]) {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
conf[envKeyToSetting(envKey.substr(11))] = process.env[envKey];
|
|
207
|
+
}
|
|
208
|
+
this.layers.push(parseLayer(conf));
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* loads the configuration from env and npmrc files
|
|
212
|
+
*/
|
|
213
|
+
static load() {
|
|
214
|
+
const conf = new NpmrcConfig();
|
|
215
|
+
// cli layer
|
|
216
|
+
conf.layers.push({});
|
|
217
|
+
// builtin npmrc of a globally installed npm
|
|
218
|
+
const requireFn = plugins.module.createRequire(import.meta.url);
|
|
219
|
+
const lookupPaths = requireFn.resolve.paths('npm');
|
|
220
|
+
if (lookupPaths) {
|
|
221
|
+
let npmPath;
|
|
222
|
+
try {
|
|
223
|
+
npmPath = requireFn.resolve('npm', { paths: lookupPaths.slice(-1) });
|
|
224
|
+
}
|
|
225
|
+
catch { }
|
|
226
|
+
if (npmPath) {
|
|
227
|
+
conf.addFile(plugins.path.resolve(plugins.path.dirname(npmPath), '..', 'npmrc'));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
conf.addEnv();
|
|
231
|
+
const localPrefix = findPrefix(process.cwd());
|
|
232
|
+
const projectConf = plugins.path.resolve(localPrefix, '.npmrc');
|
|
233
|
+
const userConf = conf.get('userconfig');
|
|
234
|
+
if (!conf.get('global') && projectConf !== userConf) {
|
|
235
|
+
conf.addFile(projectConf);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
conf.layers.push({});
|
|
239
|
+
}
|
|
240
|
+
const workspacePrefix = conf.get('workspace-prefix');
|
|
241
|
+
if (workspacePrefix && workspacePrefix !== projectConf) {
|
|
242
|
+
conf.addFile(plugins.path.resolve(workspacePrefix, '.npmrc'));
|
|
243
|
+
}
|
|
244
|
+
conf.addFile(conf.get('userconfig'));
|
|
245
|
+
if (conf.get('prefix')) {
|
|
246
|
+
conf.root.globalconfig = plugins.path.resolve(conf.get('prefix'), 'etc', 'npmrc');
|
|
247
|
+
}
|
|
248
|
+
conf.addFile(conf.get('globalconfig'));
|
|
249
|
+
conf.checkPrefix();
|
|
250
|
+
const caFile = conf.get('cafile');
|
|
251
|
+
if (caFile) {
|
|
252
|
+
try {
|
|
253
|
+
plugins.fs.readFileSync(caFile, 'utf8');
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
if (error.code !== 'ENOENT') {
|
|
257
|
+
throw error;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return conf;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* npm stats the prefix to determine the default user; only failures other than ENOENT surface
|
|
265
|
+
*/
|
|
266
|
+
checkPrefix() {
|
|
267
|
+
if (this.get('global') || process.env.SUDO_UID) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
const prefix = plugins.path.resolve(this.get('prefix'));
|
|
271
|
+
try {
|
|
272
|
+
plugins.fs.statSync(prefix);
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
if (error.code === 'ENOENT') {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
throw error;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
const replaceEnvironmentVariable = (token) => {
|
|
283
|
+
return token.replace(/^\$\{?([^}]*)\}?$/, (_fullMatch, envVar) => {
|
|
284
|
+
return process.env[envVar];
|
|
285
|
+
});
|
|
286
|
+
};
|
|
287
|
+
const getAuthInfoForUrl = (regUrl, npmrc) => {
|
|
288
|
+
const bearerToken = npmrc.get(regUrl + ':_authToken') || npmrc.get(regUrl + '/:_authToken');
|
|
289
|
+
if (bearerToken) {
|
|
290
|
+
return { token: replaceEnvironmentVariable(bearerToken), type: 'Bearer' };
|
|
291
|
+
}
|
|
292
|
+
const username = npmrc.get(regUrl + ':username') || npmrc.get(regUrl + '/:username');
|
|
293
|
+
const password = npmrc.get(regUrl + ':_password') || npmrc.get(regUrl + '/:_password');
|
|
294
|
+
if (username && password) {
|
|
295
|
+
// passwords are base64 encoded; a basic token is base64 encoded 'username:password'
|
|
296
|
+
const pass = Buffer.from(replaceEnvironmentVariable(password), 'base64').toString('utf8');
|
|
297
|
+
return {
|
|
298
|
+
token: Buffer.from(username + ':' + pass, 'utf8').toString('base64'),
|
|
299
|
+
type: 'Basic',
|
|
300
|
+
password: pass,
|
|
301
|
+
username: username,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
const legacyToken = npmrc.get(regUrl + ':_auth') || npmrc.get(regUrl + '/:_auth');
|
|
305
|
+
if (legacyToken) {
|
|
306
|
+
return { token: replaceEnvironmentVariable(legacyToken), type: 'Basic' };
|
|
307
|
+
}
|
|
308
|
+
return undefined;
|
|
309
|
+
};
|
|
310
|
+
const urlResolve = (from, to) => {
|
|
311
|
+
const resolvedUrl = new URL(to, new URL(from.startsWith('//') ? `./${from}` : from, 'resolve://'));
|
|
312
|
+
if (resolvedUrl.protocol === 'resolve:') {
|
|
313
|
+
const { pathname, search, hash } = resolvedUrl;
|
|
314
|
+
return pathname + search + hash;
|
|
315
|
+
}
|
|
316
|
+
return resolvedUrl.toString();
|
|
317
|
+
};
|
|
318
|
+
/**
|
|
319
|
+
* finds the credentials npm would send to a registry url: the most specific
|
|
320
|
+
* //host/path entry walking up the path, then the global _auth
|
|
321
|
+
*/
|
|
322
|
+
export const getRegistryAuthInfo = (checkUrl) => {
|
|
323
|
+
const npmrc = NpmrcConfig.load();
|
|
324
|
+
const parsed = new URL(checkUrl.startsWith('//') ? `http:${checkUrl}` : checkUrl);
|
|
325
|
+
let pathname;
|
|
326
|
+
while (pathname !== '/' && parsed.pathname !== pathname) {
|
|
327
|
+
pathname = parsed.pathname || '/';
|
|
328
|
+
const regUrl = '//' + parsed.host + pathname.replace(/\/$/, '');
|
|
329
|
+
const authInfo = getAuthInfoForUrl(regUrl, npmrc);
|
|
330
|
+
if (authInfo) {
|
|
331
|
+
return authInfo;
|
|
332
|
+
}
|
|
333
|
+
const normalizedPath = pathname[pathname.length - 1] === '/' ? pathname : pathname + '/';
|
|
334
|
+
parsed.pathname = urlResolve(normalizedPath, '..') || '/';
|
|
335
|
+
}
|
|
336
|
+
const legacyAuth = npmrc.get('_auth');
|
|
337
|
+
if (!legacyAuth) {
|
|
338
|
+
return undefined;
|
|
339
|
+
}
|
|
340
|
+
return { token: replaceEnvironmentVariable(legacyAuth), type: 'Basic' };
|
|
341
|
+
};
|
|
342
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRucG0ubnBtcmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydG5wbS5ucG1yYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU3Qzs7OztHQUlHO0FBRUgsK0RBQStEO0FBQy9ELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FDMUIsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUU1RSwwRkFBMEY7QUFDMUYsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNyQyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO0FBQzdCLENBQUM7QUFXRCxJQUFJLGFBQTBCLENBQUM7QUFDL0IsTUFBTSxXQUFXLEdBQUcsR0FBZ0IsRUFBRTtJQUNwQyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxNQUFNLElBQUksR0FDUixPQUFPO1FBQ1AsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQ2xCLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQ25CLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUMzRCxDQUFDO0lBQ0osSUFBSSxZQUFvQixDQUFDO0lBQ3pCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN2QixZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFDcEMsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUN4QyxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7U0FBTSxDQUFDO1FBQ04sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QixZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7SUFDRCw0RUFBNEU7SUFDNUUsYUFBYSxHQUFHO1FBQ2QsTUFBTSxFQUFFLElBQUk7UUFDWixNQUFNLEVBQUUsS0FBSztRQUNiLFlBQVksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQztRQUNoRSxNQUFNLEVBQUUsWUFBWTtRQUNwQixRQUFRLEVBQUUsNkJBQTZCO1FBQ3ZDLFVBQVUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDO0tBQ2pELENBQUM7SUFDRixPQUFPLGFBQWEsQ0FBQztBQUN2QixDQUFDLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBRyw4QkFBOEIsQ0FBQztBQUNoRCxNQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQztBQUV0Qzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLFlBQW9CLEVBQUUsR0FBc0IsRUFBVSxFQUFFO0lBQ2pGLE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFZLEVBQUUsTUFBYyxFQUFFLElBQVksRUFBRSxFQUFFO1FBQ25GLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLFFBQTRCLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDbEQsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDO2dCQUNoRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSztvQkFDM0IsQ0FBQyxDQUFDLFFBQVE7b0JBQ1YsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUM7Z0JBQ3JCLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQztJQUN6RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBVSxFQUFFLEdBQVcsRUFBTyxFQUFFO0lBQ2xELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUM7WUFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsR0FBRyxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDckUsQ0FBQztJQUNILENBQUM7SUFDRCxRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ2QsS0FBSyxNQUFNO1lBQ1QsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLE9BQU87WUFDVixPQUFPLEtBQUssQ0FBQztRQUNmLEtBQUssTUFBTTtZQUNULE9BQU8sSUFBSSxDQUFDO1FBQ2QsS0FBSyxXQUFXO1lBQ2QsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFpQixFQUFlLEVBQUU7SUFDcEQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QyxJQUFJLFFBQVEsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNyQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQVMsRUFBVSxFQUFFO0lBQzVDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUU7UUFDOUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUN2QixPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUN4RixDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQWUsRUFBVSxFQUFFO0lBQzdDLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLGNBQWMsRUFBRSxDQUFDO1FBQ3RELElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFXLEVBQUUsUUFBZ0IsRUFBVSxFQUFFO1FBQ3JELElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckYsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLElBQ0UsS0FBSyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7Z0JBQzlCLEtBQUssQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO2dCQUM5QixLQUFLLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztnQkFDL0IsS0FBSyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7Z0JBQzlCLEtBQUssQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsRUFDckMsQ0FBQztnQkFDRCxPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxJQUFJLE9BQU8sS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxRQUFRLENBQUM7WUFDbEIsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNyQixJQUFLLEtBQStCLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUN2RCxPQUFPLFFBQVEsQ0FBQztnQkFDbEIsQ0FBQztnQkFDRCxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7WUFDRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFJdEI7UUFITyxXQUFNLEdBQWtCLEVBQUUsQ0FBQztRQUloQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxXQUFXLEVBQUUsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSxHQUFHLENBQUMsR0FBVztRQUNwQixLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2hELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU8sQ0FBQyxJQUFTO1FBQ3RCLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFFTSxNQUFNO1FBQ1gsTUFBTSxJQUFJLEdBQWdCLEVBQUUsQ0FBQztRQUM3QixLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzFELFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsSUFBSTtRQUNoQixNQUFNLElBQUksR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQy9CLFlBQVk7UUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVyQiw0Q0FBNEM7UUFDNUMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEUsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLE9BQTJCLENBQUM7WUFDaEMsSUFBSSxDQUFDO2dCQUNILE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQSxDQUFDO1lBQ1YsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ25GLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2QsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRTlDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFdBQVcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUVELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNyRCxJQUFJLGVBQWUsSUFBSSxlQUFlLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFFckMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUM7Z0JBQ0gsT0FBTyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUssS0FBK0IsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3ZELE1BQU0sS0FBSyxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVztRQUNqQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQyxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUM7WUFDSCxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUssS0FBK0IsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3ZELE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLEtBQVUsRUFBVSxFQUFFO0lBQ3hELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFVBQWtCLEVBQUUsTUFBYyxFQUFFLEVBQUU7UUFDL0UsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE1BQWMsRUFBRSxLQUFrQixFQUE4QixFQUFFO0lBQzNGLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxDQUFDO0lBQzVGLElBQUksV0FBVyxFQUFFLENBQUM7UUFDaEIsT0FBTyxFQUFFLEtBQUssRUFBRSwwQkFBMEIsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQ3JGLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZGLElBQUksUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ3pCLG9GQUFvRjtRQUNwRixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxRixPQUFPO1lBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNwRSxJQUFJLEVBQUUsT0FBTztZQUNiLFFBQVEsRUFBRSxJQUFJO1lBQ2QsUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQztJQUNsRixJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sRUFBRSxLQUFLLEVBQUUsMEJBQTBCLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFVLEVBQVUsRUFBRTtJQUN0RCxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDbkcsSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFdBQVcsQ0FBQztRQUMvQyxPQUFPLFFBQVEsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ2xDLENBQUM7SUFDRCxPQUFPLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNoQyxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLFFBQWdCLEVBQThCLEVBQUU7SUFDbEYsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xGLElBQUksUUFBNEIsQ0FBQztJQUNqQyxPQUFPLFFBQVEsS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4RCxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUM7UUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEUsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBQ0QsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDekYsTUFBTSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUM1RCxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsMEJBQTBCLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQzFFLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare class PackageNotFoundError extends Error {
|
|
2
|
+
constructor(packageName: string);
|
|
3
|
+
}
|
|
4
|
+
export declare class VersionNotFoundError extends Error {
|
|
5
|
+
constructor(packageName: string, version: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class HTTPError extends Error {
|
|
8
|
+
response: Response;
|
|
9
|
+
request: Request;
|
|
10
|
+
constructor(response: Response, request: Request);
|
|
11
|
+
}
|
|
12
|
+
export declare class TimeoutError extends Error {
|
|
13
|
+
request: Request;
|
|
14
|
+
constructor(request: Request);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* fetches the packument of a package, abbreviated (as used for installs) or full
|
|
18
|
+
*/
|
|
19
|
+
export declare const fetchPackument: (packageName: string, optionsArg: {
|
|
20
|
+
registryUrl?: string;
|
|
21
|
+
fullMetadata?: boolean;
|
|
22
|
+
}) => Promise<any>;
|
|
23
|
+
/**
|
|
24
|
+
* fetches the full packument and returns the manifest of the version tagged latest,
|
|
25
|
+
* with the packument's time map attached
|
|
26
|
+
*/
|
|
27
|
+
export declare const fetchLatestManifest: (packageName: string, optionsArg: {
|
|
28
|
+
registryUrl?: string;
|
|
29
|
+
}) => Promise<any>;
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { getRegistryAuthInfo } from './smartnpm.npmrc.js';
|
|
2
|
+
import { getDefaultRegistryUrl } from './smartnpm.registryurl.js';
|
|
3
|
+
/**
|
|
4
|
+
* reads packuments (package documents) from an npm registry
|
|
5
|
+
*/
|
|
6
|
+
const ABBREVIATED_ACCEPT = 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*';
|
|
7
|
+
const FULL_ACCEPT = 'application/json';
|
|
8
|
+
const REQUEST_TIMEOUT_MS = 10_000;
|
|
9
|
+
const RETRY_LIMIT = 2;
|
|
10
|
+
const RETRY_STATUS_CODES = [408, 413, 429, 500, 502, 503, 504];
|
|
11
|
+
const RETRY_AFTER_STATUS_CODES = [413, 429, 503];
|
|
12
|
+
const MAX_SAFE_TIMEOUT_MS = 2_147_483_647;
|
|
13
|
+
export class PackageNotFoundError extends Error {
|
|
14
|
+
constructor(packageName) {
|
|
15
|
+
super(`Package \`${packageName}\` could not be found`);
|
|
16
|
+
this.name = 'PackageNotFoundError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class VersionNotFoundError extends Error {
|
|
20
|
+
constructor(packageName, version) {
|
|
21
|
+
super(`Version \`${version}\` for package \`${packageName}\` could not be found`);
|
|
22
|
+
this.name = 'VersionNotFoundError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class HTTPError extends Error {
|
|
26
|
+
constructor(response, request) {
|
|
27
|
+
const code = response.status || response.status === 0 ? response.status : '';
|
|
28
|
+
const status = `${code} ${response.statusText ?? ''}`.trim();
|
|
29
|
+
const reason = status ? `status code ${status}` : 'an unknown error';
|
|
30
|
+
super(`Request failed with ${reason}: ${request.method} ${request.url}`);
|
|
31
|
+
this.name = 'HTTPError';
|
|
32
|
+
this.response = response;
|
|
33
|
+
// not enumerable, so logging the error never prints the authorization header
|
|
34
|
+
Object.defineProperty(this, 'request', { value: request, enumerable: false, writable: true });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class TimeoutError extends Error {
|
|
38
|
+
constructor(request) {
|
|
39
|
+
super(`Request timed out: ${request.method} ${request.url}`);
|
|
40
|
+
this.name = 'TimeoutError';
|
|
41
|
+
// not enumerable, so logging the error never prints the authorization header
|
|
42
|
+
Object.defineProperty(this, 'request', { value: request, enumerable: false, writable: true });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
46
|
+
const fetchWithTimeout = (request, abortController) => {
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
const timeoutId = setTimeout(() => {
|
|
49
|
+
abortController.abort();
|
|
50
|
+
reject(new TimeoutError(request));
|
|
51
|
+
}, REQUEST_TIMEOUT_MS);
|
|
52
|
+
void fetch(request)
|
|
53
|
+
.then(resolve)
|
|
54
|
+
.catch(reject)
|
|
55
|
+
.then(() => {
|
|
56
|
+
clearTimeout(timeoutId);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* returns how long to wait before the next attempt, or throws when the error is final
|
|
62
|
+
*/
|
|
63
|
+
const getRetryDelay = (error, retryCount) => {
|
|
64
|
+
if (retryCount > RETRY_LIMIT || error instanceof TimeoutError) {
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
if (error instanceof HTTPError) {
|
|
68
|
+
const status = error.response.status;
|
|
69
|
+
if (!RETRY_STATUS_CODES.includes(status)) {
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
const headers = error.response.headers;
|
|
73
|
+
const retryAfter = headers.get('Retry-After') ??
|
|
74
|
+
headers.get('RateLimit-Reset') ??
|
|
75
|
+
headers.get('X-RateLimit-Retry-After') ??
|
|
76
|
+
headers.get('X-RateLimit-Reset') ??
|
|
77
|
+
headers.get('X-Rate-Limit-Reset');
|
|
78
|
+
if (retryAfter && RETRY_AFTER_STATUS_CODES.includes(status)) {
|
|
79
|
+
let after = Number(retryAfter) * 1000;
|
|
80
|
+
if (Number.isNaN(after)) {
|
|
81
|
+
after = Date.parse(retryAfter) - Date.now();
|
|
82
|
+
}
|
|
83
|
+
else if (after >= Date.parse('2024-01-01')) {
|
|
84
|
+
// a large number is a timestamp
|
|
85
|
+
after -= Date.now();
|
|
86
|
+
}
|
|
87
|
+
// an unparseable value waits as long as a timer can
|
|
88
|
+
return Number.isNaN(after) ? Number.POSITIVE_INFINITY : after;
|
|
89
|
+
}
|
|
90
|
+
if (status === 413) {
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return 0.3 * 2 ** (retryCount - 1) * 1000;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* GETs a json document: 10 s until response headers, two retries for network
|
|
98
|
+
* errors and retryable status codes, honouring Retry-After
|
|
99
|
+
*/
|
|
100
|
+
const getJson = async (url, headers) => {
|
|
101
|
+
const abortController = new AbortController();
|
|
102
|
+
let request = new Request(url, { headers, keepalive: true, signal: abortController.signal });
|
|
103
|
+
const fetchWithRetry = async () => {
|
|
104
|
+
let retryCount = 0;
|
|
105
|
+
while (true) {
|
|
106
|
+
const attemptRequest = request;
|
|
107
|
+
request = attemptRequest.clone();
|
|
108
|
+
try {
|
|
109
|
+
const response = await fetchWithTimeout(attemptRequest, abortController);
|
|
110
|
+
if (!response.ok) {
|
|
111
|
+
throw new HTTPError(response, request);
|
|
112
|
+
}
|
|
113
|
+
return response;
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
retryCount++;
|
|
117
|
+
await delay(Math.min(getRetryDelay(error, retryCount), MAX_SAFE_TIMEOUT_MS));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
const response = await fetchWithRetry();
|
|
122
|
+
if (response.status === 204) {
|
|
123
|
+
return '';
|
|
124
|
+
}
|
|
125
|
+
const text = await response.text();
|
|
126
|
+
if (text === '') {
|
|
127
|
+
return '';
|
|
128
|
+
}
|
|
129
|
+
return JSON.parse(text);
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* fetches the packument of a package, abbreviated (as used for installs) or full
|
|
133
|
+
*/
|
|
134
|
+
export const fetchPackument = async (packageName, optionsArg) => {
|
|
135
|
+
const scope = packageName.split('/')[0];
|
|
136
|
+
const registryUrl = optionsArg.registryUrl ?? getDefaultRegistryUrl(scope);
|
|
137
|
+
const packageUrl = new URL(encodeURIComponent(packageName).replace(/^%40/, '@'), registryUrl);
|
|
138
|
+
const authInfo = getRegistryAuthInfo(registryUrl.toString());
|
|
139
|
+
const headers = {
|
|
140
|
+
accept: optionsArg.fullMetadata ? FULL_ACCEPT : ABBREVIATED_ACCEPT,
|
|
141
|
+
};
|
|
142
|
+
if (authInfo) {
|
|
143
|
+
headers.authorization = `${authInfo.type} ${authInfo.token}`;
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
return await getJson(packageUrl, headers);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
if (error instanceof HTTPError && error.response.status === 404) {
|
|
150
|
+
throw new PackageNotFoundError(packageName);
|
|
151
|
+
}
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* fetches the full packument and returns the manifest of the version tagged latest,
|
|
157
|
+
* with the packument's time map attached
|
|
158
|
+
*/
|
|
159
|
+
export const fetchLatestManifest = async (packageName, optionsArg) => {
|
|
160
|
+
const version = 'latest';
|
|
161
|
+
let data = await fetchPackument(packageName, { ...optionsArg, fullMetadata: true });
|
|
162
|
+
if (data['dist-tags'][version]) {
|
|
163
|
+
const { time } = data;
|
|
164
|
+
data = data.versions[data['dist-tags'][version]];
|
|
165
|
+
data.time = time;
|
|
166
|
+
return data;
|
|
167
|
+
}
|
|
168
|
+
// 'latest' is no semver range, so only a version literally named so can match
|
|
169
|
+
if (!data.versions[version]) {
|
|
170
|
+
throw new VersionNotFoundError(packageName, version);
|
|
171
|
+
}
|
|
172
|
+
const { time } = data;
|
|
173
|
+
data = data.versions[version];
|
|
174
|
+
data.time = time;
|
|
175
|
+
return data;
|
|
176
|
+
};
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRucG0ucGFja3VtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRucG0ucGFja3VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWxFOztHQUVHO0FBRUgsTUFBTSxrQkFBa0IsR0FBRywwRUFBMEUsQ0FBQztBQUN0RyxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztBQUV2QyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztBQUNsQyxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDdEIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQy9ELE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2pELE1BQU0sbUJBQW1CLEdBQUcsYUFBYSxDQUFDO0FBRTFDLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxLQUFLO0lBQzdDLFlBQVksV0FBbUI7UUFDN0IsS0FBSyxDQUFDLGFBQWEsV0FBVyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLG9CQUFxQixTQUFRLEtBQUs7SUFDN0MsWUFBWSxXQUFtQixFQUFFLE9BQWU7UUFDOUMsS0FBSyxDQUFDLGFBQWEsT0FBTyxvQkFBb0IsV0FBVyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFNBQVUsU0FBUSxLQUFL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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import * as plugins from './smartnpm.plugins.js';
|
|
2
2
|
export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../');
|
|
3
3
|
export const nogitDir = plugins.path.join(packageDir, '.nogit/');
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRucG0ucGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydG5wbS5wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBRWpELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDekMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQy9ELEtBQUssQ0FDTixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQyJ9
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as module from 'module';
|
|
3
|
+
import * as os from 'os';
|
|
1
4
|
import * as path from 'path';
|
|
2
|
-
export { path };
|
|
5
|
+
export { fs, module, os, path };
|
|
3
6
|
import * as levelcache from '@push.rocks/levelcache';
|
|
4
7
|
import * as smartarchive from '@push.rocks/smartarchive';
|
|
5
8
|
import { color } from '@push.rocks/smartconsole/color';
|
|
@@ -11,5 +14,3 @@ import * as smartrequest from '@push.rocks/smartrequest';
|
|
|
11
14
|
import * as smartversion from '@push.rocks/smartversion';
|
|
12
15
|
import * as smarttime from '@push.rocks/smarttime';
|
|
13
16
|
export { levelcache, smartarchive, color, smartfile, smartfs, smartpath, smartpromise, smartrequest, smartversion, smarttime, };
|
|
14
|
-
import * as packageJson from 'package-json';
|
|
15
|
-
export { packageJson };
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
// node native modules
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as module from 'module';
|
|
4
|
+
import * as os from 'os';
|
|
2
5
|
import * as path from 'path';
|
|
3
|
-
export { path };
|
|
6
|
+
export { fs, module, os, path };
|
|
4
7
|
// @pushrocks scope
|
|
5
8
|
import * as levelcache from '@push.rocks/levelcache';
|
|
6
9
|
import * as smartarchive from '@push.rocks/smartarchive';
|
|
@@ -13,7 +16,4 @@ import * as smartrequest from '@push.rocks/smartrequest';
|
|
|
13
16
|
import * as smartversion from '@push.rocks/smartversion';
|
|
14
17
|
import * as smarttime from '@push.rocks/smarttime';
|
|
15
18
|
export { levelcache, smartarchive, color, smartfile, smartfs, smartpath, smartpromise, smartrequest, smartversion, smarttime, };
|
|
16
|
-
|
|
17
|
-
import * as packageJson from 'package-json';
|
|
18
|
-
export { packageJson };
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRucG0ucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0bnBtLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0JBQXNCO0FBQ3RCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUVoQixtQkFBbUI7QUFDbkIsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sRUFDTCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLFlBQVksRUFDWixTQUFTLEdBQ1YsQ0FBQztBQUVGLG9CQUFvQjtBQUNwQixPQUFPLEtBQUssV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUU1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMifQ==
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRucG0ucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0bnBtLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0JBQXNCO0FBQ3RCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUVoQyxtQkFBbUI7QUFDbkIsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sRUFDTCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLFlBQVksRUFDWixTQUFTLEdBQ1YsQ0FBQyJ9
|