create-lupine 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/index.js +277 -0
  2. package/package.json +18 -0
  3. package/templates/common/.env +57 -0
  4. package/templates/common/.env.development +7 -0
  5. package/templates/common/.env.mobile +10 -0
  6. package/templates/common/.env.production +7 -0
  7. package/templates/common/apps/server/src/app-loader.ts +41 -0
  8. package/templates/common/apps/server/src/fetch-data.ts +20 -0
  9. package/templates/common/apps/server/src/index.ts +66 -0
  10. package/templates/common/apps/server/src/server-env-keys.ts +22 -0
  11. package/templates/common/dev/dev-watch.js +422 -0
  12. package/templates/doc-starter/api/resources/config_default.json +6 -0
  13. package/templates/doc-starter/api/resources/install.sqlite.sql +4 -0
  14. package/templates/doc-starter/api/src/index.ts +15 -0
  15. package/templates/doc-starter/api/src/resources/config_default.json +6 -0
  16. package/templates/doc-starter/api/src/resources/install.sqlite.sql +4 -0
  17. package/templates/doc-starter/lupine.json +33 -0
  18. package/templates/doc-starter/package.json +13 -0
  19. package/templates/doc-starter/web/assets/android-chrome-192x192.png +0 -0
  20. package/templates/doc-starter/web/assets/apple-touch-icon.png +0 -0
  21. package/templates/doc-starter/web/assets/favicon-16x16.png +0 -0
  22. package/templates/doc-starter/web/assets/favicon-32x32.png +0 -0
  23. package/templates/doc-starter/web/assets/favicon.ico +0 -0
  24. package/templates/doc-starter/web/assets/site.webmanifest +14 -0
  25. package/templates/doc-starter/web/github-pj-name/index.html +21 -0
  26. package/templates/doc-starter/web/github-pj-name/index.tsx +35 -0
  27. package/templates/doc-starter/web/markdown/en/essentials/index.md +6 -0
  28. package/templates/doc-starter/web/markdown/en/essentials/list.md +18 -0
  29. package/templates/doc-starter/web/markdown/en/guide/install.md +18 -0
  30. package/templates/doc-starter/web/markdown/en/guide/started.md +22 -0
  31. package/templates/doc-starter/web/markdown/en/index.md +42 -0
  32. package/templates/doc-starter/web/markdown/index.md +7 -0
  33. package/templates/doc-starter/web/markdown/zh/essentials/index.md +6 -0
  34. package/templates/doc-starter/web/markdown/zh/essentials/list.md +18 -0
  35. package/templates/doc-starter/web/markdown/zh/guide/install.md +18 -0
  36. package/templates/doc-starter/web/markdown/zh/guide/started.md +22 -0
  37. package/templates/doc-starter/web/markdown/zh/index.md +42 -0
  38. package/templates/doc-starter/web/src/client-env-keys.ts +5 -0
  39. package/templates/doc-starter/web/src/index.html +21 -0
  40. package/templates/doc-starter/web/src/index.tsx +33 -0
  41. package/templates/doc-starter/web/src/markdown-built/en/essentials/index.html +0 -0
  42. package/templates/doc-starter/web/src/markdown-built/en/essentials/list.html +8 -0
  43. package/templates/doc-starter/web/src/markdown-built/en/guide/install.html +8 -0
  44. package/templates/doc-starter/web/src/markdown-built/en/guide/started.html +12 -0
  45. package/templates/doc-starter/web/src/markdown-built/en/index.html +0 -0
  46. package/templates/doc-starter/web/src/markdown-built/index.html +0 -0
  47. package/templates/doc-starter/web/src/markdown-built/markdown-config.ts +25 -0
  48. package/templates/doc-starter/web/src/markdown-built/zh/essentials/index.html +0 -0
  49. package/templates/doc-starter/web/src/markdown-built/zh/essentials/list.html +8 -0
  50. package/templates/doc-starter/web/src/markdown-built/zh/guide/install.html +8 -0
  51. package/templates/doc-starter/web/src/markdown-built/zh/guide/started.html +12 -0
  52. package/templates/doc-starter/web/src/markdown-built/zh/index.html +0 -0
  53. package/templates/doc-starter/web/src/styles/base-css.ts +15 -0
  54. package/templates/hello-world/api/resources/config_default.json +6 -0
  55. package/templates/hello-world/api/resources/install.sqlite.sql +4 -0
  56. package/templates/hello-world/api/src/index.ts +4 -0
  57. package/templates/hello-world/api/src/service/root-api.ts +18 -0
  58. package/templates/hello-world/lupine.json +23 -0
  59. package/templates/hello-world/web/assets/favicon.ico +0 -0
  60. package/templates/hello-world/web/package.json +6 -0
  61. package/templates/hello-world/web/src/index.html +16 -0
  62. package/templates/hello-world/web/src/index.tsx +30 -0
