@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.
@@ -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.2",
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,24 +27,23 @@
27
27
  },
28
28
  "homepage": "https://code.foss.global/push.rocks/smartnpm",
29
29
  "devDependencies": {
30
- "@git.zone/tsbuild": "^5.0.0",
31
- "@git.zone/tsrun": "^3.0.2",
32
- "@git.zone/tstest": "^6.3.2",
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.2"
34
+ "@types/node": "^26.6.4"
35
35
  },
36
36
  "dependencies": {
37
- "@push.rocks/levelcache": "^3.4.0",
38
- "@push.rocks/smartarchive": "^5.5.1",
37
+ "@push.rocks/levelcache": "^3.5.0",
38
+ "@push.rocks/smartarchive": "^5.5.2",
39
39
  "@push.rocks/smartconsole": "^2.0.0",
40
- "@push.rocks/smartfile": "^13.1.3",
40
+ "@push.rocks/smartfile": "^13.2.2",
41
41
  "@push.rocks/smartfs": "^1.5.1",
42
42
  "@push.rocks/smartpath": "^6.0.0",
43
43
  "@push.rocks/smartpromise": "^4.2.3",
44
44
  "@push.rocks/smartrequest": "^5.0.1",
45
- "@push.rocks/smarttime": "^4.2.3",
46
- "@push.rocks/smartversion": "^3.1.0",
47
- "package-json": "^10.0.1"
45
+ "@push.rocks/smarttime": "^5.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.2',
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
+ };