@push.rocks/smartnpm 2.1.3 → 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 +6 -7
- 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,367 @@
|
|
|
1
|
+
import * as plugins from './smartnpm.plugins.js';
|
|
2
|
+
import { parseIni } from './smartnpm.ini.js';
|
|
3
|
+
import { homeBeforeNpmrc as rcHome } from './smartnpm.npmrc.js';
|
|
4
|
+
/**
|
|
5
|
+
* resolves the registry url from npm configuration when none is configured,
|
|
6
|
+
* the way rc('npm') reads it: defaults < config files < npm_* env < process arguments
|
|
7
|
+
*/
|
|
8
|
+
const stripJsonComments = (str) => {
|
|
9
|
+
const strip = (s, start, end) => s.slice(start, end).replace(/\S/g, ' ');
|
|
10
|
+
let insideString = false;
|
|
11
|
+
let insideComment = false;
|
|
12
|
+
let offset = 0;
|
|
13
|
+
let ret = '';
|
|
14
|
+
for (let i = 0; i < str.length; i++) {
|
|
15
|
+
const currentChar = str[i];
|
|
16
|
+
const nextChar = str[i + 1];
|
|
17
|
+
if (!insideComment && currentChar === '"') {
|
|
18
|
+
const escaped = str[i - 1] === '\\' && str[i - 2] !== '\\';
|
|
19
|
+
if (!escaped) {
|
|
20
|
+
insideString = !insideString;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (insideString) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (!insideComment && currentChar + nextChar === '//') {
|
|
27
|
+
ret += str.slice(offset, i);
|
|
28
|
+
offset = i;
|
|
29
|
+
insideComment = 'single';
|
|
30
|
+
i++;
|
|
31
|
+
}
|
|
32
|
+
else if (insideComment === 'single' && currentChar + nextChar === '\r\n') {
|
|
33
|
+
i++;
|
|
34
|
+
insideComment = false;
|
|
35
|
+
ret += strip(str, offset, i);
|
|
36
|
+
offset = i;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
else if (insideComment === 'single' && currentChar === '\n') {
|
|
40
|
+
insideComment = false;
|
|
41
|
+
ret += strip(str, offset, i);
|
|
42
|
+
offset = i;
|
|
43
|
+
}
|
|
44
|
+
else if (!insideComment && currentChar + nextChar === '/*') {
|
|
45
|
+
ret += str.slice(offset, i);
|
|
46
|
+
offset = i;
|
|
47
|
+
insideComment = 'multi';
|
|
48
|
+
i++;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
else if (insideComment === 'multi' && currentChar + nextChar === '*/') {
|
|
52
|
+
i++;
|
|
53
|
+
insideComment = false;
|
|
54
|
+
ret += strip(str, offset, i + 1);
|
|
55
|
+
offset = i + 1;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return ret + (insideComment ? strip(str.substr(offset)) : str.substr(offset));
|
|
60
|
+
};
|
|
61
|
+
const parseConfig = (content) => {
|
|
62
|
+
if (/^\s*{/.test(content)) {
|
|
63
|
+
return JSON.parse(stripJsonComments(content));
|
|
64
|
+
}
|
|
65
|
+
return parseIni(content);
|
|
66
|
+
};
|
|
67
|
+
const readConfigFile = (file) => {
|
|
68
|
+
if (file == null || typeof file !== 'string') {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
return plugins.fs.readFileSync(plugins.path.join(file), 'utf-8');
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const findUp = (rel) => {
|
|
79
|
+
const find = (start) => {
|
|
80
|
+
const file = plugins.path.join(start, rel);
|
|
81
|
+
try {
|
|
82
|
+
plugins.fs.statSync(file);
|
|
83
|
+
return file;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
if (plugins.path.dirname(start) !== start) {
|
|
87
|
+
return find(plugins.path.dirname(start));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
return find(process.cwd());
|
|
92
|
+
};
|
|
93
|
+
const envConfig = (prefix) => {
|
|
94
|
+
const obj = {};
|
|
95
|
+
for (const k in process.env) {
|
|
96
|
+
if (k.toLowerCase().indexOf(prefix.toLowerCase()) !== 0) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const keypath = k.substring(prefix.length).split('__').filter((subkey) => subkey !== '');
|
|
100
|
+
let cursor = obj;
|
|
101
|
+
keypath.forEach((subkey, i) => {
|
|
102
|
+
if (!subkey || typeof cursor !== 'object') {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (i === keypath.length - 1) {
|
|
106
|
+
cursor[subkey] = process.env[k];
|
|
107
|
+
}
|
|
108
|
+
if (cursor[subkey] === undefined) {
|
|
109
|
+
cursor[subkey] = {};
|
|
110
|
+
}
|
|
111
|
+
cursor = cursor[subkey];
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return obj;
|
|
115
|
+
};
|
|
116
|
+
const isNumber = (x) => {
|
|
117
|
+
if (typeof x === 'number') {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
if (/^0x[0-9a-f]+$/i.test(x)) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* parses process arguments without options (minimist semantics)
|
|
127
|
+
*/
|
|
128
|
+
const parseArgv = (argsArg) => {
|
|
129
|
+
let args = argsArg;
|
|
130
|
+
const argv = { _: [] };
|
|
131
|
+
const isConstructorOrProto = (obj, key) => (key === 'constructor' && typeof obj[key] === 'function') || key === '__proto__';
|
|
132
|
+
const setKey = (obj, keys, value) => {
|
|
133
|
+
let o = obj;
|
|
134
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
135
|
+
const key = keys[i];
|
|
136
|
+
if (isConstructorOrProto(o, key)) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (o[key] === undefined) {
|
|
140
|
+
o[key] = {};
|
|
141
|
+
}
|
|
142
|
+
if (o[key] === Object.prototype || o[key] === Number.prototype || o[key] === String.prototype) {
|
|
143
|
+
o[key] = {};
|
|
144
|
+
}
|
|
145
|
+
if (o[key] === Array.prototype) {
|
|
146
|
+
o[key] = [];
|
|
147
|
+
}
|
|
148
|
+
o = o[key];
|
|
149
|
+
}
|
|
150
|
+
const lastKey = keys[keys.length - 1];
|
|
151
|
+
if (isConstructorOrProto(o, lastKey)) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (o === Object.prototype || o === Number.prototype || o === String.prototype) {
|
|
155
|
+
o = {};
|
|
156
|
+
}
|
|
157
|
+
if (o === Array.prototype) {
|
|
158
|
+
o = [];
|
|
159
|
+
}
|
|
160
|
+
if (o[lastKey] === undefined || typeof o[lastKey] === 'boolean') {
|
|
161
|
+
o[lastKey] = value;
|
|
162
|
+
}
|
|
163
|
+
else if (Array.isArray(o[lastKey])) {
|
|
164
|
+
o[lastKey].push(value);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
o[lastKey] = [o[lastKey], value];
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
const setArg = (key, val) => {
|
|
171
|
+
setKey(argv, key.split('.'), isNumber(val) ? Number(val) : val);
|
|
172
|
+
};
|
|
173
|
+
let notFlags = [];
|
|
174
|
+
if (args.indexOf('--') !== -1) {
|
|
175
|
+
notFlags = args.slice(args.indexOf('--') + 1);
|
|
176
|
+
args = args.slice(0, args.indexOf('--'));
|
|
177
|
+
}
|
|
178
|
+
for (let i = 0; i < args.length; i++) {
|
|
179
|
+
const arg = args[i];
|
|
180
|
+
let key;
|
|
181
|
+
let next;
|
|
182
|
+
if (/^--.+=/.test(arg)) {
|
|
183
|
+
const m = arg.match(/^--([^=]+)=([\s\S]*)$/);
|
|
184
|
+
setArg(m[1], m[2]);
|
|
185
|
+
}
|
|
186
|
+
else if (/^--no-.+/.test(arg)) {
|
|
187
|
+
setArg(arg.match(/^--no-(.+)/)[1], false);
|
|
188
|
+
}
|
|
189
|
+
else if (/^--.+/.test(arg)) {
|
|
190
|
+
key = arg.match(/^--(.+)/)[1];
|
|
191
|
+
next = args[i + 1];
|
|
192
|
+
if (next !== undefined && !/^(-|--)[^-]/.test(next)) {
|
|
193
|
+
setArg(key, next);
|
|
194
|
+
i += 1;
|
|
195
|
+
}
|
|
196
|
+
else if (/^(true|false)$/.test(next)) {
|
|
197
|
+
setArg(key, next === 'true');
|
|
198
|
+
i += 1;
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
setArg(key, true);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
else if (/^-[^-]+/.test(arg)) {
|
|
205
|
+
const letters = arg.slice(1, -1).split('');
|
|
206
|
+
let broken = false;
|
|
207
|
+
for (let j = 0; j < letters.length; j++) {
|
|
208
|
+
next = arg.slice(j + 2);
|
|
209
|
+
if (next === '-') {
|
|
210
|
+
setArg(letters[j], next);
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
if (/[A-Za-z]/.test(letters[j]) && next[0] === '=') {
|
|
214
|
+
setArg(letters[j], next.slice(1));
|
|
215
|
+
broken = true;
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
if (/[A-Za-z]/.test(letters[j]) && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
|
|
219
|
+
setArg(letters[j], next);
|
|
220
|
+
broken = true;
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
if (letters[j + 1] && letters[j + 1].match(/\W/)) {
|
|
224
|
+
setArg(letters[j], arg.slice(j + 2));
|
|
225
|
+
broken = true;
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
setArg(letters[j], true);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
key = arg.slice(-1)[0];
|
|
233
|
+
if (!broken && key !== '-') {
|
|
234
|
+
if (args[i + 1] && !/^(-|--)[^-]/.test(args[i + 1])) {
|
|
235
|
+
setArg(key, args[i + 1]);
|
|
236
|
+
i += 1;
|
|
237
|
+
}
|
|
238
|
+
else if (args[i + 1] && /^(true|false)$/.test(args[i + 1])) {
|
|
239
|
+
setArg(key, args[i + 1] === 'true');
|
|
240
|
+
i += 1;
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
setArg(key, true);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
argv._.push(!isNumber(arg) ? arg : Number(arg));
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
for (const k of notFlags) {
|
|
252
|
+
argv._.push(k);
|
|
253
|
+
}
|
|
254
|
+
return argv;
|
|
255
|
+
};
|
|
256
|
+
const isSpecificValue = (val) => val instanceof Buffer || val instanceof Date || val instanceof RegExp;
|
|
257
|
+
const cloneSpecificValue = (val) => {
|
|
258
|
+
if (val instanceof Buffer) {
|
|
259
|
+
const x = Buffer.alloc(val.length);
|
|
260
|
+
val.copy(x);
|
|
261
|
+
return x;
|
|
262
|
+
}
|
|
263
|
+
else if (val instanceof Date) {
|
|
264
|
+
return new Date(val.getTime());
|
|
265
|
+
}
|
|
266
|
+
else if (val instanceof RegExp) {
|
|
267
|
+
return new RegExp(val);
|
|
268
|
+
}
|
|
269
|
+
throw new Error('Unexpected situation');
|
|
270
|
+
};
|
|
271
|
+
const deepCloneArray = (arr) => {
|
|
272
|
+
const clone = [];
|
|
273
|
+
arr.forEach((item, index) => {
|
|
274
|
+
if (typeof item === 'object' && item !== null) {
|
|
275
|
+
if (Array.isArray(item)) {
|
|
276
|
+
clone[index] = deepCloneArray(item);
|
|
277
|
+
}
|
|
278
|
+
else if (isSpecificValue(item)) {
|
|
279
|
+
clone[index] = cloneSpecificValue(item);
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
clone[index] = deepExtend({}, item);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
clone[index] = item;
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
return clone;
|
|
290
|
+
};
|
|
291
|
+
const deepExtend = (target, ...sources) => {
|
|
292
|
+
const safeGetProperty = (object, property) => property === '__proto__' ? undefined : object[property];
|
|
293
|
+
for (const obj of sources) {
|
|
294
|
+
if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
for (const key of Object.keys(obj)) {
|
|
298
|
+
const src = safeGetProperty(target, key);
|
|
299
|
+
const val = safeGetProperty(obj, key);
|
|
300
|
+
if (val === target) {
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
else if (typeof val !== 'object' || val === null) {
|
|
304
|
+
target[key] = val;
|
|
305
|
+
}
|
|
306
|
+
else if (Array.isArray(val)) {
|
|
307
|
+
target[key] = deepCloneArray(val);
|
|
308
|
+
}
|
|
309
|
+
else if (isSpecificValue(val)) {
|
|
310
|
+
target[key] = cloneSpecificValue(val);
|
|
311
|
+
}
|
|
312
|
+
else if (typeof src !== 'object' || src === null || Array.isArray(src)) {
|
|
313
|
+
target[key] = deepExtend({}, val);
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
target[key] = deepExtend(src, val);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return target;
|
|
321
|
+
};
|
|
322
|
+
const readNpmRc = () => {
|
|
323
|
+
const name = 'npm';
|
|
324
|
+
const argv = parseArgv(process.argv.slice(2));
|
|
325
|
+
const env = envConfig(name + '_');
|
|
326
|
+
const configs = [{ registry: 'https://registry.npmjs.org/' }];
|
|
327
|
+
const configFiles = [];
|
|
328
|
+
const addConfigFile = (file) => {
|
|
329
|
+
if (configFiles.indexOf(file) >= 0) {
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
const fileConfig = readConfigFile(file);
|
|
333
|
+
if (fileConfig) {
|
|
334
|
+
configs.push(parseConfig(fileConfig));
|
|
335
|
+
configFiles.push(file);
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
if (process.platform !== 'win32') {
|
|
339
|
+
addConfigFile(plugins.path.join('/etc', name, 'config'));
|
|
340
|
+
addConfigFile(plugins.path.join('/etc', name + 'rc'));
|
|
341
|
+
}
|
|
342
|
+
if (rcHome) {
|
|
343
|
+
addConfigFile(plugins.path.join(rcHome, '.config', name, 'config'));
|
|
344
|
+
addConfigFile(plugins.path.join(rcHome, '.config', name));
|
|
345
|
+
addConfigFile(plugins.path.join(rcHome, '.' + name, 'config'));
|
|
346
|
+
addConfigFile(plugins.path.join(rcHome, '.' + name + 'rc'));
|
|
347
|
+
}
|
|
348
|
+
addConfigFile(findUp('.' + name + 'rc'));
|
|
349
|
+
if (env.config) {
|
|
350
|
+
addConfigFile(env.config);
|
|
351
|
+
}
|
|
352
|
+
if (argv.config) {
|
|
353
|
+
addConfigFile(argv.config);
|
|
354
|
+
}
|
|
355
|
+
return deepExtend({}, ...configs, env, argv, configFiles.length
|
|
356
|
+
? { configs: configFiles, config: configFiles[configFiles.length - 1] }
|
|
357
|
+
: undefined);
|
|
358
|
+
};
|
|
359
|
+
/**
|
|
360
|
+
* the registry url npm would use for a package scope, always ending in a slash
|
|
361
|
+
*/
|
|
362
|
+
export const getDefaultRegistryUrl = (scope) => {
|
|
363
|
+
const result = readNpmRc();
|
|
364
|
+
const url = result[`${scope}:registry`] || result.config_registry || result.registry;
|
|
365
|
+
return url.slice(-1) === '/' ? url : `${url}/`;
|
|
366
|
+
};
|
|
367
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRucG0ucmVnaXN0cnl1cmwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydG5wbS5yZWdpc3RyeXVybC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxJQUFJLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhFOzs7R0FHRztBQUVILE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxHQUFXLEVBQVUsRUFBRTtJQUNoRCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQVMsRUFBRSxLQUFjLEVBQUUsR0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ25HLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFJLGFBQWEsR0FBK0IsS0FBSyxDQUFDO0lBQ3RELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNmLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDcEMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsSUFBSSxXQUFXLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDMUMsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFD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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartnpm",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.4",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A library to interface with npm for retrieving package information and manipulation.",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
},
|
|
28
28
|
"homepage": "https://code.foss.global/push.rocks/smartnpm",
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@git.zone/tsbuild": "^
|
|
31
|
-
"@git.zone/tsrun": "^3.0.
|
|
32
|
-
"@git.zone/tstest": "^7.
|
|
30
|
+
"@git.zone/tsbuild": "^6.0.2",
|
|
31
|
+
"@git.zone/tsrun": "^3.0.3",
|
|
32
|
+
"@git.zone/tstest": "^7.2.1",
|
|
33
33
|
"@types/lodash.clonedeep": "^4.5.9",
|
|
34
|
-
"@types/node": "^26.6.
|
|
34
|
+
"@types/node": "^26.6.4"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@push.rocks/levelcache": "^3.5.0",
|
|
@@ -43,8 +43,7 @@
|
|
|
43
43
|
"@push.rocks/smartpromise": "^4.2.3",
|
|
44
44
|
"@push.rocks/smartrequest": "^5.0.1",
|
|
45
45
|
"@push.rocks/smarttime": "^5.0.1",
|
|
46
|
-
"@push.rocks/smartversion": "^3.1.0"
|
|
47
|
-
"package-json": "^10.0.1"
|
|
46
|
+
"@push.rocks/smartversion": "^3.1.0"
|
|
48
47
|
},
|
|
49
48
|
"files": [
|
|
50
49
|
"ts/**/*",
|
package/readme.md
CHANGED
|
@@ -243,6 +243,8 @@ new NpmRegistry(options?: INpmRegistryConstructorOptions)
|
|
|
243
243
|
Options:
|
|
244
244
|
- `npmRegistryUrl`: Custom registry URL (default: `https://registry.npmjs.org`)
|
|
245
245
|
|
|
246
|
+
Credentials for the registry come from the npm configuration, as npm would send them: `_authToken`, `username`/`_password` or `_auth` entries for the registry url in the project, user or global `.npmrc` or in `npm_config_*` environment variables.
|
|
247
|
+
|
|
246
248
|
#### Methods
|
|
247
249
|
|
|
248
250
|
##### `getPackageInfo(packageName: string): Promise<NpmPackage>`
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { type ISearchObject } from './smartnpm.interfaces.js';
|
|
|
7
7
|
// classes
|
|
8
8
|
import { NpmPackage } from './smartnpm.classes.npmpackage.js';
|
|
9
9
|
import { type ICacheDescriptor, RegistryCache } from './smartnpm.classes.registrycache.js';
|
|
10
|
+
import { fetchLatestManifest, fetchPackument } from './smartnpm.packument.js';
|
|
10
11
|
|
|
11
12
|
export interface INpmRegistryConstructorOptions {
|
|
12
13
|
npmRegistryUrl?: string;
|
|
@@ -35,18 +36,15 @@ export class NpmRegistry {
|
|
|
35
36
|
* @param packageName
|
|
36
37
|
*/
|
|
37
38
|
public async getPackageInfo(packageName: string): Promise<NpmPackage> {
|
|
38
|
-
const fullMetadata = await
|
|
39
|
-
.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
});
|
|
47
|
-
const versionData = await plugins.packageJson.default(packageName, {
|
|
39
|
+
const fullMetadata = await fetchLatestManifest(packageName, {
|
|
40
|
+
registryUrl: this.options.npmRegistryUrl,
|
|
41
|
+
}).catch((err) => {
|
|
42
|
+
console.log(err);
|
|
43
|
+
return null;
|
|
44
|
+
});
|
|
45
|
+
// the abbreviated packument; the full one differs, so it cannot serve both
|
|
46
|
+
const versionData = await fetchPackument(packageName, {
|
|
48
47
|
registryUrl: this.options.npmRegistryUrl,
|
|
49
|
-
allVersions: true,
|
|
50
48
|
});
|
|
51
49
|
if (!fullMetadata) {
|
|
52
50
|
throw new Error(`Could not retrieve metadata for package ${packageName}.`);
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* parses ini content the way npm config files are parsed (ini 1.3.8 semantics)
|
|
3
|
+
*/
|
|
4
|
+
export const parseIni = (str: string): Record<string, any> => {
|
|
5
|
+
const out: Record<string, any> = {};
|
|
6
|
+
let p = out;
|
|
7
|
+
// section |key = value
|
|
8
|
+
const re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i;
|
|
9
|
+
const lines = str.split(/[\r\n]+/g);
|
|
10
|
+
|
|
11
|
+
for (const line of lines) {
|
|
12
|
+
if (!line || line.match(/^\s*[;#]/)) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const match = line.match(re);
|
|
16
|
+
if (!match) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (match[1] !== undefined) {
|
|
20
|
+
const section = unsafe(match[1]);
|
|
21
|
+
if (section === '__proto__') {
|
|
22
|
+
// keep parsing the section, but don't attach it
|
|
23
|
+
p = {};
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
p = out[section] = out[section] || {};
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
let key = unsafe(match[2]);
|
|
30
|
+
if (key === '__proto__') {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
let value: unknown = match[3] ? unsafe(match[4]) : true;
|
|
34
|
+
switch (value) {
|
|
35
|
+
case 'true':
|
|
36
|
+
case 'false':
|
|
37
|
+
case 'null':
|
|
38
|
+
value = JSON.parse(value);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// convert keys with '[]' suffix to an array
|
|
42
|
+
if (key.length > 2 && key.slice(-2) === '[]') {
|
|
43
|
+
key = key.substring(0, key.length - 2);
|
|
44
|
+
if (key === '__proto__') {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (!p[key]) {
|
|
48
|
+
p[key] = [];
|
|
49
|
+
} else if (!Array.isArray(p[key])) {
|
|
50
|
+
p[key] = [p[key]];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// safeguard against resetting a previously defined array by forgetting the brackets
|
|
55
|
+
if (Array.isArray(p[key])) {
|
|
56
|
+
p[key].push(value);
|
|
57
|
+
} else {
|
|
58
|
+
p[key] = value;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// {a:{y:1},"a.b":{x:2}} --> {a:{y:1,b:{x:2}}}
|
|
63
|
+
const nestedSections = Object.keys(out).filter((k) => {
|
|
64
|
+
if (!out[k] || typeof out[k] !== 'object' || Array.isArray(out[k])) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
// see if the parent section is also an object; if so, add it to that
|
|
68
|
+
const parts = dotSplit(k);
|
|
69
|
+
let target = out;
|
|
70
|
+
const l = parts.pop()!;
|
|
71
|
+
const nl = l.replace(/\\\./g, '.');
|
|
72
|
+
for (const part of parts) {
|
|
73
|
+
if (part === '__proto__') {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (!target[part] || typeof target[part] !== 'object') {
|
|
77
|
+
target[part] = {};
|
|
78
|
+
}
|
|
79
|
+
target = target[part];
|
|
80
|
+
}
|
|
81
|
+
if (target === out && nl === l) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
target[nl] = out[k];
|
|
85
|
+
return true;
|
|
86
|
+
});
|
|
87
|
+
for (const k of nestedSections) {
|
|
88
|
+
delete out[k];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return out;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const dotSplit = (str: string): string[] => {
|
|
95
|
+
return str
|
|
96
|
+
.replace(/\u0001/g, '\u0002LITERAL\\1LITERAL\u0002')
|
|
97
|
+
.replace(/\\\./g, '\u0001')
|
|
98
|
+
.split(/\./)
|
|
99
|
+
.map((part) =>
|
|
100
|
+
part.replace(/\u0001/g, '\\.').replace(/\u0002LITERAL\\1LITERAL\u0002/g, '\u0001'),
|
|
101
|
+
);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const isQuoted = (val: string): boolean => {
|
|
105
|
+
return (
|
|
106
|
+
(val.charAt(0) === '"' && val.slice(-1) === '"') ||
|
|
107
|
+
(val.charAt(0) === "'" && val.slice(-1) === "'")
|
|
108
|
+
);
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const unsafe = (valArg: string | undefined): string => {
|
|
112
|
+
let val = (valArg || '').trim();
|
|
113
|
+
if (isQuoted(val)) {
|
|
114
|
+
// remove the single quotes before calling JSON.parse
|
|
115
|
+
if (val.charAt(0) === "'") {
|
|
116
|
+
val = val.substr(1, val.length - 2);
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
val = JSON.parse(val);
|
|
120
|
+
} catch {}
|
|
121
|
+
return val;
|
|
122
|
+
}
|
|
123
|
+
// walk the value to find the first not-escaped ; or # character
|
|
124
|
+
let esc = false;
|
|
125
|
+
let unesc = '';
|
|
126
|
+
for (let i = 0, l = val.length; i < l; i++) {
|
|
127
|
+
const c = val.charAt(i);
|
|
128
|
+
if (esc) {
|
|
129
|
+
if ('\\;#'.indexOf(c) !== -1) {
|
|
130
|
+
unesc += c;
|
|
131
|
+
} else {
|
|
132
|
+
unesc += '\\' + c;
|
|
133
|
+
}
|
|
134
|
+
esc = false;
|
|
135
|
+
} else if (';#'.indexOf(c) !== -1) {
|
|
136
|
+
break;
|
|
137
|
+
} else if (c === '\\') {
|
|
138
|
+
esc = true;
|
|
139
|
+
} else {
|
|
140
|
+
unesc += c;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (esc) {
|
|
144
|
+
unesc += '\\';
|
|
145
|
+
}
|
|
146
|
+
return unesc.trim();
|
|
147
|
+
};
|