mirror of
https://github.com/upscayl/upscayl.git
synced 2024-11-23 23:21:05 +01:00
Init
This commit is contained in:
commit
0e1e2d1229
36
.gitignore
vendored
Normal file
36
.gitignore
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.js
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
/out/
|
||||
|
||||
# production
|
||||
/build
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# local env files
|
||||
.env*.local
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
48
README.md
Normal file
48
README.md
Normal file
@ -0,0 +1,48 @@
|
||||
# Electron with Typescript application example
|
||||
|
||||
This example show how you can use Next.js inside an Electron application to avoid a lot of configuration, use Next.js router as view and use server-render to speed up the initial render of the application. Both Next.js and Electron layers are written in TypeScript and compiled to JavaScript during the build process.
|
||||
|
||||
| Part | Source code (Typescript) | Builds (JavaScript) |
|
||||
| ---------- | ------------------------ | ------------------- |
|
||||
| Next.js | `/renderer` | `/renderer` |
|
||||
| Electron | `/electron-src` | `/main` |
|
||||
| Production | | `/dist` |
|
||||
|
||||
For development it's going to run a HTTP server and let Next.js handle routing. In production it use `next export` to pre-generate HTML static files and use them in your app instead of running an HTTP server.
|
||||
|
||||
## How to use
|
||||
|
||||
Execute [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app) with [npm](https://docs.npmjs.com/cli/init), [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/), or [pnpm](https://pnpm.io) to bootstrap the example:
|
||||
|
||||
```bash
|
||||
npx create-next-app --example with-electron-typescript with-electron-typescript-app
|
||||
```
|
||||
|
||||
```bash
|
||||
yarn create next-app --example with-electron-typescript with-electron-typescript-app
|
||||
```
|
||||
|
||||
```bash
|
||||
pnpm create next-app --example with-electron-typescript with-electron-typescript-app
|
||||
```
|
||||
|
||||
Available commands:
|
||||
|
||||
```bash
|
||||
"build-renderer": build and transpile Next.js layer
|
||||
"build-electron": transpile electron layer
|
||||
"build": build both layers
|
||||
"dev": start dev version
|
||||
"dist": create production electron build
|
||||
"type-check": check TypeScript in project
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
You can create the production app using `npm run dist`.
|
||||
|
||||
_note regarding types:_
|
||||
|
||||
- Electron provides its own type definitions, so you don't need @types/electron installed!
|
||||
source: https://www.npmjs.com/package/@types/electron
|
||||
- There were no types available for `electron-next` at the time of creating this example, so until they are available there is a file `electron-next.d.ts` in `electron-src` directory.
|
11
electron-src/electron-next.d.ts
vendored
Normal file
11
electron-src/electron-next.d.ts
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
declare module 'electron-next' {
|
||||
interface Directories {
|
||||
production: string
|
||||
development: string
|
||||
}
|
||||
|
||||
export default function (
|
||||
directories: Directories | string,
|
||||
port?: number
|
||||
): Promise<void>
|
||||
}
|
42
electron-src/index.ts
Normal file
42
electron-src/index.ts
Normal file
@ -0,0 +1,42 @@
|
||||
// Native
|
||||
import { join } from 'path'
|
||||
import { format } from 'url'
|
||||
|
||||
// Packages
|
||||
import { BrowserWindow, app, ipcMain, IpcMainEvent } from 'electron'
|
||||
import isDev from 'electron-is-dev'
|
||||
import prepareNext from 'electron-next'
|
||||
|
||||
// Prepare the renderer once the app is ready
|
||||
app.on('ready', async () => {
|
||||
await prepareNext('./renderer')
|
||||
|
||||
const mainWindow = new BrowserWindow({
|
||||
width: 800,
|
||||
height: 600,
|
||||
webPreferences: {
|
||||
nodeIntegration: false,
|
||||
contextIsolation: false,
|
||||
preload: join(__dirname, 'preload.js'),
|
||||
},
|
||||
})
|
||||
|
||||
const url = isDev
|
||||
? 'http://localhost:8000/'
|
||||
: format({
|
||||
pathname: join(__dirname, '../renderer/out/index.html'),
|
||||
protocol: 'file:',
|
||||
slashes: true,
|
||||
})
|
||||
|
||||
mainWindow.loadURL(url)
|
||||
})
|
||||
|
||||
// Quit the app once all windows are closed
|
||||
app.on('window-all-closed', app.quit)
|
||||
|
||||
// listen the channel `message` and resend the received message to the renderer process
|
||||
ipcMain.on('message', (event: IpcMainEvent, message: any) => {
|
||||
console.log(message)
|
||||
setTimeout(() => event.sender.send('message', 'hi from electron'), 500)
|
||||
})
|
17
electron-src/preload.ts
Normal file
17
electron-src/preload.ts
Normal file
@ -0,0 +1,17 @@
|
||||
/* eslint-disable @typescript-eslint/no-namespace */
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
import { ipcRenderer, IpcRenderer } from 'electron'
|
||||
|
||||
declare global {
|
||||
namespace NodeJS {
|
||||
interface Global {
|
||||
ipcRenderer: IpcRenderer
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Since we disabled nodeIntegration we can reintroduce
|
||||
// needed node functionality here
|
||||
process.once('loaded', () => {
|
||||
global.ipcRenderer = ipcRenderer
|
||||
})
|
24
electron-src/tsconfig.json
Normal file
24
electron-src/tsconfig.json
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"allowJs": true,
|
||||
"alwaysStrict": true,
|
||||
"esModuleInterop": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "preserve",
|
||||
"lib": ["dom", "es2017"],
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"noEmit": false,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"resolveJsonModule": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"target": "esnext",
|
||||
"outDir": "../main"
|
||||
},
|
||||
"exclude": ["node_modules"],
|
||||
"include": ["**/*.ts", "**/*.tsx", "**/*.js"]
|
||||
}
|
40
main/index.js
Normal file
40
main/index.js
Normal file
@ -0,0 +1,40 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
// Native
|
||||
const path_1 = require("path");
|
||||
const url_1 = require("url");
|
||||
// Packages
|
||||
const electron_1 = require("electron");
|
||||
const electron_is_dev_1 = __importDefault(require("electron-is-dev"));
|
||||
const electron_next_1 = __importDefault(require("electron-next"));
|
||||
// Prepare the renderer once the app is ready
|
||||
electron_1.app.on('ready', async () => {
|
||||
await (0, electron_next_1.default)('./renderer');
|
||||
const mainWindow = new electron_1.BrowserWindow({
|
||||
width: 800,
|
||||
height: 600,
|
||||
webPreferences: {
|
||||
nodeIntegration: false,
|
||||
contextIsolation: false,
|
||||
preload: (0, path_1.join)(__dirname, 'preload.js'),
|
||||
},
|
||||
});
|
||||
const url = electron_is_dev_1.default
|
||||
? 'http://localhost:8000/'
|
||||
: (0, url_1.format)({
|
||||
pathname: (0, path_1.join)(__dirname, '../renderer/out/index.html'),
|
||||
protocol: 'file:',
|
||||
slashes: true,
|
||||
});
|
||||
mainWindow.loadURL(url);
|
||||
});
|
||||
// Quit the app once all windows are closed
|
||||
electron_1.app.on('window-all-closed', electron_1.app.quit);
|
||||
// listen the channel `message` and resend the received message to the renderer process
|
||||
electron_1.ipcMain.on('message', (event, message) => {
|
||||
console.log(message);
|
||||
setTimeout(() => event.sender.send('message', 'hi from electron'), 500);
|
||||
});
|
10
main/preload.js
Normal file
10
main/preload.js
Normal file
@ -0,0 +1,10 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
/* eslint-disable @typescript-eslint/no-namespace */
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const electron_1 = require("electron");
|
||||
// Since we disabled nodeIntegration we can reintroduce
|
||||
// needed node functionality here
|
||||
process.once('loaded', () => {
|
||||
global.ipcRenderer = electron_1.ipcRenderer;
|
||||
});
|
38
package.json
Normal file
38
package.json
Normal file
@ -0,0 +1,38 @@
|
||||
{
|
||||
"private": true,
|
||||
"main": "main/index.js",
|
||||
"productName": "ElectronTypescriptNext",
|
||||
"scripts": {
|
||||
"clean": "rimraf dist main renderer/out renderer/.next",
|
||||
"dev": "npm run build-electron && electron .",
|
||||
"build-renderer": "next build renderer && next export renderer",
|
||||
"build-electron": "tsc -p electron-src",
|
||||
"build": "npm run build-renderer && npm run build-electron",
|
||||
"pack-app": "npm run build && electron-builder --dir",
|
||||
"dist": "npm run build && electron-builder",
|
||||
"type-check": "tsc -p ./renderer/tsconfig.json && tsc -p ./electron-src/tsconfig.json"
|
||||
},
|
||||
"dependencies": {
|
||||
"electron-is-dev": "^1.1.0",
|
||||
"electron-next": "^3.1.5",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^14.14.6",
|
||||
"@types/react": "^16.9.9",
|
||||
"@types/react-dom": "^16.9.9",
|
||||
"electron": "^13",
|
||||
"electron-builder": "^23.0.3",
|
||||
"next": "latest",
|
||||
"rimraf": "^3.0.0",
|
||||
"typescript": "^4.0.5"
|
||||
},
|
||||
"build": {
|
||||
"asar": true,
|
||||
"files": [
|
||||
"main",
|
||||
"renderer/out"
|
||||
]
|
||||
}
|
||||
}
|
40
renderer/.next/build-manifest.json
Normal file
40
renderer/.next/build-manifest.json
Normal file
@ -0,0 +1,40 @@
|
||||
{
|
||||
"polyfillFiles": [
|
||||
"static/chunks/polyfills.js"
|
||||
],
|
||||
"devFiles": [
|
||||
"static/chunks/react-refresh.js"
|
||||
],
|
||||
"ampDevFiles": [
|
||||
"static/chunks/webpack.js",
|
||||
"static/chunks/amp.js"
|
||||
],
|
||||
"lowPriorityFiles": [
|
||||
"static/development/_buildManifest.js",
|
||||
"static/development/_ssgManifest.js"
|
||||
],
|
||||
"rootMainFiles": [],
|
||||
"pages": {
|
||||
"/": [
|
||||
"static/chunks/webpack.js",
|
||||
"static/chunks/main.js",
|
||||
"static/chunks/pages/index.js"
|
||||
],
|
||||
"/_app": [
|
||||
"static/chunks/webpack.js",
|
||||
"static/chunks/main.js",
|
||||
"static/chunks/pages/_app.js"
|
||||
],
|
||||
"/_error": [
|
||||
"static/chunks/webpack.js",
|
||||
"static/chunks/main.js",
|
||||
"static/chunks/pages/_error.js"
|
||||
],
|
||||
"/initial-props": [
|
||||
"static/chunks/webpack.js",
|
||||
"static/chunks/main.js",
|
||||
"static/chunks/pages/initial-props.js"
|
||||
]
|
||||
},
|
||||
"ampFirstPages": []
|
||||
}
|
BIN
renderer/.next/cache/webpack/client-development/0.pack
vendored
Normal file
BIN
renderer/.next/cache/webpack/client-development/0.pack
vendored
Normal file
Binary file not shown.
BIN
renderer/.next/cache/webpack/client-development/index.pack
vendored
Normal file
BIN
renderer/.next/cache/webpack/client-development/index.pack
vendored
Normal file
Binary file not shown.
BIN
renderer/.next/cache/webpack/server-development/0.pack
vendored
Normal file
BIN
renderer/.next/cache/webpack/server-development/0.pack
vendored
Normal file
Binary file not shown.
BIN
renderer/.next/cache/webpack/server-development/index.pack
vendored
Normal file
BIN
renderer/.next/cache/webpack/server-development/index.pack
vendored
Normal file
Binary file not shown.
1
renderer/.next/package.json
Normal file
1
renderer/.next/package.json
Normal file
@ -0,0 +1 @@
|
||||
{"type": "commonjs"}
|
1
renderer/.next/react-loadable-manifest.json
Normal file
1
renderer/.next/react-loadable-manifest.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
6
renderer/.next/server/middleware-manifest.json
Normal file
6
renderer/.next/server/middleware-manifest.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"sortedMiddleware": [],
|
||||
"middleware": {},
|
||||
"functions": {},
|
||||
"version": 1
|
||||
}
|
7
renderer/.next/server/pages-manifest.json
Normal file
7
renderer/.next/server/pages-manifest.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"/_app": "pages/_app.js",
|
||||
"/_error": "pages/_error.js",
|
||||
"/_document": "pages/_document.js",
|
||||
"/": "pages/index.js",
|
||||
"/initial-props": "pages/initial-props.js"
|
||||
}
|
56
renderer/.next/server/pages/_app.js
Normal file
56
renderer/.next/server/pages/_app.js
Normal file
File diff suppressed because one or more lines are too long
166
renderer/.next/server/pages/_document.js
Normal file
166
renderer/.next/server/pages/_document.js
Normal file
File diff suppressed because one or more lines are too long
56
renderer/.next/server/pages/_error.js
Normal file
56
renderer/.next/server/pages/_error.js
Normal file
File diff suppressed because one or more lines are too long
530
renderer/.next/server/pages/index.js
Normal file
530
renderer/.next/server/pages/index.js
Normal file
File diff suppressed because one or more lines are too long
574
renderer/.next/server/pages/initial-props.js
Normal file
574
renderer/.next/server/pages/initial-props.js
Normal file
File diff suppressed because one or more lines are too long
168
renderer/.next/server/webpack-runtime.js
Normal file
168
renderer/.next/server/webpack-runtime.js
Normal file
@ -0,0 +1,168 @@
|
||||
/*
|
||||
* ATTENTION: An "eval-source-map" devtool has been used.
|
||||
* This devtool is neither made for production nor for readable output files.
|
||||
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
||||
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
||||
* or disable the default devtool with "devtool: false".
|
||||
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
||||
*/
|
||||
/******/ (() => { // webpackBootstrap
|
||||
/******/ "use strict";
|
||||
/******/ var __webpack_modules__ = ({});
|
||||
/************************************************************************/
|
||||
/******/ // The module cache
|
||||
/******/ var __webpack_module_cache__ = {};
|
||||
/******/
|
||||
/******/ // The require function
|
||||
/******/ function __webpack_require__(moduleId) {
|
||||
/******/ // Check if module is in cache
|
||||
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
||||
/******/ if (cachedModule !== undefined) {
|
||||
/******/ return cachedModule.exports;
|
||||
/******/ }
|
||||
/******/ // Create a new module (and put it into the cache)
|
||||
/******/ var module = __webpack_module_cache__[moduleId] = {
|
||||
/******/ // no module.id needed
|
||||
/******/ // no module.loaded needed
|
||||
/******/ exports: {}
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // Execute the module function
|
||||
/******/ var threw = true;
|
||||
/******/ try {
|
||||
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
||||
/******/ threw = false;
|
||||
/******/ } finally {
|
||||
/******/ if(threw) delete __webpack_module_cache__[moduleId];
|
||||
/******/ }
|
||||
/******/
|
||||
/******/ // Return the exports of the module
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/
|
||||
/******/ // expose the modules object (__webpack_modules__)
|
||||
/******/ __webpack_require__.m = __webpack_modules__;
|
||||
/******/
|
||||
/************************************************************************/
|
||||
/******/ /* webpack/runtime/compat get default export */
|
||||
/******/ (() => {
|
||||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||||
/******/ __webpack_require__.n = (module) => {
|
||||
/******/ var getter = module && module.__esModule ?
|
||||
/******/ () => (module['default']) :
|
||||
/******/ () => (module);
|
||||
/******/ __webpack_require__.d(getter, { a: getter });
|
||||
/******/ return getter;
|
||||
/******/ };
|
||||
/******/ })();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/define property getters */
|
||||
/******/ (() => {
|
||||
/******/ // define getter functions for harmony exports
|
||||
/******/ __webpack_require__.d = (exports, definition) => {
|
||||
/******/ for(var key in definition) {
|
||||
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
||||
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
||||
/******/ }
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ })();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/ensure chunk */
|
||||
/******/ (() => {
|
||||
/******/ __webpack_require__.f = {};
|
||||
/******/ // This file contains only the entry chunk.
|
||||
/******/ // The chunk loading function for additional chunks
|
||||
/******/ __webpack_require__.e = (chunkId) => {
|
||||
/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {
|
||||
/******/ __webpack_require__.f[key](chunkId, promises);
|
||||
/******/ return promises;
|
||||
/******/ }, []));
|
||||
/******/ };
|
||||
/******/ })();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/get javascript chunk filename */
|
||||
/******/ (() => {
|
||||
/******/ // This function allow to reference async chunks and sibling chunks for the entrypoint
|
||||
/******/ __webpack_require__.u = (chunkId) => {
|
||||
/******/ // return url for filenames based on template
|
||||
/******/ return undefined;
|
||||
/******/ };
|
||||
/******/ })();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
||||
/******/ (() => {
|
||||
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
||||
/******/ })();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/make namespace object */
|
||||
/******/ (() => {
|
||||
/******/ // define __esModule on exports
|
||||
/******/ __webpack_require__.r = (exports) => {
|
||||
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
||||
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
||||
/******/ }
|
||||
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
||||
/******/ };
|
||||
/******/ })();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/startup entrypoint */
|
||||
/******/ (() => {
|
||||
/******/ __webpack_require__.X = (result, chunkIds, fn) => {
|
||||
/******/ // arguments: chunkIds, moduleId are deprecated
|
||||
/******/ var moduleId = chunkIds;
|
||||
/******/ if(!fn) chunkIds = result, fn = () => (__webpack_require__(__webpack_require__.s = moduleId));
|
||||
/******/ chunkIds.map(__webpack_require__.e, __webpack_require__)
|
||||
/******/ var r = fn();
|
||||
/******/ return r === undefined ? result : r;
|
||||
/******/ }
|
||||
/******/ })();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/require chunk loading */
|
||||
/******/ (() => {
|
||||
/******/ // no baseURI
|
||||
/******/
|
||||
/******/ // object to store loaded chunks
|
||||
/******/ // "1" means "loaded", otherwise not loaded yet
|
||||
/******/ var installedChunks = {
|
||||
/******/ "webpack-runtime": 1
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // no on chunks loaded
|
||||
/******/
|
||||
/******/ var installChunk = (chunk) => {
|
||||
/******/ var moreModules = chunk.modules, chunkIds = chunk.ids, runtime = chunk.runtime;
|
||||
/******/ for(var moduleId in moreModules) {
|
||||
/******/ if(__webpack_require__.o(moreModules, moduleId)) {
|
||||
/******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
|
||||
/******/ }
|
||||
/******/ }
|
||||
/******/ if(runtime) runtime(__webpack_require__);
|
||||
/******/ for(var i = 0; i < chunkIds.length; i++)
|
||||
/******/ installedChunks[chunkIds[i]] = 1;
|
||||
/******/
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // require() chunk loading for javascript
|
||||
/******/ __webpack_require__.f.require = (chunkId, promises) => {
|
||||
/******/ // "1" is the signal for "already loaded"
|
||||
/******/ if(!installedChunks[chunkId]) {
|
||||
/******/ if("webpack-runtime" != chunkId) {
|
||||
/******/ installChunk(require("./" + __webpack_require__.u(chunkId)));
|
||||
/******/ } else installedChunks[chunkId] = 1;
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ module.exports = __webpack_require__;
|
||||
/******/ __webpack_require__.C = installChunk;
|
||||
/******/
|
||||
/******/ // no HMR
|
||||
/******/
|
||||
/******/ // no HMR manifest
|
||||
/******/ })();
|
||||
/******/
|
||||
/************************************************************************/
|
||||
/******/
|
||||
/******/
|
||||
/******/ })()
|
||||
;
|
883
renderer/.next/static/chunks/amp.js
Normal file
883
renderer/.next/static/chunks/amp.js
Normal file
File diff suppressed because one or more lines are too long
1188
renderer/.next/static/chunks/main.js
Normal file
1188
renderer/.next/static/chunks/main.js
Normal file
File diff suppressed because one or more lines are too long
39
renderer/.next/static/chunks/pages/_app.js
Normal file
39
renderer/.next/static/chunks/pages/_app.js
Normal file
File diff suppressed because one or more lines are too long
28
renderer/.next/static/chunks/pages/_error.js
Normal file
28
renderer/.next/static/chunks/pages/_error.js
Normal file
@ -0,0 +1,28 @@
|
||||
/*
|
||||
* ATTENTION: An "eval-source-map" devtool has been used.
|
||||
* This devtool is neither made for production nor for readable output files.
|
||||
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
||||
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
||||
* or disable the default devtool with "devtool: false".
|
||||
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
||||
*/
|
||||
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([["pages/_error"],{
|
||||
|
||||
/***/ "../node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=private-next-pages%2F_error&page=%2F_error!":
|
||||
/*!************************************************************************************************************************************************!*\
|
||||
!*** ../node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=private-next-pages%2F_error&page=%2F_error! ***!
|
||||
\************************************************************************************************************************************************/
|
||||
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
||||
|
||||
eval(__webpack_require__.ts("\n (window.__NEXT_P = window.__NEXT_P || []).push([\n \"/_error\",\n function () {\n return __webpack_require__(/*! private-next-pages/_error */ \"../node_modules/next/dist/pages/_error.js\");\n }\n ]);\n if(true) {\n module.hot.dispose(function () {\n window.__NEXT_P.push([\"/_error\"])\n });\n }\n //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9idWlsZC93ZWJwYWNrL2xvYWRlcnMvbmV4dC1jbGllbnQtcGFnZXMtbG9hZGVyLmpzP2Fic29sdXRlUGFnZVBhdGg9cHJpdmF0ZS1uZXh0LXBhZ2VzJTJGX2Vycm9yJnBhZ2U9JTJGX2Vycm9yIS5qcyIsIm1hcHBpbmdzIjoiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxtQkFBTyxDQUFDLDRFQUEyQjtBQUNsRDtBQUNBO0FBQ0EsT0FBTyxJQUFVO0FBQ2pCLE1BQU0sVUFBVTtBQUNoQjtBQUNBLE9BQU87QUFDUDtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8/N2NlYiJdLCJzb3VyY2VzQ29udGVudCI6WyJcbiAgICAod2luZG93Ll9fTkVYVF9QID0gd2luZG93Ll9fTkVYVF9QIHx8IFtdKS5wdXNoKFtcbiAgICAgIFwiL19lcnJvclwiLFxuICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZShcInByaXZhdGUtbmV4dC1wYWdlcy9fZXJyb3JcIik7XG4gICAgICB9XG4gICAgXSk7XG4gICAgaWYobW9kdWxlLmhvdCkge1xuICAgICAgbW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2luZG93Ll9fTkVYVF9QLnB1c2goW1wiL19lcnJvclwiXSlcbiAgICAgIH0pO1xuICAgIH1cbiAgIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=private-next-pages%2F_error&page=%2F_error!\n"));
|
||||
|
||||
/***/ })
|
||||
|
||||
},
|
||||
/******/ function(__webpack_require__) { // webpackRuntimeModules
|
||||
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
|
||||
/******/ __webpack_require__.O(0, ["pages/_app","main"], function() { return __webpack_exec__("../node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=private-next-pages%2F_error&page=%2F_error!"); });
|
||||
/******/ var __webpack_exports__ = __webpack_require__.O();
|
||||
/******/ _N_E = __webpack_exports__;
|
||||
/******/ }
|
||||
]);
|
136
renderer/.next/static/chunks/pages/index.js
Normal file
136
renderer/.next/static/chunks/pages/index.js
Normal file
File diff suppressed because one or more lines are too long
158
renderer/.next/static/chunks/pages/initial-props.js
Normal file
158
renderer/.next/static/chunks/pages/initial-props.js
Normal file
File diff suppressed because one or more lines are too long
1
renderer/.next/static/chunks/polyfills.js
Normal file
1
renderer/.next/static/chunks/polyfills.js
Normal file
File diff suppressed because one or more lines are too long
62
renderer/.next/static/chunks/react-refresh.js
vendored
Normal file
62
renderer/.next/static/chunks/react-refresh.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1220
renderer/.next/static/chunks/webpack.js
Normal file
1220
renderer/.next/static/chunks/webpack.js
Normal file
File diff suppressed because it is too large
Load Diff
1
renderer/.next/static/development/_buildManifest.js
Normal file
1
renderer/.next/static/development/_buildManifest.js
Normal file
@ -0,0 +1 @@
|
||||
self.__BUILD_MANIFEST = {__rewrites:{beforeFiles:[],afterFiles:[],fallback:[]},"/":["static\u002Fchunks\u002Fpages\u002Findex.js"],"/_error":["static\u002Fchunks\u002Fpages\u002F_error.js"],"/initial-props":["static\u002Fchunks\u002Fpages\u002Finitial-props.js"],sortedPages:["\u002F","\u002F_app","\u002F_error","\u002Finitial-props"]};self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB()
|
1
renderer/.next/static/development/_ssgManifest.js
Normal file
1
renderer/.next/static/development/_ssgManifest.js
Normal file
@ -0,0 +1 @@
|
||||
self.__SSG_MANIFEST=new Set;self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
|
@ -0,0 +1 @@
|
||||
{"c":["webpack"],"r":[],"m":[]}
|
@ -0,0 +1 @@
|
||||
{"c":["webpack"],"r":[],"m":[]}
|
@ -0,0 +1,66 @@
|
||||
"use strict";
|
||||
/*
|
||||
* ATTENTION: An "eval-source-map" devtool has been used.
|
||||
* This devtool is neither made for production nor for readable output files.
|
||||
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
||||
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
||||
* or disable the default devtool with "devtool: false".
|
||||
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
||||
*/
|
||||
self["webpackHotUpdate_N_E"]("webpack",{},
|
||||
/******/ function(__webpack_require__) { // webpackRuntimeModules
|
||||
/******/ /* webpack/runtime/compat get default export */
|
||||
/******/ !function() {
|
||||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||||
/******/ __webpack_require__.n = function(module) {
|
||||
/******/ var getter = module && module.__esModule ?
|
||||
/******/ function() { return module['default']; } :
|
||||
/******/ function() { return module; };
|
||||
/******/ __webpack_require__.d(getter, { a: getter });
|
||||
/******/ return getter;
|
||||
/******/ };
|
||||
/******/ }();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/define property getters */
|
||||
/******/ !function() {
|
||||
/******/ // define getter functions for harmony exports
|
||||
/******/ __webpack_require__.d = function(exports, definition) {
|
||||
/******/ for(var key in definition) {
|
||||
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
||||
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
||||
/******/ }
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ }();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/getFullHash */
|
||||
/******/ !function() {
|
||||
/******/ __webpack_require__.h = function() { return "f320c99a8c730992"; }
|
||||
/******/ }();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/make namespace object */
|
||||
/******/ !function() {
|
||||
/******/ // define __esModule on exports
|
||||
/******/ __webpack_require__.r = function(exports) {
|
||||
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
||||
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
||||
/******/ }
|
||||
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
||||
/******/ };
|
||||
/******/ }();
|
||||
/******/
|
||||
/******/ /* webpack/runtime/compat */
|
||||
/******/
|
||||
/******/
|
||||
/******/ // noop fns to prevent runtime errors during initialization
|
||||
/******/ if (typeof self !== "undefined") {
|
||||
/******/ self.$RefreshReg$ = function () {};
|
||||
/******/ self.$RefreshSig$ = function () {
|
||||
/******/ return function (type) {
|
||||
/******/ return type;
|
||||
/******/ };
|
||||
/******/ };
|
||||
/******/ }
|
||||
/******/
|
||||
/******/ }
|
||||
);
|
@ -0,0 +1,18 @@
|
||||
"use strict";
|
||||
/*
|
||||
* ATTENTION: An "eval-source-map" devtool has been used.
|
||||
* This devtool is neither made for production nor for readable output files.
|
||||
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
||||
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
||||
* or disable the default devtool with "devtool: false".
|
||||
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
||||
*/
|
||||
self["webpackHotUpdate_N_E"]("webpack",{},
|
||||
/******/ function(__webpack_require__) { // webpackRuntimeModules
|
||||
/******/ /* webpack/runtime/getFullHash */
|
||||
/******/ !function() {
|
||||
/******/ __webpack_require__.h = function() { return "607e8ec64abecbff"; }
|
||||
/******/ }();
|
||||
/******/
|
||||
/******/ }
|
||||
);
|
7
renderer/.next/trace
Normal file
7
renderer/.next/trace
Normal file
File diff suppressed because one or more lines are too long
40
renderer/components/Layout.tsx
Normal file
40
renderer/components/Layout.tsx
Normal file
@ -0,0 +1,40 @@
|
||||
import React, { ReactNode } from 'react'
|
||||
import Link from 'next/link'
|
||||
import Head from 'next/head'
|
||||
|
||||
type Props = {
|
||||
children: ReactNode
|
||||
title?: string
|
||||
}
|
||||
|
||||
const Layout = ({ children, title = 'This is the default title' }: Props) => (
|
||||
<div>
|
||||
<Head>
|
||||
<title>{title}</title>
|
||||
<meta charSet="utf-8" />
|
||||
<meta name="viewport" content="initial-scale=1.0, width=device-width" />
|
||||
</Head>
|
||||
<header>
|
||||
<nav>
|
||||
<Link href="/">
|
||||
<a>Home</a>
|
||||
</Link>{' '}
|
||||
|{' '}
|
||||
<Link href="/about">
|
||||
<a>About</a>
|
||||
</Link>{' '}
|
||||
|{' '}
|
||||
<Link href="/initial-props">
|
||||
<a>With Initial Props</a>
|
||||
</Link>
|
||||
</nav>
|
||||
</header>
|
||||
{children}
|
||||
<footer>
|
||||
<hr />
|
||||
<span>I'm here to stay (Footer)</span>
|
||||
</footer>
|
||||
</div>
|
||||
)
|
||||
|
||||
export default Layout
|
19
renderer/components/List.tsx
Normal file
19
renderer/components/List.tsx
Normal file
@ -0,0 +1,19 @@
|
||||
import React from 'react'
|
||||
import ListItem from './ListItem'
|
||||
import { User } from '../interfaces'
|
||||
|
||||
type Props = {
|
||||
items: User[]
|
||||
}
|
||||
|
||||
const List = ({ items }: Props) => (
|
||||
<ul>
|
||||
{items.map((item) => (
|
||||
<li key={item.id}>
|
||||
<ListItem data={item} />
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
)
|
||||
|
||||
export default List
|
16
renderer/components/ListDetail.tsx
Normal file
16
renderer/components/ListDetail.tsx
Normal file
@ -0,0 +1,16 @@
|
||||
import * as React from 'react'
|
||||
|
||||
import { User } from '../interfaces'
|
||||
|
||||
type ListDetailProps = {
|
||||
item: User
|
||||
}
|
||||
|
||||
const ListDetail = ({ item: user }: ListDetailProps) => (
|
||||
<div>
|
||||
<h1>Detail for {user.name}</h1>
|
||||
<p>ID: {user.id}</p>
|
||||
</div>
|
||||
)
|
||||
|
||||
export default ListDetail
|
18
renderer/components/ListItem.tsx
Normal file
18
renderer/components/ListItem.tsx
Normal file
@ -0,0 +1,18 @@
|
||||
import React from 'react'
|
||||
import Link from 'next/link'
|
||||
|
||||
import { User } from '../interfaces'
|
||||
|
||||
type Props = {
|
||||
data: User
|
||||
}
|
||||
|
||||
const ListItem = ({ data }: Props) => (
|
||||
<Link href="/detail/[id]" as={`/detail/${data.id}`}>
|
||||
<a>
|
||||
{data.id}: {data.name}
|
||||
</a>
|
||||
</Link>
|
||||
)
|
||||
|
||||
export default ListItem
|
21
renderer/interfaces/index.ts
Normal file
21
renderer/interfaces/index.ts
Normal file
@ -0,0 +1,21 @@
|
||||
// You can include shared interfaces/types in a separate file
|
||||
// and then use them in any component by importing them. For
|
||||
// example, to import the interface below do:
|
||||
//
|
||||
// import User from 'path/to/interfaces';
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
import { IpcRenderer } from 'electron'
|
||||
|
||||
declare global {
|
||||
// eslint-disable-next-line @typescript-eslint/no-namespace
|
||||
namespace NodeJS {
|
||||
interface Global {
|
||||
ipcRenderer: IpcRenderer
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export type User = {
|
||||
id: number
|
||||
name: string
|
||||
}
|
16
renderer/pages/about.tsx
Normal file
16
renderer/pages/about.tsx
Normal file
@ -0,0 +1,16 @@
|
||||
import Link from 'next/link'
|
||||
import Layout from '../components/Layout'
|
||||
|
||||
const AboutPage = () => (
|
||||
<Layout title="About | Next.js + TypeScript + Electron Example">
|
||||
<h1>About</h1>
|
||||
<p>This is the about page</p>
|
||||
<p>
|
||||
<Link href="/">
|
||||
<a>Go home</a>
|
||||
</Link>
|
||||
</p>
|
||||
</Layout>
|
||||
)
|
||||
|
||||
export default AboutPage
|
62
renderer/pages/detail/[id].tsx
Normal file
62
renderer/pages/detail/[id].tsx
Normal file
@ -0,0 +1,62 @@
|
||||
// import { NextPageContext } from 'next'
|
||||
import Layout from '../../components/Layout'
|
||||
import { User } from '../../interfaces'
|
||||
import { findAll, findData } from '../../utils/sample-api'
|
||||
import ListDetail from '../../components/ListDetail'
|
||||
import { GetStaticPaths, GetStaticProps } from 'next'
|
||||
|
||||
type Params = {
|
||||
id?: string
|
||||
}
|
||||
|
||||
type Props = {
|
||||
item?: User
|
||||
errors?: string
|
||||
}
|
||||
|
||||
const InitialPropsDetail = ({ item, errors }: Props) => {
|
||||
if (errors) {
|
||||
return (
|
||||
<Layout title={`Error | Next.js + TypeScript + Electron Example`}>
|
||||
<p>
|
||||
<span style={{ color: 'red' }}>Error:</span> {errors}
|
||||
</p>
|
||||
</Layout>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<Layout
|
||||
title={`${item ? item.name : 'Detail'} | Next.js + TypeScript Example`}
|
||||
>
|
||||
{item && <ListDetail item={item} />}
|
||||
</Layout>
|
||||
)
|
||||
}
|
||||
|
||||
export const getStaticPaths: GetStaticPaths = async () => {
|
||||
const items: User[] = await findAll()
|
||||
const paths = items.map((item) => `/detail/${item.id}`)
|
||||
return { paths, fallback: false }
|
||||
}
|
||||
|
||||
export const getStaticProps: GetStaticProps = async ({ params }) => {
|
||||
const { id } = params as Params
|
||||
|
||||
try {
|
||||
const item = await findData(Array.isArray(id) ? id[0] : id)
|
||||
return {
|
||||
props: {
|
||||
item,
|
||||
},
|
||||
}
|
||||
} catch (err) {
|
||||
return {
|
||||
props: {
|
||||
errors: err.message,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default InitialPropsDetail
|
34
renderer/pages/index.tsx
Normal file
34
renderer/pages/index.tsx
Normal file
@ -0,0 +1,34 @@
|
||||
import { useEffect } from 'react'
|
||||
import Link from 'next/link'
|
||||
import Layout from '../components/Layout'
|
||||
|
||||
const IndexPage = () => {
|
||||
useEffect(() => {
|
||||
const handleMessage = (_event, args) => alert(args)
|
||||
|
||||
// add a listener to 'message' channel
|
||||
global.ipcRenderer.addListener('message', handleMessage)
|
||||
|
||||
return () => {
|
||||
global.ipcRenderer.removeListener('message', handleMessage)
|
||||
}
|
||||
}, [])
|
||||
|
||||
const onSayHiClick = () => {
|
||||
global.ipcRenderer.send('message', 'hi from next')
|
||||
}
|
||||
|
||||
return (
|
||||
<Layout title="Home | Next.js + TypeScript + Electron Example">
|
||||
<h1>Hello Next.js 👋</h1>
|
||||
<button onClick={onSayHiClick}>Say hi to electron</button>
|
||||
<p>
|
||||
<Link href="/about">
|
||||
<a>About</a>
|
||||
</Link>
|
||||
</p>
|
||||
</Layout>
|
||||
)
|
||||
}
|
||||
|
||||
export default IndexPage
|
35
renderer/pages/initial-props.tsx
Normal file
35
renderer/pages/initial-props.tsx
Normal file
@ -0,0 +1,35 @@
|
||||
import Link from 'next/link'
|
||||
import { useRouter } from 'next/router'
|
||||
import Layout from '../components/Layout'
|
||||
import List from '../components/List'
|
||||
import { User } from '../interfaces'
|
||||
import { findAll } from '../utils/sample-api'
|
||||
|
||||
type Props = {
|
||||
items: User[]
|
||||
pathname: string
|
||||
}
|
||||
|
||||
const WithInitialProps = ({ items }: Props) => {
|
||||
const router = useRouter()
|
||||
return (
|
||||
<Layout title="List Example (as Function Component) | Next.js + TypeScript + Electron Example">
|
||||
<h1>List Example (as Function Component)</h1>
|
||||
<p>You are currently on: {router.pathname}</p>
|
||||
<List items={items} />
|
||||
<p>
|
||||
<Link href="/">
|
||||
<a>Go home</a>
|
||||
</Link>
|
||||
</p>
|
||||
</Layout>
|
||||
)
|
||||
}
|
||||
|
||||
export async function getStaticProps() {
|
||||
const items: User[] = await findAll()
|
||||
|
||||
return { props: { items } }
|
||||
}
|
||||
|
||||
export default WithInitialProps
|
20
renderer/tsconfig.json
Normal file
20
renderer/tsconfig.json
Normal file
@ -0,0 +1,20 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es5",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "node",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "preserve",
|
||||
"incremental": true
|
||||
},
|
||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
34
renderer/utils/sample-api.ts
Normal file
34
renderer/utils/sample-api.ts
Normal file
@ -0,0 +1,34 @@
|
||||
import { User } from '../interfaces'
|
||||
|
||||
/** Dummy user data. */
|
||||
export const dataArray: User[] = [
|
||||
{ id: 101, name: 'Alice' },
|
||||
{ id: 102, name: 'Bob' },
|
||||
{ id: 103, name: 'Caroline' },
|
||||
{ id: 104, name: 'Dave' },
|
||||
]
|
||||
|
||||
/**
|
||||
* Calls a mock API which finds a user by ID from the list above.
|
||||
*
|
||||
* Throws an error if not found.
|
||||
*/
|
||||
export async function findData(id: number | string) {
|
||||
const selected = dataArray.find((data) => data.id === Number(id))
|
||||
|
||||
if (!selected) {
|
||||
throw new Error('Cannot find user')
|
||||
}
|
||||
|
||||
return selected
|
||||
}
|
||||
|
||||
/** Calls a mock API which returns the above array to simulate "get all". */
|
||||
export async function findAll() {
|
||||
// Throw an error, just for example.
|
||||
if (!Array.isArray(dataArray)) {
|
||||
throw new Error('Cannot find users')
|
||||
}
|
||||
|
||||
return dataArray
|
||||
}
|
Loading…
Reference in New Issue
Block a user