mirror of
https://github.com/tauri-apps/plugins-workspace.git
synced 2026-06-08 14:03:53 +02:00
Run formatter on new plugins
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
* @module
|
||||
*/
|
||||
|
||||
import { invoke } from '@tauri-apps/api/tauri';
|
||||
import { invoke } from "@tauri-apps/api/tauri";
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
@@ -19,32 +19,32 @@ 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 1.0.0
|
||||
*/
|
||||
interface SubcommandMatch {
|
||||
name: string
|
||||
matches: CliMatches
|
||||
name: string;
|
||||
matches: CliMatches;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
interface CliMatches {
|
||||
args: Record<string, ArgMatch>
|
||||
subcommand: SubcommandMatch | null
|
||||
args: Record<string, ArgMatch>;
|
||||
subcommand: SubcommandMatch | null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the arguments provided to the current process and get the matches using the configuration defined [`tauri.cli`](https://tauri.app/v1/api/config/#tauriconfig.cli) in `tauri.conf.json`
|
||||
*
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* import { getMatches } from 'tauri-plugin-cli-api';
|
||||
@@ -64,9 +64,9 @@ interface CliMatches {
|
||||
* @since 1.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 };
|
||||
|
||||
@@ -24,14 +24,14 @@
|
||||
* @module
|
||||
*/
|
||||
|
||||
import { invoke } from '@tauri-apps/api/tauri'
|
||||
import { invoke } from "@tauri-apps/api/tauri";
|
||||
|
||||
interface Clip<K, T> {
|
||||
kind: K
|
||||
options: T
|
||||
kind: K;
|
||||
options: T;
|
||||
}
|
||||
|
||||
type ClipResponse = Clip<'PlainText', string>
|
||||
type ClipResponse = Clip<"PlainText", string>;
|
||||
|
||||
/**
|
||||
* Writes plain text to the clipboard.
|
||||
@@ -46,16 +46,19 @@ type ClipResponse = Clip<'PlainText', string>
|
||||
*
|
||||
* @since 1.0.0.
|
||||
*/
|
||||
async function writeText(text: string, opts?: { label?: string }): Promise<void> {
|
||||
return invoke('plugin:clipboard|write', {
|
||||
async function writeText(
|
||||
text: string,
|
||||
opts?: { label?: string }
|
||||
): Promise<void> {
|
||||
return invoke("plugin:clipboard|write", {
|
||||
data: {
|
||||
kind: 'PlainText',
|
||||
kind: "PlainText",
|
||||
options: {
|
||||
label: opts?.label,
|
||||
text
|
||||
}
|
||||
}
|
||||
})
|
||||
text,
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -68,8 +71,8 @@ async function writeText(text: string, opts?: { label?: string }): Promise<void>
|
||||
* @since 1.0.0.
|
||||
*/
|
||||
async function readText(): Promise<string> {
|
||||
const kind: ClipResponse = await invoke('plugin:clipboard|read')
|
||||
return kind.options
|
||||
const kind: ClipResponse = await invoke("plugin:clipboard|read");
|
||||
return kind.options;
|
||||
}
|
||||
|
||||
export { writeText, readText }
|
||||
export { writeText, readText };
|
||||
|
||||
@@ -29,4 +29,4 @@
|
||||
"dependencies": {
|
||||
"@tauri-apps/api": "^1.2.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,4 +19,4 @@
|
||||
"svelte": "^3.49.0",
|
||||
"vite": "^3.0.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+77
-77
@@ -1,116 +1,116 @@
|
||||
{
|
||||
"images" : [
|
||||
"images": [
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-20x20@2x.png",
|
||||
"scale" : "2x"
|
||||
"size": "20x20",
|
||||
"idiom": "iphone",
|
||||
"filename": "AppIcon-20x20@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-20x20@3x.png",
|
||||
"scale" : "3x"
|
||||
"size": "20x20",
|
||||
"idiom": "iphone",
|
||||
"filename": "AppIcon-20x20@3x.png",
|
||||
"scale": "3x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-29x29@2x-1.png",
|
||||
"scale" : "2x"
|
||||
"size": "29x29",
|
||||
"idiom": "iphone",
|
||||
"filename": "AppIcon-29x29@2x-1.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-29x29@3x.png",
|
||||
"scale" : "3x"
|
||||
"size": "29x29",
|
||||
"idiom": "iphone",
|
||||
"filename": "AppIcon-29x29@3x.png",
|
||||
"scale": "3x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-40x40@2x.png",
|
||||
"scale" : "2x"
|
||||
"size": "40x40",
|
||||
"idiom": "iphone",
|
||||
"filename": "AppIcon-40x40@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-40x40@3x.png",
|
||||
"scale" : "3x"
|
||||
"size": "40x40",
|
||||
"idiom": "iphone",
|
||||
"filename": "AppIcon-40x40@3x.png",
|
||||
"scale": "3x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-60x60@2x.png",
|
||||
"scale" : "2x"
|
||||
"size": "60x60",
|
||||
"idiom": "iphone",
|
||||
"filename": "AppIcon-60x60@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "AppIcon-60x60@3x.png",
|
||||
"scale" : "3x"
|
||||
"size": "60x60",
|
||||
"idiom": "iphone",
|
||||
"filename": "AppIcon-60x60@3x.png",
|
||||
"scale": "3x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-20x20@1x.png",
|
||||
"scale" : "1x"
|
||||
"size": "20x20",
|
||||
"idiom": "ipad",
|
||||
"filename": "AppIcon-20x20@1x.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-20x20@2x-1.png",
|
||||
"scale" : "2x"
|
||||
"size": "20x20",
|
||||
"idiom": "ipad",
|
||||
"filename": "AppIcon-20x20@2x-1.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-29x29@1x.png",
|
||||
"scale" : "1x"
|
||||
"size": "29x29",
|
||||
"idiom": "ipad",
|
||||
"filename": "AppIcon-29x29@1x.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-29x29@2x.png",
|
||||
"scale" : "2x"
|
||||
"size": "29x29",
|
||||
"idiom": "ipad",
|
||||
"filename": "AppIcon-29x29@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-40x40@1x.png",
|
||||
"scale" : "1x"
|
||||
"size": "40x40",
|
||||
"idiom": "ipad",
|
||||
"filename": "AppIcon-40x40@1x.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-40x40@2x-1.png",
|
||||
"scale" : "2x"
|
||||
"size": "40x40",
|
||||
"idiom": "ipad",
|
||||
"filename": "AppIcon-40x40@2x-1.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-76x76@1x.png",
|
||||
"scale" : "1x"
|
||||
"size": "76x76",
|
||||
"idiom": "ipad",
|
||||
"filename": "AppIcon-76x76@1x.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-76x76@2x.png",
|
||||
"scale" : "2x"
|
||||
"size": "76x76",
|
||||
"idiom": "ipad",
|
||||
"filename": "AppIcon-76x76@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size" : "83.5x83.5",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "AppIcon-83.5x83.5@2x.png",
|
||||
"scale" : "2x"
|
||||
"size": "83.5x83.5",
|
||||
"idiom": "ipad",
|
||||
"filename": "AppIcon-83.5x83.5@2x.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size" : "1024x1024",
|
||||
"idiom" : "ios-marketing",
|
||||
"filename" : "AppIcon-512@2x.png",
|
||||
"scale" : "1x"
|
||||
"size": "1024x1024",
|
||||
"idiom": "ios-marketing",
|
||||
"filename": "AppIcon-512@2x.png",
|
||||
"scale": "1x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
"info": {
|
||||
"version": 1,
|
||||
"author": "xcode"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
"info": {
|
||||
"version": 1,
|
||||
"author": "xcode"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +60,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/$(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/$(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/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)
|
||||
@@ -82,4 +82,4 @@ targets:
|
||||
basedOnDependencyAnalysis: false
|
||||
outputFiles:
|
||||
- $(SRCROOT)/target/aarch64-apple-ios/${CONFIGURATION}/deps/libapp.a
|
||||
- $(SRCROOT)/target/x86_64-apple-ios/${CONFIGURATION}/deps/libapp.a
|
||||
- $(SRCROOT)/target/x86_64-apple-ios/${CONFIGURATION}/deps/libapp.a
|
||||
|
||||
@@ -63,4 +63,4 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,11 @@ import { internalIpV4 } from "internal-ip";
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig(async () => {
|
||||
const host = process.env.TAURI_PLATFORM === 'android' || process.env.TAURI_PLATFORM === 'ios' ? (await internalIpV4()) : 'localhost'
|
||||
const host =
|
||||
process.env.TAURI_PLATFORM === "android" ||
|
||||
process.env.TAURI_PLATFORM === "ios"
|
||||
? await internalIpV4()
|
||||
: "localhost";
|
||||
return {
|
||||
plugins: [svelte()],
|
||||
|
||||
@@ -13,17 +17,17 @@ export default defineConfig(async () => {
|
||||
clearScreen: false,
|
||||
// tauri expects a fixed port, fail if that port is not available
|
||||
server: {
|
||||
host: '0.0.0.0',
|
||||
host: "0.0.0.0",
|
||||
port: 5173,
|
||||
strictPort: true,
|
||||
hmr: {
|
||||
protocol: 'ws',
|
||||
protocol: "ws",
|
||||
host,
|
||||
port: 5183
|
||||
port: 5183,
|
||||
},
|
||||
fs: {
|
||||
allow: ['.', '../../tooling/api/dist']
|
||||
}
|
||||
allow: [".", "../../tooling/api/dist"],
|
||||
},
|
||||
},
|
||||
// to make use of `TAURI_DEBUG` and other env variables
|
||||
// https://tauri.studio/v1/api/config#buildconfig.beforedevcommand
|
||||
@@ -36,5 +40,5 @@ export default defineConfig(async () => {
|
||||
// produce sourcemaps for debug builds
|
||||
sourcemap: !!process.env.TAURI_DEBUG,
|
||||
},
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
@@ -2,18 +2,18 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
import { invoke } from '@tauri-apps/api/tauri'
|
||||
import { invoke } from "@tauri-apps/api/tauri";
|
||||
|
||||
interface FileResponse {
|
||||
base64Data?: string
|
||||
duration?: number
|
||||
height?: number
|
||||
width?: number
|
||||
mimeType?: string
|
||||
modifiedAt?: number
|
||||
name?: string
|
||||
path: string
|
||||
size: number
|
||||
base64Data?: string;
|
||||
duration?: number;
|
||||
height?: number;
|
||||
width?: number;
|
||||
mimeType?: string;
|
||||
modifiedAt?: number;
|
||||
name?: string;
|
||||
path: string;
|
||||
size: number;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -23,7 +23,7 @@ interface FileResponse {
|
||||
*/
|
||||
interface DialogFilter {
|
||||
/** Filter name. */
|
||||
name: string
|
||||
name: string;
|
||||
/**
|
||||
* Extensions to filter, without a `.` prefix.
|
||||
* @example
|
||||
@@ -31,7 +31,7 @@ interface DialogFilter {
|
||||
* extensions: ['svg', 'png']
|
||||
* ```
|
||||
*/
|
||||
extensions: string[]
|
||||
extensions: string[];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -41,20 +41,20 @@ interface DialogFilter {
|
||||
*/
|
||||
interface OpenDialogOptions {
|
||||
/** The title of the dialog window. */
|
||||
title?: string
|
||||
title?: string;
|
||||
/** The filters of the dialog. */
|
||||
filters?: DialogFilter[]
|
||||
filters?: DialogFilter[];
|
||||
/** Initial directory or file path. */
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -64,15 +64,15 @@ interface OpenDialogOptions {
|
||||
*/
|
||||
interface SaveDialogOptions {
|
||||
/** The title of the dialog window. */
|
||||
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.
|
||||
* If it's not an existing directory, the file name will be set to the dialog's file name input and the dialog will be set to the parent folder.
|
||||
*/
|
||||
defaultPath?: string
|
||||
defaultPath?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -80,36 +80,36 @@ interface SaveDialogOptions {
|
||||
*/
|
||||
interface MessageDialogOptions {
|
||||
/** The title of the dialog. Defaults to the app name. */
|
||||
title?: string
|
||||
title?: string;
|
||||
/** The type of the dialog. Defaults to `info`. */
|
||||
type?: 'info' | 'warning' | 'error'
|
||||
type?: "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 type of the dialog. Defaults to `info`. */
|
||||
type?: 'info' | 'warning' | 'error'
|
||||
type?: "info" | "warning" | "error";
|
||||
/** The label of the confirm button. */
|
||||
okLabel?: string
|
||||
okLabel?: string;
|
||||
/** The label of the cancel button. */
|
||||
cancelLabel?: string
|
||||
cancelLabel?: string;
|
||||
}
|
||||
|
||||
async function open(
|
||||
options?: OpenDialogOptions & { multiple?: false, directory?: false }
|
||||
): Promise<null | FileResponse>
|
||||
options?: OpenDialogOptions & { multiple?: false; directory?: false }
|
||||
): Promise<null | FileResponse>;
|
||||
async function open(
|
||||
options?: OpenDialogOptions & { multiple?: true, directory?: false }
|
||||
): Promise<null | FileResponse[]>
|
||||
options?: OpenDialogOptions & { multiple?: true; directory?: false }
|
||||
): Promise<null | FileResponse[]>;
|
||||
async function open(
|
||||
options?: OpenDialogOptions & { multiple?: false, directory?: true }
|
||||
): Promise<null | string>
|
||||
options?: OpenDialogOptions & { multiple?: false; directory?: true }
|
||||
): Promise<null | string>;
|
||||
async function open(
|
||||
options?: OpenDialogOptions & { multiple?: true, directory?: true }
|
||||
): Promise<null | string[]>
|
||||
options?: OpenDialogOptions & { multiple?: true; directory?: true }
|
||||
): Promise<null | string[]>;
|
||||
/**
|
||||
* Open a file/directory selection dialog.
|
||||
*
|
||||
@@ -165,11 +165,11 @@ async function open(
|
||||
async function open(
|
||||
options: OpenDialogOptions = {}
|
||||
): Promise<null | string | string[] | FileResponse | FileResponse[]> {
|
||||
if (typeof options === 'object') {
|
||||
Object.freeze(options)
|
||||
if (typeof options === "object") {
|
||||
Object.freeze(options);
|
||||
}
|
||||
|
||||
return invoke('plugin:dialog|open', { options })
|
||||
return invoke("plugin:dialog|open", { options });
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -197,11 +197,11 @@ async function open(
|
||||
* @since 1.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 invoke('plugin:dialog|save', { options })
|
||||
return invoke("plugin:dialog|save", { options });
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -225,13 +225,13 @@ async function message(
|
||||
message: string,
|
||||
options?: string | MessageDialogOptions
|
||||
): Promise<void> {
|
||||
const opts = typeof options === 'string' ? { title: options } : options
|
||||
return invoke('plugin:dialog|message', {
|
||||
const opts = typeof options === "string" ? { title: options } : options;
|
||||
return invoke("plugin:dialog|message", {
|
||||
message: message.toString(),
|
||||
title: opts?.title?.toString(),
|
||||
type_: opts?.type,
|
||||
okButtonLabel: opts?.okLabel?.toString()
|
||||
})
|
||||
okButtonLabel: opts?.okLabel?.toString(),
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -254,14 +254,14 @@ async function ask(
|
||||
message: string,
|
||||
options?: string | ConfirmDialogOptions
|
||||
): Promise<boolean> {
|
||||
const opts = typeof options === 'string' ? { title: options } : options
|
||||
return invoke('plugin:dialog|ask', {
|
||||
const opts = typeof options === "string" ? { title: options } : options;
|
||||
return invoke("plugin:dialog|ask", {
|
||||
message: message.toString(),
|
||||
title: opts?.title?.toString(),
|
||||
type_: opts?.type,
|
||||
okButtonLabel: opts?.okLabel?.toString() ?? 'Yes',
|
||||
cancelButtonLabel: opts?.cancelLabel?.toString() ?? 'No',
|
||||
})
|
||||
okButtonLabel: opts?.okLabel?.toString() ?? "Yes",
|
||||
cancelButtonLabel: opts?.cancelLabel?.toString() ?? "No",
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -284,14 +284,14 @@ async function confirm(
|
||||
message: string,
|
||||
options?: string | ConfirmDialogOptions
|
||||
): Promise<boolean> {
|
||||
const opts = typeof options === 'string' ? { title: options } : options
|
||||
return invoke('plugin:dialog|confirm', {
|
||||
const opts = typeof options === "string" ? { title: options } : options;
|
||||
return invoke("plugin:dialog|confirm", {
|
||||
message: message.toString(),
|
||||
title: opts?.title?.toString(),
|
||||
type_: opts?.type,
|
||||
okButtonLabel: opts?.okLabel?.toString() ?? 'Ok',
|
||||
cancelButtonLabel: opts?.cancelLabel?.toString() ?? 'Cancel',
|
||||
})
|
||||
okButtonLabel: opts?.okLabel?.toString() ?? "Ok",
|
||||
cancelButtonLabel: opts?.cancelLabel?.toString() ?? "Cancel",
|
||||
});
|
||||
}
|
||||
|
||||
export type {
|
||||
@@ -299,7 +299,7 @@ export type {
|
||||
OpenDialogOptions,
|
||||
SaveDialogOptions,
|
||||
MessageDialogOptions,
|
||||
ConfirmDialogOptions
|
||||
}
|
||||
ConfirmDialogOptions,
|
||||
};
|
||||
|
||||
export { open, save, message, ask, confirm }
|
||||
export { open, save, message, ask, confirm };
|
||||
|
||||
@@ -210,14 +210,14 @@ enum BaseDirectory {
|
||||
Font,
|
||||
Home,
|
||||
Runtime,
|
||||
Template
|
||||
Template,
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
interface FsOptions {
|
||||
dir?: BaseDirectory
|
||||
dir?: BaseDirectory;
|
||||
// note that adding fields here needs a change in the writeBinaryFile check
|
||||
}
|
||||
|
||||
@@ -225,8 +225,8 @@ interface FsOptions {
|
||||
* @since 1.0.0
|
||||
*/
|
||||
interface FsDirOptions {
|
||||
dir?: BaseDirectory
|
||||
recursive?: boolean
|
||||
dir?: BaseDirectory;
|
||||
recursive?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -236,12 +236,12 @@ interface FsDirOptions {
|
||||
*/
|
||||
interface FsTextFileOption {
|
||||
/** Path to the file to write. */
|
||||
path: string
|
||||
path: string;
|
||||
/** The UTF-8 string to write to the file. */
|
||||
contents: string
|
||||
contents: string;
|
||||
}
|
||||
|
||||
type BinaryFileContents = Iterable<number> | ArrayLike<number> | ArrayBuffer
|
||||
type BinaryFileContents = Iterable<number> | ArrayLike<number> | ArrayBuffer;
|
||||
|
||||
/**
|
||||
* Options object used to write a binary data to a file.
|
||||
@@ -250,23 +250,23 @@ type BinaryFileContents = Iterable<number> | ArrayLike<number> | ArrayBuffer
|
||||
*/
|
||||
interface FsBinaryFileOption {
|
||||
/** Path to the file to write. */
|
||||
path: string
|
||||
path: string;
|
||||
/** The byte array contents. */
|
||||
contents: BinaryFileContents
|
||||
contents: BinaryFileContents;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
interface FileEntry {
|
||||
path: string
|
||||
path: string;
|
||||
/**
|
||||
* Name of the directory/file
|
||||
* can be null if the path terminates with `..`
|
||||
*/
|
||||
name?: string
|
||||
name?: string;
|
||||
/** Children of this entry if it's a directory; null otherwise */
|
||||
children?: FileEntry[]
|
||||
children?: FileEntry[];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -286,8 +286,8 @@ async function readTextFile(
|
||||
): Promise<string> {
|
||||
return await invoke("plugin:fs|read_text_file", {
|
||||
path: filePath,
|
||||
options
|
||||
})
|
||||
options,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -307,10 +307,10 @@ async function readBinaryFile(
|
||||
): Promise<Uint8Array> {
|
||||
const arr = await invoke<number[]>("plugin:fs|read_file", {
|
||||
path: filePath,
|
||||
options
|
||||
})
|
||||
options,
|
||||
});
|
||||
|
||||
return Uint8Array.from(arr)
|
||||
return Uint8Array.from(arr);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -328,7 +328,7 @@ async function writeTextFile(
|
||||
path: string,
|
||||
contents: string,
|
||||
options?: FsOptions
|
||||
): Promise<void>
|
||||
): Promise<void>;
|
||||
|
||||
/**
|
||||
* Writes a UTF-8 text file.
|
||||
@@ -345,7 +345,7 @@ async function writeTextFile(
|
||||
async function writeTextFile(
|
||||
file: FsTextFileOption,
|
||||
options?: FsOptions
|
||||
): Promise<void>
|
||||
): Promise<void>;
|
||||
|
||||
/**
|
||||
* Writes a UTF-8 text file.
|
||||
@@ -359,33 +359,33 @@ async function writeTextFile(
|
||||
contents?: string | FsOptions,
|
||||
options?: FsOptions
|
||||
): Promise<void> {
|
||||
if (typeof options === 'object') {
|
||||
Object.freeze(options)
|
||||
if (typeof options === "object") {
|
||||
Object.freeze(options);
|
||||
}
|
||||
if (typeof path === 'object') {
|
||||
Object.freeze(path)
|
||||
if (typeof path === "object") {
|
||||
Object.freeze(path);
|
||||
}
|
||||
|
||||
const file: FsTextFileOption = { path: '', contents: '' }
|
||||
let fileOptions: FsOptions | undefined = options
|
||||
if (typeof path === 'string') {
|
||||
file.path = path
|
||||
const file: FsTextFileOption = { path: "", contents: "" };
|
||||
let fileOptions: FsOptions | undefined = options;
|
||||
if (typeof path === "string") {
|
||||
file.path = path;
|
||||
} else {
|
||||
file.path = path.path
|
||||
file.contents = path.contents
|
||||
file.path = path.path;
|
||||
file.contents = path.contents;
|
||||
}
|
||||
|
||||
if (typeof contents === 'string') {
|
||||
file.contents = contents ?? ''
|
||||
if (typeof contents === "string") {
|
||||
file.contents = contents ?? "";
|
||||
} else {
|
||||
fileOptions = contents
|
||||
fileOptions = contents;
|
||||
}
|
||||
|
||||
return await invoke("plugin:fs|write_file", {
|
||||
path: file.path,
|
||||
contents: Array.from(new TextEncoder().encode(file.contents)),
|
||||
options: fileOptions
|
||||
})
|
||||
options: fileOptions,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -406,7 +406,7 @@ async function writeBinaryFile(
|
||||
path: string,
|
||||
contents: BinaryFileContents,
|
||||
options?: FsOptions
|
||||
): Promise<void>
|
||||
): Promise<void>;
|
||||
|
||||
/**
|
||||
* Writes a byte array content to a file.
|
||||
@@ -426,7 +426,7 @@ async function writeBinaryFile(
|
||||
async function writeBinaryFile(
|
||||
file: FsBinaryFileOption,
|
||||
options?: FsOptions
|
||||
): Promise<void>
|
||||
): Promise<void>;
|
||||
|
||||
/**
|
||||
* Writes a byte array content to a file.
|
||||
@@ -440,27 +440,27 @@ async function writeBinaryFile(
|
||||
contents?: BinaryFileContents | FsOptions,
|
||||
options?: FsOptions
|
||||
): Promise<void> {
|
||||
if (typeof options === 'object') {
|
||||
Object.freeze(options)
|
||||
if (typeof options === "object") {
|
||||
Object.freeze(options);
|
||||
}
|
||||
if (typeof path === 'object') {
|
||||
Object.freeze(path)
|
||||
if (typeof path === "object") {
|
||||
Object.freeze(path);
|
||||
}
|
||||
|
||||
const file: FsBinaryFileOption = { path: '', contents: [] }
|
||||
let fileOptions: FsOptions | undefined = options
|
||||
if (typeof path === 'string') {
|
||||
file.path = path
|
||||
const file: FsBinaryFileOption = { path: "", contents: [] };
|
||||
let fileOptions: FsOptions | undefined = options;
|
||||
if (typeof path === "string") {
|
||||
file.path = path;
|
||||
} else {
|
||||
file.path = path.path
|
||||
file.contents = path.contents
|
||||
file.path = path.path;
|
||||
file.contents = path.contents;
|
||||
}
|
||||
|
||||
if (contents && 'dir' in contents) {
|
||||
fileOptions = contents
|
||||
} else if (typeof path === 'string') {
|
||||
if (contents && "dir" in contents) {
|
||||
fileOptions = contents;
|
||||
} else if (typeof path === "string") {
|
||||
// @ts-expect-error in this case `contents` is always a BinaryFileContents
|
||||
file.contents = contents ?? []
|
||||
file.contents = contents ?? [];
|
||||
}
|
||||
|
||||
return await invoke("plugin:fs|write_binary_file", {
|
||||
@@ -470,8 +470,8 @@ async function writeBinaryFile(
|
||||
? new Uint8Array(file.contents)
|
||||
: file.contents
|
||||
),
|
||||
options: fileOptions
|
||||
})
|
||||
options: fileOptions,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -500,8 +500,8 @@ async function readDir(
|
||||
): Promise<FileEntry[]> {
|
||||
return await invoke("plugin:fs|read_dir", {
|
||||
path: dir,
|
||||
options
|
||||
})
|
||||
options,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -525,8 +525,8 @@ async function createDir(
|
||||
): Promise<void> {
|
||||
return await invoke("plugin:fs|create_dir", {
|
||||
path: dir,
|
||||
options
|
||||
})
|
||||
options,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -549,8 +549,8 @@ async function removeDir(
|
||||
): Promise<void> {
|
||||
return await invoke("plugin:fs|remove_dir", {
|
||||
path: dir,
|
||||
options
|
||||
})
|
||||
options,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -574,8 +574,8 @@ async function copyFile(
|
||||
return await invoke("plugin:fs|copy_file", {
|
||||
source,
|
||||
destination,
|
||||
options
|
||||
})
|
||||
options,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -597,8 +597,8 @@ async function removeFile(
|
||||
): Promise<void> {
|
||||
return await invoke("plugin:fs|remove_file", {
|
||||
path: file,
|
||||
options
|
||||
})
|
||||
options,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -622,9 +622,8 @@ async function renameFile(
|
||||
return await invoke("plugin:fs|rename_file", {
|
||||
oldPath,
|
||||
newPath,
|
||||
options
|
||||
|
||||
})
|
||||
options,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -644,7 +643,7 @@ async function exists(path: string): Promise<boolean> {
|
||||
|
||||
/**
|
||||
* Returns the metadata for the given path.
|
||||
*
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
async function metadata(path: string): Promise<Metadata> {
|
||||
@@ -670,7 +669,7 @@ export type {
|
||||
FileEntry,
|
||||
Permissions,
|
||||
Metadata,
|
||||
}
|
||||
};
|
||||
|
||||
export {
|
||||
BaseDirectory,
|
||||
@@ -687,5 +686,5 @@ export {
|
||||
removeFile,
|
||||
renameFile,
|
||||
exists,
|
||||
metadata
|
||||
}
|
||||
metadata,
|
||||
};
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
* @module
|
||||
*/
|
||||
|
||||
import { invoke, transformCallback } from '@tauri-apps/api/tauri'
|
||||
import { invoke, transformCallback } from "@tauri-apps/api/tauri";
|
||||
|
||||
export type ShortcutHandler = (shortcut: string) => void
|
||||
export type ShortcutHandler = (shortcut: string) => void;
|
||||
|
||||
/**
|
||||
* Register a global shortcut.
|
||||
@@ -44,10 +44,10 @@ async function register(
|
||||
shortcut: string,
|
||||
handler: ShortcutHandler
|
||||
): Promise<void> {
|
||||
return await invoke('plugin:globalShortcut|register', {
|
||||
return await invoke("plugin:globalShortcut|register", {
|
||||
shortcut,
|
||||
handler: transformCallback(handler)
|
||||
})
|
||||
handler: transformCallback(handler),
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -69,15 +69,15 @@ async function registerAll(
|
||||
shortcuts: string[],
|
||||
handler: ShortcutHandler
|
||||
): Promise<void> {
|
||||
return await invoke('plugin:globalShortcut|register_all', {
|
||||
return await invoke("plugin:globalShortcut|register_all", {
|
||||
shortcuts,
|
||||
handler: transformCallback(handler)
|
||||
})
|
||||
handler: transformCallback(handler),
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether the given shortcut is registered by this application or not.
|
||||
*
|
||||
*
|
||||
* If the shortcut is registered by another application, it will still return `false`.
|
||||
*
|
||||
* @example
|
||||
@@ -91,9 +91,9 @@ async function registerAll(
|
||||
* @since 1.0.0
|
||||
*/
|
||||
async function isRegistered(shortcut: string): Promise<boolean> {
|
||||
return await invoke('plugin:globalShortcut|is_registered', {
|
||||
shortcut
|
||||
})
|
||||
return await invoke("plugin:globalShortcut|is_registered", {
|
||||
shortcut,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -109,9 +109,9 @@ async function isRegistered(shortcut: string): Promise<boolean> {
|
||||
* @since 1.0.0
|
||||
*/
|
||||
async function unregister(shortcut: string): Promise<void> {
|
||||
return await invoke('plugin:globalShortcut|unregister', {
|
||||
shortcut
|
||||
})
|
||||
return await invoke("plugin:globalShortcut|unregister", {
|
||||
shortcut,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -125,7 +125,7 @@ async function unregister(shortcut: string): Promise<void> {
|
||||
* @since 1.0.0
|
||||
*/
|
||||
async function unregisterAll(): Promise<void> {
|
||||
return await invoke('plugin:globalShortcut|unregister_all')
|
||||
return await invoke("plugin:globalShortcut|unregister_all");
|
||||
}
|
||||
|
||||
export { register, registerAll, isRegistered, unregister, unregisterAll }
|
||||
export { register, registerAll, isRegistered, unregister, unregisterAll };
|
||||
|
||||
+118
-110
@@ -41,14 +41,14 @@
|
||||
* @module
|
||||
*/
|
||||
|
||||
import { invoke } from '@tauri-apps/api/tauri'
|
||||
import { invoke } from "@tauri-apps/api/tauri";
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
interface Duration {
|
||||
secs: number
|
||||
nanos: number
|
||||
secs: number;
|
||||
nanos: number;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -59,8 +59,8 @@ interface ClientOptions {
|
||||
* Defines the maximum number of redirects the client should follow.
|
||||
* If set to 0, no redirects will be followed.
|
||||
*/
|
||||
maxRedirections?: number
|
||||
connectTimeout?: number | Duration
|
||||
maxRedirections?: number;
|
||||
connectTimeout?: number | Duration;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -69,19 +69,19 @@ interface ClientOptions {
|
||||
enum ResponseType {
|
||||
JSON = 1,
|
||||
Text = 2,
|
||||
Binary = 3
|
||||
Binary = 3,
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
interface FilePart<T> {
|
||||
file: string | T
|
||||
mime?: string
|
||||
fileName?: string
|
||||
file: string | T;
|
||||
mime?: string;
|
||||
fileName?: string;
|
||||
}
|
||||
|
||||
type Part = string | Uint8Array | FilePart<Uint8Array>
|
||||
type Part = string | Uint8Array | FilePart<Uint8Array>;
|
||||
|
||||
/**
|
||||
* The body object to be used on POST and PUT requests.
|
||||
@@ -89,13 +89,13 @@ type Part = string | Uint8Array | FilePart<Uint8Array>
|
||||
* @since 1.0.0
|
||||
*/
|
||||
class Body {
|
||||
type: string
|
||||
payload: unknown
|
||||
type: string;
|
||||
payload: unknown;
|
||||
|
||||
/** @ignore */
|
||||
private constructor(type: string, payload: unknown) {
|
||||
this.type = type
|
||||
this.payload = payload
|
||||
this.type = type;
|
||||
this.payload = payload;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -130,39 +130,39 @@ class Body {
|
||||
* @returns The body object ready to be used on the POST and PUT requests.
|
||||
*/
|
||||
static form(data: Record<string, Part> | FormData): Body {
|
||||
const form: Record<string, string | number[] | FilePart<number[]>> = {}
|
||||
const form: Record<string, string | number[] | FilePart<number[]>> = {};
|
||||
|
||||
const append = (
|
||||
key: string,
|
||||
v: string | Uint8Array | FilePart<Uint8Array> | File
|
||||
): void => {
|
||||
if (v !== null) {
|
||||
let r
|
||||
if (typeof v === 'string') {
|
||||
r = v
|
||||
let r;
|
||||
if (typeof v === "string") {
|
||||
r = v;
|
||||
} else if (v instanceof Uint8Array || Array.isArray(v)) {
|
||||
r = Array.from(v)
|
||||
r = Array.from(v);
|
||||
} else if (v instanceof File) {
|
||||
r = { file: v.name, mime: v.type, fileName: v.name }
|
||||
} else if (typeof v.file === 'string') {
|
||||
r = { file: v.file, mime: v.mime, fileName: v.fileName }
|
||||
r = { file: v.name, mime: v.type, fileName: v.name };
|
||||
} else if (typeof v.file === "string") {
|
||||
r = { file: v.file, mime: v.mime, fileName: v.fileName };
|
||||
} else {
|
||||
r = { file: Array.from(v.file), mime: v.mime, fileName: v.fileName }
|
||||
r = { file: Array.from(v.file), mime: v.mime, fileName: v.fileName };
|
||||
}
|
||||
form[String(key)] = r
|
||||
form[String(key)] = r;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (data instanceof FormData) {
|
||||
for (const [key, value] of data) {
|
||||
append(key, value)
|
||||
append(key, value);
|
||||
}
|
||||
} else {
|
||||
for (const [key, value] of Object.entries(data)) {
|
||||
append(key, value)
|
||||
append(key, value);
|
||||
}
|
||||
}
|
||||
return new Body('Form', form)
|
||||
return new Body("Form", form);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -181,7 +181,7 @@ class Body {
|
||||
* @returns The body object ready to be used on the POST and PUT requests.
|
||||
*/
|
||||
static json<K extends string | number | symbol, V>(data: Record<K, V>): Body {
|
||||
return new Body('Json', data)
|
||||
return new Body("Json", data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -197,7 +197,7 @@ class Body {
|
||||
* @returns The body object ready to be used on the POST and PUT requests.
|
||||
*/
|
||||
static text(value: string): Body {
|
||||
return new Body('Text', value)
|
||||
return new Body("Text", value);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -217,23 +217,23 @@ class Body {
|
||||
): Body {
|
||||
// stringifying Uint8Array doesn't return an array of numbers, so we create one here
|
||||
return new Body(
|
||||
'Bytes',
|
||||
"Bytes",
|
||||
Array.from(bytes instanceof ArrayBuffer ? new Uint8Array(bytes) : bytes)
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/** The request HTTP verb. */
|
||||
type HttpVerb =
|
||||
| 'GET'
|
||||
| 'POST'
|
||||
| 'PUT'
|
||||
| 'DELETE'
|
||||
| 'PATCH'
|
||||
| 'HEAD'
|
||||
| 'OPTIONS'
|
||||
| 'CONNECT'
|
||||
| 'TRACE'
|
||||
| "GET"
|
||||
| "POST"
|
||||
| "PUT"
|
||||
| "DELETE"
|
||||
| "PATCH"
|
||||
| "HEAD"
|
||||
| "OPTIONS"
|
||||
| "CONNECT"
|
||||
| "TRACE";
|
||||
|
||||
/**
|
||||
* Options object sent to the backend.
|
||||
@@ -241,27 +241,27 @@ type HttpVerb =
|
||||
* @since 1.0.0
|
||||
*/
|
||||
interface HttpOptions {
|
||||
method: HttpVerb
|
||||
url: string
|
||||
headers?: Record<string, unknown>
|
||||
query?: Record<string, unknown>
|
||||
body?: Body
|
||||
timeout?: number | Duration
|
||||
responseType?: ResponseType
|
||||
method: HttpVerb;
|
||||
url: string;
|
||||
headers?: Record<string, unknown>;
|
||||
query?: Record<string, unknown>;
|
||||
body?: Body;
|
||||
timeout?: number | Duration;
|
||||
responseType?: ResponseType;
|
||||
}
|
||||
|
||||
/** Request options. */
|
||||
type RequestOptions = Omit<HttpOptions, 'method' | 'url'>
|
||||
type RequestOptions = Omit<HttpOptions, "method" | "url">;
|
||||
/** Options for the `fetch` API. */
|
||||
type FetchOptions = Omit<HttpOptions, 'url'>
|
||||
type FetchOptions = Omit<HttpOptions, "url">;
|
||||
|
||||
/** @ignore */
|
||||
interface IResponse<T> {
|
||||
url: string
|
||||
status: number
|
||||
headers: Record<string, string>
|
||||
rawHeaders: Record<string, string[]>
|
||||
data: T
|
||||
url: string;
|
||||
status: number;
|
||||
headers: Record<string, string>;
|
||||
rawHeaders: Record<string, string[]>;
|
||||
data: T;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -271,26 +271,26 @@ interface IResponse<T> {
|
||||
* */
|
||||
class Response<T> {
|
||||
/** The request URL. */
|
||||
url: string
|
||||
url: string;
|
||||
/** The response status code. */
|
||||
status: number
|
||||
status: number;
|
||||
/** A boolean indicating whether the response was successful (status in the range 200–299) or not. */
|
||||
ok: boolean
|
||||
ok: boolean;
|
||||
/** The response headers. */
|
||||
headers: Record<string, string>
|
||||
headers: Record<string, string>;
|
||||
/** The response raw headers. */
|
||||
rawHeaders: Record<string, string[]>
|
||||
rawHeaders: Record<string, string[]>;
|
||||
/** The response data. */
|
||||
data: T
|
||||
data: T;
|
||||
|
||||
/** @ignore */
|
||||
constructor(response: IResponse<T>) {
|
||||
this.url = response.url
|
||||
this.status = response.status
|
||||
this.ok = this.status >= 200 && this.status < 300
|
||||
this.headers = response.headers
|
||||
this.rawHeaders = response.rawHeaders
|
||||
this.data = response.data
|
||||
this.url = response.url;
|
||||
this.status = response.status;
|
||||
this.ok = this.status >= 200 && this.status < 300;
|
||||
this.headers = response.headers;
|
||||
this.rawHeaders = response.rawHeaders;
|
||||
this.data = response.data;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -298,10 +298,10 @@ class Response<T> {
|
||||
* @since 1.0.0
|
||||
*/
|
||||
class Client {
|
||||
id: number
|
||||
id: number;
|
||||
/** @ignore */
|
||||
constructor(id: number) {
|
||||
this.id = id
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -314,9 +314,9 @@ class Client {
|
||||
* ```
|
||||
*/
|
||||
async drop(): Promise<void> {
|
||||
return invoke('plugin:http|drop_client', {
|
||||
client: this.id
|
||||
})
|
||||
return invoke("plugin:http|drop_client", {
|
||||
client: this.id,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -333,34 +333,34 @@ class Client {
|
||||
*/
|
||||
async request<T>(options: HttpOptions): Promise<Response<T>> {
|
||||
const jsonResponse =
|
||||
!options.responseType || options.responseType === ResponseType.JSON
|
||||
!options.responseType || options.responseType === ResponseType.JSON;
|
||||
if (jsonResponse) {
|
||||
options.responseType = ResponseType.Text
|
||||
options.responseType = ResponseType.Text;
|
||||
}
|
||||
return invoke<IResponse<T>>('plugin:http|request', {
|
||||
return invoke<IResponse<T>>("plugin:http|request", {
|
||||
clientId: this.id,
|
||||
options
|
||||
options,
|
||||
}).then((res) => {
|
||||
const response = new Response(res)
|
||||
const response = new Response(res);
|
||||
if (jsonResponse) {
|
||||
/* eslint-disable */
|
||||
try {
|
||||
response.data = JSON.parse(response.data as string)
|
||||
response.data = JSON.parse(response.data as string);
|
||||
} catch (e) {
|
||||
if (response.ok && (response.data as unknown as string) === '') {
|
||||
response.data = {} as T
|
||||
if (response.ok && (response.data as unknown as string) === "") {
|
||||
response.data = {} as T;
|
||||
} else if (response.ok) {
|
||||
throw Error(
|
||||
`Failed to parse response \`${response.data}\` as JSON: ${e};
|
||||
try setting the \`responseType\` option to \`ResponseType.Text\` or \`ResponseType.Binary\` if the API does not return a JSON response.`
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
/* eslint-enable */
|
||||
return response
|
||||
return response;
|
||||
}
|
||||
return response
|
||||
})
|
||||
return response;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -378,10 +378,10 @@ class Client {
|
||||
*/
|
||||
async get<T>(url: string, options?: RequestOptions): Promise<Response<T>> {
|
||||
return this.request({
|
||||
method: 'GET',
|
||||
method: "GET",
|
||||
url,
|
||||
...options
|
||||
})
|
||||
...options,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -406,11 +406,11 @@ class Client {
|
||||
options?: RequestOptions
|
||||
): Promise<Response<T>> {
|
||||
return this.request({
|
||||
method: 'POST',
|
||||
method: "POST",
|
||||
url,
|
||||
body,
|
||||
...options
|
||||
})
|
||||
...options,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -436,11 +436,11 @@ class Client {
|
||||
options?: RequestOptions
|
||||
): Promise<Response<T>> {
|
||||
return this.request({
|
||||
method: 'PUT',
|
||||
method: "PUT",
|
||||
url,
|
||||
body,
|
||||
...options
|
||||
})
|
||||
...options,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -456,10 +456,10 @@ class Client {
|
||||
*/
|
||||
async patch<T>(url: string, options?: RequestOptions): Promise<Response<T>> {
|
||||
return this.request({
|
||||
method: 'PATCH',
|
||||
method: "PATCH",
|
||||
url,
|
||||
...options
|
||||
})
|
||||
...options,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -473,10 +473,10 @@ class Client {
|
||||
*/
|
||||
async delete<T>(url: string, options?: RequestOptions): Promise<Response<T>> {
|
||||
return this.request({
|
||||
method: 'DELETE',
|
||||
method: "DELETE",
|
||||
url,
|
||||
...options
|
||||
})
|
||||
...options,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -495,13 +495,13 @@ class Client {
|
||||
* @since 1.0.0
|
||||
*/
|
||||
async function getClient(options?: ClientOptions): Promise<Client> {
|
||||
return invoke<number>('plugin:http|create_client', {
|
||||
options
|
||||
}).then((id) => new Client(id))
|
||||
return invoke<number>("plugin:http|create_client", {
|
||||
options,
|
||||
}).then((id) => new Client(id));
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
let defaultClient: Client | null = null
|
||||
let defaultClient: Client | null = null;
|
||||
|
||||
/**
|
||||
* Perform an HTTP request using the default client.
|
||||
@@ -519,13 +519,13 @@ async function fetch<T>(
|
||||
options?: FetchOptions
|
||||
): Promise<Response<T>> {
|
||||
if (defaultClient === null) {
|
||||
defaultClient = await getClient()
|
||||
defaultClient = await getClient();
|
||||
}
|
||||
return defaultClient.request({
|
||||
url,
|
||||
method: options?.method ?? 'GET',
|
||||
...options
|
||||
})
|
||||
method: options?.method ?? "GET",
|
||||
...options,
|
||||
});
|
||||
}
|
||||
|
||||
export type {
|
||||
@@ -535,7 +535,15 @@ export type {
|
||||
HttpVerb,
|
||||
HttpOptions,
|
||||
RequestOptions,
|
||||
FetchOptions
|
||||
}
|
||||
FetchOptions,
|
||||
};
|
||||
|
||||
export { getClient, fetch, Body, Client, Response, ResponseType, type FilePart }
|
||||
export {
|
||||
getClient,
|
||||
fetch,
|
||||
Body,
|
||||
Client,
|
||||
Response,
|
||||
ResponseType,
|
||||
type FilePart,
|
||||
};
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
* @module
|
||||
*/
|
||||
|
||||
import { invoke } from '@tauri-apps/api/tauri'
|
||||
import { invoke } from "@tauri-apps/api/tauri";
|
||||
|
||||
/**
|
||||
* Options to send a notification.
|
||||
@@ -33,15 +33,15 @@ import { invoke } from '@tauri-apps/api/tauri'
|
||||
*/
|
||||
interface Options {
|
||||
/** Notification title. */
|
||||
title: string
|
||||
title: string;
|
||||
/** Optional notification body. */
|
||||
body?: string
|
||||
body?: string;
|
||||
/** Optional notification icon. */
|
||||
icon?: string
|
||||
icon?: string;
|
||||
}
|
||||
|
||||
/** Possible permission values. */
|
||||
type Permission = 'granted' | 'denied' | 'default'
|
||||
type Permission = "granted" | "denied" | "default";
|
||||
|
||||
/**
|
||||
* Checks if the permission to send notifications is granted.
|
||||
@@ -54,10 +54,10 @@ type Permission = 'granted' | 'denied' | 'default'
|
||||
* @since 1.0.0
|
||||
*/
|
||||
async function isPermissionGranted(): Promise<boolean> {
|
||||
if (window.Notification.permission !== 'default') {
|
||||
return Promise.resolve(window.Notification.permission === 'granted')
|
||||
if (window.Notification.permission !== "default") {
|
||||
return Promise.resolve(window.Notification.permission === "granted");
|
||||
}
|
||||
return invoke('plugin:notification|is_permission_granted')
|
||||
return invoke("plugin:notification|is_permission_granted");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -77,7 +77,7 @@ async function isPermissionGranted(): Promise<boolean> {
|
||||
* @since 1.0.0
|
||||
*/
|
||||
async function requestPermission(): Promise<Permission> {
|
||||
return window.Notification.requestPermission()
|
||||
return window.Notification.requestPermission();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -99,15 +99,15 @@ async function requestPermission(): Promise<Permission> {
|
||||
* @since 1.0.0
|
||||
*/
|
||||
function sendNotification(options: Options | string): void {
|
||||
if (typeof options === 'string') {
|
||||
if (typeof options === "string") {
|
||||
// eslint-disable-next-line no-new
|
||||
new window.Notification(options)
|
||||
new window.Notification(options);
|
||||
} else {
|
||||
// eslint-disable-next-line no-new
|
||||
new window.Notification(options.title, options)
|
||||
new window.Notification(options.title, options);
|
||||
}
|
||||
}
|
||||
|
||||
export type { Options, Permission }
|
||||
export type { Options, Permission };
|
||||
|
||||
export { sendNotification, requestPermission, isPermissionGranted }
|
||||
export { sendNotification, requestPermission, isPermissionGranted };
|
||||
|
||||
@@ -1,71 +1,71 @@
|
||||
(function () {
|
||||
let permissionSettable = false
|
||||
let permissionValue = 'default'
|
||||
let permissionSettable = false;
|
||||
let permissionValue = "default";
|
||||
|
||||
function isPermissionGranted() {
|
||||
if (window.Notification.permission !== 'default') {
|
||||
return Promise.resolve(window.Notification.permission === 'granted')
|
||||
if (window.Notification.permission !== "default") {
|
||||
return Promise.resolve(window.Notification.permission === "granted");
|
||||
}
|
||||
return __TAURI__.invoke('plugin:notification|is_permission_granted')
|
||||
return __TAURI__.invoke("plugin:notification|is_permission_granted");
|
||||
}
|
||||
|
||||
function setNotificationPermission(value) {
|
||||
permissionSettable = true
|
||||
permissionSettable = true;
|
||||
// @ts-expect-error we can actually set this value on the webview
|
||||
window.Notification.permission = value
|
||||
permissionSettable = false
|
||||
window.Notification.permission = value;
|
||||
permissionSettable = false;
|
||||
}
|
||||
|
||||
function requestPermission() {
|
||||
return __TAURI__.invoke('plugin:notification|request_permission')
|
||||
return __TAURI__
|
||||
.invoke("plugin:notification|request_permission")
|
||||
.then(function (permission) {
|
||||
setNotificationPermission(permission)
|
||||
return permission
|
||||
})
|
||||
setNotificationPermission(permission);
|
||||
return permission;
|
||||
});
|
||||
}
|
||||
|
||||
function sendNotification(options) {
|
||||
if (typeof options === 'object') {
|
||||
Object.freeze(options)
|
||||
if (typeof options === "object") {
|
||||
Object.freeze(options);
|
||||
}
|
||||
|
||||
return __TAURI__.invoke('plugin:notification|notify', {
|
||||
options: typeof options === 'string'
|
||||
? {
|
||||
title: options
|
||||
}
|
||||
: options
|
||||
})
|
||||
return __TAURI__.invoke("plugin:notification|notify", {
|
||||
options:
|
||||
typeof options === "string"
|
||||
? {
|
||||
title: options,
|
||||
}
|
||||
: options,
|
||||
});
|
||||
}
|
||||
|
||||
// @ts-expect-error unfortunately we can't implement the whole type, so we overwrite it with our own version
|
||||
window.Notification = function (title, options) {
|
||||
const opts = options || {}
|
||||
sendNotification(
|
||||
Object.assign(opts, { title })
|
||||
)
|
||||
}
|
||||
const opts = options || {};
|
||||
sendNotification(Object.assign(opts, { title }));
|
||||
};
|
||||
|
||||
window.Notification.requestPermission = requestPermission
|
||||
window.Notification.requestPermission = requestPermission;
|
||||
|
||||
Object.defineProperty(window.Notification, 'permission', {
|
||||
Object.defineProperty(window.Notification, "permission", {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
return permissionValue
|
||||
return permissionValue;
|
||||
},
|
||||
set: function (v) {
|
||||
if (!permissionSettable) {
|
||||
throw new Error('Readonly property')
|
||||
throw new Error("Readonly property");
|
||||
}
|
||||
permissionValue = v
|
||||
}
|
||||
})
|
||||
permissionValue = v;
|
||||
},
|
||||
});
|
||||
|
||||
isPermissionGranted().then(function (response) {
|
||||
if (response === null) {
|
||||
setNotificationPermission('default')
|
||||
setNotificationPermission("default");
|
||||
} else {
|
||||
setNotificationPermission(response ? 'granted' : 'denied')
|
||||
setNotificationPermission(response ? "granted" : "denied");
|
||||
}
|
||||
})
|
||||
})()
|
||||
});
|
||||
})();
|
||||
|
||||
+122
-122
@@ -75,27 +75,27 @@
|
||||
* @module
|
||||
*/
|
||||
|
||||
import { invoke, transformCallback } from '@tauri-apps/api/tauri'
|
||||
import { invoke, transformCallback } from "@tauri-apps/api/tauri";
|
||||
|
||||
/**
|
||||
* @since 1.0.0
|
||||
*/
|
||||
interface SpawnOptions {
|
||||
/** Current working directory. */
|
||||
cwd?: string
|
||||
cwd?: string;
|
||||
/** Environment variables. set to `null` to clear the process env. */
|
||||
env?: Record<string, string>
|
||||
env?: Record<string, string>;
|
||||
/**
|
||||
* Character encoding for stdout/stderr
|
||||
*
|
||||
* @since 1.1.0
|
||||
* */
|
||||
encoding?: string
|
||||
encoding?: string;
|
||||
}
|
||||
|
||||
/** @ignore */
|
||||
interface InternalSpawnOptions extends SpawnOptions {
|
||||
sidecar?: boolean
|
||||
sidecar?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -103,13 +103,13 @@ interface InternalSpawnOptions extends SpawnOptions {
|
||||
*/
|
||||
interface ChildProcess<O extends IOPayload> {
|
||||
/** Exit code of the process. `null` if the process was terminated by a signal on Unix. */
|
||||
code: number | null
|
||||
code: number | null;
|
||||
/** If the process was terminated by a signal, represents that signal. */
|
||||
signal: number | null
|
||||
signal: number | null;
|
||||
/** The data that the process wrote to `stdout`. */
|
||||
stdout: O
|
||||
stdout: O;
|
||||
/** The data that the process wrote to `stderr`. */
|
||||
stderr: O
|
||||
stderr: O;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -128,16 +128,16 @@ async function execute<O extends IOPayload>(
|
||||
args: string | string[] = [],
|
||||
options?: InternalSpawnOptions
|
||||
): Promise<number> {
|
||||
if (typeof args === 'object') {
|
||||
Object.freeze(args)
|
||||
if (typeof args === "object") {
|
||||
Object.freeze(args);
|
||||
}
|
||||
|
||||
return invoke<number>('plugin:shell|execute', {
|
||||
return invoke<number>("plugin:shell|execute", {
|
||||
program,
|
||||
args,
|
||||
options,
|
||||
onEventFn: transformCallback(onEvent)
|
||||
})
|
||||
onEventFn: transformCallback(onEvent),
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -147,7 +147,7 @@ class EventEmitter<E extends Record<string, any>> {
|
||||
/** @ignore */
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
||||
private eventListeners: Record<keyof E, Array<(arg: any) => void>> =
|
||||
Object.create(null)
|
||||
Object.create(null);
|
||||
|
||||
/**
|
||||
* Alias for `emitter.on(eventName, listener)`.
|
||||
@@ -158,7 +158,7 @@ class EventEmitter<E extends Record<string, any>> {
|
||||
eventName: N,
|
||||
listener: (arg: E[typeof eventName]) => void
|
||||
): this {
|
||||
return this.on(eventName, listener)
|
||||
return this.on(eventName, listener);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -170,7 +170,7 @@ class EventEmitter<E extends Record<string, any>> {
|
||||
eventName: N,
|
||||
listener: (arg: E[typeof eventName]) => void
|
||||
): this {
|
||||
return this.off(eventName, listener)
|
||||
return this.off(eventName, listener);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -189,12 +189,12 @@ class EventEmitter<E extends Record<string, any>> {
|
||||
): this {
|
||||
if (eventName in this.eventListeners) {
|
||||
// eslint-disable-next-line security/detect-object-injection
|
||||
this.eventListeners[eventName].push(listener)
|
||||
this.eventListeners[eventName].push(listener);
|
||||
} else {
|
||||
// eslint-disable-next-line security/detect-object-injection
|
||||
this.eventListeners[eventName] = [listener]
|
||||
this.eventListeners[eventName] = [listener];
|
||||
}
|
||||
return this
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -210,11 +210,11 @@ class EventEmitter<E extends Record<string, any>> {
|
||||
listener: (arg: E[typeof eventName]) => void
|
||||
): this {
|
||||
const wrapper = (arg: E[typeof eventName]): void => {
|
||||
this.removeListener(eventName, wrapper)
|
||||
this.removeListener(eventName, wrapper);
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
||||
listener(arg)
|
||||
}
|
||||
return this.addListener(eventName, wrapper)
|
||||
listener(arg);
|
||||
};
|
||||
return this.addListener(eventName, wrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -231,9 +231,9 @@ class EventEmitter<E extends Record<string, any>> {
|
||||
// eslint-disable-next-line security/detect-object-injection
|
||||
this.eventListeners[eventName] = this.eventListeners[eventName].filter(
|
||||
(l) => l !== listener
|
||||
)
|
||||
);
|
||||
}
|
||||
return this
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -246,12 +246,12 @@ class EventEmitter<E extends Record<string, any>> {
|
||||
removeAllListeners<N extends keyof E>(event?: N): this {
|
||||
if (event) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete,security/detect-object-injection
|
||||
delete this.eventListeners[event]
|
||||
delete this.eventListeners[event];
|
||||
} else {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
||||
this.eventListeners = Object.create(null)
|
||||
this.eventListeners = Object.create(null);
|
||||
}
|
||||
return this
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -264,12 +264,12 @@ class EventEmitter<E extends Record<string, any>> {
|
||||
emit<N extends keyof E>(eventName: N, arg: E[typeof eventName]): boolean {
|
||||
if (eventName in this.eventListeners) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,security/detect-object-injection
|
||||
const listeners = this.eventListeners[eventName]
|
||||
const listeners = this.eventListeners[eventName];
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
||||
for (const listener of listeners) listener(arg)
|
||||
return true
|
||||
for (const listener of listeners) listener(arg);
|
||||
return true;
|
||||
}
|
||||
return false
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -280,8 +280,8 @@ class EventEmitter<E extends Record<string, any>> {
|
||||
listenerCount<N extends keyof E>(eventName: N): number {
|
||||
if (eventName in this.eventListeners)
|
||||
// eslint-disable-next-line security/detect-object-injection
|
||||
return this.eventListeners[eventName].length
|
||||
return 0
|
||||
return this.eventListeners[eventName].length;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -300,12 +300,12 @@ class EventEmitter<E extends Record<string, any>> {
|
||||
): this {
|
||||
if (eventName in this.eventListeners) {
|
||||
// eslint-disable-next-line security/detect-object-injection
|
||||
this.eventListeners[eventName].unshift(listener)
|
||||
this.eventListeners[eventName].unshift(listener);
|
||||
} else {
|
||||
// eslint-disable-next-line security/detect-object-injection
|
||||
this.eventListeners[eventName] = [listener]
|
||||
this.eventListeners[eventName] = [listener];
|
||||
}
|
||||
return this
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -321,11 +321,11 @@ class EventEmitter<E extends Record<string, any>> {
|
||||
listener: (arg: E[typeof eventName]) => void
|
||||
): this {
|
||||
const wrapper = (arg: any): void => {
|
||||
this.removeListener(eventName, wrapper)
|
||||
this.removeListener(eventName, wrapper);
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
||||
listener(arg)
|
||||
}
|
||||
return this.prependListener(eventName, wrapper)
|
||||
listener(arg);
|
||||
};
|
||||
return this.prependListener(eventName, wrapper);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -334,10 +334,10 @@ class EventEmitter<E extends Record<string, any>> {
|
||||
*/
|
||||
class Child {
|
||||
/** The child process `pid`. */
|
||||
pid: number
|
||||
pid: number;
|
||||
|
||||
constructor(pid: number) {
|
||||
this.pid = pid
|
||||
this.pid = pid;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -356,11 +356,11 @@ class Child {
|
||||
* @returns A promise indicating the success or failure of the operation.
|
||||
*/
|
||||
async write(data: IOPayload): Promise<void> {
|
||||
return invoke('plugin:shell|stdin_write', {
|
||||
return invoke("plugin:shell|stdin_write", {
|
||||
pid: this.pid,
|
||||
// correctly serialize Uint8Arrays
|
||||
buffer: typeof data === 'string' ? data : Array.from(data)
|
||||
})
|
||||
buffer: typeof data === "string" ? data : Array.from(data),
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -369,20 +369,20 @@ class Child {
|
||||
* @returns A promise indicating the success or failure of the operation.
|
||||
*/
|
||||
async kill(): Promise<void> {
|
||||
return invoke('plugin:shell|kill', {
|
||||
cmd: 'killChild',
|
||||
pid: this.pid
|
||||
})
|
||||
return invoke("plugin:shell|kill", {
|
||||
cmd: "killChild",
|
||||
pid: this.pid,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
interface CommandEvents {
|
||||
close: TerminatedPayload
|
||||
error: string
|
||||
close: TerminatedPayload;
|
||||
error: string;
|
||||
}
|
||||
|
||||
interface OutputEvents<O extends IOPayload> {
|
||||
data: O
|
||||
data: O;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -408,15 +408,15 @@ interface OutputEvents<O extends IOPayload> {
|
||||
*/
|
||||
class Command<O extends IOPayload> extends EventEmitter<CommandEvents> {
|
||||
/** @ignore Program to execute. */
|
||||
private readonly program: string
|
||||
private readonly program: string;
|
||||
/** @ignore Program arguments */
|
||||
private readonly args: string[]
|
||||
private readonly args: string[];
|
||||
/** @ignore Spawn options. */
|
||||
private readonly options: InternalSpawnOptions
|
||||
private readonly options: InternalSpawnOptions;
|
||||
/** Event emitter for the `stdout`. Emits the `data` event. */
|
||||
readonly stdout = new EventEmitter<OutputEvents<O>>()
|
||||
readonly stdout = new EventEmitter<OutputEvents<O>>();
|
||||
/** Event emitter for the `stderr`. Emits the `data` event. */
|
||||
readonly stderr = new EventEmitter<OutputEvents<O>>()
|
||||
readonly stderr = new EventEmitter<OutputEvents<O>>();
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
@@ -432,23 +432,23 @@ class Command<O extends IOPayload> extends EventEmitter<CommandEvents> {
|
||||
args: string | string[] = [],
|
||||
options?: SpawnOptions
|
||||
) {
|
||||
super()
|
||||
this.program = program
|
||||
this.args = typeof args === 'string' ? [args] : args
|
||||
this.options = options ?? {}
|
||||
super();
|
||||
this.program = program;
|
||||
this.args = typeof args === "string" ? [args] : args;
|
||||
this.options = options ?? {};
|
||||
}
|
||||
|
||||
static create(program: string, args?: string | string[]): Command<string>
|
||||
static create(program: string, args?: string | string[]): Command<string>;
|
||||
static create(
|
||||
program: string,
|
||||
args?: string | string[],
|
||||
options?: SpawnOptions & { encoding: 'raw' }
|
||||
): Command<Uint8Array>
|
||||
options?: SpawnOptions & { encoding: "raw" }
|
||||
): Command<Uint8Array>;
|
||||
static create(
|
||||
program: string,
|
||||
args?: string | string[],
|
||||
options?: SpawnOptions
|
||||
): Command<string>
|
||||
): Command<string>;
|
||||
|
||||
/**
|
||||
* Creates a command to execute the given program.
|
||||
@@ -467,20 +467,20 @@ class Command<O extends IOPayload> extends EventEmitter<CommandEvents> {
|
||||
args: string | string[] = [],
|
||||
options?: SpawnOptions
|
||||
): Command<O> {
|
||||
return new Command(program, args, options)
|
||||
return new Command(program, args, options);
|
||||
}
|
||||
|
||||
static sidecar(program: string, args?: string | string[]): Command<string>
|
||||
static sidecar(program: string, args?: string | string[]): Command<string>;
|
||||
static sidecar(
|
||||
program: string,
|
||||
args?: string | string[],
|
||||
options?: SpawnOptions & { encoding: 'raw' }
|
||||
): Command<Uint8Array>
|
||||
options?: SpawnOptions & { encoding: "raw" }
|
||||
): Command<Uint8Array>;
|
||||
static sidecar(
|
||||
program: string,
|
||||
args?: string | string[],
|
||||
options?: SpawnOptions
|
||||
): Command<string>
|
||||
): Command<string>;
|
||||
|
||||
/**
|
||||
* Creates a command to execute the given sidecar program.
|
||||
@@ -499,9 +499,9 @@ class Command<O extends IOPayload> extends EventEmitter<CommandEvents> {
|
||||
args: string | string[] = [],
|
||||
options?: SpawnOptions
|
||||
): Command<O> {
|
||||
const instance = new Command<O>(program, args, options)
|
||||
instance.options.sidecar = true
|
||||
return instance
|
||||
const instance = new Command<O>(program, args, options);
|
||||
instance.options.sidecar = true;
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -513,24 +513,24 @@ class Command<O extends IOPayload> extends EventEmitter<CommandEvents> {
|
||||
return execute<O>(
|
||||
(event) => {
|
||||
switch (event.event) {
|
||||
case 'Error':
|
||||
this.emit('error', event.payload)
|
||||
break
|
||||
case 'Terminated':
|
||||
this.emit('close', event.payload)
|
||||
break
|
||||
case 'Stdout':
|
||||
this.stdout.emit('data', event.payload)
|
||||
break
|
||||
case 'Stderr':
|
||||
this.stderr.emit('data', event.payload)
|
||||
break
|
||||
case "Error":
|
||||
this.emit("error", event.payload);
|
||||
break;
|
||||
case "Terminated":
|
||||
this.emit("close", event.payload);
|
||||
break;
|
||||
case "Stdout":
|
||||
this.stdout.emit("data", event.payload);
|
||||
break;
|
||||
case "Stderr":
|
||||
this.stderr.emit("data", event.payload);
|
||||
break;
|
||||
}
|
||||
},
|
||||
this.program,
|
||||
this.args,
|
||||
this.options
|
||||
).then((pid) => new Child(pid))
|
||||
).then((pid) => new Child(pid));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -549,38 +549,38 @@ class Command<O extends IOPayload> extends EventEmitter<CommandEvents> {
|
||||
*/
|
||||
async execute(): Promise<ChildProcess<O>> {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.on('error', reject)
|
||||
this.on("error", reject);
|
||||
|
||||
const stdout: O[] = []
|
||||
const stderr: O[] = []
|
||||
this.stdout.on('data', (line: O) => {
|
||||
stdout.push(line)
|
||||
})
|
||||
this.stderr.on('data', (line: O) => {
|
||||
stderr.push(line)
|
||||
})
|
||||
const stdout: O[] = [];
|
||||
const stderr: O[] = [];
|
||||
this.stdout.on("data", (line: O) => {
|
||||
stdout.push(line);
|
||||
});
|
||||
this.stderr.on("data", (line: O) => {
|
||||
stderr.push(line);
|
||||
});
|
||||
|
||||
this.on('close', (payload: TerminatedPayload) => {
|
||||
this.on("close", (payload: TerminatedPayload) => {
|
||||
resolve({
|
||||
code: payload.code,
|
||||
signal: payload.signal,
|
||||
stdout: this.collectOutput(stdout) as O,
|
||||
stderr: this.collectOutput(stderr) as O
|
||||
})
|
||||
})
|
||||
stderr: this.collectOutput(stderr) as O,
|
||||
});
|
||||
});
|
||||
|
||||
this.spawn().catch(reject)
|
||||
})
|
||||
this.spawn().catch(reject);
|
||||
});
|
||||
}
|
||||
|
||||
/** @ignore */
|
||||
private collectOutput(events: O[]): string | Uint8Array {
|
||||
if (this.options.encoding === 'raw') {
|
||||
if (this.options.encoding === "raw") {
|
||||
return events.reduce<Uint8Array>((p, c) => {
|
||||
return new Uint8Array([...p, ...(c as Uint8Array), 10])
|
||||
}, new Uint8Array())
|
||||
return new Uint8Array([...p, ...(c as Uint8Array), 10]);
|
||||
}, new Uint8Array());
|
||||
} else {
|
||||
return events.join('\n')
|
||||
return events.join("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -589,8 +589,8 @@ class Command<O extends IOPayload> extends EventEmitter<CommandEvents> {
|
||||
* Describes the event message received from the command.
|
||||
*/
|
||||
interface Event<T, V> {
|
||||
event: T
|
||||
payload: V
|
||||
event: T;
|
||||
payload: V;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -598,20 +598,20 @@ interface Event<T, V> {
|
||||
*/
|
||||
interface TerminatedPayload {
|
||||
/** Exit code of the process. `null` if the process was terminated by a signal on Unix. */
|
||||
code: number | null
|
||||
code: number | null;
|
||||
/** If the process was terminated by a signal, represents that signal. */
|
||||
signal: number | null
|
||||
signal: number | null;
|
||||
}
|
||||
|
||||
/** Event payload type */
|
||||
type IOPayload = string | Uint8Array
|
||||
type IOPayload = string | Uint8Array;
|
||||
|
||||
/** Events emitted by the child process. */
|
||||
type CommandEvent<O extends IOPayload> =
|
||||
| Event<'Stdout', O>
|
||||
| Event<'Stderr', O>
|
||||
| Event<'Terminated', TerminatedPayload>
|
||||
| Event<'Error', string>
|
||||
| Event<"Stdout", O>
|
||||
| Event<"Stderr", O>
|
||||
| Event<"Terminated", TerminatedPayload>
|
||||
| Event<"Error", string>;
|
||||
|
||||
/**
|
||||
* Opens a path or URL with the system's default app,
|
||||
@@ -640,18 +640,18 @@ type CommandEvent<O extends IOPayload> =
|
||||
* @since 1.0.0
|
||||
*/
|
||||
async function open(path: string, openWith?: string): Promise<void> {
|
||||
return invoke('plugin:shell|open', {
|
||||
return invoke("plugin:shell|open", {
|
||||
path,
|
||||
with: openWith
|
||||
})
|
||||
with: openWith,
|
||||
});
|
||||
}
|
||||
|
||||
export { Command, Child, EventEmitter, open }
|
||||
export { Command, Child, EventEmitter, open };
|
||||
export type {
|
||||
IOPayload,
|
||||
CommandEvents,
|
||||
TerminatedPayload,
|
||||
OutputEvents,
|
||||
ChildProcess,
|
||||
SpawnOptions
|
||||
}
|
||||
SpawnOptions,
|
||||
};
|
||||
|
||||
@@ -29,4 +29,4 @@
|
||||
"dependencies": {
|
||||
"@tauri-apps/api": "^1.2.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+18
-18
@@ -1,20 +1,20 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"esModuleInterop": true,
|
||||
"lib": ["ES2019", "ES2020.Promise", "ES2020.String", "DOM", "DOM.Iterable"],
|
||||
"module": "ESNext",
|
||||
"moduleResolution": "node",
|
||||
"noEmit": true,
|
||||
"noEmitOnError": false,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"pretty": true,
|
||||
"sourceMap": true,
|
||||
"strict": true,
|
||||
"target": "ES2019",
|
||||
"declaration": true,
|
||||
"declarationDir": "./"
|
||||
},
|
||||
"exclude": ["dist-js", "node_modules", "test/types"]
|
||||
"compilerOptions": {
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"esModuleInterop": true,
|
||||
"lib": ["ES2019", "ES2020.Promise", "ES2020.String", "DOM", "DOM.Iterable"],
|
||||
"module": "ESNext",
|
||||
"moduleResolution": "node",
|
||||
"noEmit": true,
|
||||
"noEmitOnError": false,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"pretty": true,
|
||||
"sourceMap": true,
|
||||
"strict": true,
|
||||
"target": "ES2019",
|
||||
"declaration": true,
|
||||
"declarationDir": "./"
|
||||
},
|
||||
"exclude": ["dist-js", "node_modules", "test/types"]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user