@cappitolian/local-ip 0.0.9

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,17 @@
1
+ require 'json'
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, 'package.json')))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = 'LocalIp'
7
+ s.version = package['version']
8
+ s.summary = package['description']
9
+ s.license = package['license']
10
+ s.homepage = package['repository']['url']
11
+ s.author = package['author']
12
+ s.source = { :git => package['repository']['url'], :tag => s.version.to_s }
13
+ s.source_files = 'ios/Sources/**/*.{swift,h,m,c,cc,mm,cpp}'
14
+ s.ios.deployment_target = '14.0'
15
+ s.dependency 'Capacitor'
16
+ s.swift_version = '5.1'
17
+ end
package/Package.swift ADDED
@@ -0,0 +1,28 @@
1
+ // swift-tools-version: 5.9
2
+ import PackageDescription
3
+
4
+ let package = Package(
5
+ name: "LocalIp",
6
+ platforms: [.iOS(.v14)],
7
+ products: [
8
+ .library(
9
+ name: "LocalIp",
10
+ targets: ["LocalIpPlugin"])
11
+ ],
12
+ dependencies: [
13
+ .package(url: "https://github.com/ionic-team/capacitor-swift-pm.git", from: "7.0.0")
14
+ ],
15
+ targets: [
16
+ .target(
17
+ name: "LocalIpPlugin",
18
+ dependencies: [
19
+ .product(name: "Capacitor", package: "capacitor-swift-pm"),
20
+ .product(name: "Cordova", package: "capacitor-swift-pm")
21
+ ],
22
+ path: "ios/Sources/LocalIpPlugin"),
23
+ .testTarget(
24
+ name: "LocalIpPluginTests",
25
+ dependencies: ["LocalIpPlugin"],
26
+ path: "ios/Tests/LocalIpPluginTests")
27
+ ]
28
+ )
package/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # @cappitolian/local-ip
2
+
3
+ Retrieve local IP address from native device
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @cappitolian/local-ip
9
+ npx cap sync
10
+ ```
11
+
12
+ ## API
13
+
14
+ <docgen-index>
15
+
16
+ * [`getLocalIp()`](#getlocalip)
17
+
18
+ </docgen-index>
19
+
20
+ <docgen-api>
21
+ <!--Update the source file JSDoc comments and rerun docgen to update the docs below-->
22
+
23
+ ### getLocalIp()
24
+
25
+ ```typescript
26
+ getLocalIp() => Promise<{ ip: string; }>
27
+ ```
28
+
29
+ **Returns:** <code>Promise&lt;{ ip: string; }&gt;</code>
30
+
31
+ --------------------
32
+
33
+ </docgen-api>
@@ -0,0 +1,58 @@
1
+ ext {
2
+ junitVersion = project.hasProperty('junitVersion') ? rootProject.ext.junitVersion : '4.13.2'
3
+ androidxAppCompatVersion = project.hasProperty('androidxAppCompatVersion') ? rootProject.ext.androidxAppCompatVersion : '1.7.0'
4
+ androidxJunitVersion = project.hasProperty('androidxJunitVersion') ? rootProject.ext.androidxJunitVersion : '1.2.1'
5
+ androidxEspressoCoreVersion = project.hasProperty('androidxEspressoCoreVersion') ? rootProject.ext.androidxEspressoCoreVersion : '3.6.1'
6
+ }
7
+
8
+ buildscript {
9
+ repositories {
10
+ google()
11
+ mavenCentral()
12
+ }
13
+ dependencies {
14
+ classpath 'com.android.tools.build:gradle:8.7.2'
15
+ }
16
+ }
17
+
18
+ apply plugin: 'com.android.library'
19
+
20
+ android {
21
+ namespace "com.cappitolian.plugins.localip"
22
+ compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 35
23
+ defaultConfig {
24
+ minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 23
25
+ targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 35
26
+ versionCode 1
27
+ versionName "1.0"
28
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
29
+ }
30
+ buildTypes {
31
+ release {
32
+ minifyEnabled false
33
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
34
+ }
35
+ }
36
+ lintOptions {
37
+ abortOnError false
38
+ }
39
+ compileOptions {
40
+ sourceCompatibility JavaVersion.VERSION_21
41
+ targetCompatibility JavaVersion.VERSION_21
42
+ }
43
+ }
44
+
45
+ repositories {
46
+ google()
47
+ mavenCentral()
48
+ }
49
+
50
+
51
+ dependencies {
52
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
53
+ implementation project(':capacitor-android')
54
+ implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
55
+ testImplementation "junit:junit:$junitVersion"
56
+ androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
57
+ androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
58
+ }
@@ -0,0 +1,2 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
+ </manifest>
@@ -0,0 +1,43 @@
1
+ package com.cappitolian.plugins.localip;
2
+
3
+ import com.getcapacitor.Plugin;
4
+ import com.getcapacitor.PluginCall;
5
+ import com.getcapacitor.JSObject;
6
+ import com.getcapacitor.PluginMethod;
7
+ import com.getcapacitor.annotation.CapacitorPlugin;
8
+
9
+ import java.net.Inet4Address;
10
+ import java.net.NetworkInterface;
11
+ import java.util.Enumeration;
12
+
13
+ @CapacitorPlugin(name = "LocalIp")
14
+ public class LocalIpPlugin extends Plugin {
15
+ @PluginMethod
16
+ public void getLocalIp(PluginCall call) {
17
+ try {
18
+ String localIp = null;
19
+ Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
20
+ while (interfaces.hasMoreElements()) {
21
+ NetworkInterface intf = interfaces.nextElement();
22
+ Enumeration<java.net.InetAddress> addrs = intf.getInetAddresses();
23
+ while (addrs.hasMoreElements()) {
24
+ java.net.InetAddress addr = addrs.nextElement();
25
+ if (!addr.isLoopbackAddress() && addr instanceof Inet4Address) {
26
+ localIp = addr.getHostAddress();
27
+ break;
28
+ }
29
+ }
30
+ if (localIp != null) break;
31
+ }
32
+ if (localIp != null) {
33
+ JSObject ret = new JSObject();
34
+ ret.put("ip", localIp);
35
+ call.resolve(ret);
36
+ } else {
37
+ call.reject("Local IP address not found");
38
+ }
39
+ } catch (Exception e) {
40
+ call.reject("Error retrieving IP: " + e.getMessage());
41
+ }
42
+ }
43
+ }
File without changes
package/dist/docs.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "api": {
3
+ "name": "LocalIpPlugin",
4
+ "slug": "localipplugin",
5
+ "docs": "",
6
+ "tags": [],
7
+ "methods": [
8
+ {
9
+ "name": "getLocalIp",
10
+ "signature": "() => Promise<{ ip: string; }>",
11
+ "parameters": [],
12
+ "returns": "Promise<{ ip: string; }>",
13
+ "tags": [],
14
+ "docs": "",
15
+ "complexTypes": [],
16
+ "slug": "getlocalip"
17
+ }
18
+ ],
19
+ "properties": []
20
+ },
21
+ "interfaces": [],
22
+ "enums": [],
23
+ "typeAliases": [],
24
+ "pluginConfigs": []
25
+ }
@@ -0,0 +1,5 @@
1
+ export interface LocalIpPlugin {
2
+ getLocalIp(): Promise<{
3
+ ip: string;
4
+ }>;
5
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"","sourcesContent":["export interface LocalIpPlugin {\n getLocalIp(): Promise<{ ip: string }>;\n}"]}
@@ -0,0 +1,4 @@
1
+ import type { LocalIpPlugin } from './definitions';
2
+ declare const LocalIp: LocalIpPlugin;
3
+ export * from './definitions';
4
+ export { LocalIp };
@@ -0,0 +1,7 @@
1
+ import { registerPlugin } from '@capacitor/core';
2
+ const LocalIp = registerPlugin('LocalIp', {
3
+ web: () => import('./web').then(m => new m.LocalIpWeb()),
4
+ });
5
+ export * from './definitions';
6
+ export { LocalIp };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,OAAO,GAAG,cAAc,CAAgB,SAAS,EAAE;IACvD,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;CACzD,CAAC,CAAC;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,CAAC","sourcesContent":["import { registerPlugin } from '@capacitor/core';\nimport type { LocalIpPlugin } from './definitions';\n\nconst LocalIp = registerPlugin<LocalIpPlugin>('LocalIp', {\n web: () => import('./web').then(m => new m.LocalIpWeb()),\n});\n\nexport * from './definitions';\nexport { LocalIp };"]}
@@ -0,0 +1,7 @@
1
+ import { WebPlugin } from '@capacitor/core';
2
+ import type { LocalIpPlugin } from './definitions';
3
+ export declare class LocalIpWeb extends WebPlugin implements LocalIpPlugin {
4
+ getLocalIp(): Promise<{
5
+ ip: string;
6
+ }>;
7
+ }
@@ -0,0 +1,7 @@
1
+ import { WebPlugin } from '@capacitor/core';
2
+ export class LocalIpWeb extends WebPlugin {
3
+ async getLocalIp() {
4
+ return { ip: '' }; // Not implemented for web
5
+ }
6
+ }
7
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,OAAO,UAAW,SAAQ,SAAS;IACvC,KAAK,CAAC,UAAU;QACd,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,0BAA0B;IAC/C,CAAC;CACF","sourcesContent":["import { WebPlugin } from '@capacitor/core';\nimport type { LocalIpPlugin } from './definitions';\n\nexport class LocalIpWeb extends WebPlugin implements LocalIpPlugin {\n async getLocalIp(): Promise<{ ip: string }> {\n return { ip: '' }; // Not implemented for web\n }\n}"]}
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ var core = require('@capacitor/core');
4
+
5
+ const LocalIp = core.registerPlugin('LocalIp', {
6
+ web: () => Promise.resolve().then(function () { return web; }).then(m => new m.LocalIpWeb()),
7
+ });
8
+
9
+ class LocalIpWeb extends core.WebPlugin {
10
+ async getLocalIp() {
11
+ return { ip: '' }; // Not implemented for web
12
+ }
13
+ }
14
+
15
+ var web = /*#__PURE__*/Object.freeze({
16
+ __proto__: null,
17
+ LocalIpWeb: LocalIpWeb
18
+ });
19
+
20
+ exports.LocalIp = LocalIp;
21
+ //# sourceMappingURL=plugin.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst LocalIp = registerPlugin('LocalIp', {\n web: () => import('./web').then(m => new m.LocalIpWeb()),\n});\nexport * from './definitions';\nexport { LocalIp };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class LocalIpWeb extends WebPlugin {\n async getLocalIp() {\n return { ip: '' }; // Not implemented for web\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;;AACK,MAAC,OAAO,GAAGA,mBAAc,CAAC,SAAS,EAAE;AAC1C,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;AAC5D,CAAC;;ACFM,MAAM,UAAU,SAASC,cAAS,CAAC;AAC1C,IAAI,MAAM,UAAU,GAAG;AACvB,QAAQ,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAC1B;AACA;;;;;;;;;"}
package/dist/plugin.js ADDED
@@ -0,0 +1,24 @@
1
+ var capacitorLocalIpPlugin = (function (exports, core) {
2
+ 'use strict';
3
+
4
+ const LocalIp = core.registerPlugin('LocalIp', {
5
+ web: () => Promise.resolve().then(function () { return web; }).then(m => new m.LocalIpWeb()),
6
+ });
7
+
8
+ class LocalIpWeb extends core.WebPlugin {
9
+ async getLocalIp() {
10
+ return { ip: '' }; // Not implemented for web
11
+ }
12
+ }
13
+
14
+ var web = /*#__PURE__*/Object.freeze({
15
+ __proto__: null,
16
+ LocalIpWeb: LocalIpWeb
17
+ });
18
+
19
+ exports.LocalIp = LocalIp;
20
+
21
+ return exports;
22
+
23
+ })({}, capacitorExports);
24
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst LocalIp = registerPlugin('LocalIp', {\n web: () => import('./web').then(m => new m.LocalIpWeb()),\n});\nexport * from './definitions';\nexport { LocalIp };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class LocalIpWeb extends WebPlugin {\n async getLocalIp() {\n return { ip: '' }; // Not implemented for web\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;AACK,UAAC,OAAO,GAAGA,mBAAc,CAAC,SAAS,EAAE;IAC1C,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;IAC5D,CAAC;;ICFM,MAAM,UAAU,SAASC,cAAS,CAAC;IAC1C,IAAI,MAAM,UAAU,GAAG;IACvB,QAAQ,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAC1B;IACA;;;;;;;;;;;;;;;"}
@@ -0,0 +1,39 @@
1
+ import Foundation
2
+ import Capacitor
3
+
4
+ @objc(LocalIpPlugin)
5
+ public class LocalIpPlugin: CAPPlugin {
6
+ @objc func getLocalIp(_ call: CAPPluginCall) {
7
+ var address: String?
8
+
9
+ var ifaddr: UnsafeMutablePointer<ifaddrs>?
10
+ if getifaddrs(&ifaddr) == 0 {
11
+ var ptr = ifaddr
12
+ while ptr != nil {
13
+ defer { ptr = ptr?.pointee.ifa_next }
14
+ guard let interface = ptr?.pointee else { continue }
15
+ let addrFamily = interface.ifa_addr.pointee.sa_family
16
+ if addrFamily == UInt8(AF_INET) {
17
+ if let name = String(validatingUTF8: interface.ifa_name),
18
+ name == "en0" { // WiFi interface
19
+ var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
20
+ getnameinfo(interface.ifa_addr, socklen_t(interface.ifa_addr.pointee.sa_len),
21
+ &hostname, socklen_t(hostname.count),
22
+ nil, socklen_t(0), NI_NUMERICHOST)
23
+ address = String(cString: hostname)
24
+ break
25
+ }
26
+ }
27
+ }
28
+ freeifaddrs(ifaddr)
29
+ }
30
+
31
+ if let ip = address {
32
+ call.resolve([
33
+ "ip": ip
34
+ ])
35
+ } else {
36
+ call.reject("Unable to determine local IP address")
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,15 @@
1
+ import XCTest
2
+ @testable import LocalIpPlugin
3
+
4
+ class LocalIpPluginTests: XCTestCase {
5
+ func testEcho() {
6
+ // This is an example of a functional test case for a plugin.
7
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
8
+
9
+ let implementation = LocalIpPlugin()
10
+ let value = "Hello, World!"
11
+ let result = implementation.echo(value)
12
+
13
+ XCTAssertEqual(value, result)
14
+ }
15
+ }
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "@cappitolian/local-ip",
3
+ "version": "0.0.9",
4
+ "description": "Retrieve local IP address from native device",
5
+ "main": "dist/plugin.cjs.js",
6
+ "module": "dist/esm/index.js",
7
+ "types": "dist/esm/index.d.ts",
8
+ "unpkg": "dist/plugin.js",
9
+ "files": [
10
+ "android/src/main/",
11
+ "android/build.gradle",
12
+ "dist/",
13
+ "ios/Sources",
14
+ "ios/Tests",
15
+ "Package.swift",
16
+ "LocalIp.podspec"
17
+ ],
18
+ "author": "Cappitolian",
19
+ "license": "MIT",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/alessandrycruz1987/local-ip.git"
23
+ },
24
+ "bugs": {
25
+ "url": "https://github.com/alessandrycruz1987/local-ip/issues"
26
+ },
27
+ "keywords": [
28
+ "capacitor",
29
+ "plugin",
30
+ "native"
31
+ ],
32
+ "scripts": {
33
+ "verify": "npm run verify:ios && npm run verify:android && npm run verify:web",
34
+ "verify:ios": "xcodebuild -scheme LocalIp -destination generic/platform=iOS",
35
+ "verify:android": "cd android && ./gradlew clean build test && cd ..",
36
+ "verify:web": "npm run build",
37
+ "lint": "npm run eslint && npm run prettier -- --check && npm run swiftlint -- lint",
38
+ "fmt": "npm run eslint -- --fix && npm run prettier -- --write && npm run swiftlint -- --fix --format",
39
+ "eslint": "eslint . --ext ts",
40
+ "prettier": "prettier \"**/*.{css,html,ts,js,java}\" --plugin=prettier-plugin-java",
41
+ "swiftlint": "node-swiftlint",
42
+ "docgen": "docgen --api LocalIpPlugin --output-readme README.md --output-json dist/docs.json",
43
+ "build": "npm run clean && npm run docgen && tsc && rollup -c rollup.config.mjs",
44
+ "clean": "rimraf ./dist",
45
+ "watch": "tsc --watch",
46
+ "prepublishOnly": "npm run build"
47
+ },
48
+ "devDependencies": {
49
+ "@capacitor/android": "^7.0.0",
50
+ "@capacitor/core": "^7.0.0",
51
+ "@capacitor/docgen": "^0.3.0",
52
+ "@capacitor/ios": "^7.0.0",
53
+ "@ionic/eslint-config": "^0.4.0",
54
+ "@ionic/prettier-config": "^4.0.0",
55
+ "@ionic/swiftlint-config": "^2.0.0",
56
+ "eslint": "^8.57.0",
57
+ "prettier": "^3.4.2",
58
+ "prettier-plugin-java": "^2.6.6",
59
+ "rimraf": "^6.0.1",
60
+ "rollup": "^4.30.1",
61
+ "swiftlint": "^2.0.0",
62
+ "typescript": "~4.1.5"
63
+ },
64
+ "peerDependencies": {
65
+ "@capacitor/core": ">=7.0.0"
66
+ },
67
+ "prettier": "@ionic/prettier-config",
68
+ "swiftlint": "@ionic/swiftlint-config",
69
+ "eslintConfig": {
70
+ "extends": "@ionic/eslint-config/recommended"
71
+ },
72
+ "capacitor": {
73
+ "ios": {
74
+ "src": "ios"
75
+ },
76
+ "android": {
77
+ "src": "android"
78
+ }
79
+ }
80
+ }