Skip to content

Commit

Permalink
Require Node.js 14 and move to ESM
Browse files Browse the repository at this point in the history
  • Loading branch information
sindresorhus committed Mar 20, 2023
1 parent 3b79981 commit 7f5995e
Show file tree
Hide file tree
Showing 7 changed files with 210 additions and 250 deletions.
7 changes: 4 additions & 3 deletions .github/workflows/main.yml
Expand Up @@ -10,11 +10,12 @@ jobs:
fail-fast: false
matrix:
node-version:
- 18
- 16
- 14
- 12
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- run: npm install
Expand Down
224 changes: 105 additions & 119 deletions index.d.ts
@@ -1,171 +1,157 @@
import {ChildProcess} from 'child_process';
import {type ChildProcess} from 'node:child_process';

declare namespace open {
interface Options {
/**
Wait for the opened app to exit before fulfilling the promise. If `false` it's fulfilled immediately when opening the app.
Note that it waits for the app to exit, not just for the window to close.
On Windows, you have to explicitly specify an app for it to be able to wait.
export type Options = {
/**
Wait for the opened app to exit before fulfilling the promise. If `false` it's fulfilled immediately when opening the app.
@default false
*/
readonly wait?: boolean;
Note that it waits for the app to exit, not just for the window to close.
/**
__macOS only__
On Windows, you have to explicitly specify an app for it to be able to wait.
Do not bring the app to the foreground.
@default false
*/
readonly wait?: boolean;

@default false
*/
readonly background?: boolean;
/**
__macOS only__
/**
__macOS only__
Do not bring the app to the foreground.
Open a new instance of the app even it's already running.
@default false
*/
readonly background?: boolean;

A new instance is always opened on other platforms.
/**
__macOS only__
@default false
*/
readonly newInstance?: boolean;
Open a new instance of the app even it's already running.
/**
Specify the `name` of the app to open the `target` with, and optionally, app `arguments`. `app` can be an array of apps to try to open and `name` can be an array of app names to try. If each app fails, the last error will be thrown.
A new instance is always opened on other platforms.
The app name is platform dependent. Don't hard code it in reusable modules. For example, Chrome is `google chrome` on macOS, `google-chrome` on Linux and `chrome` on Windows. If possible, use [`open.apps`](#openapps) which auto-detects the correct binary to use.
@default false
*/
readonly newInstance?: boolean;

You may also pass in the app's full path. For example on WSL, this can be `/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe` for the Windows installation of Chrome.
/**
Specify the `name` of the app to open the `target` with, and optionally, app `arguments`. `app` can be an array of apps to try to open and `name` can be an array of app names to try. If each app fails, the last error will be thrown.
The app `arguments` are app dependent. Check the app's documentation for what arguments it accepts.
*/
readonly app?: App | readonly App[];
The app name is platform dependent. Don't hard code it in reusable modules. For example, Chrome is `google chrome` on macOS, `google-chrome` on Linux and `chrome` on Windows. If possible, use `apps` which auto-detects the correct binary to use.
/**
Allow the opened app to exit with nonzero exit code when the `wait` option is `true`.
You may also pass in the app's full path. For example on WSL, this can be `/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe` for the Windows installation of Chrome.
We do not recommend setting this option. The convention for success is exit code zero.
The app `arguments` are app dependent. Check the app's documentation for what arguments it accepts.
*/
readonly app?: App | readonly App[];

@default false
*/
readonly allowNonzeroExitCode?: boolean;
}
/**
Allow the opened app to exit with nonzero exit code when the `wait` option is `true`.
interface OpenAppOptions extends Omit<Options, 'app'> {
/**
Arguments passed to the app.
We do not recommend setting this option. The convention for success is exit code zero.
These arguments are app dependent. Check the app's documentation for what arguments it accepts.
*/
readonly arguments?: readonly string[];
}
@default false
*/
readonly allowNonzeroExitCode?: boolean;
};

type AppName =
| 'chrome'
| 'firefox'
| 'edge'
| 'browser'
| 'browserPrivate';
export type OpenAppOptions = {
/**
Arguments passed to the app.
type App = {
name: string | readonly string[];
arguments?: readonly string[];
};
}
These arguments are app dependent. Check the app's documentation for what arguments it accepts.
*/
readonly arguments?: readonly string[];
} & Omit<Options, 'app'>;

export type AppName =
| 'chrome'
| 'firefox'
| 'edge'
| 'browser'
| 'browserPrivate';

export type App = {
name: string | readonly string[];
arguments?: readonly string[];
};

/**
An object containing auto-detected binary names for common apps. Useful to work around cross-platform differences.
@example
```
import open from 'open';
import open, {apps} from 'open';
await open('https://google.com', {
app: {
name: open.apps.chrome
name: apps.chrome
}
});
```
*/
declare const apps: Record<open.AppName, string | readonly string[]>;
export const apps: Record<AppName, string | readonly string[]>;

