Skip to content
This repository has been archived by the owner on Sep 29, 2023. It is now read-only.

Revamp and move to TypeScript #898

Merged
merged 59 commits into from
Mar 15, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
90df289
Revamp and move to TypeScript (! WIP !)
ronjouch Feb 1, 2020
8a2fa24
Adjust .npmignore, document no-webpack issue
ronjouch Feb 2, 2020
3bc64c1
PR fixes
ronjouch Feb 8, 2020
b99702a
Restore Squirrel, make getTmpDir helper
ronjouch Feb 8, 2020
e257c27
Make electron-packager verbose too when using `--verbose`
ronjouch Feb 8, 2020
5d2fb00
Validate Electron version and warn on using old electron
ronjouch Feb 8, 2020
a9925ee
Default to Electron 8, fix zoom broken due to electron API change
ronjouch Feb 8, 2020
85a728a
Start making eslint happy, and use typed eslint (thx remusao)
ronjouch Feb 8, 2020
86093d8
Bump compilation target, as node >= 8.10 will eat es2017 happily
ronjouch Feb 8, 2020
833d161
Make eslint happy in CLI, which was the occasion to wrap callbackful-…
ronjouch Feb 8, 2020
da28422
Work around npm lock bug
ronjouch Feb 9, 2020
bb654e4
Restore prettier, accidentally removed while adding typed-eslint
ronjouch Feb 9, 2020
f325e42
Type options and start simplifying. WIP, works but tests broken
ronjouch Feb 13, 2020
95d9444
Back to yarn in deps, as discussed
ronjouch Feb 13, 2020
b7b7be6
Update README todos
ronjouch Feb 13, 2020
e2970f2
Default to Electron 8.0.1
ronjouch Feb 14, 2020
9c8e453
Back to something more functional and testable for asyncConfig proces…
ronjouch Feb 16, 2020
4a4db01
Fix broken icon conversion
ronjouch Feb 16, 2020
eb7b414
A few fields tests
ronjouch Feb 16, 2020
24bcbab
Docs and clearer error reporting from script
ronjouch Feb 17, 2020
d517054
Expose buildMain wrapped in hopefully-backwards-compatible callback-s…
ronjouch Feb 18, 2020
2fbb558
Run integration test in parallel with tests; fix missing rename due t…
ronjouch Feb 18, 2020
9a5de4a
Update README todo
ronjouch Feb 18, 2020
ab4c88c
Bump default Electron to 8.0.2
ronjouch Feb 26, 2020
b29203c
Fix build broken by recent typings unhappy about unbound method
ronjouch Mar 1, 2020
853c7cb
Make eslint happy in app
ronjouch Mar 1, 2020
cc9ab2e
Bump default Electron to 8.0.3
ronjouch Mar 3, 2020
02fa134
Disable yarn --prefer-offline, to get the latest even if offline resp…
ronjouch Mar 6, 2020
79c2c93
Fix build on Node 8: use URL from url, it's in the global object only…
ronjouch Mar 6, 2020
8914408
Bump default Electron to 8.1.0
ronjouch Mar 6, 2020
18d6020
Re-add codeclimate.yml, to deactivate it, until actually deactivated …
ronjouch Mar 6, 2020
1846489
Use tsc --build and clean output folder structure
ronjouch Mar 7, 2020
4c9f4b8
Re-delete codeclimate.yml, now that Jia removed the github integratio…
ronjouch Mar 7, 2020
234fc73
Fix integration tests uselessly run twice by TravisCI
ronjouch Mar 7, 2020
3396792
Attempt to fix running nativefier / electron-packager behing a proxy
ronjouch Mar 7, 2020
fdd64ba
Tie together electron/chrome versions
ronjouch Mar 7, 2020
a0a94ef
Remove dead electron-packager `ignore` code
ronjouch Mar 7, 2020
1de1bf1
Fix http basic auth and cleanup path.joins
ronjouch Mar 7, 2020
2a727b1
Integration test: test name inferring & icon
ronjouch Mar 8, 2020
b9ad2c5
Better icon error message under Windows
ronjouch Mar 8, 2020
da3e15f
Wheeeeeeeeeeeeeeeee
ronjouch Mar 8, 2020
64fb1eb
Remove TODOs from readme
ronjouch Mar 8, 2020
5600356
Add mention of --verbose in top-level error handler
ronjouch Mar 8, 2020
03dfd80
Remove broken depstatus badge
ronjouch Mar 8, 2020
08385ee
Depend on node 8.x types, as that's actually our minimum / the least …
ronjouch Mar 8, 2020
025e78b
Mention Prettier in dev docs
ronjouch Mar 8, 2020
98504c8
Test adding windows+osx travis
ronjouch Mar 9, 2020
2248014
Fix Windows CI
ronjouch Mar 9, 2020
bff5012
Improve --inject error message on file not found
ronjouch Mar 10, 2020
135a807
Bump default Electron to 8.1.1, increase timeout to make CI macOS bui…
ronjouch Mar 10, 2020
079f842
menu: cosmetic cleanups
ronjouch Mar 12, 2020
dec386b
Partially fix #379: fix zoom with Ctrl + *numpad* +/-
ronjouch Mar 12, 2020
3875743
Fix pinch-to-zoom, thanks Elad
ronjouch Mar 13, 2020
f1686f4
Add simple test:manual smoke test, to verify that hard-to-programmati…
ronjouch Mar 13, 2020
83ccda1
Add common Alt+Left/Right for previous/next navigation
ronjouch Mar 13, 2020
17e7cbf
Fix pinch-to-zoom in children windows, thanks Elad again. https://git…
ronjouch Mar 13, 2020
4fdd1b4
Better comment
ronjouch Mar 13, 2020
467d4c9
Clarify yaml linter comment
ronjouch Mar 15, 2020
19e4e4c
Development.md: document to run app through commandline to get loggin…
ronjouch Mar 15, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 0 additions & 18 deletions .codeclimate.yml

