@adamlui/geolocate 2.3.1 → 2.4.0

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/README.md CHANGED
@@ -1,19 +1,17 @@
1
1
  <a id="top"></a>
2
2
 
3
- # <picture><source media="(prefers-color-scheme: dark)" srcset="https://media.geolocatejs.org/images/icons/wire-globe/white/icon32.png?0d36e26"><img height=28 src="https://media.geolocatejs.org/images/icons/wire-globe/black/icon32.png?0d36e26"></picture> geolocate
3
+ # <picture><source media="(prefers-color-scheme: dark)" srcset="https://cdn.jsdelivr.net/gh/adamlui/js-utils@0d3424a/geolocate/assets/images/icons/wire-globe/white/icon32.png"><img height=28 src="https://cdn.jsdelivr.net/gh/adamlui/js-utils@0d3424a/geolocate/assets/images/icons/wire-globe/black/icon32.png"></picture> geolocate
4
4
 
5
5
  ### Fetch IP geolocation data from the CLI.
6
6
 
7
- <a href="https://www.npmjs.com/package/@adamlui/geolocate">
7
+ <a href="https://npmstar.com/compare/@adamlui%2Fgeolocate">
8
8
  <img height=31 src="https://img.shields.io/npm/dm/@adamlui/geolocate?logo=npm&color=af68ff&logoColor=white&labelColor=464646&style=for-the-badge"></a>
9
9
  <a href="#%EF%B8%8F-mit-license">
10
10
  <img height=31 src="https://img.shields.io/badge/License-MIT-orange.svg?logo=internetarchive&logoColor=white&labelColor=464646&style=for-the-badge"></a>
11
- <a href="https://github.com/adamlui/js-utils/releases/tag/geolocate-2.3.1">
12
- <img height=31 src="https://img.shields.io/badge/Latest_Build-2.3.1-44cc11.svg?logo=icinga&logoColor=white&labelColor=464646&style=for-the-badge"></a>
11
+ <a href="https://github.com/adamlui/js-utils/releases/tag/geolocate-2.4.0">
12
+ <img height=31 src="https://img.shields.io/badge/Latest_Build-2.4.0-44cc11.svg?logo=icinga&logoColor=white&labelColor=464646&style=for-the-badge"></a>
13
13
  <a href="https://www.npmjs.com/package/@adamlui/geolocate?activeTab=code">
14
14
  <img height=31 src="https://img.shields.io/npm/unpacked-size/%40adamlui%2Fgeolocate?style=for-the-badge&logo=ebox&logoColor=white&labelColor=464646&color=blue"></a>
15
- <a href="#">
16
- <img height=31 src="https://img.shields.io/bundlejs/size/%40adamlui%2Fgeolocate%402.2.1?label=Minified%20Size&logo=databricks&logoColor=white&labelColor=464646&color=ff69b4&style=for-the-badge"></a>
17
15
  <a href="https://sonarcloud.io/component_measures?metric=new_vulnerabilities&id=adamlui_js-utils:geolocate/src/geolocate.js">
18
16
  <img height=31 src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fsonarcloud.io%2Fapi%2Fmeasures%2Fcomponent%3Fcomponent%3Dadamlui_js-utils%3Ageolocate%2Fsrc%2Fgeolocate.js%26metricKeys%3Dvulnerabilities&query=%24.component.measures.0.value&style=for-the-badge&logo=sonarcloud&logoColor=white&labelColor=464646&label=Vulnerabilities&color=gold"></a>
19
17
  <a href="https://github.com/toolleeo/cli-apps#networking">
@@ -59,7 +57,7 @@ $ geolocate [ip1] [ip2] [...]
59
57
 
60
58
  Sample output:
61
59
 
62
- <img src="https://media.geolocatejs.org/images/screenshots/cli/geolocate-8.8.8.8-cmd-output.png?0d36e26">
60
+ <img src="https://cdn.jsdelivr.net/gh/adamlui/js-utils@0d3424a/geolocate/assets/images/screenshots/cli/geolocate-8.8.8.8-cmd-output.png">
63
61
 
