@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.
@@ -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",
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": "^5.1.2",
31
- "@git.zone/tsrun": "^3.0.2",
32
- "@git.zone/tstest": "^7.0.0",
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.3"
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>`
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartnpm',
6
- version: '2.1.3',
6
+ version: '2.1.4',
7
7
  description: 'A library to interface with npm for retrieving package information and manipulation.'
8
8
  }
@@ -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 plugins
39
- .packageJson.default(packageName, {
40
- registryUrl: this.options.npmRegistryUrl,
41
- fullMetadata: true,
42
- })
43
- .catch((err) => {
44
- console.log(err);
45
- return null;
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
+ };