// eslint-disable-next-line no-redeclare
declare const open: {
/**
Open stuff like URLs, files, executables. Cross-platform.
Uses the command `open` on macOS, `start` on Windows and `xdg-open` on other platforms.
/**
Open stuff like URLs, files, executables. Cross-platform.
There is a caveat for [double-quotes on Windows](https://github.com/sindresorhus/open#double-quotes-on-windows) where all double-quotes are stripped from the `target`.
Uses the command `open` on macOS, `start` on Windows and `xdg-open` on other platforms.
@param target - The thing you want to open. Can be a URL, file, or executable. Opens in the default app for the file type. For example, URLs open in your default browser.
@returns The [spawned child process](https://nodejs.org/api/child_process.html#child_process_class_childprocess). You would normally not need to use this for anything, but it can be useful if you'd like to attach custom event listeners or perform other operations directly on the spawned process.
There is a caveat for [double-quotes on Windows](https://github.com/sindresorhus/open#double-quotes-on-windows) where all double-quotes are stripped from the `target`.
@example
```
import open from 'open';
@param target - The thing you want to open. Can be a URL, file, or executable. Opens in the default app for the file type. For example, URLs open in your default browser.
@returns The [spawned child process](https://nodejs.org/api/child_process.html#child_process_class_childprocess). You would normally not need to use this for anything, but it can be useful if you'd like to attach custom event listeners or perform other operations directly on the spawned process.
// Opens the image in the default image viewer.
await open('unicorn.png', {wait: true});
console.log('The image viewer app quit');
@example
```
import open, {apps} from 'open';
// Opens the URL in the default browser.
await open('https://sindresorhus.com');
// Opens the image in the default image viewer.
await open('unicorn.png', {wait: true});
console.log('The image viewer app quit');
// Opens the URL in a specified browser.
await open('https://sindresorhus.com', {app: {name: 'firefox'}});
// Opens the URL in the default browser.
await open('https://sindresorhus.com');
// Specify app arguments.
await open('https://sindresorhus.com', {app: {name: 'google chrome', arguments: ['--incognito']}});
// Opens the URL in a specified browser.
await open('https://sindresorhus.com', {app: {name: 'firefox'}});
// Opens the URL in the default browser in incognito mode.
await open('https://sindresorhus.com', {app: {name: open.apps.browserPrivate}});
```
*/
(
target: string,
options?: open.Options
): Promise<ChildProcess>;
// Specify app arguments.
await open('https://sindresorhus.com', {app: {name: 'google chrome', arguments: ['--incognito']}});
/**
An object containing auto-detected binary names for common apps. Useful to work around cross-platform differences.
*/
apps: typeof apps;

/**
Open an app. Cross-platform.
// Opens the URL in the default browser in incognito mode.
await open('https://sindresorhus.com', {app: {name: apps.browserPrivate}});
```
*/
export default function open(
target: string,
options?: Options
): Promise<ChildProcess>;

Uses the command `open` on macOS, `start` on Windows and `xdg-open` on other platforms.
/**
Open an app. Cross-platform.
@param name - The app you want to open. Can be either builtin supported `open.apps` names or other name supported in platform.
@returns The [spawned child process](https://nodejs.org/api/child_process.html#child_process_class_childprocess). You would normally not need to use this for anything, but it can be useful if you'd like to attach custom event listeners or perform other operations directly on the spawned process.
Uses the command `open` on macOS, `start` on Windows and `xdg-open` on other platforms.
@example
```
import open from 'open';
const {apps, openApp} = open;
@param name - The app you want to open. Can be either builtin supported `apps` names or other name supported in platform.
@returns The [spawned child process](https://nodejs.org/api/child_process.html#child_process_class_childprocess). You would normally not need to use this for anything, but it can be useful if you'd like to attach custom event listeners or perform other operations directly on the spawned process.
// Open Firefox.
await openApp(apps.firefox);
@example
```
import open, {openApp, apps} from 'open';
// Open Chrome in incognito mode.
await openApp(apps.chrome, {arguments: ['--incognito']});
// Open Firefox.
await openApp(apps.firefox);
// Open default browser.
await openApp(apps.browser);
// Open Chrome in incognito mode.
await openApp(apps.chrome, {arguments: ['--incognito']});
// Open default browser in incognito mode.
await openApp(apps.browserPrivate);
// Open default browser.
await openApp(apps.browser);
// Open Xcode.
await openApp('xcode');
```
*/
openApp: (name: open.App['name'], options?: open.OpenAppOptions) => Promise<ChildProcess>;
};
// Open default browser in incognito mode.
await openApp(apps.browserPrivate);
export {apps};
export default open;
// Open Xcode.
await openApp('xcode');
```
*/
export function openApp(name: App['name'], options?: OpenAppOptions): Promise<ChildProcess>;

0 comments on commit 7f5995e

Please sign in to comment.