chore: adjust prettier config, .gitignore and use taplo to format toml files (#1728)

* chore: adjust prettier config, .gitignore and use taplo to format toml files

This brings the plugins-workspace repository to the same code style of the main tauri repo

* format toml

* ignore examples gen dir

* add .vscode/extensions.json

* remove packageManager field

* fmt

* fix audit

* taplo ignore permissions autogenerated files

* remove create dummy dist

* fix prettier workflow

* install fmt in prettier workflow

---------

Co-authored-by: Lucas Nogueira <lucas@tauri.app>
This commit is contained in:
Amr Bashir
2024-09-04 14:54:23 +03:00
committed by GitHub
parent 72c2ce82c1
commit cf4d7d4e6c
227 changed files with 2534 additions and 2505 deletions
-1
View File
@@ -1 +0,0 @@
node_modules
+3 -3
View File
@@ -10,11 +10,11 @@ repository = { workspace = true }
links = "tauri-plugin-autostart"
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
[build-dependencies]
tauri-plugin = { workspace = true, features = [ "build" ] }
tauri-plugin = { workspace = true, features = ["build"] }
[dependencies]
serde = { workspace = true }
+4 -4
View File
@@ -62,13 +62,13 @@ fn main() {
Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
```javascript
import { enable, isEnabled, disable } from "@tauri-apps/plugin-autostart";
import { enable, isEnabled, disable } from '@tauri-apps/plugin-autostart'
await enable();
await enable()
console.log(`registered for autostart? ${await isEnabled()}`);
console.log(`registered for autostart? ${await isEnabled()}`)
disable();
disable()
```
## Contributing
+1 -1
View File
@@ -20,4 +20,4 @@ We prefer to receive reports in English.
Please disclose a vulnerability or security relevant issue here: [https://github.com/tauri-apps/plugins-workspace/security/advisories/new](https://github.com/tauri-apps/plugins-workspace/security/advisories/new).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
+4 -4
View File
@@ -2,16 +2,16 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { invoke } from "@tauri-apps/api/core";
import { invoke } from '@tauri-apps/api/core'
export async function isEnabled(): Promise<boolean> {
return await invoke("plugin:autostart|is_enabled");
return await invoke('plugin:autostart|is_enabled')
}
export async function enable(): Promise<void> {
await invoke("plugin:autostart|enable");
await invoke('plugin:autostart|enable')
}
export async function disable(): Promise<void> {
await invoke("plugin:autostart|disable");
await invoke('plugin:autostart|disable')
}
+1 -5
View File
@@ -12,8 +12,4 @@ disable the automatic start on boot.
"""
permissions = [
"allow-enable",
"allow-disable",
"allow-is-enabled",
]
permissions = ["allow-enable", "allow-disable", "allow-is-enabled"]
+2 -2
View File
@@ -2,6 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { createConfig } from "../../shared/rollup.config.js";
import { createConfig } from '../../shared/rollup.config.js'
export default createConfig();
export default createConfig()
-1
View File
@@ -1 +0,0 @@
/.tauri
+4 -4
View File
@@ -10,12 +10,12 @@ repository = { workspace = true }
links = "tauri-plugin-barcode-scanner"
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
targets = [ "x86_64-linux-android" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
targets = ["x86_64-linux-android"]
[build-dependencies]
tauri-plugin = { workspace = true, features = [ "build" ] }
tauri-plugin = { workspace = true, features = ["build"] }
[dependencies]
serde = { workspace = true }
+2 -2
View File
@@ -60,12 +60,12 @@ fn main() {
Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
```javascript
import { scan } from "@tauri-apps/plugin-barcode-scanner";
import { scan } from '@tauri-apps/plugin-barcode-scanner'
// `windowed: true` actually sets the webview to transparent
// instead of opening a separate view for the camera
// make sure your user interface is ready to show what is underneath with a transparent element
scan({ windowed: true, formats: [""] })
scan({ windowed: true, formats: [''] })
```
## Contributing
-1
View File
@@ -54,7 +54,6 @@ The camera has two modes. The first one is where the user can see the background
The second mode allows the developer to assist the user and add a transparent overlay to the image, providing hints or additional information (like a link preview).
The overlay could be made non-transparent by the application frontend and as long as the app is open (and in some cases) it could read QR codes in range of the camera lense.
#### Out Of Scope
- Exploits in the operating system QR code parsing functionality
+29 -29
View File
@@ -5,37 +5,37 @@
import {
invoke,
requestPermissions as checkPermissions_,
checkPermissions as requestPermissions_,
} from "@tauri-apps/api/core";
checkPermissions as requestPermissions_
} from '@tauri-apps/api/core'
export type { PermissionState } from "@tauri-apps/api/core";
export type { PermissionState } from '@tauri-apps/api/core'
export enum Format {
QRCode = "QR_CODE",
UPC_A = "UPC_A",
UPC_E = "UPC_E",
EAN8 = "EAN_8",
EAN13 = "EAN_13",
Code39 = "CODE_39",
Code93 = "CODE_93",
Code128 = "CODE_128",
Codabar = "CODABAR",
ITF = "ITF",
Aztec = "AZTEC",
DataMatrix = "DATA_MATRIX",
PDF417 = "PDF_417",
QRCode = 'QR_CODE',
UPC_A = 'UPC_A',
UPC_E = 'UPC_E',
EAN8 = 'EAN_8',
EAN13 = 'EAN_13',
Code39 = 'CODE_39',
Code93 = 'CODE_93',
Code128 = 'CODE_128',
Codabar = 'CODABAR',
ITF = 'ITF',
Aztec = 'AZTEC',
DataMatrix = 'DATA_MATRIX',
PDF417 = 'PDF_417'
}
export interface ScanOptions {
cameraDirection?: "back" | "front";
formats?: Format[];
windowed?: boolean;
cameraDirection?: 'back' | 'front'
formats?: Format[]
windowed?: boolean
}
export interface Scanned {
content: string;
format: Format;
bounds: unknown;
content: string
format: Format
bounds: unknown
}
/**
@@ -43,14 +43,14 @@ export interface Scanned {
* @param options
*/
export async function scan(options?: ScanOptions): Promise<Scanned> {
return await invoke("plugin:barcode-scanner|scan", { ...options });
return await invoke('plugin:barcode-scanner|scan', { ...options })
}
/**
* Cancel the current scan process.
*/
export async function cancel(): Promise<void> {
await invoke("plugin:barcode-scanner|cancel");
await invoke('plugin:barcode-scanner|cancel')
}
/**
@@ -58,8 +58,8 @@ export async function cancel(): Promise<void> {
*/
export async function checkPermissions(): Promise<PermissionState> {
return await checkPermissions_<{ camera: PermissionState }>(
"barcode-scanner",
).then((r) => r.camera);
'barcode-scanner'
).then((r) => r.camera)
}
/**
@@ -67,13 +67,13 @@ export async function checkPermissions(): Promise<PermissionState> {
*/
export async function requestPermissions(): Promise<PermissionState> {
return await requestPermissions_<{ camera: PermissionState }>(
"barcode-scanner",
).then((r) => r.camera);
'barcode-scanner'
).then((r) => r.camera)
}
/**
* Open application settings. Useful if permission was denied and the user must manually enable it.
*/
export async function openAppSettings(): Promise<void> {
await invoke("plugin:barcode-scanner|open_app_settings");
await invoke('plugin:barcode-scanner|open_app_settings')
}
+2 -2
View File
@@ -2,6 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { createConfig } from "../../shared/rollup.config.js";
import { createConfig } from '../../shared/rollup.config.js'
export default createConfig();
export default createConfig()
-1
View File
@@ -1 +0,0 @@
/.tauri
+4 -4
View File
@@ -9,12 +9,12 @@ repository = { workspace = true }
links = "tauri-plugin-biometric"
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
targets = [ "x86_64-linux-android" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
targets = ["x86_64-linux-android"]
[build-dependencies]
tauri-plugin = { workspace = true, features = [ "build" ] }
tauri-plugin = { workspace = true, features = ["build"] }
[dependencies]
serde = { workspace = true }
+2 -2
View File
@@ -62,8 +62,8 @@ fn main() {
Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
```javascript
import { authenticate } from "@tauri-apps/plugin-biometric";
await authenticate('Open your wallet');
import { authenticate } from '@tauri-apps/plugin-biometric'
await authenticate('Open your wallet')
```
## Contributing
+1 -1
View File
@@ -20,4 +20,4 @@ We prefer to receive reports in English.
Please disclose a vulnerability or security relevant issue here: [https://github.com/tauri-apps/plugins-workspace/security/advisories/new](https://github.com/tauri-apps/plugins-workspace/security/advisories/new).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
+28 -28
View File
@@ -2,7 +2,7 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { invoke } from "@tauri-apps/api/core";
import { invoke } from '@tauri-apps/api/core'
export enum BiometryType {
None = 0,
@@ -11,39 +11,39 @@ export enum BiometryType {
// Apple FaceID or Android face authentication
FaceID = 2,
// Android iris authentication
Iris = 3,
Iris = 3
}
export interface Status {
isAvailable: boolean;
biometryType: BiometryType;
error?: string;
isAvailable: boolean
biometryType: BiometryType
error?: string
errorCode?:
| "appCancel"
| "authenticationFailed"
| "invalidContext"
| "notInteractive"
| "passcodeNotSet"
| "systemCancel"
| "userCancel"
| "userFallback"
| "biometryLockout"
| "biometryNotAvailable"
| "biometryNotEnrolled";
| 'appCancel'
| 'authenticationFailed'
| 'invalidContext'
| 'notInteractive'
| 'passcodeNotSet'
| 'systemCancel'
| 'userCancel'
| 'userFallback'
| 'biometryLockout'
| 'biometryNotAvailable'
| 'biometryNotEnrolled'
}
export interface AuthOptions {
allowDeviceCredential?: boolean;
cancelTitle?: string;
allowDeviceCredential?: boolean
cancelTitle?: string
// iOS options
fallbackTitle?: string;
fallbackTitle?: string
// android options
title?: string;
subtitle?: string;
confirmationRequired?: boolean;
maxAttemps?: number;
title?: string
subtitle?: string
confirmationRequired?: boolean
maxAttemps?: number
}
/**
@@ -51,7 +51,7 @@ export interface AuthOptions {
* @returns a promise resolving to an object containing all the information about the status of the biometry.
*/
export async function checkStatus(): Promise<Status> {
return await invoke("plugin:biometric|status");
return await invoke('plugin:biometric|status')
}
/**
@@ -68,10 +68,10 @@ export async function checkStatus(): Promise<Status> {
*/
export async function authenticate(
reason: string,
options?: AuthOptions,
options?: AuthOptions
): Promise<void> {
await invoke("plugin:biometric|authenticate", {
await invoke('plugin:biometric|authenticate', {
reason,
...options,
});
...options
})
}
+1 -4
View File
@@ -10,7 +10,4 @@ It allows acccess to all biometric commands.
"""
permissions = [
"allow-authenticate",
"allow-status",
]
permissions = ["allow-authenticate", "allow-status"]
+2 -2
View File
@@ -2,6 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { createConfig } from "../../shared/rollup.config.js";
import { createConfig } from '../../shared/rollup.config.js'
export default createConfig();
export default createConfig()
+3 -3
View File
@@ -10,11 +10,11 @@ repository = { workspace = true }
links = "tauri-plugin-cli"
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
[build-dependencies]
tauri-plugin = { workspace = true, features = [ "build" ] }
tauri-plugin = { workspace = true, features = ["build"] }
[dependencies]
serde = { workspace = true }
+6 -6
View File
@@ -67,16 +67,16 @@ fn main() {
Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
```javascript
import { getMatches } from "@tauri-apps/plugin-cli";
const matches = await getMatches();
if (matches.subcommand?.name === "run") {
import { getMatches } from '@tauri-apps/plugin-cli'
const matches = await getMatches()
if (matches.subcommand?.name === 'run') {
// `./your-app run $ARGS` was executed
const args = matches.subcommand?.matches.args;
if ("debug" in args) {
const args = matches.subcommand?.matches.args
if ('debug' in args) {
// `./your-app run --debug` was executed
}
} else {
const args = matches.args;
const args = matches.args
// `./your-app $ARGS` was executed
}
```
+1 -1
View File
@@ -20,4 +20,4 @@ We prefer to receive reports in English.
Please disclose a vulnerability or security relevant issue here: [https://github.com/tauri-apps/plugins-workspace/security/advisories/new](https://github.com/tauri-apps/plugins-workspace/security/advisories/new).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
+10 -10
View File
@@ -8,7 +8,7 @@
* @module
*/
import { invoke } from "@tauri-apps/api/core";
import { invoke } from '@tauri-apps/api/core'
/**
* @since 2.0.0
@@ -19,27 +19,27 @@ interface ArgMatch {
* boolean if flag
* string[] or null if takes multiple values
*/
value: string | boolean | string[] | null;
value: string | boolean | string[] | null
/**
* Number of occurrences
*/
occurrences: number;
occurrences: number
}
/**
* @since 2.0.0
*/
interface SubcommandMatch {
name: string;
matches: CliMatches;
name: string
matches: CliMatches
}
/**
* @since 2.0.0
*/
interface CliMatches {
args: Record<string, ArgMatch>;
subcommand: SubcommandMatch | null;
args: Record<string, ArgMatch>
subcommand: SubcommandMatch | null
}
/**
@@ -64,9 +64,9 @@ interface CliMatches {
* @since 2.0.0
*/
async function getMatches(): Promise<CliMatches> {
return await invoke("plugin:cli|cli_matches");
return await invoke('plugin:cli|cli_matches')
}
export type { ArgMatch, SubcommandMatch, CliMatches };
export type { ArgMatch, SubcommandMatch, CliMatches }
export { getMatches };
export { getMatches }
+2 -2
View File
@@ -2,6 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { createConfig } from "../../shared/rollup.config.js";
import { createConfig } from '../../shared/rollup.config.js'
export default createConfig();
export default createConfig()
-1
View File
@@ -1 +0,0 @@
/.tauri
+4 -4
View File
@@ -10,12 +10,12 @@ repository = { workspace = true }
links = "tauri-plugin-clipboard-manager"
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
targets = [ "x86_64-unknown-linux-gnu", "x86_64-linux-android" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
targets = ["x86_64-unknown-linux-gnu", "x86_64-linux-android"]
[build-dependencies]
tauri-plugin = { workspace = true, features = [ "build" ] }
tauri-plugin = { workspace = true, features = ["build"] }
[dependencies]
serde = { workspace = true }
+9 -3
View File
@@ -60,9 +60,15 @@ fn main() {
Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
```javascript
import { writeText, readText, writeHtml, readHtml, clear } from "@tauri-apps/plugin-clipboard-manager";
await writeText("Tauri is awesome!");
assert(await readText(), "Tauri is awesome!");
import {
writeText,
readText,
writeHtml,
readHtml,
clear
} from '@tauri-apps/plugin-clipboard-manager'
await writeText('Tauri is awesome!')
assert(await readText(), 'Tauri is awesome!')
```
## Contributing
+1 -1
View File
@@ -20,4 +20,4 @@ We prefer to receive reports in English.
Please disclose a vulnerability or security relevant issue here: [https://github.com/tauri-apps/plugins-workspace/security/advisories/new](https://github.com/tauri-apps/plugins-workspace/security/advisories/new).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
+19 -19
View File
@@ -8,8 +8,8 @@
* @module
*/
import { invoke } from "@tauri-apps/api/core";
import { Image, transformImage } from "@tauri-apps/api/image";
import { invoke } from '@tauri-apps/api/core'
import { Image, transformImage } from '@tauri-apps/api/image'
/**
* Writes plain text to the clipboard.
@@ -26,12 +26,12 @@ import { Image, transformImage } from "@tauri-apps/api/image";
*/
async function writeText(
text: string,
opts?: { label?: string },
opts?: { label?: string }
): Promise<void> {
await invoke("plugin:clipboard-manager|write_text", {
await invoke('plugin:clipboard-manager|write_text', {
label: opts?.label,
text,
});
text
})
}
/**
@@ -44,7 +44,7 @@ async function writeText(
* @since 2.0.0
*/
async function readText(): Promise<string> {
return await invoke("plugin:clipboard-manager|read_text");
return await invoke('plugin:clipboard-manager|read_text')
}
/**
@@ -66,11 +66,11 @@ async function readText(): Promise<string> {
* @since 2.0.0
*/
async function writeImage(
image: string | Image | Uint8Array | ArrayBuffer | number[],
image: string | Image | Uint8Array | ArrayBuffer | number[]
): Promise<void> {
await invoke("plugin:clipboard-manager|write_image", {
image: transformImage(image),
});
await invoke('plugin:clipboard-manager|write_image', {
image: transformImage(image)
})
}
/**
@@ -86,9 +86,9 @@ async function writeImage(
* @since 2.0.0
*/
async function readImage(): Promise<Image> {
return await invoke<number>("plugin:clipboard-manager|read_image").then(
(rid) => new Image(rid),
);
return await invoke<number>('plugin:clipboard-manager|read_image').then(
(rid) => new Image(rid)
)
}
/**
@@ -106,10 +106,10 @@ async function readImage(): Promise<Image> {
* @since 2.0.0
*/
async function writeHtml(html: string, altHtml?: string): Promise<void> {
await invoke("plugin:clipboard-manager|write_html", {
await invoke('plugin:clipboard-manager|write_html', {
html,
altHtml,
});
altHtml
})
}
/**
@@ -122,7 +122,7 @@ async function writeHtml(html: string, altHtml?: string): Promise<void> {
* @since 2.0.0
*/
async function clear(): Promise<void> {
await invoke("plugin:clipboard-manager|clear");
await invoke('plugin:clipboard-manager|clear')
}
export { writeText, readText, writeHtml, clear, readImage, writeImage };
export { writeText, readText, writeHtml, clear, readImage, writeImage }
+2 -2
View File
@@ -2,6 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { createConfig } from "../../shared/rollup.config.js";
import { createConfig } from '../../shared/rollup.config.js'
export default createConfig();
export default createConfig()
-1
View File
@@ -1 +0,0 @@
/.tauri
+15 -15
View File
@@ -2,26 +2,26 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import http from "http";
import fs from "fs";
import http from 'http'
import fs from 'fs'
const hostname = "localhost";
const port = 8080;
const hostname = 'localhost'
const port = 8080
const server = http.createServer(function (req, res) {
console.log(req.url);
if (req.url == "/.well-known/apple-app-site-association") {
console.log(req.url)
if (req.url == '/.well-known/apple-app-site-association') {
const association = fs.readFileSync(
".well-known/apple-app-site-association",
);
res.writeHead(200, { "Content-Type": "application/json" });
res.end(association);
'.well-known/apple-app-site-association'
)
res.writeHead(200, { 'Content-Type': 'application/json' })
res.end(association)
} else {
res.writeHead(404);
res.end("404 NOT FOUND");
res.writeHead(404)
res.end('404 NOT FOUND')
}
});
})
server.listen(port, hostname, () => {
console.log("Server started on port", port);
});
console.log('Server started on port', port)
})
+3 -3
View File
@@ -10,15 +10,15 @@ repository = { workspace = true }
links = "tauri-plugin-deep-link"
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
targets = ["x86_64-linux-android"]
[build-dependencies]
serde = { workspace = true }
serde_json = { workspace = true }
tauri-utils = { workspace = true }
tauri-plugin = { workspace = true, features = [ "build" ] }
tauri-plugin = { workspace = true, features = ["build"] }
[dependencies]
serde = { workspace = true }
+3 -3
View File
@@ -139,10 +139,10 @@ fn main() {
Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
```javascript
import { onOpenUrl } from "@tauri-apps/plugin-deep-link";
import { onOpenUrl } from '@tauri-apps/plugin-deep-link'
await onOpenUrl((urls) => {
console.log("deep link:", urls);
});
console.log('deep link:', urls)
})
```
Note that the Plugin will only emit events on macOS, iOS and Android. On Windows and Linux the OS will spawn a new instance of your app with the URL as a CLI argument. If you want your app to behave on Windows & Linux similar to the other platforms you can use the [single-instance](../single-instance/) plugin.
+1 -1
View File
@@ -20,4 +20,4 @@ We prefer to receive reports in English.
Please disclose a vulnerability or security relevant issue here: [https://github.com/tauri-apps/plugins-workspace/security/advisories/new](https://github.com/tauri-apps/plugins-workspace/security/advisories/new).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
@@ -68,7 +68,7 @@ targets:
base:
ENABLE_BITCODE: false
ARCHS: [arm64, arm64-sim]
VALID_ARCHS: arm64 arm64-sim
VALID_ARCHS: arm64 arm64-sim
LIBRARY_SEARCH_PATHS[arch=x86_64]: $(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)
LIBRARY_SEARCH_PATHS[arch=arm64]: $(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)
LIBRARY_SEARCH_PATHS[arch=arm64-sim]: $(inherited) $(PROJECT_DIR)/Externals/arm64-sim/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)
@@ -93,4 +93,4 @@ targets:
outputFiles:
- $(SRCROOT)/Externals/x86_64/${CONFIGURATION}/libapp.a
- $(SRCROOT)/Externals/arm64/${CONFIGURATION}/libapp.a
- $(SRCROOT)/Externals/arm64-sim/${CONFIGURATION}/libapp.a
- $(SRCROOT)/Externals/arm64-sim/${CONFIGURATION}/libapp.a
@@ -2,30 +2,30 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import http from "http";
import fs from "fs";
import path from "path";
import * as url from "url";
const __dirname = url.fileURLToPath(new URL(".", import.meta.url));
import http from 'http'
import fs from 'fs'
import path from 'path'
import * as url from 'url'
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
const port = 8125;
const port = 8125
http
.createServer(function (request, response) {
if (request.url === "/.well-known/apple-app-site-association") {
if (request.url === '/.well-known/apple-app-site-association') {
// eslint-disable-next-line
fs.readFile(
path.resolve(__dirname, "apple-app-site-association"),
path.resolve(__dirname, 'apple-app-site-association'),
function (_error, content) {
response.writeHead(200);
response.end(content, "utf-8");
},
);
response.writeHead(200)
response.end(content, 'utf-8')
}
)
} else {
response.writeHead(404);
response.end();
response.writeHead(404)
response.end()
}
})
.listen(port);
.listen(port)
console.log(`Server running at http://127.0.0.1:${port}/`);
console.log(`Server running at http://127.0.0.1:${port}/`)
+17 -17
View File
@@ -4,35 +4,35 @@
import {
onOpenUrl,
getCurrent as getCurrentDeepLinkUrls,
} from "@tauri-apps/plugin-deep-link";
getCurrent as getCurrentDeepLinkUrls
} from '@tauri-apps/plugin-deep-link'
function handler(urls: string[]) {
console.log(urls);
console.log(urls)
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const updateIntentEl = document.querySelector("#event-intent")!;
updateIntentEl.textContent = JSON.stringify(urls);
const updateIntentEl = document.querySelector('#event-intent')!
updateIntentEl.textContent = JSON.stringify(urls)
}
window.addEventListener("DOMContentLoaded", () => {
onOpenUrl(handler);
window.addEventListener('DOMContentLoaded', () => {
onOpenUrl(handler)
document.querySelector("#intent-form")?.addEventListener("submit", (e) => {
e.preventDefault();
document.querySelector('#intent-form')?.addEventListener('submit', (e) => {
e.preventDefault()
getCurrentDeepLinkUrls()
.then((res) => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const updateIntentEl = document.querySelector("#update-intent")!;
updateIntentEl.textContent = res ? JSON.stringify(res) : "none";
const updateIntentEl = document.querySelector('#update-intent')!
updateIntentEl.textContent = res ? JSON.stringify(res) : 'none'
})
.catch(console.error);
});
.catch(console.error)
})
getCurrentDeepLinkUrls()
.then((res) => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const initialIntentEl = document.querySelector("#initial-intent")!;
initialIntentEl.textContent = res ? JSON.stringify(res) : "none";
const initialIntentEl = document.querySelector('#initial-intent')!
initialIntentEl.textContent = res ? JSON.stringify(res) : 'none'
})
.catch(console.error);
});
.catch(console.error)
})
+11 -11
View File
@@ -2,9 +2,9 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { defineConfig } from "vite";
import { defineConfig } from 'vite'
const host = process.env.TAURI_DEV_HOST;
const host = process.env.TAURI_DEV_HOST
// https://vitejs.dev/config/
export default defineConfig({
@@ -17,22 +17,22 @@ export default defineConfig({
port: 1420,
hmr: host
? {
protocol: "ws",
protocol: 'ws',
host,
port: 1421,
port: 1421
}
: undefined,
strictPort: true,
strictPort: true
},
// to make use of `TAURI_DEBUG` and other env variables
// https://tauri.studio/v1/api/config#buildconfig.beforedevcommand
envPrefix: ["VITE_", "TAURI_"],
envPrefix: ['VITE_', 'TAURI_'],
build: {
// Tauri supports es2021
target: process.env.TAURI_PLATFORM == "windows" ? "chrome105" : "safari13",
target: process.env.TAURI_PLATFORM == 'windows' ? 'chrome105' : 'safari13',
// don't minify for debug builds
minify: !process.env.TAURI_DEBUG ? "esbuild" : false,
minify: !process.env.TAURI_DEBUG ? 'esbuild' : false,
// produce sourcemaps for debug builds
sourcemap: !!process.env.TAURI_DEBUG,
},
});
sourcemap: !!process.env.TAURI_DEBUG
}
})
+12 -12
View File
@@ -2,8 +2,8 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { invoke } from "@tauri-apps/api/core";
import { type UnlistenFn, listen } from "@tauri-apps/api/event";
import { invoke } from '@tauri-apps/api/core'
import { type UnlistenFn, listen } from '@tauri-apps/api/event'
/**
* Get the current URLs that triggered the deep link. Use this on app load to check whether your app was started via a deep link.
@@ -19,7 +19,7 @@ import { type UnlistenFn, listen } from "@tauri-apps/api/event";
* @since 2.0.0
*/
export async function getCurrent(): Promise<string[] | null> {
return await invoke("plugin:deep-link|get_current");
return await invoke('plugin:deep-link|get_current')
}
/**
@@ -38,7 +38,7 @@ export async function getCurrent(): Promise<string[] | null> {
* @since 2.0.0
*/
export async function register(protocol: string): Promise<null> {
return await invoke("plugin:deep-link|register", { protocol });
return await invoke('plugin:deep-link|register', { protocol })
}
/**
@@ -57,7 +57,7 @@ export async function register(protocol: string): Promise<null> {
* @since 2.0.0
*/
export async function unregister(protocol: string): Promise<null> {
return await invoke("plugin:deep-link|unregister", { protocol });
return await invoke('plugin:deep-link|unregister', { protocol })
}
/**
@@ -76,7 +76,7 @@ export async function unregister(protocol: string): Promise<null> {
* @since 2.0.0
*/
export async function isRegistered(protocol: string): Promise<boolean> {
return await invoke("plugin:deep-link|is_registered", { protocol });
return await invoke('plugin:deep-link|is_registered', { protocol })
}
/**
@@ -95,14 +95,14 @@ export async function isRegistered(protocol: string): Promise<boolean> {
* @since 2.0.0
*/
export async function onOpenUrl(
handler: (urls: string[]) => void,
handler: (urls: string[]) => void
): Promise<UnlistenFn> {
const current = await getCurrent();
const current = await getCurrent()
if (current) {
handler(current);
handler(current)
}
return await listen<string[]>("deep-link://new-url", (event) => {
handler(event.payload);
});
return await listen<string[]>('deep-link://new-url', (event) => {
handler(event.payload)
})
}
+2 -2
View File
@@ -2,6 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { createConfig } from "../../shared/rollup.config.js";
import { createConfig } from '../../shared/rollup.config.js'
export default createConfig();
export default createConfig()
-1
View File
@@ -1 +0,0 @@
.tauri
+4 -4
View File
@@ -10,15 +10,15 @@ repository = { workspace = true }
links = "tauri-plugin-dialog"
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
targets = ["x86_64-unknown-linux-gnu", "x86_64-linux-android"]
[build-dependencies]
tauri-plugin = { workspace = true, features = [ "build" ] }
tauri-plugin = { workspace = true, features = ["build"] }
[dev-dependencies]
tauri = { workspace = true, features = [ "wry" ] }
tauri = { workspace = true, features = ["wry"] }
[dependencies]
serde = { workspace = true }
+1 -1
View File
@@ -20,4 +20,4 @@ We prefer to receive reports in English.
Please disclose a vulnerability or security relevant issue here: [https://github.com/tauri-apps/plugins-workspace/security/advisories/new](https://github.com/tauri-apps/plugins-workspace/security/advisories/new).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
+52 -52
View File
@@ -2,7 +2,7 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { invoke } from "@tauri-apps/api/core";
import { invoke } from '@tauri-apps/api/core'
/**
* Extension filters for the file dialog.
@@ -11,7 +11,7 @@ import { invoke } from "@tauri-apps/api/core";
*/
interface DialogFilter {
/** Filter name. */
name: string;
name: string
/**
* Extensions to filter, without a `.` prefix.
* @example
@@ -19,7 +19,7 @@ interface DialogFilter {
* extensions: ['svg', 'png']
* ```
*/
extensions: string[];
extensions: string[]
}
/**
@@ -29,9 +29,9 @@ interface DialogFilter {
*/
interface OpenDialogOptions {
/** The title of the dialog window (desktop only). */
title?: string;
title?: string
/** The filters of the dialog. */
filters?: DialogFilter[];
filters?: DialogFilter[]
/**
* Initial directory or file path.
* If it's a directory path, the dialog interface will change to that folder.
@@ -40,18 +40,18 @@ interface OpenDialogOptions {
* On mobile the file name is always used on the dialog's file name input.
* If not provided, Android uses `(invalid).txt` as default file name.
*/
defaultPath?: string;
defaultPath?: string
/** Whether the dialog allows multiple selection or not. */
multiple?: boolean;
multiple?: boolean
/** Whether the dialog is a directory selection or not. */
directory?: boolean;
directory?: boolean
/**
* If `directory` is true, indicates that it will be read recursively later.
* Defines whether subdirectories will be allowed on the scope or not.
*/
recursive?: boolean;
recursive?: boolean
/** Whether to allow creating directories in the dialog. Enabled by default. **macOS Only** */
canCreateDirectories?: boolean;
canCreateDirectories?: boolean
}
/**
@@ -61,9 +61,9 @@ interface OpenDialogOptions {
*/
interface SaveDialogOptions {
/** The title of the dialog window (desktop only). */
title?: string;
title?: string
/** The filters of the dialog. */
filters?: DialogFilter[];
filters?: DialogFilter[]
/**
* Initial directory or file path.
* If it's a directory path, the dialog interface will change to that folder.
@@ -72,9 +72,9 @@ interface SaveDialogOptions {
* On mobile the file name is always used on the dialog's file name input.
* If not provided, Android uses `(invalid).txt` as default file name.
*/
defaultPath?: string;
defaultPath?: string
/** Whether to allow creating directories in the dialog. Enabled by default. **macOS Only** */
canCreateDirectories?: boolean;
canCreateDirectories?: boolean
}
/**
@@ -82,31 +82,31 @@ interface SaveDialogOptions {
*/
interface MessageDialogOptions {
/** The title of the dialog. Defaults to the app name. */
title?: string;
title?: string
/** The kind of the dialog. Defaults to `info`. */
kind?: "info" | "warning" | "error";
kind?: 'info' | 'warning' | 'error'
/** The label of the confirm button. */
okLabel?: string;
okLabel?: string
}
interface ConfirmDialogOptions {
/** The title of the dialog. Defaults to the app name. */
title?: string;
title?: string
/** The kind of the dialog. Defaults to `info`. */
kind?: "info" | "warning" | "error";
kind?: 'info' | 'warning' | 'error'
/** The label of the confirm button. */
okLabel?: string;
okLabel?: string
/** The label of the cancel button. */
cancelLabel?: string;
cancelLabel?: string
}
type OpenDialogReturn<T extends OpenDialogOptions> = T["directory"] extends true
? T["multiple"] extends true
type OpenDialogReturn<T extends OpenDialogOptions> = T['directory'] extends true
? T['multiple'] extends true
? string[] | null
: string | null
: T["multiple"] extends true
: T['multiple'] extends true
? string[] | null
: string | null;
: string | null
/**
* Open a file/directory selection dialog.
@@ -161,13 +161,13 @@ type OpenDialogReturn<T extends OpenDialogOptions> = T["directory"] extends true
* @since 2.0.0
*/
async function open<T extends OpenDialogOptions>(
options: T = {} as T,
options: T = {} as T
): Promise<OpenDialogReturn<T>> {
if (typeof options === "object") {
Object.freeze(options);
if (typeof options === 'object') {
Object.freeze(options)
}
return await invoke("plugin:dialog|open", { options });
return await invoke('plugin:dialog|open', { options })
}
/**
@@ -195,11 +195,11 @@ async function open<T extends OpenDialogOptions>(
* @since 2.0.0
*/
async function save(options: SaveDialogOptions = {}): Promise<string | null> {
if (typeof options === "object") {
Object.freeze(options);
if (typeof options === 'object') {
Object.freeze(options)
}
return await invoke("plugin:dialog|save", { options });
return await invoke('plugin:dialog|save', { options })
}
/**
@@ -221,15 +221,15 @@ async function save(options: SaveDialogOptions = {}): Promise<string | null> {
*/
async function message(
message: string,
options?: string | MessageDialogOptions,
options?: string | MessageDialogOptions
): Promise<void> {
const opts = typeof options === "string" ? { title: options } : options;
await invoke("plugin:dialog|message", {
const opts = typeof options === 'string' ? { title: options } : options
await invoke('plugin:dialog|message', {
message: message.toString(),
title: opts?.title?.toString(),
kind: opts?.kind,
okButtonLabel: opts?.okLabel?.toString(),
});
okButtonLabel: opts?.okLabel?.toString()
})
}
/**
@@ -250,16 +250,16 @@ async function message(
*/
async function ask(
message: string,
options?: string | ConfirmDialogOptions,
options?: string | ConfirmDialogOptions
): Promise<boolean> {
const opts = typeof options === "string" ? { title: options } : options;
return await invoke("plugin:dialog|ask", {
const opts = typeof options === 'string' ? { title: options } : options
return await invoke('plugin:dialog|ask', {
message: message.toString(),
title: opts?.title?.toString(),
kind: opts?.kind,
okButtonLabel: opts?.okLabel?.toString() ?? "Yes",
cancelButtonLabel: opts?.cancelLabel?.toString() ?? "No",
});
okButtonLabel: opts?.okLabel?.toString() ?? 'Yes',
cancelButtonLabel: opts?.cancelLabel?.toString() ?? 'No'
})
}
/**
@@ -280,16 +280,16 @@ async function ask(
*/
async function confirm(
message: string,
options?: string | ConfirmDialogOptions,
options?: string | ConfirmDialogOptions
): Promise<boolean> {
const opts = typeof options === "string" ? { title: options } : options;
return await invoke("plugin:dialog|confirm", {
const opts = typeof options === 'string' ? { title: options } : options
return await invoke('plugin:dialog|confirm', {
message: message.toString(),
title: opts?.title?.toString(),
kind: opts?.kind,
okButtonLabel: opts?.okLabel?.toString() ?? "Ok",
cancelButtonLabel: opts?.cancelLabel?.toString() ?? "Cancel",
});
okButtonLabel: opts?.okLabel?.toString() ?? 'Ok',
cancelButtonLabel: opts?.cancelLabel?.toString() ?? 'Cancel'
})
}
export type {
@@ -298,7 +298,7 @@ export type {
OpenDialogReturn,
SaveDialogOptions,
MessageDialogOptions,
ConfirmDialogOptions,
};
ConfirmDialogOptions
}
export { open, save, message, ask, confirm };
export { open, save, message, ask, confirm }
+9 -9
View File
@@ -2,17 +2,17 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { invoke } from "@tauri-apps/api/core";
import { invoke } from '@tauri-apps/api/core'
window.alert = function (message: string) {
void invoke("plugin:dialog|message", {
message: message.toString(),
});
};
void invoke('plugin:dialog|message', {
message: message.toString()
})
}
// @ts-expect-error tauri does not have sync IPC :(
window.confirm = async function (message: string) {
return await invoke("plugin:dialog|confirm", {
message: message.toString(),
});
};
return await invoke('plugin:dialog|confirm', {
message: message.toString()
})
}
+5 -5
View File
@@ -12,9 +12,9 @@ All dialog types are enabled.
"""
permissions = [
"allow-ask",
"allow-confirm",
"allow-message",
"allow-save",
"allow-open",
"allow-ask",
"allow-confirm",
"allow-message",
"allow-save",
"allow-open",
]
+11 -11
View File
@@ -2,21 +2,21 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { createConfig } from "../../shared/rollup.config.js";
import { nodeResolve } from "@rollup/plugin-node-resolve";
import typescript from "@rollup/plugin-typescript";
import terser from "@rollup/plugin-terser";
import { createConfig } from '../../shared/rollup.config.js'
import { nodeResolve } from '@rollup/plugin-node-resolve'
import typescript from '@rollup/plugin-typescript'
import terser from '@rollup/plugin-terser'
export default createConfig({
additionalConfigs: {
input: "guest-js/init.ts",
input: 'guest-js/init.ts',
output: {
file: "src/init-iife.js",
format: "iife",
file: 'src/init-iife.js',
format: 'iife'
},
plugins: [typescript(), terser(), nodeResolve()],
onwarn: (warning) => {
throw Object.assign(new Error(), warning);
},
},
});
throw Object.assign(new Error(), warning)
}
}
})
-1
View File
@@ -1 +0,0 @@
node_modules
+3 -3
View File
@@ -10,11 +10,11 @@ repository = { workspace = true }
links = "tauri-plugin-fs"
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
[build-dependencies]
tauri-plugin = { workspace = true, features = [ "build" ] }
tauri-plugin = { workspace = true, features = ["build"] }
schemars = { workspace = true }
serde = { workspace = true }
+2 -2
View File
@@ -60,9 +60,9 @@ fn main() {
Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
```javascript
import { metadata } from "@tauri-apps/plugin-fs";
import { metadata } from '@tauri-apps/plugin-fs'
await metadata("/path/to/file");
await metadata('/path/to/file')
```
## Contributing
-2
View File
@@ -36,7 +36,6 @@ the restrictions imposed by the scope.
The scope is defined at compile time in the used permissions but the user or application developer can grant or revoke access to specific files or folders at runtime by modifying the scope state through the runtime authority, if configured during plugin initialization.
### Security Assumptions
- The filesystem access is limited by user permissions
@@ -44,7 +43,6 @@ The scope is defined at compile time in the used permissions but the user or app
- The scoping mechanism of the Tauri `fs` commands work as intended and has no bypasses
- The user or application developer can grant or revoke access to specific files at runtime by modifying the scope
#### Out Of Scope
- Exploits in underlying filesystems
File diff suppressed because it is too large Load Diff
@@ -20,4 +20,4 @@ path = "$APPLOCALDATA"
path = "$APPCACHE"
[[permission.scope.allow]]
path = "$APPLOG"
path = "$APPLOG"
+3 -3
View File
@@ -28,7 +28,7 @@ On Windows the webview data folder access is denied.
"""
permissions = [
"create-app-specific-dirs",
"read-app-specific-dirs-recursive",
"deny-default",
"create-app-specific-dirs",
"read-app-specific-dirs-recursive",
"deny-default",
]
+14 -14
View File
@@ -4,18 +4,18 @@
identifier = "read-all"
description = "This enables all read related commands without any pre-configured accessible paths."
commands.allow = [
"read_dir",
"read_file",
"read",
"open",
"read_text_file",
"read_text_file_lines",
"read_text_file_lines_next",
"seek",
"stat",
"lstat",
"fstat",
"exists",
"watch",
"unwatch",
"read_dir",
"read_file",
"read",
"open",
"read_text_file",
"read_text_file_lines",
"read_text_file_lines_next",
"seek",
"stat",
"lstat",
"fstat",
"exists",
"watch",
"unwatch",
]
@@ -7,12 +7,12 @@ This permission allows recursive read functionality on the application
specific base directories.
"""
commands.allow = [
"read_dir",
"read_file",
"read_text_file",
"read_text_file_lines",
"read_text_file_lines_next",
"exists",
"read_dir",
"read_file",
"read_text_file",
"read_text_file_lines",
"read_text_file_lines_next",
"exists",
]
[[permission.scope.allow]]
@@ -28,4 +28,4 @@ path = "$APPLOCALDATA/**"
path = "$APPCACHE/**"
[[permission.scope.allow]]
path = "$APPLOG/**"
path = "$APPLOG/**"
+11 -11
View File
@@ -4,16 +4,16 @@
identifier = "read-files"
description = "This enables file read related commands without any pre-configured accessible paths."
commands.allow = [
"read_file",
"read",
"open",
"read_text_file",
"read_text_file_lines",
"read_text_file_lines_next",
"seek",
"stat",
"lstat",
"fstat",
"exists",
"read_file",
"read",
"open",
"read_text_file",
"read_text_file_lines",
"read_text_file_lines_next",
"seek",
"stat",
"lstat",
"fstat",
"exists",
]
+10 -10
View File
@@ -4,14 +4,14 @@
identifier = "write-all"
description = "This enables all write related commands without any pre-configured accessible paths."
commands.allow = [
"mkdir",
"create",
"copy_file",
"remove",
"rename",
"truncate",
"ftruncate",
"write",
"write_file",
"write_text_file",
"mkdir",
"create",
"copy_file",
"remove",
"rename",
"truncate",
"ftruncate",
"write",
"write_file",
"write_text_file",
]
+9 -9
View File
@@ -4,13 +4,13 @@
identifier = "write-files"
description = "This enables all file write related commands without any pre-configured accessible paths."
commands.allow = [
"create",
"copy_file",
"remove",
"rename",
"truncate",
"ftruncate",
"write",
"write_file",
"write_text_file",
"create",
"copy_file",
"remove",
"rename",
"truncate",
"ftruncate",
"write",
"write_file",
"write_text_file",
]
+2 -2
View File
@@ -2,6 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { createConfig } from "../../shared/rollup.config.js";
import { createConfig } from '../../shared/rollup.config.js'
export default createConfig();
export default createConfig()
-1
View File
@@ -1 +0,0 @@
/.tauri
+4 -4
View File
@@ -9,12 +9,12 @@ repository = { workspace = true }
links = "tauri-plugin-geolocation"
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
targets = [ "x86_64-linux-android" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
targets = ["x86_64-linux-android"]
[build-dependencies]
tauri-plugin = { workspace = true, features = [ "build" ] }
tauri-plugin = { workspace = true, features = ["build"] }
[dependencies]
serde = { workspace = true }
+4 -4
View File
@@ -87,16 +87,16 @@ fn main() {
Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
```javascript
import { getCurrentPosition, watchPosition } from "@tauri-apps/plugin-log";
import { getCurrentPosition, watchPosition } from '@tauri-apps/plugin-log'
const pos = await getCurrentPosition();
const pos = await getCurrentPosition()
await watchPosition(
{ enableHighAccuracy: true, timeout: 10000, maximumAge: 0 },
(pos) => {
console.log(pos);
console.log(pos)
}
);
)
```
## Contributing
+1 -1
View File
@@ -20,4 +20,4 @@ We prefer to receive reports in English.
Please disclose a vulnerability or security relevant issue here: [https://github.com/tauri-apps/plugins-workspace/security/advisories/new](https://github.com/tauri-apps/plugins-workspace/security/advisories/new).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
+88 -88
View File
@@ -9,77 +9,77 @@
export const commands = {
async getCurrentPosition(
options: PositionOptions | null,
options: PositionOptions | null
): Promise<Result<Position, Error>> {
try {
return {
status: "ok",
data: await TAURI_INVOKE("plugin:geolocation|get_current_position", {
options,
}),
};
status: 'ok',
data: await TAURI_INVOKE('plugin:geolocation|get_current_position', {
options
})
}
} catch (e) {
if (e instanceof Error) throw e;
else return { status: "error", error: e as any };
if (e instanceof Error) throw e
else return { status: 'error', error: e as any }
}
},
async watchPosition(
options: PositionOptions,
channel: any,
channel: any
): Promise<Result<null, Error>> {
try {
return {
status: "ok",
data: await TAURI_INVOKE("plugin:geolocation|watch_position", {
status: 'ok',
data: await TAURI_INVOKE('plugin:geolocation|watch_position', {
options,
channel,
}),
};
channel
})
}
} catch (e) {
if (e instanceof Error) throw e;
else return { status: "error", error: e as any };
if (e instanceof Error) throw e
else return { status: 'error', error: e as any }
}
},
async clearWatch(channelId: number): Promise<Result<null, Error>> {
try {
return {
status: "ok",
data: await TAURI_INVOKE("plugin:geolocation|clear_watch", {
channelId,
}),
};
status: 'ok',
data: await TAURI_INVOKE('plugin:geolocation|clear_watch', {
channelId
})
}
} catch (e) {
if (e instanceof Error) throw e;
else return { status: "error", error: e as any };
if (e instanceof Error) throw e
else return { status: 'error', error: e as any }
}
},
async checkPermissions(): Promise<Result<PermissionStatus, Error>> {
try {
return {
status: "ok",
data: await TAURI_INVOKE("plugin:geolocation|check_permissions"),
};
status: 'ok',
data: await TAURI_INVOKE('plugin:geolocation|check_permissions')
}
} catch (e) {
if (e instanceof Error) throw e;
else return { status: "error", error: e as any };
if (e instanceof Error) throw e
else return { status: 'error', error: e as any }
}
},
async requestPermissions(
permissions: PermissionType[] | null,
permissions: PermissionType[] | null
): Promise<Result<PermissionStatus, Error>> {
try {
return {
status: "ok",
data: await TAURI_INVOKE("plugin:geolocation|request_permissions", {
permissions,
}),
};
status: 'ok',
data: await TAURI_INVOKE('plugin:geolocation|request_permissions', {
permissions
})
}
} catch (e) {
if (e instanceof Error) throw e;
else return { status: "error", error: e as any };
if (e instanceof Error) throw e
else return { status: 'error', error: e as any }
}
},
};
}
}
/** user-defined events **/
@@ -97,31 +97,31 @@ export type Coordinates = {
/**
* Latitude in decimal degrees.
*/
latitude: number;
latitude: number
/**
* Longitude in decimal degrees.
*/
longitude: number;
longitude: number
/**
* Accuracy level of the latitude and longitude coordinates in meters.
*/
accuracy: number;
accuracy: number
/**
* Accuracy level of the altitude coordinate in meters, if available.
* Available on all iOS versions and on Android 8 and above.
*/
altitudeAccuracy: number | null;
altitudeAccuracy: number | null
/**
* The altitude the user is at, if available.
*/
altitude: number | null;
speed: number | null;
altitude: number | null
speed: number | null
/**
* The heading the user is facing, if available.
*/
heading: number | null;
};
export type Error = never;
heading: number | null
}
export type Error = never
/**
* Permission state.
*/
@@ -129,15 +129,15 @@ export type PermissionState =
/**
* Permission access has been granted.
*/
| "granted"
| 'granted'
/**
* Permission access has been denied.
*/
| "denied"
| 'denied'
/**
* The end user should be prompted for permission.
*/
| "prompt";
| 'prompt'
export type PermissionStatus = {
/**
* Permission state for the location alias.
@@ -146,7 +146,7 @@ export type PermissionStatus = {
*
* On iOS it requests/checks location permissions.
*/
location: PermissionState;
location: PermissionState
/**
* Permissions state for the coarseLoaction alias.
*
@@ -156,93 +156,93 @@ export type PermissionStatus = {
*
* On iOS it will have the same value as the `location` alias.
*/
coarseLocation: PermissionState;
};
export type PermissionType = "location" | "coarseLocation";
coarseLocation: PermissionState
}
export type PermissionType = 'location' | 'coarseLocation'
export type Position = {
/**
* Creation time for these coordinates.
*/
timestamp: number;
timestamp: number
/**
* The GPD coordinates along with the accuracy of the data.
*/
coords: Coordinates;
};
coords: Coordinates
}
export type PositionOptions = {
/**
* High accuracy mode (such as GPS, if available)
* Will be ignored on Android 12+ if users didn't grant the ACCESS_FINE_LOCATION permission.
*/
enableHighAccuracy: boolean;
enableHighAccuracy: boolean
/**
* The maximum wait time in milliseconds for location updates.
* On Android the timeout gets ignored for getCurrentPosition.
* Ignored on iOS
*/
timeout: number;
timeout: number
/**
* The maximum age in milliseconds of a possible cached position that is acceptable to return.
* Default: 0
* Ignored on iOS
*/
maximumAge: number;
};
maximumAge: number
}
//export type RandomNumber = number;
/** tauri-specta globals **/
import { invoke as TAURI_INVOKE } from "@tauri-apps/api/core";
import * as TAURI_API_EVENT from "@tauri-apps/api/event";
import { type WebviewWindow as __WebviewWindow__ } from "@tauri-apps/api/webviewWindow";
import { invoke as TAURI_INVOKE } from '@tauri-apps/api/core'
import * as TAURI_API_EVENT from '@tauri-apps/api/event'
import { type WebviewWindow as __WebviewWindow__ } from '@tauri-apps/api/webviewWindow'
type __EventObj__<T> = {
listen: (
cb: TAURI_API_EVENT.EventCallback<T>,
) => ReturnType<typeof TAURI_API_EVENT.listen<T>>;
cb: TAURI_API_EVENT.EventCallback<T>
) => ReturnType<typeof TAURI_API_EVENT.listen<T>>
once: (
cb: TAURI_API_EVENT.EventCallback<T>,
) => ReturnType<typeof TAURI_API_EVENT.once<T>>;
cb: TAURI_API_EVENT.EventCallback<T>
) => ReturnType<typeof TAURI_API_EVENT.once<T>>
emit: T extends null
? (payload?: T) => ReturnType<typeof TAURI_API_EVENT.emit>
: (payload: T) => ReturnType<typeof TAURI_API_EVENT.emit>;
};
: (payload: T) => ReturnType<typeof TAURI_API_EVENT.emit>
}
export type Result<T, E> =
| { status: "ok"; data: T }
| { status: "error"; error: E };
| { status: 'ok'; data: T }
| { status: 'error'; error: E }
function __makeEvents__<T extends Record<string, any>>(
mappings: Record<keyof T, string>,
mappings: Record<keyof T, string>
) {
return new Proxy(
{} as unknown as {
[K in keyof T]: __EventObj__<T[K]> & {
(handle: __WebviewWindow__): __EventObj__<T[K]>;
};
(handle: __WebviewWindow__): __EventObj__<T[K]>
}
},
{
get: (_, event) => {
const name = mappings[event as keyof T];
const name = mappings[event as keyof T]
return new Proxy((() => {}) as any, {
apply: (_, __, [window]: [__WebviewWindow__]) => ({
listen: (arg: any) => window.listen(name, arg),
once: (arg: any) => window.once(name, arg),
emit: (arg: any) => window.emit(name, arg),
emit: (arg: any) => window.emit(name, arg)
}),
get: (_, command: keyof __EventObj__<any>) => {
switch (command) {
case "listen":
return (arg: any) => TAURI_API_EVENT.listen(name, arg);
case "once":
return (arg: any) => TAURI_API_EVENT.once(name, arg);
case "emit":
return (arg: any) => TAURI_API_EVENT.emit(name, arg);
case 'listen':
return (arg: any) => TAURI_API_EVENT.listen(name, arg)
case 'once':
return (arg: any) => TAURI_API_EVENT.once(name, arg)
case 'emit':
return (arg: any) => TAURI_API_EVENT.emit(name, arg)
}
},
});
},
},
);
}
})
}
}
)
}
+11 -11
View File
@@ -4,26 +4,26 @@
/* eslint-disable @typescript-eslint/unbound-method */
import { Channel } from "@tauri-apps/api/core";
import { commands, type PositionOptions, type Position } from "./bindings";
import { Channel } from '@tauri-apps/api/core'
import { commands, type PositionOptions, type Position } from './bindings'
export async function watchPosition(
options: PositionOptions,
// TODO: This can receive errors too
cb: (location: Position | string) => void,
cb: (location: Position | string) => void
): Promise<number> {
const channel = new Channel<Position>();
channel.onmessage = cb;
await commands.watchPosition(options, channel);
return channel.id;
const channel = new Channel<Position>()
channel.onmessage = cb
await commands.watchPosition(options, channel)
return channel.id
}
export const {
getCurrentPosition,
clearWatch,
checkPermissions,
requestPermissions,
} = commands;
requestPermissions
} = commands
export type {
PermissionState,
@@ -31,7 +31,7 @@ export type {
PermissionType,
Position,
PositionOptions,
Coordinates,
} from "./bindings";
Coordinates
} from './bindings'
// export { events };
+2 -2
View File
@@ -2,6 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { createConfig } from "../../shared/rollup.config.js";
import { createConfig } from '../../shared/rollup.config.js'
export default createConfig();
export default createConfig()
+3 -3
View File
@@ -10,11 +10,11 @@ repository = { workspace = true }
links = "tauri-plugin-global-shortcut"
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
[build-dependencies]
tauri-plugin = { workspace = true, features = [ "build" ] }
tauri-plugin = { workspace = true, features = ["build"] }
[dependencies]
serde = { workspace = true }
+5 -5
View File
@@ -87,12 +87,12 @@ fn main() {
Afterwards all the plugin's APIs are available through the JavaScript bindings:
```javascript
import { register } from "@tauri-apps/plugin-global-shortcut";
await register("CommandOrControl+Shift+C", (event) => {
if (event.state === "Pressed") {
console.log("Shortcut triggered");
import { register } from '@tauri-apps/plugin-global-shortcut'
await register('CommandOrControl+Shift+C', (event) => {
if (event.state === 'Pressed') {
console.log('Shortcut triggered')
}
});
})
```
## Contributing
+1 -1
View File
@@ -20,4 +20,4 @@ We prefer to receive reports in English.
Please disclose a vulnerability or security relevant issue here: [https://github.com/tauri-apps/plugins-workspace/security/advisories/new](https://github.com/tauri-apps/plugins-workspace/security/advisories/new).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
+19 -19
View File
@@ -8,15 +8,15 @@
* @module
*/
import { invoke, Channel } from "@tauri-apps/api/core";
import { invoke, Channel } from '@tauri-apps/api/core'
export interface ShortcutEvent {
shortcut: string;
id: number;
state: "Released" | "Pressed";
shortcut: string
id: number
state: 'Released' | 'Pressed'
}
export type ShortcutHandler = (event: ShortcutEvent) => void;
export type ShortcutHandler = (event: ShortcutEvent) => void
/**
* Register a global shortcut or a list of shortcuts.
@@ -50,15 +50,15 @@ export type ShortcutHandler = (event: ShortcutEvent) => void;
*/
async function register(
shortcuts: string | string[],
handler: ShortcutHandler,
handler: ShortcutHandler
): Promise<void> {
const h = new Channel<ShortcutEvent>();
h.onmessage = handler;
const h = new Channel<ShortcutEvent>()
h.onmessage = handler
return await invoke("plugin:global-shortcut|register", {
return await invoke('plugin:global-shortcut|register', {
shortcuts: Array.isArray(shortcuts) ? shortcuts : [shortcuts],
handler: h,
});
handler: h
})
}
/**
@@ -80,9 +80,9 @@ async function register(
* @since 2.0.0
*/
async function unregister(shortcuts: string | string[]): Promise<void> {
return await invoke("plugin:global-shortcut|unregister", {
shortcuts: Array.isArray(shortcuts) ? shortcuts : [shortcuts],
});
return await invoke('plugin:global-shortcut|unregister', {
shortcuts: Array.isArray(shortcuts) ? shortcuts : [shortcuts]
})
}
/**
@@ -96,7 +96,7 @@ async function unregister(shortcuts: string | string[]): Promise<void> {
* @since 2.0.0
*/
async function unregisterAll(): Promise<void> {
return await invoke("plugin:global-shortcut|unregister_all", {});
return await invoke('plugin:global-shortcut|unregister_all', {})
}
/**
@@ -115,9 +115,9 @@ async function unregisterAll(): Promise<void> {
* @since 2.0.0
*/
async function isRegistered(shortcut: string): Promise<boolean> {
return await invoke("plugin:global-shortcut|is_registered", {
shortcut,
});
return await invoke('plugin:global-shortcut|is_registered', {
shortcut
})
}
export { register, unregister, unregisterAll, isRegistered };
export { register, unregister, unregisterAll, isRegistered }
+2 -2
View File
@@ -2,6 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { createConfig } from "../../shared/rollup.config.js";
import { createConfig } from '../../shared/rollup.config.js'
export default createConfig();
export default createConfig()
-1
View File
@@ -1 +0,0 @@
/.tauri
+4 -4
View File
@@ -9,12 +9,12 @@ repository = { workspace = true }
links = "tauri-plugin-haptics"
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
targets = [ "x86_64-linux-android" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
targets = ["x86_64-linux-android"]
[build-dependencies]
tauri-plugin = { workspace = true, features = [ "build" ] }
tauri-plugin = { workspace = true, features = ["build"] }
[dependencies]
serde = { workspace = true }
+6 -6
View File
@@ -68,13 +68,13 @@ import {
vibrate,
impactFeedback,
notificationFeedback,
selectionFeedback,
} from "@tauri-apps/plugin-haptics";
selectionFeedback
} from '@tauri-apps/plugin-haptics'
await vibrate(1);
await impactFeedback("medium");
await notificationFeedback("warning");
await selectionFeedback();
await vibrate(1)
await impactFeedback('medium')
await notificationFeedback('warning')
await selectionFeedback()
```
## Contributing
+1 -1
View File
@@ -20,4 +20,4 @@ We prefer to receive reports in English.
Please disclose a vulnerability or security relevant issue here: [https://github.com/tauri-apps/plugins-workspace/security/advisories/new](https://github.com/tauri-apps/plugins-workspace/security/advisories/new).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
+60 -60
View File
@@ -11,54 +11,54 @@ export const commands = {
async vibrate(duration: number): Promise<Result<null, Error>> {
try {
return {
status: "ok",
data: await TAURI_INVOKE("plugin:haptics|vibrate", { duration }),
};
status: 'ok',
data: await TAURI_INVOKE('plugin:haptics|vibrate', { duration })
}
} catch (e) {
if (e instanceof Error) throw e;
else return { status: "error", error: e as any };
if (e instanceof Error) throw e
else return { status: 'error', error: e as any }
}
},
async impactFeedback(
style: ImpactFeedbackStyle,
style: ImpactFeedbackStyle
): Promise<Result<null, Error>> {
try {
return {
status: "ok",
data: await TAURI_INVOKE("plugin:haptics|impact_feedback", { style }),
};
status: 'ok',
data: await TAURI_INVOKE('plugin:haptics|impact_feedback', { style })
}
} catch (e) {
if (e instanceof Error) throw e;
else return { status: "error", error: e as any };
if (e instanceof Error) throw e
else return { status: 'error', error: e as any }
}
},
async notificationFeedback(
type: NotificationFeedbackType,
type: NotificationFeedbackType
): Promise<Result<null, Error>> {
try {
return {
status: "ok",
data: await TAURI_INVOKE("plugin:haptics|notification_feedback", {
type,
}),
};
status: 'ok',
data: await TAURI_INVOKE('plugin:haptics|notification_feedback', {
type
})
}
} catch (e) {
if (e instanceof Error) throw e;
else return { status: "error", error: e as any };
if (e instanceof Error) throw e
else return { status: 'error', error: e as any }
}
},
async selectionFeedback(): Promise<Result<null, Error>> {
try {
return {
status: "ok",
data: await TAURI_INVOKE("plugin:haptics|selection_feedback"),
};
status: 'ok',
data: await TAURI_INVOKE('plugin:haptics|selection_feedback')
}
} catch (e) {
if (e instanceof Error) throw e;
else return { status: "error", error: e as any };
if (e instanceof Error) throw e
else return { status: 'error', error: e as any }
}
},
};
}
}
/** user-defined events **/
@@ -72,69 +72,69 @@ export const commands = {
/** user-defined types **/
export type Error = never;
export type Error = never
export type ImpactFeedbackStyle =
| "light"
| "medium"
| "heavy"
| "soft"
| "rigid";
export type NotificationFeedbackType = "success" | "warning" | "error";
| 'light'
| 'medium'
| 'heavy'
| 'soft'
| 'rigid'
export type NotificationFeedbackType = 'success' | 'warning' | 'error'
//export type RandomNumber = number;
/** tauri-specta globals **/
import { invoke as TAURI_INVOKE } from "@tauri-apps/api/core";
import * as TAURI_API_EVENT from "@tauri-apps/api/event";
import { type WebviewWindow as __WebviewWindow__ } from "@tauri-apps/api/webviewWindow";
import { invoke as TAURI_INVOKE } from '@tauri-apps/api/core'
import * as TAURI_API_EVENT from '@tauri-apps/api/event'
import { type WebviewWindow as __WebviewWindow__ } from '@tauri-apps/api/webviewWindow'
type __EventObj__<T> = {
listen: (
cb: TAURI_API_EVENT.EventCallback<T>,
) => ReturnType<typeof TAURI_API_EVENT.listen<T>>;
cb: TAURI_API_EVENT.EventCallback<T>
) => ReturnType<typeof TAURI_API_EVENT.listen<T>>
once: (
cb: TAURI_API_EVENT.EventCallback<T>,
) => ReturnType<typeof TAURI_API_EVENT.once<T>>;
cb: TAURI_API_EVENT.EventCallback<T>
) => ReturnType<typeof TAURI_API_EVENT.once<T>>
emit: T extends null
? (payload?: T) => ReturnType<typeof TAURI_API_EVENT.emit>
: (payload: T) => ReturnType<typeof TAURI_API_EVENT.emit>;
};
: (payload: T) => ReturnType<typeof TAURI_API_EVENT.emit>
}
export type Result<T, E> =
| { status: "ok"; data: T }
| { status: "error"; error: E };
| { status: 'ok'; data: T }
| { status: 'error'; error: E }
function __makeEvents__<T extends Record<string, any>>(
mappings: Record<keyof T, string>,
mappings: Record<keyof T, string>
) {
return new Proxy(
{} as unknown as {
[K in keyof T]: __EventObj__<T[K]> & {
(handle: __WebviewWindow__): __EventObj__<T[K]>;
};
(handle: __WebviewWindow__): __EventObj__<T[K]>
}
},
{
get: (_, event) => {
const name = mappings[event as keyof T];
const name = mappings[event as keyof T]
return new Proxy((() => {}) as any, {
apply: (_, __, [window]: [__WebviewWindow__]) => ({
listen: (arg: any) => window.listen(name, arg),
once: (arg: any) => window.once(name, arg),
emit: (arg: any) => window.emit(name, arg),
emit: (arg: any) => window.emit(name, arg)
}),
get: (_, command: keyof __EventObj__<any>) => {
switch (command) {
case "listen":
return (arg: any) => TAURI_API_EVENT.listen(name, arg);
case "once":
return (arg: any) => TAURI_API_EVENT.once(name, arg);
case "emit":
return (arg: any) => TAURI_API_EVENT.emit(name, arg);
case 'listen':
return (arg: any) => TAURI_API_EVENT.listen(name, arg)
case 'once':
return (arg: any) => TAURI_API_EVENT.once(name, arg)
case 'emit':
return (arg: any) => TAURI_API_EVENT.emit(name, arg)
}
},
});
},
},
);
}
})
}
}
)
}
+4 -4
View File
@@ -4,15 +4,15 @@
/* eslint-disable @typescript-eslint/unbound-method */
import { commands } from "./bindings";
import { commands } from './bindings'
export const {
vibrate,
impactFeedback,
notificationFeedback,
selectionFeedback,
} = commands;
selectionFeedback
} = commands
export { ImpactFeedbackStyle, NotificationFeedbackType } from "./bindings";
export { ImpactFeedbackStyle, NotificationFeedbackType } from './bindings'
// export { events };
+2 -2
View File
@@ -2,6 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { createConfig } from "../../shared/rollup.config.js";
import { createConfig } from '../../shared/rollup.config.js'
export default createConfig();
export default createConfig()
+3 -3
View File
@@ -10,11 +10,11 @@ repository = { workspace = true }
links = "tauri-plugin-http"
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
[build-dependencies]
tauri-plugin = { workspace = true, features = [ "build" ] }
tauri-plugin = { workspace = true, features = ["build"] }
schemars = { workspace = true }
serde = { workspace = true }
url = { workspace = true }
+5 -5
View File
@@ -60,11 +60,11 @@ fn main() {
Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
```javascript
import { fetch } from "@tauri-apps/plugin-http";
const response = await fetch("http://localhost:3003/users/2", {
method: "GET",
timeout: 30,
});
import { fetch } from '@tauri-apps/plugin-http'
const response = await fetch('http://localhost:3003/users/2', {
method: 'GET',
timeout: 30
})
```
## Contributing
+1 -1
View File
@@ -20,4 +20,4 @@ We prefer to receive reports in English.
Please disclose a vulnerability or security relevant issue here: [https://github.com/tauri-apps/plugins-workspace/security/advisories/new](https://github.com/tauri-apps/plugins-workspace/security/advisories/new).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
+61 -61
View File
@@ -26,7 +26,7 @@
* @module
*/
import { invoke } from "@tauri-apps/api/core";
import { invoke } from '@tauri-apps/api/core'
/**
* Configuration of a proxy that a Client should pass requests to.
@@ -37,34 +37,34 @@ export interface Proxy {
/**
* Proxy all traffic to the passed URL.
*/
all?: string | ProxyConfig;
all?: string | ProxyConfig
/**
* Proxy all HTTP traffic to the passed URL.
*/
http?: string | ProxyConfig;
http?: string | ProxyConfig
/**
* Proxy all HTTPS traffic to the passed URL.
*/
https?: string | ProxyConfig;
https?: string | ProxyConfig
}
export interface ProxyConfig {
/**
* The URL of the proxy server.
*/
url: string;
url: string
/**
* Set the `Proxy-Authorization` header using Basic auth.
*/
basicAuth?: {
username: string;
password: string;
};
username: string
password: string
}
/**
* A configuration for filtering out requests that shouldn't be proxied.
* Entries are expected to be comma-separated (whitespace between entries is ignored)
*/
noProxy?: string;
noProxy?: string
}
/**
@@ -77,16 +77,16 @@ export interface ClientOptions {
* Defines the maximum number of redirects the client should follow.
* If set to 0, no redirects will be followed.
*/
maxRedirections?: number;
maxRedirections?: number
/** Timeout in milliseconds */
connectTimeout?: number;
connectTimeout?: number
/**
* Configuration of a proxy that a Client should pass requests to.
*/
proxy?: Proxy;
proxy?: Proxy
}
const ERROR_REQUEST_CANCELLED = "Request canceled";
const ERROR_REQUEST_CANCELLED = 'Request canceled'
/**
* Fetch a resource from the network. It returns a `Promise` that resolves to the
@@ -104,41 +104,41 @@ const ERROR_REQUEST_CANCELLED = "Request canceled";
*/
export async function fetch(
input: URL | Request | string,
init?: RequestInit & ClientOptions,
init?: RequestInit & ClientOptions
): Promise<Response> {
// abort early here if needed
const signal = init?.signal;
const signal = init?.signal
if (signal?.aborted) {
throw new Error(ERROR_REQUEST_CANCELLED);
throw new Error(ERROR_REQUEST_CANCELLED)
}
const maxRedirections = init?.maxRedirections;
const connectTimeout = init?.connectTimeout;
const proxy = init?.proxy;
const maxRedirections = init?.maxRedirections
const connectTimeout = init?.connectTimeout
const proxy = init?.proxy
// Remove these fields before creating the request
if (init) {
delete init.maxRedirections;
delete init.connectTimeout;
delete init.proxy;
delete init.maxRedirections
delete init.connectTimeout
delete init.proxy
}
const headers = init?.headers
? init.headers instanceof Headers
? init.headers
: new Headers(init.headers)
: new Headers();
: new Headers()
const req = new Request(input, init);
const buffer = await req.arrayBuffer();
const req = new Request(input, init)
const buffer = await req.arrayBuffer()
const data =
buffer.byteLength !== 0 ? Array.from(new Uint8Array(buffer)) : null;
buffer.byteLength !== 0 ? Array.from(new Uint8Array(buffer)) : null
// append new headers created by the browser `Request` implementation,
// if not already declared by the caller of this function
for (const [key, value] of req.headers) {
if (!headers.get(key)) {
headers.set(key, value);
headers.set(key, value)
}
}
@@ -147,7 +147,7 @@ export async function fetch(
? Array.from(headers.entries())
: Array.isArray(headers)
? headers
: Object.entries(headers);
: Object.entries(headers)
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const mappedHeaders: Array<[string, string]> = headersArray.map(
@@ -155,16 +155,16 @@ export async function fetch(
name,
// we need to ensure we have all header values as strings
// eslint-disable-next-line
typeof val === "string" ? val : (val as any).toString(),
],
);
typeof val === 'string' ? val : (val as any).toString()
]
)
// abort early here if needed
if (signal?.aborted) {
throw new Error(ERROR_REQUEST_CANCELLED);
throw new Error(ERROR_REQUEST_CANCELLED)
}
const rid = await invoke<number>("plugin:http|fetch", {
const rid = await invoke<number>('plugin:http|fetch', {
clientConfig: {
method: req.method,
url: req.url,
@@ -172,28 +172,28 @@ export async function fetch(
data,
maxRedirections,
connectTimeout,
proxy,
},
});
proxy
}
})
const abort = () => invoke("plugin:http|fetch_cancel", { rid });
const abort = () => invoke('plugin:http|fetch_cancel', { rid })
// abort early here if needed
if (signal?.aborted) {
// we don't care about the result of this proimse
// eslint-disable-next-line @typescript-eslint/no-floating-promises
abort();
throw new Error(ERROR_REQUEST_CANCELLED);
abort()
throw new Error(ERROR_REQUEST_CANCELLED)
}
signal?.addEventListener("abort", () => void abort());
signal?.addEventListener('abort', () => void abort())
interface FetchSendResponse {
status: number;
statusText: string;
headers: [[string, string]];
url: string;
rid: number;
status: number
statusText: string
headers: [[string, string]]
url: string
rid: number
}
const {
@@ -201,17 +201,17 @@ export async function fetch(
statusText,
url,
headers: responseHeaders,
rid: responseRid,
} = await invoke<FetchSendResponse>("plugin:http|fetch_send", {
rid,
});
rid: responseRid
} = await invoke<FetchSendResponse>('plugin:http|fetch_send', {
rid
})
const body = await invoke<ArrayBuffer | number[]>(
"plugin:http|fetch_read_body",
'plugin:http|fetch_read_body',
{
rid: responseRid,
},
);
rid: responseRid
}
)
const res = new Response(
body instanceof ArrayBuffer && body.byteLength !== 0
@@ -221,9 +221,9 @@ export async function fetch(
: null,
{
status,
statusText,
},
);
statusText
}
)
// url and headers are read only properties
// but seems like we can set them like this
@@ -231,10 +231,10 @@ export async function fetch(
// we define theme like this, because using `Response`
// constructor, it removes url and some headers
// like `set-cookie` headers
Object.defineProperty(res, "url", { value: url });
Object.defineProperty(res, "headers", {
value: new Headers(responseHeaders),
});
Object.defineProperty(res, 'url', { value: url })
Object.defineProperty(res, 'headers', {
value: new Headers(responseHeaders)
})
return res;
return res
}
+2 -2
View File
@@ -2,6 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { createConfig } from "../../shared/rollup.config.js";
import { createConfig } from '../../shared/rollup.config.js'
export default createConfig();
export default createConfig()
+2 -2
View File
@@ -9,8 +9,8 @@ rust-version = { workspace = true }
repository = { workspace = true }
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
[dependencies]
serde = { workspace = true }
+1 -1
View File
@@ -20,4 +20,4 @@ We prefer to receive reports in English.
Please disclose a vulnerability or security relevant issue here: [https://github.com/tauri-apps/plugins-workspace/security/advisories/new](https://github.com/tauri-apps/plugins-workspace/security/advisories/new).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
-2
View File
@@ -1,2 +0,0 @@
node_modules
/.tauri
+3 -3
View File
@@ -10,11 +10,11 @@ repository = { workspace = true }
links = "tauri-plugin-log"
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
[build-dependencies]
tauri-plugin = { workspace = true, features = [ "build" ] }
tauri-plugin = { workspace = true, features = ["build"] }
[dependencies]
serde = { workspace = true }
+6 -6
View File
@@ -68,17 +68,17 @@ fn main() {
Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
```javascript
import { trace, info, error, attachConsole } from "@tauri-apps/plugin-log";
import { trace, info, error, attachConsole } from '@tauri-apps/plugin-log'
// with TargetKind::Webview enabled this function will print logs to the browser console
const detach = await attachConsole();
const detach = await attachConsole()
trace("Trace");
info("Info");
error("Error");
trace('Trace')
info('Info')
error('Error')
// detach the browser console from the log stream
detach();
detach()
```
To log from rust code, add the log crate to your `Cargo.toml`:
+1
View File
@@ -39,6 +39,7 @@ One possible threat you need to consider when using this plugin is that secrets
in logs can theoretically be leaked when the application's frontend gets compromised.
For this threat to be possible all of the following requirements need to be fulfilled:
- `TargetKind::Webview` enabled OR secrets stem from frontend logs
- Frontend application is compromised via something like XSS (cross-site-scripting) OR logs are directly exposed
- Logs contain secrets or sensitive information
+49 -49
View File
@@ -2,13 +2,13 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { invoke } from "@tauri-apps/api/core";
import { listen, type UnlistenFn, type Event } from "@tauri-apps/api/event";
import { invoke } from '@tauri-apps/api/core'
import { listen, type UnlistenFn, type Event } from '@tauri-apps/api/event'
export interface LogOptions {
file?: string;
line?: number;
keyValues?: Record<string, string | undefined>;
file?: string
line?: number
keyValues?: Record<string, string | undefined>
}
enum LogLevel {
@@ -41,35 +41,35 @@ enum LogLevel {
*
* Designates very serious errors.
*/
Error,
Error
}
async function log(
level: LogLevel,
message: string,
options?: LogOptions,
options?: LogOptions
): Promise<void> {
const traces = new Error().stack?.split("\n").map((line) => line.split("@"));
const traces = new Error().stack?.split('\n').map((line) => line.split('@'))
const filtered = traces?.filter(([name, location]) => {
return name.length > 0 && location !== "[native code]";
});
return name.length > 0 && location !== '[native code]'
})
const { file, line, keyValues } = options ?? {};
const { file, line, keyValues } = options ?? {}
let location = filtered?.[0]?.filter((v) => v.length > 0).join("@");
if (location === "Error") {
location = "webview::unknown";
let location = filtered?.[0]?.filter((v) => v.length > 0).join('@')
if (location === 'Error') {
location = 'webview::unknown'
}
await invoke("plugin:log|log", {
await invoke('plugin:log|log', {
level,
message,
location,
file,
line,
keyValues,
});
keyValues
})
}
/**
@@ -90,9 +90,9 @@ async function log(
*/
export async function error(
message: string,
options?: LogOptions,
options?: LogOptions
): Promise<void> {
await log(LogLevel.Error, message, options);
await log(LogLevel.Error, message, options)
}
/**
@@ -112,9 +112,9 @@ export async function error(
*/
export async function warn(
message: string,
options?: LogOptions,
options?: LogOptions
): Promise<void> {
await log(LogLevel.Warn, message, options);
await log(LogLevel.Warn, message, options)
}
/**
@@ -134,9 +134,9 @@ export async function warn(
*/
export async function info(
message: string,
options?: LogOptions,
options?: LogOptions
): Promise<void> {
await log(LogLevel.Info, message, options);
await log(LogLevel.Info, message, options)
}
/**
@@ -156,9 +156,9 @@ export async function info(
*/
export async function debug(
message: string,
options?: LogOptions,
options?: LogOptions
): Promise<void> {
await log(LogLevel.Debug, message, options);
await log(LogLevel.Debug, message, options)
}
/**
@@ -178,17 +178,17 @@ export async function debug(
*/
export async function trace(
message: string,
options?: LogOptions,
options?: LogOptions
): Promise<void> {
await log(LogLevel.Trace, message, options);
await log(LogLevel.Trace, message, options)
}
interface RecordPayload {
level: LogLevel;
message: string;
level: LogLevel
message: string
}
type LoggerFn = (fn: RecordPayload) => void;
type LoggerFn = (fn: RecordPayload) => void
/**
* Attaches a listener for the log, and calls the passed function for each log entry.
@@ -197,19 +197,19 @@ type LoggerFn = (fn: RecordPayload) => void;
* @returns a function to cancel the listener.
*/
export async function attachLogger(fn: LoggerFn): Promise<UnlistenFn> {
return await listen("log://log", (event: Event<RecordPayload>) => {
const { level } = event.payload;
let { message } = event.payload;
return await listen('log://log', (event: Event<RecordPayload>) => {
const { level } = event.payload
let { message } = event.payload
// Strip ANSI escape codes
message = message.replace(
// TODO: Investigate security/detect-unsafe-regex
// eslint-disable-next-line no-control-regex, security/detect-unsafe-regex
/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,
"",
);
fn({ message, level });
});
''
)
fn({ message, level })
})
}
/**
@@ -221,23 +221,23 @@ export async function attachConsole(): Promise<UnlistenFn> {
return await attachLogger(({ level, message }: RecordPayload) => {
switch (level) {
case LogLevel.Trace:
console.log(message);
break;
console.log(message)
break
case LogLevel.Debug:
console.debug(message);
break;
console.debug(message)
break
case LogLevel.Info:
console.info(message);
break;
console.info(message)
break
case LogLevel.Warn:
console.warn(message);
break;
console.warn(message)
break
case LogLevel.Error:
console.error(message);
break;
console.error(message)
break
default:
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
throw new Error(`unknown log level ${level}`);
throw new Error(`unknown log level ${level}`)
}
});
})
}
+2 -2
View File
@@ -2,6 +2,6 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { createConfig } from "../../shared/rollup.config.js";
import { createConfig } from '../../shared/rollup.config.js'
export default createConfig();
export default createConfig()
-1
View File
@@ -1 +0,0 @@
/.tauri
+4 -4
View File
@@ -9,12 +9,12 @@ repository = { workspace = true }
links = "tauri-plugin-nfc"
[package.metadata.docs.rs]
rustc-args = [ "--cfg", "docsrs" ]
rustdoc-args = [ "--cfg", "docsrs" ]
targets = [ "x86_64-linux-android" ]
rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
targets = ["x86_64-linux-android"]
[build-dependencies]
tauri-plugin = { workspace = true, features = [ "build" ] }
tauri-plugin = { workspace = true, features = ["build"] }
[dependencies]
serde = { workspace = true }
+3 -3
View File
@@ -62,9 +62,9 @@ fn main() {
Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
```javascript
import { scan, textRecord, write } from "@tauri-apps/plugin-nfc";
await scan({ type: "tag", keepSessionAlive: true });
await write([textRecord("Tauri is awesome!")]);
import { scan, textRecord, write } from '@tauri-apps/plugin-nfc'
await scan({ type: 'tag', keepSessionAlive: true })
await write([textRecord('Tauri is awesome!')])
```
## Contributing
+1 -1
View File
@@ -20,4 +20,4 @@ We prefer to receive reports in English.
Please disclose a vulnerability or security relevant issue here: [https://github.com/tauri-apps/plugins-workspace/security/advisories/new](https://github.com/tauri-apps/plugins-workspace/security/advisories/new).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
+105 -107
View File
@@ -2,15 +2,15 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import { invoke } from "@tauri-apps/api/core";
import { invoke } from '@tauri-apps/api/core'
export const RTD_TEXT = [0x54]; // "T"
export const RTD_URI = [0x55]; // "U"
export const RTD_TEXT = [0x54] // "T"
export const RTD_URI = [0x55] // "U"
export interface UriFilter {
scheme?: string;
host?: string;
pathPrefix?: string;
scheme?: string
host?: string
pathPrefix?: string
}
export enum TechKind {
@@ -23,19 +23,19 @@ export enum TechKind {
NfcB,
NfcBarcode,
NfcF,
NfcV,
NfcV
}
export type ScanKind =
| {
type: "tag";
uri?: UriFilter;
mimeType?: string;
type: 'tag'
uri?: UriFilter
mimeType?: string
}
| {
type: "ndef";
uri?: UriFilter;
mimeType?: string;
type: 'ndef'
uri?: UriFilter
mimeType?: string
/**
* Each of the tech-lists is considered independently and the activity is considered a match if
* any single tech-list matches the tag that was discovered.
@@ -56,25 +56,25 @@ export type ScanKind =
* ]
* ```
*/
techLists?: TechKind[][];
};
techLists?: TechKind[][]
}
export interface ScanOptions {
keepSessionAlive?: boolean;
keepSessionAlive?: boolean
/** Message displayed in the UI. iOS only. */
message?: string;
message?: string
/** Message displayed in the UI when the message has been read. iOS only. */
successMessage?: string;
successMessage?: string
}
export interface WriteOptions {
kind?: ScanKind;
kind?: ScanKind
/** Message displayed in the UI when reading the tag. iOS only. */
message?: string;
message?: string
/** Message displayed in the UI when the tag has been read. iOS only. */
successfulReadMessage?: string;
successfulReadMessage?: string
/** Message displayed in the UI when the message has been written. iOS only. */
successMessage?: string;
successMessage?: string
}
export enum NFCTypeNameFormat {
@@ -84,122 +84,120 @@ export enum NFCTypeNameFormat {
AbsoluteURI = 3,
NfcExternal = 4,
Unknown = 5,
Unchanged = 6,
Unchanged = 6
}
export interface TagRecord {
tnf: NFCTypeNameFormat;
kind: number[];
id: number[];
payload: number[];
tnf: NFCTypeNameFormat
kind: number[]
id: number[]
payload: number[]
}
export interface Tag {
id: number[];
kind: string[];
records: TagRecord[];
id: number[]
kind: string[]
records: TagRecord[]
}
export interface NFCRecord {
format: NFCTypeNameFormat;
kind: number[];
id: number[];
payload: number[];
format: NFCTypeNameFormat
kind: number[]
id: number[]
payload: number[]
}
export function record(
format: NFCTypeNameFormat,
kind: string | number[],
id: string | number[],
payload: string | number[],
payload: string | number[]
): NFCRecord {
return {
format,
kind:
typeof kind === "string"
typeof kind === 'string'
? Array.from(new TextEncoder().encode(kind))
: kind,
id: typeof id === "string" ? Array.from(new TextEncoder().encode(id)) : id,
id: typeof id === 'string' ? Array.from(new TextEncoder().encode(id)) : id,
payload:
typeof payload === "string"
typeof payload === 'string'
? Array.from(new TextEncoder().encode(payload))
: payload,
};
: payload
}
}
export function textRecord(
text: string,
id?: string | number[],
language: string = "en",
language: string = 'en'
): NFCRecord {
const payload = Array.from(new TextEncoder().encode(language + text));
payload.unshift(language.length);
return record(NFCTypeNameFormat.NfcWellKnown, RTD_TEXT, id ?? [], payload);
const payload = Array.from(new TextEncoder().encode(language + text))
payload.unshift(language.length)
return record(NFCTypeNameFormat.NfcWellKnown, RTD_TEXT, id ?? [], payload)
}
const protocols = [
"",
"http://www.",
"https://www.",
"http://",
"https://",
"tel:",
"mailto:",
"ftp://anonymous:anonymous@",
"ftp://ftp.",
"ftps://",
"sftp://",
"smb://",
"nfs://",
"ftp://",
"dav://",
"news:",
"telnet://",
"imap:",
"rtsp://",
"urn:",
"pop:",
"sip:",
"sips:",
"tftp:",
"btspp://",
"btl2cap://",
"btgoep://",
"tcpobex://",
"irdaobex://",
"file://",
"urn:epc:id:",
"urn:epc:tag:",
"urn:epc:pat:",
"urn:epc:raw:",
"urn:epc:",
"urn:nfc:",
];
'',
'http://www.',
'https://www.',
'http://',
'https://',
'tel:',
'mailto:',
'ftp://anonymous:anonymous@',
'ftp://ftp.',
'ftps://',
'sftp://',
'smb://',
'nfs://',
'ftp://',
'dav://',
'news:',
'telnet://',
'imap:',
'rtsp://',
'urn:',
'pop:',
'sip:',
'sips:',
'tftp:',
'btspp://',
'btl2cap://',
'btgoep://',
'tcpobex://',
'irdaobex://',
'file://',
'urn:epc:id:',
'urn:epc:tag:',
'urn:epc:pat:',
'urn:epc:raw:',
'urn:epc:',
'urn:nfc:'
]
function encodeURI(uri: string): number[] {
let prefix = "";
let prefix = ''
protocols.slice(1).forEach(function (protocol) {
if (
(prefix.length === 0 || prefix === "urn:") &&
(prefix.length === 0 || prefix === 'urn:') &&
uri.indexOf(protocol) === 0
) {
prefix = protocol;
prefix = protocol
}
});
})
if (prefix.length === 0) {
prefix = "";
prefix = ''
}
const encoded = Array.from(
new TextEncoder().encode(uri.slice(prefix.length)),
);
const protocolCode = protocols.indexOf(prefix);
const encoded = Array.from(new TextEncoder().encode(uri.slice(prefix.length)))
const protocolCode = protocols.indexOf(prefix)
// prepend protocol code
encoded.unshift(protocolCode);
encoded.unshift(protocolCode)
return encoded;
return encoded
}
export function uriRecord(uri: string, id?: string | number[]): NFCRecord {
@@ -207,13 +205,13 @@ export function uriRecord(uri: string, id?: string | number[]): NFCRecord {
NFCTypeNameFormat.NfcWellKnown,
RTD_URI,
id ?? [],
encodeURI(uri),
);
encodeURI(uri)
)
}
function mapScanKind(kind: ScanKind): Record<string, unknown> {
const { type: scanKind, ...kindOptions } = kind;
return { [scanKind]: kindOptions };
const { type: scanKind, ...kindOptions } = kind
return { [scanKind]: kindOptions }
}
/**
@@ -232,12 +230,12 @@ function mapScanKind(kind: ScanKind): Record<string, unknown> {
*/
export async function scan(
kind: ScanKind,
options?: ScanOptions,
options?: ScanOptions
): Promise<Tag> {
return await invoke("plugin:nfc|scan", {
return await invoke('plugin:nfc|scan', {
kind: mapScanKind(kind),
...options,
});
...options
})
}
/**
@@ -257,19 +255,19 @@ export async function scan(
*/
export async function write(
records: NFCRecord[],
options?: WriteOptions,
options?: WriteOptions
): Promise<void> {
const { kind, ...opts } = options ?? {};
const { kind, ...opts } = options ?? {}
if (kind) {
// @ts-expect-error map the property
opts.kind = mapScanKind(kind);
opts.kind = mapScanKind(kind)
}
await invoke("plugin:nfc|write", {
await invoke('plugin:nfc|write', {
records,
...opts,
});
...opts
})
}
export async function isAvailable(): Promise<boolean> {
return await invoke("plugin:nfc|is_available");
return await invoke('plugin:nfc|is_available')
}
+1 -4
View File
@@ -12,7 +12,4 @@ and scanning nearby tags is allowed.
Writing to tags needs to be manually enabled.
"""
permissions = [
"allow-is-available",
"allow-scan",
]
permissions = ["allow-is-available", "allow-scan"]

Some files were not shown because too many files have changed in this diff Show More