This file was deleted.

23 changes: 23 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// # https://github.com/typescript-eslint/typescript-eslint/blob/master/docs/getting-started/linting/README.md
module.exports = {
root: true,
parser: '@typescript-eslint/parser',
parserOptions: {
tsconfigRootDir: __dirname,
project: ['./tsconfig.json'],
},
plugins: ['@typescript-eslint', 'prettier'],
extends: [
'eslint:recommended',
'prettier',
'plugin:@typescript-eslint/eslint-recommended',
'plugin:@typescript-eslint/recommended',
'plugin:@typescript-eslint/recommended-requiring-type-checking',
],
rules: {
'prettier/prettier': 'error',
// TODO remove when done killing anys and making tsc strict
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/ban-ts-ignore': 'off',
},
};
15 changes: 0 additions & 15 deletions .eslintrc.yml

This file was deleted.

5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
package-lock.json

# ignore compiled lib files
lib/*
lib*
app/lib/*
built-tests

Expand Down Expand Up @@ -48,3 +48,6 @@ node_modules
*.iml
out
gen

# Builds when testing npm pack
nativefier*.tgz
7 changes: 0 additions & 7 deletions .hound.yml

This file was deleted.

20 changes: 16 additions & 4 deletions .npmignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
# OSX
.DS_Store

/*
!lib/
!app/lib
!bin
!app/lib/
!icon-scripts
.DS_Store
.eslintrc.yml
src/
app/src/
app/node_modules
*tsconfig.tsbuildinfo
*package-lock.json
*tsconfig.json
*jestSetupFiles*
*-test.js
*-test.js.map
*.test.d.ts
*.test.js
*.test.js.map
jiahaog marked this conversation as resolved.
Show resolved Hide resolved
26 changes: 12 additions & 14 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
language: node_js
addons:
code_climate:
repo_token: CODE_CLIMATE_TOKEN
os:
- linux
- osx
- windows
node_js:
- '11'
- '10'
- '13' # Changing this? Remind to adjust the linter condition below causing linter to run for only one version (for faster CI)
- '12'
- '8'
- '7'
- '6'
before_install:
- npm install -g npm@5.8.x
install:
- npm run dev-up
- npm install
- npm run build
script:
- npm run ci
after_script:
- codeclimate-test-reporter < ./coverage/lcov.info
# Only run linter once, for faster CI
- if [ "$TRAVIS_OS_NAME" = "linux" ] && [ "$TRAVIS_NODE_VERSION" = "13" ]; then npm run lint; fi
- npm test
deploy:
provider: npm
skip_cleanup: true
Expand All @@ -25,4 +23,4 @@ deploy:
on:
tags: true
repo: jiahaog/nativefier
node: '8'
node: '12'
File renamed without changes.
59 changes: 18 additions & 41 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,96 +1,73 @@
# Nativefier

[![Build Status](https://travis-ci.org/jiahaog/nativefier.svg?branch=development)](https://travis-ci.org/jiahaog/nativefier)
[![Code Climate](https://codeclimate.com/github/jiahaog/nativefier/badges/gpa.svg)](https://codeclimate.com/github/jiahaog/nativefier)
[![Build Status](https://travis-ci.org/jiahaog/nativefier.svg)](https://travis-ci.org/jiahaog/nativefier)
[![npm version](https://badge.fury.io/js/nativefier.svg)](https://www.npmjs.com/package/nativefier)
[![Dependency Status](https://david-dm.org/jiahaog/nativefier.svg)](https://david-dm.org/jiahaog/nativefier)

![Dock](screenshots/dock.png)
![Dock](dock.png)

You want to make a native wrapper for WhatsApp Web (or any web page).

```bash
nativefier web.whatsapp.com
```

![Walkthrough](screenshots/walkthrough.gif)
![Walkthrough animation](walkthrough.gif)

You're done.

## Table of Contents

- [Installation](#installation)
- [Usage](#usage)
- [Optional dependencies](#optional-dependencies)
- [How it works](#how-it-works)
- [Development](docs/development.md)
- [License](#license)

## Introduction

Nativefier is a command-line tool to easily create a desktop application for any web site with succinct and minimal configuration. Apps are wrapped by [Electron](http://electron.atom.io) in an OS executable (`.app`, `.exe`, etc.) for use on Windows, macOS and Linux.
Nativefier is a command-line tool to easily create a desktop application for any web site with succinct and minimal configuration. Apps are wrapped by [Electron](https://www.electronjs.org/) in an OS executable (`.app`, `.exe`, etc.) for use on Windows, macOS and Linux.

I did this because I was tired of having to `⌘-tab` or `alt-tab` to my browser and then search through the numerous open tabs when I was using [Facebook Messenger](http://messenger.com) or [Whatsapp Web](http://web.whatsapp.com) ([relevant Hacker News thread](https://news.ycombinator.com/item?id=10930718)).
I did this because I was tired of having to `⌘-tab` or `alt-tab` to my browser and then search through the numerous open tabs when I was using [Facebook Messenger](https://messenger.com) or [Whatsapp Web](https://web.whatsapp.com) ([relevant Hacker News thread](https://news.ycombinator.com/item?id=10930718)).

[Changelog](https://github.com/jiahaog/nativefier/blob/master/docs/changelog.md). [Developer docs](https://github.com/jiahaog/nativefier/blob/master/docs/development.md).
[Changelog](https://github.com/jiahaog/nativefier/blob/master/CHANGELOG.md). [Developer docs](https://github.com/jiahaog/nativefier/blob/master/docs/development.md).

### Features
Features:

- Automatically retrieves the correct icon and app name.
- JavaScript and CSS injection.
- Flash Support (with [`--flash`](docs/api.md#flash) flag).
- Many more, see the [API docs](docs/api.md) or `nativefier --help`

## Installation

### Requirements

- macOS 10.9+ / Windows / Linux
- [Node.js](https://nodejs.org/) `>=6` (4.x may work but is no longer tested, please upgrade)
- See [optional dependencies](#optional-dependencies) for more.
- [Node.js](https://nodejs.org/) `>=8`
- Optional dependencies:
- [ImageMagick](http://www.imagemagick.org/) to convert icons. Make sure `convert` and `identify` are in your `$PATH`.
- [Wine](https://www.winehq.org/) to package Windows apps under non-Windows platforms. Make sure `wine` is in your `$PATH`.

```bash
npm install nativefier -g
```

## Usage

Creating a native desktop app for [medium.com](http://medium.com):
Creating a native desktop app for [medium.com](https://medium.com):

```bash
nativefier "http://medium.com"
nativefier "medium.com"
```

Nativefier will intelligently attempt to determine the app name, your OS and processor architecture, among other options. If desired, the app name or other options can be overwritten by specifying the `--name "Medium"` as part of the command line options:
Nativefier will attempt to determine the app name, your OS and processor architecture, among other options. If desired, the app name or other options can be overwritten by specifying the `--name "Medium"` as part of the command line options:

```bash
nativefier --name "Some Awesome App" "http://medium.com"
nativefier --name "Some Awesome App" "medium.com"
```
Read the [API documentation](docs/api.md) (or `nativefier --help`) for other command line flags and options that can be used to configure the packaged app.

If you would like high resolution icons to be used, please contribute to the [icon repository](https://github.com/jiahaog/nativefier-icons)!

**Windows Users:** Take note that the application menu is automatically hidden by default, you can press `alt` on your keyboard to access it.

**Linux Users:** Do not put spaces if you define the app name yourself with `--name`, as this will cause problems when pinning a packaged app to the launcher.

## Optional dependencies

### Icons for Windows apps packaged under non-Windows platforms

You need [Wine](https://www.winehq.org/) installed; make sure that `wine` is in your `$PATH`.

### Icon conversion for macOS

To support conversion of a `.png` or `.ico` into a `.icns` for a packaged macOS app icon (currently only supported on macOS), you need the following dependencies.

* [iconutil](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Optimizing/Optimizing.html) (comes with [Xcode](https://developer.apple.com/xcode/)).
* [imagemagick](http://www.imagemagick.org/script/index.php). Make sure `convert` and `identify` are in your `$PATH`.
* If the tools are not found, then Nativefier will fall back to the built-in macOS tool `sips` to perform the conversion, which is more limited.
Read the [API documentation](docs/api.md) (or `nativefier --help`) for other command-line flags that can be used to configure the packaged app.

### Flash
To have high-resolution icons used by default for an app/domain, please contribute to the [icon repository](https://github.com/jiahaog/nativefier-icons)!

[Google Chrome](https://www.google.com/chrome/) is required for flash to be supported; you should pass the path to its embedded Flash plugin to the `--flash` flag. See the [API docs](docs/api.md) for more details.
Note that the application menu is hidden by default for a minimal UI. You can press the `alt` keyboard key to access it.

## How it works

Expand Down
24 changes: 24 additions & 0 deletions app/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// # https://github.com/typescript-eslint/typescript-eslint/blob/master/docs/getting-started/linting/README.md
module.exports = {
parser: '@typescript-eslint/parser',
parserOptions: {
tsconfigRootDir: __dirname,
project: ['./tsconfig.json'],
},
plugins: ['@typescript-eslint'],
extends: [
'eslint:recommended',
'prettier',
'plugin:@typescript-eslint/eslint-recommended',
'plugin:@typescript-eslint/recommended',
'plugin:@typescript-eslint/recommended-requiring-type-checking',
],
rules: {
'prettier/prettier': 'error',
// TODO remove when done killing anys and making tsc strict
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/ban-ts-ignore': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
},
};
2 changes: 0 additions & 2 deletions app/.eslintrc.yml

This file was deleted.

33 changes: 17 additions & 16 deletions app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,24 @@
"version": "1.0.0",
"description": "Placeholder for the nativefier cli to override with a target url",
"main": "lib/main.js",
"dependencies": {
"electron-context-menu": "^0.10.0",
"electron-dl": "^1.10.0",
"electron-squirrel-startup": "^1.0.0",
"electron-window-state": "^4.1.1",
"loglevel": "^1.5.1",
"source-map-support": "^0.5.0",
"wurl": "^2.5.2"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Jia Hao",
"license": "MIT",
"keywords": [
"desktop",
"electron"
"electron",
"placeholder"
],
"author": "Jia Hao",
"license": "MIT"
"scripts": {},
"dependencies": {
"electron-context-menu": "0.x",
"electron-dl": "3.x",
"electron-squirrel-startup": "1.x",
"electron-window-state": "5.x",
"loglevel": "1.x",
"source-map-support": "0.x",
"wurl": "2.x"
},
"devDependencies": {
"electron": "8.x"
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { shell } from 'electron';
import contextMenu from 'electron-context-menu';

function initContextMenu(createNewWindow, createNewTab) {
export function initContextMenu(createNewWindow, createNewTab): void {
contextMenu({
prepend: (params) => {
prepend: (actions, params) => {
const items = [];
if (params.linkURL) {
items.push({
Expand Down Expand Up @@ -31,5 +31,3 @@ function initContextMenu(createNewWindow, createNewTab) {
},
});
}

export default initContextMenu;
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
import * as path from 'path';

import { BrowserWindow, ipcMain } from 'electron';
import path from 'path';

function createLoginWindow(loginCallback) {
export function createLoginWindow(loginCallback): BrowserWindow {
const loginWindow = new BrowserWindow({
width: 300,
height: 400,
frame: false,
resizable: false,
webPreferences: {
nodeIntegration: true,
nodeIntegration: true, // TODO work around this; insecure
},
});
loginWindow.loadURL(
`file://${path.join(__dirname, '/static/login/login.html')}`,
`file://${path.join(__dirname, '..', 'static/login.html')}`,
);

ipcMain.once('login-message', (event, usernameAndPassword) => {
Expand All @@ -21,5 +22,3 @@ function createLoginWindow(loginCallback) {
});
return loginWindow;
}

export default createLoginWindow;