64
62
  **📝 Note:** If no IPv4 address is passed, your own one will be used.
65
63
 
@@ -126,14 +124,14 @@ const geo = require('@adamlui/geolocate')
126
124
  #### <> HTML script tag:
127
125
 
128
126
  ```html
129
- <script src="https://cdn.jsdelivr.net/npm/@adamlui/geolocate@2.3.1/dist/geolocate.min.js"></script>
127
+ <script src="https://cdn.jsdelivr.net/npm/@adamlui/geolocate@2.4.0/dist/geolocate.min.js"></script>
130
128
  ```
131
129
 
132
130
  #### ES6:
133
131
 
134
132
  ```js
135
133
  (async () => {
136
- await import('https://cdn.jsdelivr.net/npm/@adamlui/geolocate@2.3.1/dist/geolocate.min.js')
134
+ await import('https://cdn.jsdelivr.net/npm/@adamlui/geolocate@2.4.0/dist/geolocate.min.js')
137
135
  // Your code here...
138
136
  })()
139
137
  ```
@@ -142,7 +140,7 @@ const geo = require('@adamlui/geolocate')
142
140
 
143
141
  ```js
144
142
  ...
145
- // @require https://cdn.jsdelivr.net/npm/@adamlui/geolocate@2.3.1/dist/geolocate.min.js
143
+ // @require https://cdn.jsdelivr.net/npm/@adamlui/geolocate@2.4.0/dist/geolocate.min.js
146
144
  // ==/UserScript==
147
145
 
148
146
  // Your code here...
@@ -150,7 +148,7 @@ const geo = require('@adamlui/geolocate')
150
148
 
151
149
  <br>
152
150
 
153
- **📝 Note:** To always import the latest version (not recommended in production!) remove the `@2.3.1` version tag from the jsDelivr URL: `https://cdn.jsdelivr.net/npm/@adamlui/geolocate/dist/geolocate.min.js`
151
+ **📝 Note:** To always import the latest version (not recommended in production!) remove the `@2.4.0` version tag from the jsDelivr URL: `https://cdn.jsdelivr.net/npm/@adamlui/geolocate/dist/geolocate.min.js`
154
152
 
155
153
  <br>
156
154
 
@@ -223,7 +221,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
223
221
 
224
222
  ## 🛠️ Related utilities
225
223
 
226
- ### <picture><source media="(prefers-color-scheme: dark)" srcset="https://media.generate-ip.org/images/icons/node-graph/white/icon55x49.png?b4eb06e"><img height=21 src="https://media.generate-ip.org/images/icons/node-graph/black/icon55x49.png?b4eb06e"></picture> [generate-ip](https://js-utils.org/generate-ip) &nbsp;<a href="https://github.com/toolleeo/cli-apps#networking"><img height=18 src="https://assets.js-utils.org/images/badges/awesome/badge.svg?v=0d36e26"></a>
224
+ ### <picture><source media="(prefers-color-scheme: dark)" srcset="https://cdn.jsdelivr.net/gh/adamlui/js-utils@5c34563/generate-ip/assets/images/icons/node-graph/white/icon55x49.png"><img height=21 src="https://cdn.jsdelivr.net/gh/adamlui/js-utils@5c34563/generate-ip/assets/images/icons/node-graph/black/icon55x49.png"></picture> [generate-ip](https://js-utils.org/generate-ip) &nbsp;<a href="https://github.com/toolleeo/cli-apps#networking"><img height=18 src="https://assets.js-utils.org/images/badges/awesome/badge.svg?v=0d36e26"></a>
227
225
 
228
226
  > Randomly generate, format, and validate IPv4 + IPv6 + MAC addresses.
