diff --git a/docs/api/browser-view.md b/docs/api/browser-view.md index a2c5b03079a..bf9411af415 100644 --- a/docs/api/browser-view.md +++ b/docs/api/browser-view.md @@ -84,16 +84,16 @@ Examples of valid `color` values: * #ffffff (RRGGBB) * #ffffffff (AARRGGBB) * RGB - * rgb\(([\d]+),\s*([\d]+),\s*([\d]+)\) + * rgb\((\[\d]+),\s*(\[\d]+),\s*(\[\d]+)\) * e.g. rgb(255, 255, 255) * RGBA - * rgba\(([\d]+),\s*([\d]+),\s*([\d]+),\s*([\d.]+)\) + * rgba\((\[\d]+),\s*(\[\d]+),\s*(\[\d]+),\s*(\[\d.]+)\) * e.g. rgba(255, 255, 255, 1.0) * HSL - * hsl\((-?[\d.]+),\s*([\d.]+)%,\s*([\d.]+)%\) + * hsl\((-?\[\d.]+),\s*(\[\d.]+)%,\s*(\[\d.]+)%\) * e.g. hsl(200, 20%, 50%) * HSLA - * hsla\((-?[\d.]+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\) + * hsla\((-?\[\d.]+),\s*(\[\d.]+)%,\s*(\[\d.]+)%,\s*(\[\d.]+)\) * e.g. hsla(200, 20%, 50%, 0.5) * Color name * Options are listed in [SkParseColor.cpp](https://source.chromium.org/chromium/chromium/src/+/main:third_party/skia/src/utils/SkParseColor.cpp;l=11-152;drc=eea4bf52cb0d55e2a39c828b017c80a5ee054148) diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index e332caaed0c..7e941a4a140 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -1048,16 +1048,16 @@ Examples of valid `backgroundColor` values: * #ffffff (RGB) * #ffffffff (ARGB) * RGB - * rgb\(([\d]+),\s*([\d]+),\s*([\d]+)\) + * rgb\((\[\d]+),\s*(\[\d]+),\s*(\[\d]+)\) * e.g. rgb(255, 255, 255) * RGBA - * rgba\(([\d]+),\s*([\d]+),\s*([\d]+),\s*([\d.]+)\) + * rgba\((\[\d]+),\s*(\[\d]+),\s*(\[\d]+),\s*(\[\d.]+)\) * e.g. rgba(255, 255, 255, 1.0) * HSL - * hsl\((-?[\d.]+),\s*([\d.]+)%,\s*([\d.]+)%\) + * hsl\((-?\[\d.]+),\s*(\[\d.]+)%,\s*(\[\d.]+)%\) * e.g. hsl(200, 20%, 50%) * HSLA - * hsla\((-?[\d.]+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\) + * hsla\((-?\[\d.]+),\s*(\[\d.]+)%,\s*(\[\d.]+)%,\s*(\[\d.]+)\) * e.g. hsla(200, 20%, 50%, 0.5) * Color name * Options are listed in [SkParseColor.cpp](https://source.chromium.org/chromium/chromium/src/+/main:third_party/skia/src/utils/SkParseColor.cpp;l=11-152;drc=eea4bf52cb0d55e2a39c828b017c80a5ee054148) @@ -1541,7 +1541,7 @@ Remove the window's menu bar. * `options` Object (optional) * `mode` string _Windows_ - Mode for the progress bar. Can be `none`, `normal`, `indeterminate`, `error` or `paused`. -Sets progress value in progress bar. Valid range is [0, 1.0]. +Sets progress value in progress bar. Valid range is \[0, 1.0]. Remove progress bar when progress < 0; Change to indeterminate mode when progress > 1. @@ -1587,7 +1587,7 @@ Returns `boolean` - Whether the window has a shadow. * `opacity` number - between 0.0 (fully transparent) and 1.0 (fully opaque) Sets the opacity of the window. On Linux, does nothing. Out of bound number -values are clamped to the [0, 1] range. +values are clamped to the \[0, 1] range. #### `win.getOpacity()` diff --git a/docs/api/command-line-switches.md b/docs/api/command-line-switches.md index 125ef3a8e6b..e99f223b2f5 100644 --- a/docs/api/command-line-switches.md +++ b/docs/api/command-line-switches.md @@ -61,7 +61,7 @@ throttling in one window, you can take the hack of Forces the maximum disk space to be used by the disk cache, in bytes. -### --enable-logging[=file] +### --enable-logging\[=file] Prints Chromium's logging to stderr (or a log file). @@ -241,19 +241,19 @@ Electron supports some of the [CLI flags][node-cli] supported by Node.js. **Note:** Passing unsupported command line switches to Electron when it is not running in `ELECTRON_RUN_AS_NODE` will have no effect. -### --inspect-brk[=[host:]port] +### --inspect-brk\[=\[host:]port] Activate inspector on host:port and break at start of user script. Default host:port is 127.0.0.1:9229. Aliased to `--debug-brk=[host:]port`. -### --inspect-port=[host:]port +### --inspect-port=\[host:]port Set the `host:port` to be used when the inspector is activated. Useful when activating the inspector by sending the SIGUSR1 signal. Default host is `127.0.0.1`. Aliased to `--debug-port=[host:]port`. -### --inspect[=[host:]port] +### --inspect\[=\[host:]port] Activate inspector on `host:port`. Default is `127.0.0.1:9229`. diff --git a/docs/api/desktop-capturer.md b/docs/api/desktop-capturer.md index fa4874e3c86..96c1b6cd0fa 100644 --- a/docs/api/desktop-capturer.md +++ b/docs/api/desktop-capturer.md @@ -1,7 +1,7 @@ # desktopCapturer > Access information about media sources that can be used to capture audio and -> video from the desktop using the [`navigator.mediaDevices.getUserMedia`] API. +> video from the desktop using the [`navigator.mediaDevices.getUserMedia`][] API. Process: [Main](../glossary.md#main-process) @@ -59,11 +59,11 @@ function handleError (e) { ``` To capture video from a source provided by `desktopCapturer` the constraints -passed to [`navigator.mediaDevices.getUserMedia`] must include +passed to [`navigator.mediaDevices.getUserMedia`][] must include `chromeMediaSource: 'desktop'`, and `audio: false`. To capture both audio and video from the entire desktop the constraints passed -to [`navigator.mediaDevices.getUserMedia`] must include `chromeMediaSource: 'desktop'`, +to [`navigator.mediaDevices.getUserMedia`][] must include `chromeMediaSource: 'desktop'`, for both `audio` and `video`, but should not include a `chromeMediaSourceId` constraint. ```javascript @@ -101,7 +101,7 @@ The `desktopCapturer` module has the following methods: Returns `Promise` - Resolves with an array of [`DesktopCapturerSource`](structures/desktop-capturer-source.md) objects, each `DesktopCapturerSource` represents a screen or an individual window that can be captured. **Note** Capturing the screen contents requires user consent on macOS 10.15 Catalina or higher, -which can detected by [`systemPreferences.getMediaAccessStatus`]. +which can detected by [`systemPreferences.getMediaAccessStatus`][]. [`navigator.mediaDevices.getUserMedia`]: https://developer.mozilla.org/en/docs/Web/API/MediaDevices/getUserMedia [`systemPreferences.getMediaAccessStatus`]: system-preferences.md#systempreferencesgetmediaaccessstatusmediatype-windows-macos diff --git a/docs/api/ipc-main.md b/docs/api/ipc-main.md index e7c9800a25b..2b42afe2834 100644 --- a/docs/api/ipc-main.md +++ b/docs/api/ipc-main.md @@ -16,7 +16,7 @@ process, it handles asynchronous and synchronous messages sent from a renderer process (web page). Messages sent from a renderer will be emitted to this module. -For usage examples, check out the [IPC tutorial]. +For usage examples, check out the [IPC tutorial][]. ## Sending messages diff --git a/docs/api/ipc-renderer.md b/docs/api/ipc-renderer.md index d17b7612868..3045eba6396 100644 --- a/docs/api/ipc-renderer.md +++ b/docs/api/ipc-renderer.md @@ -142,7 +142,7 @@ Returns `any` - The value sent back by the [`ipcMain`](./ipc-main.md) handler. Send a message to the main process via `channel` and expect a result synchronously. Arguments will be serialized with the [Structured Clone -Algorithm][SCA], just like [`window.postMessage`], so prototype chains will not be +Algorithm][SCA], just like [`window.postMessage`][], so prototype chains will not be included. Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will throw an exception. diff --git a/docs/api/session.md b/docs/api/session.md index a67f967dff1..3a72944bb86 100644 --- a/docs/api/session.md +++ b/docs/api/session.md @@ -659,7 +659,7 @@ The `proxyBypassRules` is a comma separated list of rules described below: Match URLs which are IP address literals. Examples: - "127.0.1", "[0:0::1]", "[::1]", "http://[::1]:99" + "127.0.1", "\[0:0::1]", "\[::1]", "http://\[::1]:99" * `IP_LITERAL "/" PREFIX_LENGTH_IN_BITS` diff --git a/docs/api/system-preferences.md b/docs/api/system-preferences.md index 2c57be77016..1361865ff37 100644 --- a/docs/api/system-preferences.md +++ b/docs/api/system-preferences.md @@ -187,7 +187,7 @@ Some popular `key` and `type`s are: * `key` string * `type` Type - Can be `string`, `boolean`, `integer`, `float`, `double`, `url`, `array` or `dictionary`. -* `value` UserDefaultTypes[Type] +* `value` UserDefaultTypes\[Type] Set the value of `key` in `NSUserDefaults`. diff --git a/docs/api/utility-process.md b/docs/api/utility-process.md index 2c228598deb..8880f3d693f 100644 --- a/docs/api/utility-process.md +++ b/docs/api/utility-process.md @@ -24,9 +24,9 @@ Process: [Main](../glossary.md#main-process)
`stderr` to either `pipe`, `inherit` or `ignore`. Configuring `stdin` is not supported; `stdin` will always be ignored. For example, the supported values will be processed as following: - * `pipe`: equivalent to ['ignore', 'pipe', 'pipe'] (the default) - * `ignore`: equivalent to 'ignore', 'ignore', 'ignore'] - * `inherit`: equivalent to ['ignore', 'inherit', 'inherit'] + * `pipe`: equivalent to \['ignore', 'pipe', 'pipe'] (the default) + * `ignore`: equivalent to \['ignore', 'ignore', 'ignore'] + * `inherit`: equivalent to \['ignore', 'inherit', 'inherit'] * `serviceName` string (optional) - Name of the process that will appear in `name` property of [`child-process-gone` event of `app`](app.md#event-child-process-gone). Default is `node.mojom.NodeService`. @@ -90,7 +90,7 @@ the child process exits, then the value is `undefined` after the `exit` event is #### `child.stdout` A `NodeJS.ReadableStream | null` that represents the child process's stdout. -If the child was spawned with options.stdio[1] set to anything other than 'pipe', then this will be `null`. +If the child was spawned with options.stdio\[1] set to anything other than 'pipe', then this will be `null`. When the child process exits, then the value is `null` after the `exit` event is emitted. ```js @@ -105,7 +105,7 @@ child.stdout.on('data', (data) => { #### `child.stderr` A `NodeJS.ReadableStream | null` that represents the child process's stderr. -If the child was spawned with options.stdio[2] set to anything other than 'pipe', then this will be `null`. +If the child was spawned with options.stdio\[2] set to anything other than 'pipe', then this will be `null`. When the child process exits, then the value is `null` after the `exit` event is emitted. ### Instance Events diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index 1f25e0fb416..b0f7c06b52d 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -570,7 +570,7 @@ Returns: * `finalUpdate` boolean Emitted when a result is available for -[`webContents.findInPage`] request. +[`webContents.findInPage`](#contentsfindinpagetext-options) request. #### Event: 'media-started-playing' @@ -1324,7 +1324,7 @@ can be obtained by subscribing to [`found-in-page`](web-contents.md#event-found- #### `contents.stopFindInPage(action)` * `action` string - Specifies the action to take place when ending - [`webContents.findInPage`] request. + [`webContents.findInPage`](#contentsfindinpagetext-options) request. * `clearSelection` - Clear the selection. * `keepSelection` - Translate the selection into a normal selection. * `activateSelection` - Focus and click the selection node. @@ -1712,7 +1712,7 @@ app.whenReady().then(() => { #### `contents.sendToFrame(frameId, channel, ...args)` -* `frameId` Integer | [number, number] - the ID of the frame to send to, or a +* `frameId` Integer | \[number, number] - the ID of the frame to send to, or a pair of `[processId, frameId]` if the frame is in a different process to the main frame. * `channel` string diff --git a/docs/api/webview-tag.md b/docs/api/webview-tag.md index 499d348b4c5..c6f924af42e 100644 --- a/docs/api/webview-tag.md +++ b/docs/api/webview-tag.md @@ -609,7 +609,7 @@ examples. ### `.sendToFrame(frameId, channel, ...args)` -* `frameId` [number, number] - `[processId, frameId]` +* `frameId` \[number, number] - `[processId, frameId]` * `channel` string * `...args` any[] @@ -909,7 +909,7 @@ webview.addEventListener('close', () => { Returns: -* `frameId` [number, number] - pair of `[processId, frameId]`. +* `frameId` \[number, number] - pair of `[processId, frameId]`. * `channel` string * `args` any[] diff --git a/docs/development/debugging-with-xcode.md b/docs/development/debugging-with-xcode.md index 7e88a92bba7..ded8328be40 100644 --- a/docs/development/debugging-with-xcode.md +++ b/docs/development/debugging-with-xcode.md @@ -17,7 +17,7 @@ See `gn help gen` for more information on generating IDE projects with GN. Launch Electron app after build. You can now open the xcode workspace created above and attach to the Electron process -through the Debug > Attach To Process > Electron debug menu. [Note: If you want to debug +through the Debug > Attach To Process > Electron debug menu. \[Note: If you want to debug the renderer process, you need to attach to the Electron Helper as well.] You can now set breakpoints in any of the indexed files. However, you will not be able diff --git a/docs/glossary.md b/docs/glossary.md index 175e554ad1c..1b5bcbc93e5 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -4,7 +4,7 @@ This page defines some terminology that is commonly used in Electron development ### ASAR -ASAR stands for Atom Shell Archive Format. An [asar] archive is a simple +ASAR stands for Atom Shell Archive Format. An [asar][] archive is a simple `tar`-like format that concatenates files into a single file. Electron can read arbitrary files from it without unpacking the whole file. @@ -20,7 +20,7 @@ macOS implement their own version of code signing. As a desktop app developer, it's important that you sign your code if you plan on distributing it to the general public. -For more information, read the [Code Signing] tutorial. +For more information, read the [Code Signing][] tutorial. ### context isolation @@ -30,7 +30,7 @@ contents in your renderer process. With context isolation enabled, the only way to expose APIs from your preload script is through the `contextBridge` API. -For more information, read the [Context Isolation] tutorial. +For more information, read the [Context Isolation][] tutorial. See also: [preload script](#preload-script), [renderer process](#renderer-process) @@ -83,7 +83,7 @@ See also: [process](#process), [renderer process](#renderer-process) ### MAS Acronym for Apple's Mac App Store. For details on submitting your app to the -MAS, see the [Mac App Store Submission Guide]. +MAS, see the [Mac App Store Submission Guide][]. ### Mojo @@ -105,7 +105,7 @@ More information can be found in [Microsoft's documentation][msi]. ### native modules -Native modules (also called [addons] in +Native modules (also called [addons][] in Node.js) are modules written in C or C++ that can be loaded into Node.js or Electron using the require() function, and used as if they were an ordinary Node.js module. They are used primarily to provide an interface @@ -116,7 +116,7 @@ likely to use a different V8 version from the Node binary installed in your system, you have to manually specify the location of Electron’s headers when building native modules. -For more information, read the [Native Node Modules] tutorial. +For more information, read the [Native Node Modules][] tutorial. ### notarization @@ -132,7 +132,7 @@ OSR (offscreen rendering) can be used for loading heavy page in background and then displaying it after (it will be much faster). It allows you to render page without showing it on screen. -For more information, read the [Offscreen Rendering] tutorial. +For more information, read the [Offscreen Rendering][] tutorial. ### preload script @@ -146,7 +146,7 @@ See also: [renderer process](#renderer-process), [context isolation](#context-is ### process A process is an instance of a computer program that is being executed. Electron -apps that make use of the [main] and one or many [renderer] process are +apps that make use of the [main][] and one or many [renderer][] process are actually running several programs simultaneously. In Node.js and Electron, each running process has a `process` object. This @@ -169,14 +169,14 @@ See also: [process](#process), [main process](#main-process) The sandbox is a security feature inherited from Chromium that restricts your renderer processes to a limited set of permissions. -For more information, read the [Process Sandboxing] tutorial. +For more information, read the [Process Sandboxing][] tutorial. See also: [process](#process) ### Squirrel Squirrel is an open-source framework that enables Electron apps to update -automatically as new versions are released. See the [autoUpdater] API for +automatically as new versions are released. See the [autoUpdater][] API for info about getting started with Squirrel. ### userland diff --git a/docs/styleguide.md b/docs/styleguide.md index 92a5c1ccf73..40814b2f87b 100644 --- a/docs/styleguide.md +++ b/docs/styleguide.md @@ -113,13 +113,13 @@ Using `autoUpdater` as an example: * [Instance Methods](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Prototype_methods) must be listed under an `### Instance Methods` chapter. * All methods that have a return value must start their description with - "Returns `[TYPE]` - [Return description]" + "Returns `[TYPE]` - \[Return description]" * If the method returns an `Object`, its structure can be specified using a colon followed by a newline then an unordered list of properties in the same style as function parameters. * Instance Events must be listed under an `### Instance Events` chapter. * Instance Properties must be listed under an `### Instance Properties` chapter. - * Instance Properties must start with "A [Property Type] ..." + * Instance Properties must start with "A \[Property Type] ..." Using the `Session` and `Cookies` classes as an example: diff --git a/docs/tutorial/application-distribution.md b/docs/tutorial/application-distribution.md index 6f5d86290dc..40cd6653677 100644 --- a/docs/tutorial/application-distribution.md +++ b/docs/tutorial/application-distribution.md @@ -55,7 +55,7 @@ will then be your distribution to deliver to users. ### With an app source code archive (asar) Instead of shipping your app by copying all of its source files, you can -package your app into an [asar] archive to improve the performance of reading +package your app into an [asar][] archive to improve the performance of reading files on platforms like Windows, if you are not already using a bundler such as Parcel or Webpack. diff --git a/docs/tutorial/automated-testing.md b/docs/tutorial/automated-testing.md index 7d26df1c0d4..993d6e46d67 100644 --- a/docs/tutorial/automated-testing.md +++ b/docs/tutorial/automated-testing.md @@ -117,9 +117,9 @@ driver.quit() ## Using Playwright [Microsoft Playwright](https://playwright.dev) is an end-to-end testing framework built -using browser-specific remote debugging protocols, similar to the [Puppeteer] headless +using browser-specific remote debugging protocols, similar to the [Puppeteer][] headless Node.js API but geared towards end-to-end testing. Playwright has experimental Electron -support via Electron's support for the [Chrome DevTools Protocol] (CDP). +support via Electron's support for the [Chrome DevTools Protocol][] (CDP). ### Install dependencies diff --git a/docs/tutorial/code-signing.md b/docs/tutorial/code-signing.md index dca031d53f8..dff75072f5c 100644 --- a/docs/tutorial/code-signing.md +++ b/docs/tutorial/code-signing.md @@ -40,9 +40,9 @@ your app isn't doing anything to endanger its users. To start the process, ensure that you fulfill the requirements for signing and notarizing your app: -1. Enroll in the [Apple Developer Program] (requires an annual fee) -2. Download and install [Xcode] - this requires a computer running macOS -3. Generate, download, and install [signing certificates] +1. Enroll in the [Apple Developer Program][] (requires an annual fee) +2. Download and install [Xcode][] - this requires a computer running macOS +3. Generate, download, and install [signing certificates][] Electron's ecosystem favors configuration and freedom, so there are multiple ways to get your application signed and notarized. @@ -51,8 +51,8 @@ ways to get your application signed and notarized. If you're using Electron's favorite build tool, getting your application signed and notarized requires a few additions to your configuration. [Forge](https://electronforge.io) is a -collection of the official Electron tools, using [`electron-packager`], -[`@electron/osx-sign`], and [`@electron/notarize`] under the hood. +collection of the official Electron tools, using [`electron-packager`][], +[`@electron/osx-sign`][], and [`@electron/notarize`][] under the hood. Detailed instructions on how to configure your application can be found in the [Signing macOS Apps](https://www.electronforge.io/guides/code-signing/code-signing-macos) guide in @@ -61,8 +61,8 @@ the Electron Forge docs. ### Using Electron Packager If you're not using an integrated build pipeline like Forge, you -are likely using [`electron-packager`], which includes [`@electron/osx-sign`] and -[`@electron/notarize`]. +are likely using [`electron-packager`][], which includes [`@electron/osx-sign`][] and +[`@electron/notarize`][]. If you're using Packager's API, you can pass [in configuration that both signs and notarizes your application](https://electron.github.io/electron-packager/main/interfaces/electronpackager.options.html). @@ -82,7 +82,7 @@ packager({ ### Signing Mac App Store applications -See the [Mac App Store Guide]. +See the [Mac App Store Guide][]. ## Signing Windows builds @@ -110,7 +110,7 @@ Electron Forge is the recommended way to sign your `Squirrel.Windows` and `WiX M ### Using electron-winstaller (Squirrel.Windows) -[`electron-winstaller`] is a package that can generate Squirrel.Windows installers for your +[`electron-winstaller`][] is a package that can generate Squirrel.Windows installers for your Electron app. This is the tool used under the hood by Electron Forge's [Squirrel.Windows Maker][maker-squirrel]. If you're not using Electron Forge and want to use `electron-winstaller` directly, use the `certificateFile` and `certificatePassword` configuration @@ -135,16 +135,16 @@ try { } ``` -For full configuration options, check out the [`electron-winstaller`] repository! +For full configuration options, check out the [`electron-winstaller`][] repository! ### Using electron-wix-msi (WiX MSI) -[`electron-wix-msi`] is a package that can generate MSI installers for your +[`electron-wix-msi`][] is a package that can generate MSI installers for your Electron app. This is the tool used under the hood by Electron Forge's [MSI Maker][maker-msi]. If you're not using Electron Forge and want to use `electron-wix-msi` directly, use the `certificateFile` and `certificatePassword` configuration options -or pass in parameters directly to [SignTool.exe] with the `signWithParams` option. +or pass in parameters directly to [SignTool.exe][] with the `signWithParams` option. ```js {12-13} import { MSICreator } from 'electron-wix-msi' @@ -177,7 +177,7 @@ supportBinaries.forEach(async (binary) => { await msiCreator.compile() ``` -For full configuration options, check out the [`electron-wix-msi`] repository! +For full configuration options, check out the [`electron-wix-msi`][] repository! ### Using Electron Builder @@ -186,7 +186,7 @@ can find [its documentation here](https://www.electron.build/code-signing). ### Signing Windows Store applications -See the [Windows Store Guide]. +See the [Windows Store Guide][]. [apple developer program]: https://developer.apple.com/programs/ [`@electron/osx-sign`]: https://github.com/electron/osx-sign diff --git a/docs/tutorial/context-isolation.md b/docs/tutorial/context-isolation.md index 140d9d75726..c68c62faca8 100644 --- a/docs/tutorial/context-isolation.md +++ b/docs/tutorial/context-isolation.md @@ -72,7 +72,7 @@ contextBridge.exposeInMainWorld('myAPI', { ## Usage with TypeScript -If you're building your Electron app with TypeScript, you'll want to add types to your APIs exposed over the context bridge. The renderer's `window` object won't have the correct typings unless you extend the types with a [declaration file]. +If you're building your Electron app with TypeScript, you'll want to add types to your APIs exposed over the context bridge. The renderer's `window` object won't have the correct typings unless you extend the types with a [declaration file][]. For example, given this `preload.ts` script: diff --git a/docs/tutorial/dark-mode.md b/docs/tutorial/dark-mode.md index 41e9fd31126..0e53d42e02b 100644 --- a/docs/tutorial/dark-mode.md +++ b/docs/tutorial/dark-mode.md @@ -13,7 +13,7 @@ from the OS. If your app has its own dark mode, you should toggle it on and off in sync with the system's dark mode setting. You can do this by using the -[prefers-color-scheme] CSS media query. +[prefers-color-scheme][] CSS media query. ### Manually update your own interfaces diff --git a/docs/tutorial/examples.md b/docs/tutorial/examples.md index c30e0fc7e87..4870ee6433b 100644 --- a/docs/tutorial/examples.md +++ b/docs/tutorial/examples.md @@ -36,13 +36,13 @@ guide!). | Guide | Description | | :-------------------- | ------------------------------------------------------------------------------------------------------------------- | -| [Message ports] | This guide provides some examples of how you might use MessagePorts in your app to communicate different processes. | -| [Device access] | Learn how to access the device hardware (Bluetooth, USB, Serial). | -| [Keyboard shortcuts] | Configure local and global keyboard shortcuts for your Electron application. | -| [Multithreading] | With Web Workers, it is possible to run JavaScript in OS-level threads | -| [Offscreen rendering] | Offscreen rendering lets you obtain the content of a BrowserWindow in a bitmap, so it can be rendered anywhere. | -| [Spellchecker] | Learn how to use the built-in spellchecker, set languages, etc. | -| [Web embeds] | Discover the different ways to embed third-party web content in your application. | +| [Message ports][] | This guide provides some examples of how you might use MessagePorts in your app to communicate different processes. | +| [Device access][] | Learn how to access the device hardware (Bluetooth, USB, Serial). | +| [Keyboard shortcuts][] | Configure local and global keyboard shortcuts for your Electron application. | +| [Multithreading][] | With Web Workers, it is possible to run JavaScript in OS-level threads | +| [Offscreen rendering][] | Offscreen rendering lets you obtain the content of a BrowserWindow in a bitmap, so it can be rendered anywhere. | +| [Spellchecker][] | Learn how to use the built-in spellchecker, set languages, etc. | +| [Web embeds][] | Discover the different ways to embed third-party web content in your application. | @@ -55,3 +55,10 @@ our [Discord server][discord] and let us know! [app]: ../api/app.md [discord]: https://discord.gg/electronjs [fiddle]: https://www.electronjs.org/fiddle +[Message ports]: ./message-ports.md +[Device access]: ./devices.md +[Keyboard shortcuts]: ./keyboard-shortcuts.md +[Multithreading]: ./multithreading.md +[Offscreen rendering]: ./offscreen-rendering.md +[Spellchecker]: ./spellchecker.md +[Web embeds]: ./web-embeds.md diff --git a/docs/tutorial/forge-overview.md b/docs/tutorial/forge-overview.md index 0ec6872ce7f..8851d4733e6 100644 --- a/docs/tutorial/forge-overview.md +++ b/docs/tutorial/forge-overview.md @@ -6,23 +6,23 @@ a single extensible interface so that anyone can jump right into making Electron ## Getting started -The [Electron Forge docs] contain detailed information on taking your application +The [Electron Forge docs][] contain detailed information on taking your application from source code to your end users' machines. This includes: -* Packaging your application [(package)] -* Generating executables and installers for each OS [(make)], and, -* Publishing these files to online platforms to download [(publish)]. +* Packaging your application [(package)][] +* Generating executables and installers for each OS [(make)][], and, +* Publishing these files to online platforms to download [(publish)][]. -For beginners, we recommend following through Electron's [tutorial] to develop, build, +For beginners, we recommend following through Electron's [tutorial][] to develop, build, package and publish your first Electron app. If you have already developed an app on your machine -and want to start on packaging and distribution, start from [step 5] of the tutorial. +and want to start on packaging and distribution, start from [step 5][] of the tutorial. ## Getting help * If you need help with developing your app, our [community Discord server][discord] is a great place to get advice from other Electron app developers. -* If you suspect you're running into a bug with Forge, please check the [GitHub issue tracker] +* If you suspect you're running into a bug with Forge, please check the [GitHub issue tracker][] to see if any existing issues match your problem. If not, feel free to fill out our bug report template and submit a new issue. diff --git a/docs/tutorial/introduction.md b/docs/tutorial/introduction.md index 58143552407..b7bfba0734e 100644 --- a/docs/tutorial/introduction.md +++ b/docs/tutorial/introduction.md @@ -15,9 +15,9 @@ experience required. ## Getting started -We recommend you to start with the [tutorial], which guides you through the +We recommend you to start with the [tutorial][], which guides you through the process of developing an Electron app and distributing it to users. -The [examples] and [API documentation] are also good places to browse around +The [examples][] and [API documentation][] are also good places to browse around and discover new things. ## Running examples with Electron Fiddle diff --git a/docs/tutorial/ipc.md b/docs/tutorial/ipc.md index c1af5d1f085..92804bc679d 100644 --- a/docs/tutorial/ipc.md +++ b/docs/tutorial/ipc.md @@ -15,7 +15,7 @@ native API from your UI or triggering changes in your web contents from native m ## IPC channels In Electron, processes communicate by passing messages through developer-defined "channels" -with the [`ipcMain`] and [`ipcRenderer`] modules. These channels are +with the [`ipcMain`][] and [`ipcRenderer`][] modules. These channels are **arbitrary** (you can name them anything you want) and **bidirectional** (you can use the same channel name for both modules). @@ -25,16 +25,16 @@ you can use as a reference for your app code. ## Understanding context-isolated processes Before proceeding to implementation details, you should be familiar with the idea of using a -[preload script] to import Node.js and Electron modules in a context-isolated renderer process. +[preload script][] to import Node.js and Electron modules in a context-isolated renderer process. -* For a full overview of Electron's process model, you can read the [process model docs]. +* For a full overview of Electron's process model, you can read the [process model docs][]. * For a primer into exposing APIs from your preload script using the `contextBridge` module, check -out the [context isolation tutorial]. +out the [context isolation tutorial][]. ## Pattern 1: Renderer to main (one-way) To fire a one-way IPC message from a renderer process to the main process, you can use the -[`ipcRenderer.send`] API to send a message that is then received by the [`ipcMain.on`] API. +[`ipcRenderer.send`][] API to send a message that is then received by the [`ipcMain.on`][] API. You usually use this pattern to call a main process API from your web contents. We'll demonstrate this pattern by creating a simple app that can programmatically change its window title. @@ -78,7 +78,7 @@ app.whenReady().then(() => { //... ``` -The above `handleSetTitle` callback has two parameters: an [IpcMainEvent] structure and a +The above `handleSetTitle` callback has two parameters: an [IpcMainEvent][] structure and a `title` string. Whenever a message comes through the `set-title` channel, this function will find the BrowserWindow instance attached to the message sender and use the `win.setTitle` API on it. @@ -108,7 +108,7 @@ At this point, you'll be able to use the `window.electronAPI.setTitle()` functio process. :::caution Security warning -We don't directly expose the whole `ipcRenderer.send` API for [security reasons]. Make sure to +We don't directly expose the whole `ipcRenderer.send` API for [security reasons][]. Make sure to limit the renderer's access to Electron APIs as much as possible. ::: @@ -153,8 +153,8 @@ to your BrowserWindow title! ## Pattern 2: Renderer to main (two-way) A common application for two-way IPC is calling a main process module from your renderer process -code and waiting for a result. This can be done by using [`ipcRenderer.invoke`] paired with -[`ipcMain.handle`]. +code and waiting for a result. This can be done by using [`ipcRenderer.invoke`][] paired with +[`ipcMain.handle`][]. In the following example, we'll be opening a native file dialog from the renderer process and returning the selected file's path. @@ -236,7 +236,7 @@ contextBridge.exposeInMainWorld('electronAPI', { ``` :::caution Security warning -We don't directly expose the whole `ipcRenderer.invoke` API for [security reasons]. Make sure to +We don't directly expose the whole `ipcRenderer.invoke` API for [security reasons][]. Make sure to limit the renderer's access to Electron APIs as much as possible. ::: @@ -359,7 +359,7 @@ renderer process until a reply is received. When sending a message from the main process to a renderer process, you need to specify which renderer is receiving the message. Messages need to be sent to a renderer process -via its [`WebContents`] instance. This WebContents instance contains a [`send`][webcontents-send] method +via its [`WebContents`][] instance. This WebContents instance contains a [`send`][webcontents-send] method that can be used in the same way as `ipcRenderer.send`. To demonstrate this pattern, we'll be building a number counter controlled by the native operating @@ -440,7 +440,7 @@ After loading the preload script, your renderer process should have access to th `window.electronAPI.onUpdateCounter()` listener function. :::caution Security warning -We don't directly expose the whole `ipcRenderer.on` API for [security reasons]. Make sure to +We don't directly expose the whole `ipcRenderer.on` API for [security reasons][]. Make sure to limit the renderer's access to Electron APIs as much as possible. ::: @@ -540,7 +540,7 @@ and `ipcRenderer` modules. To achieve this, you have two options: * Use the main process as a message broker between renderers. This would involve sending a message from one renderer to the main process, which would forward the message to the other renderer. -* Pass a [MessagePort] from the main process to both renderers. This will allow direct communication +* Pass a [MessagePort][] from the main process to both renderers. This will allow direct communication between renderers after the initial setup. ## Object serialization diff --git a/docs/tutorial/keyboard-shortcuts.md b/docs/tutorial/keyboard-shortcuts.md index 30b9429e83c..52bda0e25f6 100644 --- a/docs/tutorial/keyboard-shortcuts.md +++ b/docs/tutorial/keyboard-shortcuts.md @@ -10,8 +10,8 @@ for your Electron application. ### Local Shortcuts Local keyboard shortcuts are triggered only when the application is focused. -To configure a local keyboard shortcut, you need to specify an [`accelerator`] -property when creating a [MenuItem] within the [Menu] module. +To configure a local keyboard shortcut, you need to specify an [`accelerator`][] +property when creating a [MenuItem][] within the [Menu][] module. Starting with a working application from the [Quick Start Guide](quick-start.md), update the `main.js` file with the @@ -48,7 +48,7 @@ generated after triggering the `click` event: "Electron rocks!". ### Global Shortcuts -To configure a global keyboard shortcut, you need to use the [globalShortcut] +To configure a global keyboard shortcut, you need to use the [globalShortcut][] module to detect keyboard events even when the application does not have keyboard focus. @@ -77,7 +77,7 @@ you will see that Electron loves global shortcuts! #### Using web APIs -If you want to handle keyboard shortcuts within a [BrowserWindow], you can +If you want to handle keyboard shortcuts within a [BrowserWindow][], you can listen for the `keyup` and `keydown` [DOM events][dom-events] inside the renderer process using the [addEventListener() API][addEventListener-api]. @@ -128,7 +128,7 @@ see that this key combination was successfully intercepted. #### Using third-party libraries If you don't want to do manual shortcut parsing, there are libraries that do -advanced key detection, such as [mousetrap]. Below are examples of usage of the +advanced key detection, such as [mousetrap][]. Below are examples of usage of the `mousetrap` running in the Renderer process: ```js diff --git a/docs/tutorial/mac-app-store-submission-guide.md b/docs/tutorial/mac-app-store-submission-guide.md index 004f204c9e2..685924eaf17 100644 --- a/docs/tutorial/mac-app-store-submission-guide.md +++ b/docs/tutorial/mac-app-store-submission-guide.md @@ -11,7 +11,7 @@ This guide provides information on: To sign Electron apps, the following tools must be installed first: * Xcode 11 or above. -* The [@electron/osx-sign] npm module. +* The [@electron/osx-sign][] npm module. You also have to register an Apple Developer account and join the [Apple Developer Program][developer-program]. diff --git a/docs/tutorial/native-file-drag-drop.md b/docs/tutorial/native-file-drag-drop.md index 0b8b5332124..c8dba82c8df 100644 --- a/docs/tutorial/native-file-drag-drop.md +++ b/docs/tutorial/native-file-drag-drop.md @@ -18,7 +18,7 @@ An example demonstrating how you can create a file on the fly to be dragged out ### Preload.js -In `preload.js` use the [`contextBridge`] to inject a method `window.electron.startDrag(...)` that will send an IPC message to the main process. +In `preload.js` use the [`contextBridge`][] to inject a method `window.electron.startDrag(...)` that will send an IPC message to the main process. ```js const { contextBridge, ipcRenderer } = require('electron') @@ -41,7 +41,7 @@ Add a draggable element to `index.html`, and reference your renderer script: ### Renderer.js -In `renderer.js` set up the renderer process to handle drag events by calling the method you added via the [`contextBridge`] above. +In `renderer.js` set up the renderer process to handle drag events by calling the method you added via the [`contextBridge`][] above. ```javascript document.getElementById('drag').ondragstart = (event) => { diff --git a/docs/tutorial/process-model.md b/docs/tutorial/process-model.md index 3e3439dd1d5..3218885967d 100644 --- a/docs/tutorial/process-model.md +++ b/docs/tutorial/process-model.md @@ -28,7 +28,7 @@ it also meant that one website crashing or hanging would affect the entire brows To solve this problem, the Chrome team decided that each tab would render in its own process, limiting the harm that buggy or malicious code on a web page could cause to the app as a whole. A single browser process then controls these processes, as well -as the application lifecycle as a whole. This diagram below from the [Chrome Comic] +as the application lifecycle as a whole. This diagram below from the [Chrome Comic][] visualizes this model: ![Chrome's multi-process architecture](../images/chrome-processes.png) diff --git a/docs/tutorial/tutorial-1-prerequisites.md b/docs/tutorial/tutorial-1-prerequisites.md index 0dffcc70eb7..c115569d947 100644 --- a/docs/tutorial/tutorial-1-prerequisites.md +++ b/docs/tutorial/tutorial-1-prerequisites.md @@ -49,7 +49,7 @@ continuing, we recommend the following resources: ### Code editor -You will need a text editor to write your code. We recommend using [Visual Studio Code], +You will need a text editor to write your code. We recommend using [Visual Studio Code][], although you can choose whichever one you prefer. ### Command line @@ -73,8 +73,8 @@ on in the tutorial. Therefore, we'll require you to: - [Create a GitHub account](https://github.com/join) - [Install Git](https://github.com/git-guides/install-git) -If you're unfamiliar with how Git works, we recommend reading GitHub's [Git guides]. You can also -use the [GitHub Desktop] app if you prefer using a visual interface over the command line. +If you're unfamiliar with how Git works, we recommend reading GitHub's [Git guides][]. You can also +use the [GitHub Desktop][] app if you prefer using a visual interface over the command line. We recommend that you create a local Git repository and publish it to GitHub before starting the tutorial, and commit your code after every step. @@ -96,8 +96,8 @@ use the latest long-term support (LTS) version. Please install Node.js using pre-built installers for your platform. You may encounter incompatibility issues with different development tools otherwise. -If you are using macOS, we recommend using a package manager like [Homebrew] or -[nvm] to avoid any directory permission issues. +If you are using macOS, we recommend using a package manager like [Homebrew][] or +[nvm][] to avoid any directory permission issues. ::: @@ -120,8 +120,8 @@ comes bundled with its own Node.js runtime. This means that your end users do no need to install Node.js themselves as a prerequisite to running your app. To check which version of Node.js is running in your app, you can access the global -[`process.versions`] variable in the main process or preload script. You can also reference -the list of versions in the [electron/releases] repository. +[`process.versions`][] variable in the main process or preload script. You can also reference +the list of versions in the [electron/releases][] repository. ::: diff --git a/docs/tutorial/tutorial-2-first-app.md b/docs/tutorial/tutorial-2-first-app.md index 935a24411b9..ff2dd5e03ba 100644 --- a/docs/tutorial/tutorial-2-first-app.md +++ b/docs/tutorial/tutorial-2-first-app.md @@ -126,7 +126,7 @@ console.log(`Hello from Electron 👋`) ``` Because Electron's main process is a Node.js runtime, you can execute arbitrary Node.js code -with the `electron` command (you can even use it as a [REPL]). To execute this script, +with the `electron` command (you can even use it as a [REPL][]). To execute this script, add `electron .` to the `start` command in the [`scripts`][package-scripts] field of your package.json. This command will tell the Electron executable to look for the main script in the current directory and run it in dev mode. @@ -258,7 +258,7 @@ app.whenReady().then(() => { }) ``` -Many of Electron's core modules are Node.js [event emitters] that adhere to Node's asynchronous +Many of Electron's core modules are Node.js [event emitters][] that adhere to Node's asynchronous event-driven architecture. The app module is one of these emitters. In Electron, BrowserWindows can only be created after the app module's [`ready`][app-ready] event @@ -288,7 +288,7 @@ open a window that displays your web page! Each web page your app displays in a window will run in a separate process called a **renderer** process (or simply _renderer_ for short). Renderer processes have access to the same JavaScript APIs and tooling you use for typical front-end web -development, such as using [webpack] to bundle and minify your code or [React][react] +development, such as using [webpack][] to bundle and minify your code or [React][react] to build your user interfaces. ## Managing your app's window lifecycle @@ -403,7 +403,7 @@ What we have done in the `launch.json` file is to create 3 configurations: that creates the process, we have to "attach" to it (`"request": "attach"`) instead of creating a new one. The renderer process is a web one, so the debugger we have to use is `chrome`. -- `Main + renderer` is a [compound task] that executes the previous ones simultaneously. +- `Main + renderer` is a [compound task][] that executes the previous ones simultaneously. :::caution @@ -419,7 +419,7 @@ in development mode. If you want to dig deeper in the debugging area, the following guides provide more information: -- [Application Debugging] +- [Application Debugging][] - [DevTools Extensions][devtools extension] ::: diff --git a/docs/tutorial/tutorial-3-preload.md b/docs/tutorial/tutorial-3-preload.md index 0aa30c5254e..97c45780e35 100644 --- a/docs/tutorial/tutorial-3-preload.md +++ b/docs/tutorial/tutorial-3-preload.md @@ -58,7 +58,7 @@ For more information, check out the [Process Sandboxing](./sandbox.md) guide. Preload scripts are injected before a web page loads in the renderer, similar to a Chrome extension's [content scripts][content-script]. To add features to your renderer -that require privileged access, you can define [global] objects through the +that require privileged access, you can define [global][] objects through the [contextBridge][contextbridge] API. To demonstrate this concept, you will create a preload script that exposes your app's @@ -115,7 +115,7 @@ There are two Node.js concepts that are used here: At this point, the renderer has access to the `versions` global, so let's display that information in the window. This variable can be accessed via `window.versions` or simply -`versions`. Create a `renderer.js` script that uses the [`document.getElementById`] +`versions`. Create a `renderer.js` script that uses the [`document.getElementById`][] DOM API to replace the displayed text for the HTML element with `info` as its `id` property. ```js title="renderer.js" diff --git a/docs/tutorial/tutorial-4-adding-features.md b/docs/tutorial/tutorial-4-adding-features.md index 92e053463f8..7b796bf383b 100644 --- a/docs/tutorial/tutorial-4-adding-features.md +++ b/docs/tutorial/tutorial-4-adding-features.md @@ -49,7 +49,7 @@ and deeper operating system integrations. To get started, check out the :::note Let us know if something is missing! -If you can't find what you are looking for, please let us know on [GitHub] or in +If you can't find what you are looking for, please let us know on [GitHub][] or in our [Discord server][discord]! ::: diff --git a/docs/tutorial/tutorial-5-packaging.md b/docs/tutorial/tutorial-5-packaging.md index b917bbe58da..87e30461a56 100644 --- a/docs/tutorial/tutorial-5-packaging.md +++ b/docs/tutorial/tutorial-5-packaging.md @@ -24,7 +24,7 @@ This is **part 5** of the Electron tutorial. ## Learning goals In this part of the tutorial, we'll be going over the basics of packaging and distributing -your app with [Electron Forge]. +your app with [Electron Forge][]. ## Using Electron Forge @@ -35,8 +35,8 @@ as a **distributable**). Distributables can be either installers (e.g. MSI on Wi portable executable files (e.g. `.app` on macOS). Electron Forge is an all-in-one tool that handles the packaging and distribution of Electron -apps. Under the hood, it combines a lot of existing Electron tools (e.g. [`electron-packager`], -[`@electron/osx-sign`], [`electron-winstaller`], etc.) into a single interface so you do not +apps. Under the hood, it combines a lot of existing Electron tools (e.g. [`electron-packager`][], +[`@electron/osx-sign`][], [`electron-winstaller`][], etc.) into a single interface so you do not have to worry about wiring them all together. ### Importing your project into Forge @@ -65,7 +65,7 @@ to your `package.json` file. :::info CLI documentation For more information on `make` and other Forge APIs, check out -the [Electron Forge CLI documentation]. +the [Electron Forge CLI documentation][]. ::: @@ -106,21 +106,21 @@ created your first bundled Electron application. :::tip Distributable formats Electron Forge can be configured to create distributables in different OS-specific formats -(e.g. DMG, deb, MSI, etc.). See Forge's [Makers] documentation for all configuration options. +(e.g. DMG, deb, MSI, etc.). See Forge's [Makers][] documentation for all configuration options. ::: :::tip Creating and adding application icons Setting custom application icons requires a few additions to your config. -Check out [Forge's icon tutorial] for more information. +Check out [Forge's icon tutorial][] for more information. ::: :::info Packaging without Electron Forge If you want to manually package your code, or if you're just interested understanding the -mechanics behind packaging an Electron app, check out the full [Application Packaging] +mechanics behind packaging an Electron app, check out the full [Application Packaging][] documentation. ::: diff --git a/docs/tutorial/tutorial-6-publishing-updating.md b/docs/tutorial/tutorial-6-publishing-updating.md index f10c5369687..44058c69971 100644 --- a/docs/tutorial/tutorial-6-publishing-updating.md +++ b/docs/tutorial/tutorial-6-publishing-updating.md @@ -31,7 +31,7 @@ at [https://update.electronjs.org](https://update.electronjs.org). Its requireme - Your app runs on macOS or Windows - Your app has a public GitHub repository -- Builds are published to [GitHub releases] +- Builds are published to [GitHub releases][] - Builds are [code signed][code-signed] At this point, we'll assume that you have already pushed all your @@ -47,7 +47,7 @@ you need to keep your code repository private, please refer to our ## Publishing a GitHub release -Electron Forge has [Publisher] plugins that can automate the distribution +Electron Forge has [Publisher][] plugins that can automate the distribution of your packaged application to various sources. In this tutorial, we will be using the GitHub Publisher, which will allow us to publish our code to GitHub releases. @@ -65,7 +65,7 @@ with the `public_repo` scope, which gives write access to your public repositori #### Installing the module -Forge's [GitHub Publisher] is a plugin that +Forge's [GitHub Publisher][] is a plugin that needs to be installed in your project's `devDependencies`: ```sh npm2yarn @@ -76,7 +76,7 @@ npm install --save-dev @electron-forge/publisher-github Once you have it installed, you need to set it up in your Forge configuration. A full list of options is documented in the Forge's -[`PublisherGitHubConfig`] API docs. +[`PublisherGitHubConfig`][] API docs. ```js title='forge.config.js' module.exports = { @@ -114,7 +114,7 @@ variable. ### Running the publish command -Add Forge's [publish command] to your npm scripts. +Add Forge's [publish command][] to your npm scripts. ```json {6} title='package.json' //... @@ -155,8 +155,8 @@ Publishing locally can be painful, especially because you can only create distri for your host operating system (i.e. you can't publish a Window `.exe` file from macOS). A solution for this would be to publish your app via automation workflows -such as [GitHub Actions], which can run tasks in the -cloud on Ubuntu, macOS, and Windows. This is the exact approach taken by [Electron Fiddle]. +such as [GitHub Actions][], which can run tasks in the +cloud on Ubuntu, macOS, and Windows. This is the exact approach taken by [Electron Fiddle][]. You can refer to Fiddle's [Build and Release pipeline][fiddle-build] and [Forge configuration][fiddle-forge-config] for more details. @@ -165,7 +165,7 @@ for more details. Now that we have a functional release system via GitHub releases, we now need to tell our Electron app to download an update whenever a new release is out. Electron apps do this -via the [autoUpdater] module, which reads from an update server feed to check if a new version +via the [autoUpdater][] module, which reads from an update server feed to check if a new version is available for download. The update.electronjs.org service provides an updater-compatible feed. For example, Electron @@ -175,7 +175,7 @@ to see if a newer GitHub release is available. After your release is published to GitHub, the update.electronjs.org service should work for your application. The only step left is to configure the feed with the autoUpdater module. -To make this process easier, the Electron team maintains the [`update-electron-app`] module, +To make this process easier, the Electron team maintains the [`update-electron-app`][] module, which sets up the autoUpdater boilerplate for update.electronjs.org in one function call — no configuration required. This module will search for the update.electronjs.org feed that matches your project's package.json `"repository"` field. @@ -214,7 +214,7 @@ own update server and configure the autoUpdater module yourself. From here, you have officially completed our tutorial to Electron. Feel free to explore the rest of our docs and happy developing! If you have questions, please stop by our community -[Discord server]. +[Discord server][]. ::: diff --git a/docs/tutorial/updates.md b/docs/tutorial/updates.md index ed7c1d8faf9..71c57ee42a2 100644 --- a/docs/tutorial/updates.md +++ b/docs/tutorial/updates.md @@ -12,7 +12,7 @@ Electron's [autoUpdater](../api/auto-updater.md) module. ## Using update.electronjs.org -The Electron team maintains [update.electronjs.org], a free and open-source +The Electron team maintains [update.electronjs.org][], a free and open-source webservice that Electron apps can use to self-update. The service is designed for Electron apps that meet the following criteria: @@ -21,7 +21,7 @@ for Electron apps that meet the following criteria: - Builds are published to [GitHub Releases][gh-releases] - Builds are [code-signed](./code-signing.md) -The easiest way to use this service is by installing [update-electron-app], +The easiest way to use this service is by installing [update-electron-app][], a Node.js module preconfigured for use with update.electronjs.org. Install the module using your Node.js package manager of choice: diff --git a/docs/tutorial/window-customization.md b/docs/tutorial/window-customization.md index 13250161fb1..3c1ce9269d3 100644 --- a/docs/tutorial/window-customization.md +++ b/docs/tutorial/window-customization.md @@ -7,7 +7,7 @@ macOS, Windows, and Linux. ## Create frameless windows -A frameless window is a window that has no [chrome]. Not to be confused with the Google +A frameless window is a window that has no [chrome][]. Not to be confused with the Google Chrome browser, window _chrome_ refers to the parts of the window (e.g. toolbars, controls) that are not a part of the web page. @@ -93,7 +93,7 @@ win.setWindowButtonVisibility(false) ## Window Controls Overlay _macOS_ _Windows_ -The [Window Controls Overlay API] is a web standard that gives web apps the ability to +The [Window Controls Overlay API][] is a web standard that gives web apps the ability to customize their title bar region when installed on desktop. Electron exposes this API through the `BrowserWindow` constructor option `titleBarOverlay`. @@ -155,7 +155,7 @@ const win = new BrowserWindow({ transparent: true }) [#1335](https://github.com/electron/electron/issues/1335) for details. * Transparent windows are not resizable. Setting `resizable` to `true` may make a transparent window stop working on some platforms. -* The CSS [`blur()`] filter only applies to the window's web contents, so there is no way to apply +* The CSS [`blur()`][] filter only applies to the window's web contents, so there is no way to apply blur effect to the content below the window (i.e. other applications open on the user's system). * The window will not be transparent when DevTools is opened. diff --git a/package.json b/package.json index 8ccdee44cf9..76a6dec6c3f 100644 --- a/package.json +++ b/package.json @@ -54,8 +54,7 @@ "klaw": "^3.0.0", "lint": "^1.1.2", "lint-staged": "^10.2.11", - "markdownlint": "^0.26.2", - "markdownlint-cli": "^0.32.2", + "markdownlint-cli": "^0.33.0", "minimist": "^1.2.6", "null-loader": "^4.0.0", "pre-flight": "^1.1.0", @@ -90,7 +89,7 @@ "lint:gn": "node ./script/lint.js --gn", "lint:docs": "remark docs -qf && npm run lint:js-in-markdown && npm run create-typescript-definitions && npm run lint:docs-relative-links && npm run lint:markdownlint", "lint:docs-relative-links": "python3 ./script/check-relative-doc-links.py", - "lint:markdownlint": "markdownlint \"*.md\" \"docs/**/*.md\"", + "lint:markdownlint": "markdownlint -r ./script/markdownlint-emd001.js \"*.md\" \"docs/**/*.md\"", "lint:js-in-markdown": "standard-markdown docs", "create-api-json": "node script/create-api-json.js", "create-typescript-definitions": "npm run create-api-json && electron-typescript-definitions --api=electron-api.json && node spec/ts-smoke/runner.js", diff --git a/script/markdownlint-emd001.js b/script/markdownlint-emd001.js new file mode 100644 index 00000000000..a415ba503d2 --- /dev/null +++ b/script/markdownlint-emd001.js @@ -0,0 +1,21 @@ +const { addError, getLineMetadata, getReferenceLinkImageData } = require('markdownlint/helpers'); + +module.exports = { + names: ['EMD001', 'no-shortcut-reference-links'], + description: + 'Disallow shortcut reference links (those with no link label)', + tags: ['images', 'links'], + function: function EMD001 (params, onError) { + const lineMetadata = getLineMetadata(params); + const { shortcuts } = getReferenceLinkImageData(lineMetadata); + for (const [shortcut, occurrences] of shortcuts) { + for (const [lineNumber] of occurrences) { + addError( + onError, + lineNumber + 1, // human-friendly line numbers (1-based) + `Disallowed shortcut reference link: "${shortcut}"` + ); + } + } + } +}; diff --git a/yarn.lock b/yarn.lock index 0214c3557c0..c86ff3ca471 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1902,7 +1902,7 @@ commander@^7.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -commander@~9.4.0: +commander@~9.4.1: version "9.4.1" resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== @@ -3297,10 +3297,10 @@ ignore@^5.0.0, ignore@^5.1.1, ignore@^5.1.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== -ignore@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" - integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== +ignore@~5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== import-fresh@^3.0.0: version "3.1.0" @@ -3679,10 +3679,10 @@ json5@^2.0.0, json5@^2.1.2: dependencies: minimist "^1.2.5" -jsonc-parser@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.1.0.tgz#73b8f0e5c940b83d03476bc2e51a20ef0932615d" - integrity sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg== +jsonc-parser@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== jsonfile@^4.0.0: version "4.0.0" @@ -4069,31 +4069,25 @@ markdown-it@^10.0.0: mdurl "^1.0.1" uc.micro "^1.0.5" -markdownlint-cli@^0.32.2: - version "0.32.2" - resolved "https://registry.yarnpkg.com/markdownlint-cli/-/markdownlint-cli-0.32.2.tgz#b7b5c5808039aef4022aef603efaa607caf8e0de" - integrity sha512-xmJT1rGueUgT4yGNwk6D0oqQr90UJ7nMyakXtqjgswAkEhYYqjHew9RY8wDbOmh2R270IWjuKSeZzHDEGPAUkQ== +markdownlint-cli@^0.33.0: + version "0.33.0" + resolved "https://registry.yarnpkg.com/markdownlint-cli/-/markdownlint-cli-0.33.0.tgz#703af1234c32c309ab52fcd0e8bc797a34e2b096" + integrity sha512-zMK1oHpjYkhjO+94+ngARiBBrRDEUMzooDHBAHtmEIJ9oYddd9l3chCReY2mPlecwH7gflQp1ApilTo+o0zopQ== dependencies: - commander "~9.4.0" + commander "~9.4.1" get-stdin "~9.0.0" glob "~8.0.3" - ignore "~5.2.0" + ignore "~5.2.4" js-yaml "^4.1.0" - jsonc-parser "~3.1.0" - markdownlint "~0.26.2" - markdownlint-rule-helpers "~0.17.2" - minimatch "~5.1.0" + jsonc-parser "~3.2.0" + markdownlint "~0.27.0" + minimatch "~5.1.2" run-con "~1.2.11" -markdownlint-rule-helpers@~0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.17.2.tgz#64d6e8c66e497e631b0e40cf1cef7ca622a0b654" - integrity sha512-XaeoW2NYSlWxMCZM2B3H7YTG6nlaLfkEZWMBhr4hSPlq9MuY2sy83+Xr89jXOqZMZYjvi5nBCGoFh7hHoPKZmA== - -markdownlint@^0.26.2, markdownlint@~0.26.2: - version "0.26.2" - resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.26.2.tgz#11d3d03e7f0dd3c2e239753ee8fd064a861d9237" - integrity sha512-2Am42YX2Ex5SQhRq35HxYWDfz1NLEOZWWN25nqd2h3AHRKsGRE+Qg1gt1++exW792eXTrR4jCNHfShfWk9Nz8w== +markdownlint@~0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.27.0.tgz#9dabf7710a4999e2835e3c68317f1acd0bc89049" + integrity sha512-HtfVr/hzJJmE0C198F99JLaeada+646B5SaG2pVoEakLFI6iRGsvMqrnnrflq8hm1zQgwskEgqSnhDW11JBp0w== dependencies: markdown-it "13.0.1" @@ -4434,13 +4428,20 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.4: dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1, minimatch@~5.1.0: +minimatch@^5.0.1: version "5.1.1" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.1.tgz#6c9dffcf9927ff2a31e74b5af11adf8b9604b022" integrity sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g== dependencies: brace-expansion "^2.0.1" +minimatch@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.2.tgz#0939d7d6f0898acbd1508abe534d1929368a8fff" + integrity sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.0.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.0: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"