@@ -0,0 +1,42 @@
1
+ ---
2
+ layout: home
3
+ title: Doc Starter
4
+ sidemenu-width: 260px
5
+ github-title: View on GitHub
6
+ github-link: https://github.com/uuware/lupine.js
7
+
8
+ lang:
9
+ title: English
10
+ id: en
11
+
12
+ hero:
13
+ name: Doc Starter
14
+ text: A Demo Documentation Project
15
+ tagline: This is a demo to show how to build documentation.
16
+ actions:
17
+ - theme: brand
18
+ text: Get Started
19
+ link: /en/guide/started
20
+ - theme: alt
21
+ text: View on GitHub
22
+ link: https://github.com/uuware/lupine.js
23
+
24
+ nav:
25
+ - text: Guide
26
+ link: /en/guide/started
27
+ - text: API
28
+ link: /en/essentials/list
29
+
30
+ sidebar:
31
+ - text: Guide
32
+ items:
33
+ - /en/guide/started
34
+ - /en/guide/install
35
+ - submenu: /en/essentials
36
+
37
+ features:
38
+ - title: Demo Feature 1
39
+ details: This is a demo feature description.
40
+ - title: Demo Feature 2
41
+ details: This is another demo feature description.
42
+ ---
@@ -0,0 +1,7 @@
1
+ ---
2
+ lang:
3
+ - title: English
4
+ id: en
5
+ - title: 简体中文
6
+ id: zh
7
+ ---
@@ -0,0 +1,6 @@
1
+ ---
2
+ sidebar:
3
+ - text: 核心要点
4
+ items:
5
+ - /zh/essentials/list
6
+ ---
@@ -0,0 +1,18 @@
1
+ ---
2
+ title: 核心要点列表
3
+ ---
4
+
5
+ > [!NOTE]
6
+ > This is a demo document.
7
+
8
+ # 核心要点列表
9
+
10
+ This is a simplified essentials list doc for demo purposes.
11
+
12
+ ## 核心要点概述
13
+
14
+ Here is an example listing key features:
15
+
16
+ ```tsx
17
+ const features = ['Fast', 'Reliable', 'Easy to use'];
18
+ ```
@@ -0,0 +1,18 @@
1
+ ---
2
+ title: 安装
3
+ ---
4
+
5
+ > [!NOTE]
6
+ > This is a demo document.
7
+
8
+ # 安装
9
+
10
+ This is a simplified installation guide for demo purposes.
11
+
12
+ ## 基本安装
13
+
14
+ Run the following command:
15
+
16
+ ```bash
17
+ npm install my-project
18
+ ```
@@ -0,0 +1,22 @@
1
+ ---
2
+ title: 快速开始
3
+ ---
4
+
5
+ > [!NOTE]
6
+ > This is a demo document.
7
+
8
+ # 简介
9
+
10
+ This is a simplified getting started guide for demo purposes.
11
+
12
+ ## 快速开始
13
+
14
+ Initialize your project:
15
+
16
+ ```javascript
17
+ import { init } from 'my-project';
18
+
19
+ init({
20
+ debug: true,
21
+ });
22
+ ```
@@ -0,0 +1,42 @@
1
+ ---
2
+ layout: home
3
+ title: 文档演示
4
+ sidemenu-width: 260px
5
+ github-title: GitHub 仓库
6
+ github-link: https://github.com/uuware/lupine.js
7
+
8
+ lang:
9
+ title: 简体中文
10
+ id: zh
11
+
12
+ hero:
13
+ name: 文档演示
14
+ text: 一个演示用的文档项目
15
+ tagline: 这是一个用来展示如何构建文档的演示项目。
16
+ actions:
17
+ - theme: brand
18
+ text: 快速开始
19
+ link: /zh/guide/started
20
+ - theme: alt
21
+ text: GitHub 仓库
22
+ link: https://github.com/uuware/lupine.js
23
+
24
+ nav:
25
+ - text: 指南
26
+ link: /zh/guide/started
27
+ - text: API
28
+ link: /zh/essentials/list
29
+
30
+ sidebar:
31
+ - text: 指南
32
+ items:
33
+ - /zh/guide/started
34
+ - /zh/guide/install
35
+ - submenu: /zh/essentials
36
+
37
+ features:
38
+ - title: 演示特性 1
39
+ details: 这是一个演示特性的描述。
40
+ - title: 演示特性 2
41
+ details: 这是另一个演示特性的描述。
42
+ ---
@@ -0,0 +1,5 @@
1
+ export const enum ClientEnvKeys {
2
+ API_PORT = 'API_PORT',
3
+ API_BASE_URL = 'API_BASE_URL',
4
+ NODE_ENV = 'NODE_ENV',
5
+ }
@@ -0,0 +1,21 @@
1
+ <!DOCTYPE html>
2
+ <html data-theme="<!--META-THEME-->">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <link rel="manifest" href="{SUBDIR}/assets/site.webmanifest" />
6
+ <title><!--META-TITLE--></title>
7
+ <link rel="apple-touch-icon" sizes="180x180" href="{SUBDIR}/assets/apple-touch-icon.png" />
8
+ <link rel="icon" type="image/png" sizes="32x32" href="{SUBDIR}/assets/favicon-32x32.png" />
9
+ <link rel="icon" type="image/png" sizes="16x16" href="{SUBDIR}/assets/favicon-16x16.png" />
10
+ <link rel="icon" type="image/png" sizes="192x192" href="{SUBDIR}/assets/android-chrome-192x192.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <!--META-ENV-START-->
13
+ <!--META-ENV-END-->
14
+ <link rel="shortcut icon" href="{SUBDIR}/assets/favicon.ico?t={hash}" />
15
+ <link rel="stylesheet" type="text/css" href="{SUBDIR}/index.css?t={hash}" />
16
+ <script defer src="{SUBDIR}/index.js#t={hash}"></script>
17
+ </head>
18
+ <body>
19
+ <div class="lupine-root"></div>
20
+ </body>
21
+ </html>
@@ -0,0 +1,33 @@
1
+ import {
2
+ bindRouter,
3
+ PageRouter,
4
+ bindTheme,
5
+ bindLang,
6
+ setDefaultPageTitle,
7
+ isFrontEnd,
8
+ debugWatch,
9
+ webEnv,
10
+ setDefaultMetaDescription,
11
+ bindGlobalStyle,
12
+ } from 'lupine.components';
13
+ import { bindPressData, PressPage, pressThemes } from 'lupine.press';
14
+ import { markdownConfig } from './markdown-built/markdown-config';
15
+ import { ClientEnvKeys } from './client-env-keys';
16
+ import { baseCss } from './styles/base-css';
17
+
18
+ if (isFrontEnd() && webEnv(ClientEnvKeys.NODE_ENV, '') === 'development') {
19
+ debugWatch(webEnv(ClientEnvKeys.API_PORT, 0));
20
+ }
21
+
22
+ bindLang('en', {});
23
+ bindTheme('light', pressThemes);
24
+ bindGlobalStyle('comm-css', baseCss, false, true);
25
+ setDefaultPageTitle('LupineJS Doc');
26
+ setDefaultMetaDescription('LupineJS Doc');
27
+
28
+ bindPressData(markdownConfig);
29
+
30
+ const pageRouter = new PageRouter();
31
+ pageRouter.use('*', PressPage);
32
+
33
+ bindRouter(pageRouter);
@@ -0,0 +1,8 @@
1
+ <blockquote>
2
+ <p>[!NOTE]
3
+ This is a demo document.</p>
4
+ </blockquote>
5
+ <h1 id="essentials-list"><a class="header-anchor" href="#essentials-list">#</a>Essentials List</h1><p>This is a simplified essentials list doc for demo purposes.</p>
6
+ <h2 id="feature-overview"><a class="header-anchor" href="#feature-overview">#</a>Feature Overview</h2><p>Here is an example listing key features:</p>
7
+ <pre><code class="language-tsx">const features = [&#39;Fast&#39;, &#39;Reliable&#39;, &#39;Easy to use&#39;];
8
+ </code></pre>
@@ -0,0 +1,8 @@
1
+ <blockquote>
2
+ <p>[!NOTE]
3
+ This is a demo document.</p>
4
+ </blockquote>
5
+ <h1 id="installation"><a class="header-anchor" href="#installation">#</a>Installation</h1><p>This is a simplified installation guide for demo purposes.</p>
6
+ <h2 id="basic-install"><a class="header-anchor" href="#basic-install">#</a>Basic Install</h2><p>Run the following command:</p>
7
+ <pre><code class="language-bash">npm install my-project
8
+ </code></pre>
@@ -0,0 +1,12 @@
1
+ <blockquote>
2
+ <p>[!NOTE]
3
+ This is a demo document.</p>
4
+ </blockquote>
5
+ <h1 id="getting-started"><a class="header-anchor" href="#getting-started">#</a>Getting Started</h1><p>This is a simplified getting started guide for demo purposes.</p>
6
+ <h2 id="quick-start"><a class="header-anchor" href="#quick-start">#</a>Quick Start</h2><p>Initialize your project:</p>
7
+ <pre><code class="language-javascript">import { init } from &#39;my-project&#39;;
8
+
9
+ init({
10
+ debug: true,
11
+ });
12
+ </code></pre>
@@ -0,0 +1,25 @@
1
+ import html0 from './index.html';
2
+ import html1 from './en/essentials/index.html';
3
+ import html2 from './en/essentials/list.html';
4
+ import html3 from './en/guide/install.html';
5
+ import html4 from './en/guide/started.html';
6
+ import html5 from './en/index.html';
7
+ import html6 from './zh/essentials/index.html';
8
+ import html7 from './zh/essentials/list.html';
9
+ import html8 from './zh/guide/install.html';
10
+ import html9 from './zh/guide/started.html';
11
+ import html10 from './zh/index.html';
12
+
13
+ export const markdownConfig: Record<string, { html: string; data: any; headings: any[] }> = {
14
+ '/': { html: html0, data: {"lang":[{"title":"English","id":"en"},{"title":"简体中文","id":"zh"}]}, headings: [] },
15
+ '/en/essentials/index': { html: html1, data: {"title":"Core Essentials","sidebar":[{"type":"link","text":"Essentials List","link":"/en/essentials/list","level":0}]}, headings: [] },
16
+ '/en/essentials/list': { html: html2, data: {"title":"Essentials List"}, headings: [{"level":2,"text":"Feature Overview","id":"feature-overview"}] },
17
+ '/en/guide/install': { html: html3, data: {"title":"Installation"}, headings: [{"level":2,"text":"Basic Install","id":"basic-install"}] },
18
+ '/en/guide/started': { html: html4, data: {"title":"Getting Started"}, headings: [{"level":2,"text":"Quick Start","id":"quick-start"}] },
19
+ '/en/index': { html: html5, data: {"layout":"home","title":"Doc Starter","sidemenu-width":"260px","github-title":"View on GitHub","github-link":"https://github.com/uuware/lupine.js","lang":{"title":"English","id":"en"},"hero":{"name":"Doc Starter","text":"A Demo Documentation Project","tagline":"This is a demo to show how to build documentation.","actions":[{"theme":"brand","text":"Get Started","link":"/en/guide/started"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/uuware/lupine.js"}]},"nav":[{"text":"Guide","link":"/en/guide/started"},{"text":"API","link":"/en/essentials/list"}],"sidebar":[{"type":"group","text":"Guide","level":0},{"type":"link","text":"Getting Started","link":"/en/guide/started","level":1},{"type":"link","text":"Installation","link":"/en/guide/install","level":1},{"type":"group","text":"Core Essentials","level":0},{"type":"link","text":"Essentials List","link":"/en/essentials/list","level":1}],"features":[{"title":"Demo Feature 1","details":"This is a demo feature description."},{"title":"Demo Feature 2","details":"This is another demo feature description."}]}, headings: [] },
20
+ '/zh/essentials/index': { html: html6, data: {"sidebar":[{"type":"group","text":"核心要点","level":0},{"type":"link","text":"核心要点列表","link":"/zh/essentials/list","level":1}]}, headings: [] },
21
+ '/zh/essentials/list': { html: html7, data: {"title":"核心要点列表"}, headings: [{"level":2,"text":"核心要点概述","id":"核心要点概述"}] },
22
+ '/zh/guide/install': { html: html8, data: {"title":"安装"}, headings: [{"level":2,"text":"基本安装","id":"基本安装"}] },
23
+ '/zh/guide/started': { html: html9, data: {"title":"快速开始"}, headings: [{"level":2,"text":"快速开始","id":"快速开始"}] },
24
+ '/zh/index': { html: html10, data: {"layout":"home","title":"文档演示","sidemenu-width":"260px","github-title":"GitHub 仓库","github-link":"https://github.com/uuware/lupine.js","lang":{"title":"简体中文","id":"zh"},"hero":{"name":"文档演示","text":"一个演示用的文档项目","tagline":"这是一个用来展示如何构建文档的演示项目。","actions":[{"theme":"brand","text":"快速开始","link":"/zh/guide/started"},{"theme":"alt","text":"GitHub 仓库","link":"https://github.com/uuware/lupine.js"}]},"nav":[{"text":"指南","link":"/zh/guide/started"},{"text":"API","link":"/zh/essentials/list"}],"sidebar":[{"type":"group","text":"指南","level":0},{"type":"link","text":"快速开始","link":"/zh/guide/started","level":1},{"type":"link","text":"安装","link":"/zh/guide/install","level":1},{"type":"group","text":"核心要点","level":0},{"type":"link","text":"核心要点列表","link":"/zh/essentials/list","level":1}],"features":[{"title":"演示特性 1","details":"这是一个演示特性的描述。"},{"title":"演示特性 2","details":"这是另一个演示特性的描述。"}]}, headings: [] },
25
+ };
@@ -0,0 +1,8 @@
1
+ <blockquote>
2
+ <p>[!NOTE]
3
+ This is a demo document.</p>
4
+ </blockquote>
5
+ <h1 id="核心要点列表"><a class="header-anchor" href="#核心要点列表">#</a>核心要点列表</h1><p>This is a simplified essentials list doc for demo purposes.</p>
6
+ <h2 id="核心要点概述"><a class="header-anchor" href="#核心要点概述">#</a>核心要点概述</h2><p>Here is an example listing key features:</p>
7
+ <pre><code class="language-tsx">const features = [&#39;Fast&#39;, &#39;Reliable&#39;, &#39;Easy to use&#39;];
8
+ </code></pre>
@@ -0,0 +1,8 @@
1
+ <blockquote>
2
+ <p>[!NOTE]
3
+ This is a demo document.</p>
4
+ </blockquote>
5
+ <h1 id="安装"><a class="header-anchor" href="#安装">#</a>安装</h1><p>This is a simplified installation guide for demo purposes.</p>
6
+ <h2 id="基本安装"><a class="header-anchor" href="#基本安装">#</a>基本安装</h2><p>Run the following command:</p>
7
+ <pre><code class="language-bash">npm install my-project
8
+ </code></pre>
@@ -0,0 +1,12 @@
1
+ <blockquote>
2
+ <p>[!NOTE]
3
+ This is a demo document.</p>
4
+ </blockquote>
5
+ <h1 id="简介"><a class="header-anchor" href="#简介">#</a>简介</h1><p>This is a simplified getting started guide for demo purposes.</p>
6
+ <h2 id="快速开始"><a class="header-anchor" href="#快速开始">#</a>快速开始</h2><p>Initialize your project:</p>
7
+ <pre><code class="language-javascript">import { init } from &#39;my-project&#39;;
8
+
9
+ init({
10
+ debug: true,
11
+ });
12
+ </code></pre>
@@ -0,0 +1,15 @@
1
+ export const baseCss = {
2
+ a: {
3
+ textDecoration: 'none',
4
+ color: 'inherit',
5
+ '&:hover': { color: 'var(--press-brand-color)' },
6
+ },
7
+ body: {
8
+ backgroundColor: 'var(--primary-bg-color)',
9
+ color: 'var(--primary-color)',
10
+ fontSize: 'var(--font-size-base)',
11
+ lineHeight: 'var(--line-height-base)',
12
+ fontFamily: 'var(--font-family-base)',
13
+ fontWeight: 'var(--font-weight-base)',
14
+ },
15
+ };
@@ -0,0 +1,6 @@
1
+ {
2
+ "WEB.pageLimit": "15",
3
+ "WEB.siteTitle": "Sample title",
4
+ "WEB.siteEmail": "sample@sample.com",
5
+ "WEB.siteUrl": "https://sample.com"
6
+ }
@@ -0,0 +1,4 @@
1
+ #-- sql queries to create tables
2
+ #-- Never name a table with plural (such as "users")
3
+ #-- Never name a table using a reserved keyword (such as "user")
4
+ #-- Never prefix your table name with "tbl" or some other object type prefix
@@ -0,0 +1,4 @@
1
+ import { ApiModule } from 'lupine.api';
2
+ import { RootApi } from './service/root-api';
3
+
4
+ export const apiModule = new ApiModule(new RootApi());
@@ -0,0 +1,18 @@
1
+ import { IApiBase, StaticServer, ApiRouter } from 'lupine.api';
2
+
3
+ export class RootApi implements IApiBase {
4
+ protected router = new ApiRouter();
5
+
6
+ constructor() {
7
+ this.mountDashboard();
8
+ }
9
+
10
+ public getRouter(): ApiRouter {
11
+ return this.router;
12
+ }
13
+
14
+ protected mountDashboard() {
15
+ const staticServer = new StaticServer();
16
+ this.router.use('*', staticServer.processRequest.bind(staticServer));
17
+ }
18
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "hello-world",
3
+ "webEntryPoints": [
4
+ {
5
+ "index": "web/src/index.tsx",
6
+ "html": "web/src/index.html",
7
+ "outdir": "/"
8
+ }
9
+ ],
10
+ "apiEntryPoint": "api/src/index.ts",
11
+ "copyFiles": [
12
+ {
13
+ "type": "web",
14
+ "from": "web/assets",
15
+ "to": "assets"
16
+ },
17
+ {
18
+ "type": "data",
19
+ "from": "api/resources",
20
+ "to": "resources"
21
+ }
22
+ ]
23
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "hello-world-web",
3
+ "version": "1.0.0",
4
+ "dependencies": {},
5
+ "devDependencies": {}
6
+ }
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html data-theme="<!--META-THEME-->">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title><!--META-TITLE--></title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
7
+ <!--META-ENV-START-->
8
+ <!--META-ENV-END-->
9
+ <link rel="shortcut icon" href="{SUBDIR}/assets/favicon.ico?t={hash}" />
10
+ <link rel="stylesheet" type="text/css" href="{SUBDIR}/index.css?t={hash}" />
11
+ <script defer src="{SUBDIR}/index.js#t={hash}"></script>
12
+ </head>
13
+ <body>
14
+ <div class="lupine-root"></div>
15
+ </body>
16
+ </html>
@@ -0,0 +1,30 @@
1
+ import { bindRouter, CssProps, debugWatch, HtmlVar, isFrontEnd, PageRouter, webEnv } from 'lupine.components';
2
+
3
+ const HelloPage = () => {
4
+ const css: CssProps = {
5
+ padding: '20px',
6
+ h1: {
7
+ color: 'blue',
8
+ '&:hover': {
9
+ color: 'red',
10
+ },
11
+ },
12
+ };
13
+ const dom = new HtmlVar('0');
14
+ return (
15
+ <div css={css} style={{ textAlign: 'center' }}>
16
+ <h1>Hello World</h1>
17
+ <p>This is a simplified Lupine.js project.</p>
18
+ <p>{dom.node}</p>
19
+ <button onClick={() => (dom.value = (Number(dom.value) + 1).toString())}>Increment</button>
20
+ </div>
21
+ );
22
+ };
23
+
24
+ if (isFrontEnd() && webEnv('NODE_ENV', '') === 'development') {
25
+ debugWatch(webEnv('API_PORT', 0));
26
+ }
27
+
28
+ const pageRouter = new PageRouter();
29
+ pageRouter.use('/', HelloPage);
30
+ bindRouter(pageRouter);