229
227
  <br>[Install](https://docs.generate-ip.org/#-installation) /
package/dist/cli/index.js CHANGED
@@ -3,18 +3,14 @@
3
3
  (async () => {
4
4
  'use strict'
5
5
 
6
- globalThis.env = {
7
- args: process.argv.slice(2),
8
- modes: { dev: /[\\/]src(?:[\\/]|$)/i.test(__dirname) },
9
- paths: { lib: './lib' }
10
- }
11
- env.modes.debug = env.args.some(arg => /^--?(?:V|debug(?:[-_]?mode)?)$/.test(arg))
6
+ // Init ENV
7
+ const init = require('./lib/init')
8
+ init.env()
12
9
 
13
10
  // Import LIBS
14
- globalThis.log = require(`${env.paths.lib}/log`)
11
+ globalThis.log = require('./lib/log')
15
12
  const clipboardy = require('node-clipboardy'),
16
- geo = require(`../geolocate${ env.modes.dev ? '' : '.min' }.js`),
17
- init = require(`${env.paths.lib}/init`)
13
+ geo = require(`../geolocate${ env.modes.dev ? '' : '.min' }.js`)
18
14
 
19
15
  await init.cli()
20
16
 
@@ -1,12 +1,10 @@
1
1
  const language = require('./language'),
2
2
  settings = require('./settings')
3
3
 
4
- const dataPath = `../../${ env.modes.dev ? '../' : 'data/' }`
5
-
6
4
  module.exports = {
7
5
 
8
6
  async cli() {
9
- Object.assign(globalThis.cli ??= {}, require(`${dataPath}package-data.json`))
7
+ Object.assign(globalThis.cli ??= {}, require(`${env.paths.libData}/package-data.json`))
10
8
  cli.msgs = await language.getMsgs('en')
11
9
  cli.msgs = await language.getMsgs(cli.lang = settings.load('uiLang') || (
12
10
  env.modes.debug ? language.generateRandomLang({ excludes: ['en'] }) : language.getSysLang() ))
@@ -21,11 +19,11 @@ module.exports = {
21
19
 
22
20
  if (fs.existsSync(paths.target)) // use existing config file
23
21
  return log.warn(`${cli.msgs.warn_configFileExists}:`, paths.target)
24
- if (fs.existsSync(paths.src = path.resolve(__dirname, `${dataPath}${filename}`)))
22
+ if (fs.existsSync(paths.src = path.resolve(__dirname, `${env.paths.libData}/${filename}`)))
25
23
  fs.copyFileSync(paths.src, paths.target) // use found template
26
24
 
27
25
  else { // use jsDelivr copy
28
- const jsdURL = `${require('./jsdelivr').pkgVerURL()}/${filename}`
26
+ const jsdURL = `${require('./jsdelivr').getPkgVerURL()}/${filename}`
29
27
  log.data(`${cli.msgs.info_fetchingRemoteConfigFrom} ${jsdURL}...`)
30
28
  try {
31
29
  const data = require('./data'),
@@ -39,5 +37,15 @@ module.exports = {
39
37
  log.success(`${cli.msgs.info_configFileCreated}: ${paths.target}\n`)
40
38
  log.tip(`${cli.msgs.tip_editToSetDefaults}.`)
41
39
  log.tip(`${cli.msgs.tip_cliArgsPrioritized}.`)
40
+ },
41
+
42
+ env() {
43
+ Object.assign(globalThis.env ??= {}, {
44
+ args: process.argv.slice(2),
45
+ modes: { dev: /[\\/]src(?:[\\/]|$)/i.test(__dirname) },
46
+ supports: { unicode: require('is-unicode-supported').default() }
47
+ })
48
+ env.modes.debug = env.args.some(arg => /^--?(?:V|debug(?:[-_]?mode)?)$/.test(arg))
49
+ env.paths = { libData: `../../${ env.modes.dev ? '..' : 'data' }` }
42
50
  }
43
51
  }
@@ -1,11 +1,11 @@
1
1
  module.exports = {
2
2
 
3
- pkgVerURL(version) {
3
+ getPkgVerURL(version) {
4
4
  version ||= cli.version ||= require('./pkg').getVer('local') || 'none'
5
5
  const pkgName = cli.name.split('/')[1],
6
6
  verTag = !/^\d+\.\d+\.\d+$/.test(version) ? 'latest' : `${pkgName}-${version}`
7
7
  return `${cli.urls.jsdelivr}@${verTag}/${pkgName}`
8
8
  },
9
9
 
10
- commitURL(hash = 'latest') { return `${cli.urls.jsdelivr}@${hash}/${cli.name.split('/')[1]}` }
10
+ getCommitURL(hash = 'latest') { return `${cli.urls.jsdelivr}@${hash}/${cli.name.split('/')[1]}` }
11
11
  }
@@ -13,13 +13,13 @@ module.exports = {
13
13
  let locales = includes.length ? includes : (() => {
14
14
 
15
15
  // Read cache if found
16
- const cacheDir = path.join(__dirname, '..', '.cache'),
16
+ const cacheDir = path.join(__dirname, '../../.cache'),
17
17
  localeCache = path.join(cacheDir, 'locales.json')
18
18
  if (fs.existsSync(localeCache))
19
19
  try { return JSON.parse(fs.readFileSync(localeCache, 'utf8')) } catch (err) {}
20
20
 
21
21
  // Discover pkg _locales
22
- const localesDir = path.resolve(process.cwd(), '_locales')
22
+ const localesDir = path.resolve(__dirname, '../../../_locales')
23
23
  if (!fs.existsSync(localesDir)) return ['en']
24
24
  const locales = fs.readdirSync(localesDir, { withFileTypes: true })
25
25
  .filter(entry => entry.isDirectory()).map(entry => entry.name)
@@ -37,9 +37,7 @@ module.exports = {
37
37
  locales = locales.filter(locale => !excludeSet.has(locale))
38
38
 
39
39
  // Get random language
40
- let randomLang = 'en'
41
- if (locales.length)
42
- randomLang = locales[Math.floor(Math.random() * locales.length)]
40
+ const randomLang = locales.length ? locales[Math.floor(Math.random() * locales.length)] : 'en'
43
41
  log.debug(`Random language: ${randomLang}`)
44
42
 
45
43
  return randomLang
@@ -50,20 +48,29 @@ module.exports = {
50
48
  if (env.msgs && langCode == cli.lang) return env.msgs // don't re-fetch same msgs
51
49
 
52
50
  let msgs = data.flatten( // local ones
53
- require(`../../${ env.modes.dev ? '../_locales/en/' : 'data/' }messages.json`))
51
+ require(`../../${ env.modes.dev ? '../_locales/en' : 'data' }/messages.json`))
54
52
 
55
53
  if (!langCode.startsWith('en')) { // fetch non-English msgs from jsDelivr
56
- const msgHostURL = `${require('./jsdelivr').commitURL(cli.commitHashes.locales)}/_locales/`
57
- let msgHref = `${msgHostURL}${langCode}/messages.json`, msgFetchesTried = 0
54
+ try { // check if terminal supports non-Latin scripts
55
+ const nonLatinLocales = await (await data.fetch(
56
+ `${cli.urls.jsdelivr}@${cli.commitHashes.data}/assets/data/non-latin-locales.json`
57
+ )).json()
58
+ if (nonLatinLocales.includes(langCode.split('-')[0]) && !env.supports.unicode)
59
+ return msgs // en ones
60
+ } catch (err) {
61
+ log.debug(`Failed to fetch non-Latin locales: ${err}`)
62
+ }
63
+ const msgBaseURL = `${require('./jsdelivr').getCommitURL(cli.commitHashes.locales)}/_locales`
64
+ let msgURL = `${msgBaseURL}/${langCode}/messages.json`, msgFetchesTried = 0
58
65
  while (msgFetchesTried < 3)
59
66
  try { // fetch remote msgs
60
- msgs = data.flatten(await (await data.fetch(msgHref)).json())
67
+ msgs = data.flatten(await (await data.fetch(msgURL)).json())
61
68
  break
62
69
  } catch (err) { // retry up to 2X (region-stripped + EN)
63
70
  msgFetchesTried++ ; if (msgFetchesTried >= 3) break
64
- log.debug(msgHref = langCode.includes('-') && msgFetchesTried == 1 ?
65
- msgHref.replace(/([^_]*)_[^/]*(\/.*)/, '$1$2') // strip region before retrying
66
- : `${msgHostURL}en/messages.json` // else use EN msgs
71
+ log.debug(msgURL = langCode.includes('-') && msgFetchesTried == 1 ?
72
+ msgURL.replace(/([^_]*)_[^/]*(\/.*)/, '$1$2') // strip region before retrying
73
+ : `${msgBaseURL}/en/messages.json` // else use EN msgs
67
74
  )
68
75
  }
69
76
  }
@@ -1,5 +1,6 @@
1
1
  const colors = require('./color'),
2
2
  { getDownloads, getVer } = require('./pkg'),
3
+ settings = require('./settings'),
3
4
  string = require('./string')
4
5
 
5
6
  const nextMajVer = require('../../../package.json').version.replace(/^(\d+)\..*/, (_, major) => `${ +major +1 }.0.0`)
@@ -7,6 +8,7 @@ const nextMajVer = require('../../../package.json').version.replace(/^(\d+)\..*/
7
8
  module.exports = {
8
9
  colors,
9
10
 
11
+ break() { console.log() },
10
12
  configURL() { this.info(`${cli.msgs.info_exampleValidConfigFile}: ${cli.urls.config}`) },
11
13
  configURLandExit(...args) { this.error(...args); this.configURL(); process.exit(1) },
12
14
  data(msg) { console.log(`\n${colors.bw}${msg}${colors.nc}`) },
@@ -15,9 +17,8 @@ module.exports = {
15
17
  errorAndExit(...args) { this.error(...args); this.helpDocsCmdsDocsURL(); process.exit(1) },
16
18
  ifNotQuiet(msg) { if (!cli.config.quietMode) this.info(msg) },
17
19
  info(msg) { console.info(`\n${colors.schemes.default[0]}${msg}${colors.nc}`) },
18
- break() { console.log() },
19
- tip(msg) { console.info(`${colors.by}TIP: ${msg}${colors.nc}`) },
20
20
  success(msg) { console.log(`\n${colors.bg}${msg}${colors.nc}`) },
21
+ tip(msg) { console.info(`${colors.by}TIP: ${msg}${colors.nc}`) },
21
22
  warn(...args) { console.warn(`\n${colors.bo}WARNING:`, ...args, colors.nc) },
22
23
 
23
24
  geoData(data) {
@@ -45,11 +46,10 @@ module.exports = {
45
46
  this.warn(
46
47
  `${cli.msgs.info_configFile} ${cli.msgs.warn_option.toLowerCase()} '${oldKey}: ${oldVal}' ${
47
48
  cli.msgs.warn_hasBeenReplacedBy} '${
48
- newKey}: ${ isNegKey(oldKey) != isNegKey(newKey) ? !oldVal : oldVal }' ${
49
+ newKey}: ${ settings.isNegKey(oldKey) != settings.isNegKey(newKey) ? !oldVal : oldVal }' ${
49
50
  cli.msgs.warn_andWillBeRemoved} @ v${nextMajVer}`
50
51
  )
51
52
  this[`${oldKey}Warned`] = true
52
- function isNegKey(key) { return /^(?:no|disable|exclude)[A-Z]/.test(key) }
53
53
  }
54
54
  },
55
55
 
@@ -16,12 +16,14 @@ module.exports = {
16
16
  stats: { type: 'cmd', regex: /^--?stats?$/ }
17
17
  },
18
18
 
19
+ isNegKey(key) { return /^(?:no|disable|exclude)[A-Z]/.test(key) },
20
+
19
21
  load(ctrlKeys = Object.keys(this.controls)) {
20
22
  const inputCtrlKeys = [].concat(ctrlKeys) // force array
21
23
 
22
24
  if (!cli.defaultsSet && !arguments.length) { // init all defaults on arg-less load()
23
25
  inputCtrlKeys.forEach(key => {
24
- const ctrl = this.controls[key] ; if (ctrl.mode || ctrl.type == 'legacy') return
26
+ const ctrl = this.controls[key] ; if (ctrl.mode || key.startsWith('legacy_')) return
25
27
  cli.config[key] ??= ctrl.defaultVal ?? ( ctrl.type == 'param' ? '' : false )
26
28
  })
27
29
  cli.defaultsSet = true
@@ -60,8 +62,8 @@ module.exports = {
60
62
  if (this.configFileKeyWhitelist && !this.configFileKeyWhitelist.includes(key))
61
63
  log.invalidConfigKey(key)
62
64
  return
63
- } else if (ctrl.type == 'legacy' && ctrl.replacedBy) {
64
- if (key.toLowerCase().includes('no') != ctrl.replacedBy.toLowerCase().includes('no'))
65
+ } else if (key.startsWith('legacy_') && ctrl.replacedBy) {
66
+ if (this.isNegKey(key) != this.isNegKey(ctrl.replacedBy))
65
67
  cli.config[ctrl.replacedBy] = !val // assign opposite val to current key
66
68
  else // assign direct val to current key
67
69
  cli.config[ctrl.replacedBy] = val
@@ -79,8 +81,8 @@ module.exports = {
79
81
  const ctrlKey = Object.keys(this.controls).find(key => this.controls[key]?.regex?.test(arg))
80
82
  if (!ctrlKey && cli.msgs) log.errorAndExit(`[${arg}] ${cli.msgs.error_notRecognized}.`)
81
83
  if (!inputCtrlKeys.includes(ctrlKey)) return // don't process env.args when load() specific keys
84
+ if (ctrlKey.startsWith('legacy_')) { log.argDoesNothing(arg) ; continue }
82
85
  const ctrl = this.controls[ctrlKey]
83
- if (ctrl.type == 'legacy') { log.argDoesNothing(arg) ; continue }
84
86
  if (ctrl.mode) // set cli.config.mode to mode name
85
87
  cli.config.mode = ctrlKey.replace(/mode$/i, '').toLowerCase()
86
88
  else { // init flag/param/cmd cli.config[ctrlKey] val
@@ -13,6 +13,7 @@
13
13
  "src": "https://github.com/adamlui/js-utils/tree/main/geolocate/src"
14
14
  },
15
15
  "commitHashes": {
16
- "locales": "78c0809"
16
+ "data": "92f4d1b",
17
+ "locales": "b93ea3a"
17
18
  }
18
19
  }
package/docs/README.md CHANGED
@@ -1,19 +1,17 @@
1
1
  <a id="top"></a>
2
2
 
3
- # <picture><source media="(prefers-color-scheme: dark)" srcset="https://media.geolocatejs.org/images/icons/wire-globe/white/icon32.png?0d36e26"><img height=28 src="https://media.geolocatejs.org/images/icons/wire-globe/black/icon32.png?0d36e26"></picture> geolocate
3
+ # <picture><source media="(prefers-color-scheme: dark)" srcset="https://cdn.jsdelivr.net/gh/adamlui/js-utils@0d3424a/geolocate/assets/images/icons/wire-globe/white/icon32.png"><img height=28 src="https://cdn.jsdelivr.net/gh/adamlui/js-utils@0d3424a/geolocate/assets/images/icons/wire-globe/black/icon32.png"></picture> geolocate
4
4
 
5
5
  ### Fetch IP geolocation data from the CLI.
6
6
 
7
- <a href="https://www.npmjs.com/package/@adamlui/geolocate">
7
+ <a href="https://npmstar.com/compare/@adamlui%2Fgeolocate">
8
8
  <img height=31 src="https://img.shields.io/npm/dm/@adamlui/geolocate?logo=npm&color=af68ff&logoColor=white&labelColor=464646&style=for-the-badge"></a>
9
9
  <a href="#%EF%B8%8F-mit-license">
10
10
  <img height=31 src="https://img.shields.io/badge/License-MIT-orange.svg?logo=internetarchive&logoColor=white&labelColor=464646&style=for-the-badge"></a>
11
- <a href="https://github.com/adamlui/js-utils/releases/tag/geolocate-2.3.1">
12
- <img height=31 src="https://img.shields.io/badge/Latest_Build-2.3.1-44cc11.svg?logo=icinga&logoColor=white&labelColor=464646&style=for-the-badge"></a>
11
+ <a href="https://github.com/adamlui/js-utils/releases/tag/geolocate-2.4.0">
12
+ <img height=31 src="https://img.shields.io/badge/Latest_Build-2.4.0-44cc11.svg?logo=icinga&logoColor=white&labelColor=464646&style=for-the-badge"></a>
13
13
  <a href="https://www.npmjs.com/package/@adamlui/geolocate?activeTab=code">
14
14
  <img height=31 src="https://img.shields.io/npm/unpacked-size/%40adamlui%2Fgeolocate?style=for-the-badge&logo=ebox&logoColor=white&labelColor=464646&color=blue"></a>
15
- <a href="#">
16
- <img height=31 src="https://img.shields.io/bundlejs/size/%40adamlui%2Fgeolocate%402.2.1?label=Minified%20Size&logo=databricks&logoColor=white&labelColor=464646&color=ff69b4&style=for-the-badge"></a>
17
15
  <a href="https://sonarcloud.io/component_measures?metric=new_vulnerabilities&id=adamlui_js-utils:geolocate/src/geolocate.js">
18
16
  <img height=31 src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fsonarcloud.io%2Fapi%2Fmeasures%2Fcomponent%3Fcomponent%3Dadamlui_js-utils%3Ageolocate%2Fsrc%2Fgeolocate.js%26metricKeys%3Dvulnerabilities&query=%24.component.measures.0.value&style=for-the-badge&logo=sonarcloud&logoColor=white&labelColor=464646&label=Vulnerabilities&color=gold"></a>
19
17
  <a href="https://github.com/toolleeo/cli-apps#networking">
@@ -59,7 +57,7 @@ $ geolocate [ip1] [ip2] [...]
59
57
 
60
58
  Sample output:
61
59
 
62
- <img src="https://media.geolocatejs.org/images/screenshots/cli/geolocate-8.8.8.8-cmd-output.png?0d36e26">
60
+ <img src="https://cdn.jsdelivr.net/gh/adamlui/js-utils@0d3424a/geolocate/assets/images/screenshots/cli/geolocate-8.8.8.8-cmd-output.png">
63
61
 
64
62
  **📝 Note:** If no IPv4 address is passed, your own one will be used.
65
63
 
@@ -126,14 +124,14 @@ const geo = require('@adamlui/geolocate')
126
124
  #### <> HTML script tag:
127
125
 
128
126
  ```html
129
- <script src="https://cdn.jsdelivr.net/npm/@adamlui/geolocate@2.3.1/dist/geolocate.min.js"></script>
127
+ <script src="https://cdn.jsdelivr.net/npm/@adamlui/geolocate@2.4.0/dist/geolocate.min.js"></script>
130
128
  ```
131
129
 
132
130
  #### ES6:
133
131
 
134
132
  ```js
135
133
  (async () => {
136
- await import('https://cdn.jsdelivr.net/npm/@adamlui/geolocate@2.3.1/dist/geolocate.min.js')
134
+ await import('https://cdn.jsdelivr.net/npm/@adamlui/geolocate@2.4.0/dist/geolocate.min.js')
137
135
  // Your code here...
138
136
  })()
139
137
  ```
@@ -142,7 +140,7 @@ const geo = require('@adamlui/geolocate')
142
140
 
143
141
  ```js
144
142
  ...
145
- // @require https://cdn.jsdelivr.net/npm/@adamlui/geolocate@2.3.1/dist/geolocate.min.js
143
+ // @require https://cdn.jsdelivr.net/npm/@adamlui/geolocate@2.4.0/dist/geolocate.min.js
146
144
  // ==/UserScript==
147
145
 
148
146
  // Your code here...
@@ -150,7 +148,7 @@ const geo = require('@adamlui/geolocate')
150
148
 
151
149
  <br>
152
150
 
153
- **📝 Note:** To always import the latest version (not recommended in production!) remove the `@2.3.1` version tag from the jsDelivr URL: `https://cdn.jsdelivr.net/npm/@adamlui/geolocate/dist/geolocate.min.js`
151
+ **📝 Note:** To always import the latest version (not recommended in production!) remove the `@2.4.0` version tag from the jsDelivr URL: `https://cdn.jsdelivr.net/npm/@adamlui/geolocate/dist/geolocate.min.js`
154
152
 
155
153
  <br>
156
154
 
@@ -223,7 +221,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
223
221
 
224
222
  ## 🛠️ Related utilities
225
223
 
226
- ### <picture><source media="(prefers-color-scheme: dark)" srcset="https://media.generate-ip.org/images/icons/node-graph/white/icon55x49.png?b4eb06e"><img height=21 src="https://media.generate-ip.org/images/icons/node-graph/black/icon55x49.png?b4eb06e"></picture> [generate-ip](https://js-utils.org/generate-ip) &nbsp;<a href="https://github.com/toolleeo/cli-apps#networking"><img height=18 src="https://assets.js-utils.org/images/badges/awesome/badge.svg?v=0d36e26"></a>
224
+ ### <picture><source media="(prefers-color-scheme: dark)" srcset="https://cdn.jsdelivr.net/gh/adamlui/js-utils@5c34563/generate-ip/assets/images/icons/node-graph/white/icon55x49.png"><img height=21 src="https://cdn.jsdelivr.net/gh/adamlui/js-utils@5c34563/generate-ip/assets/images/icons/node-graph/black/icon55x49.png"></picture> [generate-ip](https://js-utils.org/generate-ip) &nbsp;<a href="https://github.com/toolleeo/cli-apps#networking"><img height=18 src="https://assets.js-utils.org/images/badges/awesome/badge.svg?v=0d36e26"></a>
227
225
 
228
226
  > Randomly generate, format, and validate IPv4 + IPv6 + MAC addresses.
229
227
  <br>[Install](https://docs.generate-ip.org/#-installation) /
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adamlui/geolocate",
3
- "version": "2.3.1",
3
+ "version": "2.4.0",
4
4
  "description": "Fetch IP geolocation data from the CLI.",
5
5
  "author": {
6
6
  "name": "Adam Lui",
@@ -71,10 +71,11 @@
71
71
  "url": "https://github.com/adamlui/js-utils/issues"
72
72
  },
73
73
  "dependencies": {
74
+ "is-unicode-supported": "^2.1.0",
74
75
  "node-clipboardy": "^1.0.3"
75
76
  },
76
77
  "devDependencies": {
77
- "@adamlui/minify.js": "^2.3.1",
78
+ "@adamlui/minify.js": "^2.4.1",
78
79
  "console-table-printer": "^2.15.0",
79
80
  "copyfiles": "^2.4.1",
80
81
  "generate-ip": "^2.8.2"