@ciderjs/gasbombe 0.2.8 → 0.3.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 (120) hide show
  1. package/README.ja.md +9 -4
  2. package/README.md +9 -4
  3. package/dist/cli.cjs +46 -5
  4. package/dist/cli.mjs +46 -5
  5. package/dist/index.cjs +1 -1
  6. package/dist/index.d.cts +1 -1
  7. package/dist/index.d.mts +1 -1
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.mjs +1 -1
  10. package/dist/templates/react/.env.ejs +1 -0
  11. package/dist/templates/{react-tsx → react}/README.md.ejs +0 -1
  12. package/dist/templates/react/biome.json.ejs +43 -0
  13. package/dist/templates/react/index.html.ejs +13 -0
  14. package/dist/templates/{react-tsx → react}/package.json.ejs +0 -2
  15. package/dist/templates/react/public/vite.svg.ejs +1 -0
  16. package/dist/templates/react/rolldown.config.ts.ejs +25 -0
  17. package/dist/templates/react/server/app.ts.ejs +29 -0
  18. package/dist/templates/react/server/appsscript.json.ejs +12 -0
  19. package/dist/templates/react/server/modules/hello.ts.ejs +3 -0
  20. package/dist/templates/react/src/App.css.ejs +42 -0
  21. package/dist/templates/react/src/App.tsx.ejs +63 -0
  22. package/dist/templates/react/src/assets/react.svg.ejs +1 -0
  23. package/dist/templates/react/src/index.css.ejs +68 -0
  24. package/dist/templates/react/src/lib/parameters.ts.ejs +20 -0
  25. package/dist/templates/react/src/main.tsx.ejs +11 -0
  26. package/dist/templates/react/src/vite-env.d.ts.ejs +1 -0
  27. package/dist/templates/react/tests/server/modules/hello.spec.ts.ejs +9 -0
  28. package/dist/templates/react/tsconfig.app.json.ejs +31 -0
  29. package/dist/templates/react/tsconfig.json.ejs +13 -0
  30. package/dist/templates/react/tsconfig.node.json.ejs +25 -0
  31. package/dist/templates/{react-tsx → react}/types/appsscript/client.ts.ejs +2 -15
  32. package/dist/templates/react/types/appsscript/server.ts.ejs +10 -0
  33. package/dist/templates/react/vite.config.ts.ejs +20 -0
  34. package/dist/templates/react-ciderjs/.github/workflows/appsscript.yml.ejs +45 -0
  35. package/dist/templates/react-ciderjs/README.md.ejs +20 -0
  36. package/dist/templates/{react-tsx → react-ciderjs}/biome.json.ejs +3 -25
  37. package/dist/templates/react-ciderjs/package.json.ejs +51 -0
  38. package/dist/templates/react-ciderjs/rolldown.config.ts.ejs +25 -0
  39. package/dist/templates/{react-tsx → react-ciderjs}/server/app.ts.ejs +6 -6
  40. package/dist/templates/react-ciderjs/src/App.tsx.ejs +49 -0
  41. package/dist/templates/{react-tsx → react-ciderjs}/src/lib/parameters.ts.ejs +4 -4
  42. package/dist/templates/{react-tsx → react-ciderjs}/src/lib/server.ts.ejs +2 -2
  43. package/dist/templates/react-ciderjs/src/main.tsx.ejs +11 -0
  44. package/dist/templates/react-ciderjs/src/pages/about.tsx.ejs +7 -0
  45. package/dist/templates/react-ciderjs/src/pages/detail/user.tsx.ejs +16 -0
  46. package/dist/templates/{react-tsx/src/App.tsx.ejs → react-ciderjs/src/pages/index.tsx.ejs} +10 -13
  47. package/dist/templates/react-ciderjs/tests/server/modules/hello.spec.ts.ejs +9 -0
  48. package/dist/templates/react-ciderjs/tests/src/lib/server.spec.ts.ejs +8 -0
  49. package/dist/templates/react-ciderjs/vite.config.ts.ejs +33 -0
  50. package/dist/templates/server-js/biome.json.ejs +36 -0
  51. package/dist/templates/server-js/package.json.ejs +26 -0
  52. package/dist/templates/server-js/rolldown.config.mjs.ejs +29 -0
  53. package/dist/templates/server-js/src/main.js.ejs +5 -0
  54. package/dist/templates/server-js/src/modules/hello.js.ejs +3 -0
  55. package/dist/templates/server-js/tests/main.test.js.ejs +15 -0
  56. package/dist/templates/server-js/tsconfig.json.ejs +34 -0
  57. package/dist/templates/server-js/vitest.config.js.ejs +11 -0
  58. package/dist/templates/server-ts/.clasp.json.ejs +5 -0
  59. package/dist/templates/server-ts/README.md.ejs +7 -0
  60. package/dist/templates/{vanilla-ts → server-ts}/biome.json.ejs +2 -2
  61. package/dist/templates/{vanilla-ts → server-ts}/package.json.ejs +8 -9
  62. package/dist/templates/server-ts/rolldown.config.ts.ejs +29 -0
  63. package/dist/templates/server-ts/src/appsscript.json.ejs +8 -0
  64. package/dist/templates/server-ts/src/main.ts.ejs +5 -0
  65. package/dist/templates/server-ts/tests/main.test.ts.ejs +15 -0
  66. package/dist/templates/server-ts/vitest.config.ts.ejs +11 -0
  67. package/dist/templates/vue/.clasp.json.ejs +5 -0
  68. package/dist/templates/vue/.env.ejs +1 -0
  69. package/dist/templates/vue/.vscode/extensions.json.ejs +3 -0
  70. package/dist/templates/vue/README.md.ejs +5 -0
  71. package/dist/templates/vue/biome.json.ejs +35 -0
  72. package/dist/templates/vue/index.html.ejs +13 -0
  73. package/dist/templates/vue/package.json.ejs +45 -0
  74. package/dist/templates/vue/public/vite.svg.ejs +1 -0
  75. package/dist/templates/vue/rolldown.config.ts.ejs +25 -0
  76. package/dist/templates/vue/server/app.ts.ejs +29 -0
  77. package/dist/templates/vue/server/appsscript.json.ejs +12 -0
  78. package/dist/templates/vue/server/modules/hello.ts.ejs +3 -0
  79. package/dist/templates/vue/src/App.vue.ejs +30 -0
  80. package/dist/templates/vue/src/assets/vue.svg.ejs +1 -0
  81. package/dist/templates/vue/src/components/HelloWorld.vue.ejs +60 -0
  82. package/dist/templates/vue/src/lib/parameters.ts.ejs +20 -0
  83. package/dist/templates/vue/src/main.ts.ejs +5 -0
  84. package/dist/templates/vue/src/style.css.ejs +79 -0
  85. package/dist/templates/vue/tests/server/modules/hello.spec.ts.ejs +9 -0
  86. package/dist/templates/vue/tsconfig.app.json.ejs +21 -0
  87. package/dist/templates/vue/tsconfig.json.ejs +13 -0
  88. package/dist/templates/vue/tsconfig.node.json.ejs +26 -0
  89. package/dist/templates/vue/types/appsscript/client.ts.ejs +44 -0
  90. package/dist/templates/vue/types/appsscript/server.ts.ejs +10 -0
  91. package/dist/templates/vue/vite.config.ts.ejs +19 -0
  92. package/package.json +17 -12
  93. package/dist/templates/react-tsx/rolldown.config.ts.ejs +0 -25
  94. package/dist/templates/react-tsx/src/main.tsx.ejs +0 -11
  95. package/dist/templates/react-tsx/tests/server/modules/hello.spec.ts.ejs +0 -9
  96. package/dist/templates/react-tsx/tests/src/lib/server.spec.ts.ejs +0 -8
  97. package/dist/templates/react-tsx/vite.config.ts.ejs +0 -31
  98. package/dist/templates/vanilla-ts/rolldown.config.ts.ejs +0 -29
  99. package/dist/templates/vanilla-ts/src/main.ts.ejs +0 -5
  100. package/dist/templates/vanilla-ts/tests/main.test.ts.ejs +0 -15
  101. package/dist/templates/vanilla-ts/vitest.config.ts.ejs +0 -11
  102. /package/dist/templates/{vanilla-ts → react}/.clasp.json.ejs +0 -0
  103. /package/dist/templates/{react-tsx → react-ciderjs}/.clasp.json.ejs +0 -0
  104. /package/dist/templates/{react-tsx → react-ciderjs}/.env.ejs +0 -0
  105. /package/dist/templates/{react-tsx → react-ciderjs}/index.html.ejs +0 -0
  106. /package/dist/templates/{react-tsx → react-ciderjs}/public/vite.svg.ejs +0 -0
  107. /package/dist/templates/{react-tsx → react-ciderjs}/server/appsscript.json.ejs +0 -0
  108. /package/dist/templates/{react-tsx → react-ciderjs}/server/modules/hello.ts.ejs +0 -0
  109. /package/dist/templates/{react-tsx → react-ciderjs}/src/App.css.ejs +0 -0
  110. /package/dist/templates/{react-tsx → react-ciderjs}/src/assets/react.svg.ejs +0 -0
  111. /package/dist/templates/{react-tsx → react-ciderjs}/src/index.css.ejs +0 -0
  112. /package/dist/templates/{react-tsx → react-ciderjs}/src/vite-env.d.ts.ejs +0 -0
  113. /package/dist/templates/{react-tsx → react-ciderjs}/tsconfig.app.json.ejs +0 -0
  114. /package/dist/templates/{react-tsx → react-ciderjs}/tsconfig.json.ejs +0 -0
  115. /package/dist/templates/{react-tsx → react-ciderjs}/tsconfig.node.json.ejs +0 -0
  116. /package/dist/templates/{react-tsx → react-ciderjs}/types/appsscript/server.ts.ejs +0 -0
  117. /package/dist/templates/{vanilla-ts → server-js}/README.md.ejs +0 -0
  118. /package/dist/templates/{vanilla-ts → server-js}/src/appsscript.json.ejs +0 -0
  119. /package/dist/templates/{vanilla-ts → server-ts}/src/modules/hello.ts.ejs +0 -0
  120. /package/dist/templates/{vanilla-ts → server-ts}/tsconfig.json.ejs +0 -0
@@ -0,0 +1,31 @@
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
+ "target": "ES2022",
5
+ "useDefineForClassFields": true,
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+ "module": "ESNext",
8
+ "skipLibCheck": true,
9
+
10
+ /* Bundler mode */
11
+ "moduleResolution": "bundler",
12
+ "allowImportingTsExtensions": true,
13
+ "verbatimModuleSyntax": true,
14
+ "moduleDetection": "force",
15
+ "noEmit": true,
16
+ "jsx": "react-jsx",
17
+
18
+ /* Linting */
19
+ "strict": true,
20
+ "noUnusedLocals": true,
21
+ "noUnusedParameters": true,
22
+ "erasableSyntaxOnly": true,
23
+ "noFallthroughCasesInSwitch": true,
24
+ "noUncheckedSideEffectImports": true,
25
+ "paths": {
26
+ "@/*": ["./src/*"],
27
+ "~/*": ["./*"]
28
+ }
29
+ },
30
+ "include": ["src", "tests", "server", "types"]
31
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ { "path": "./tsconfig.app.json" },
5
+ { "path": "./tsconfig.node.json" }
6
+ ],
7
+ "compilerOptions": {
8
+ "paths": {
9
+ "@/*": ["./src/*"],
10
+ "~/*": ["./*"]
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "compilerOptions": {
3
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
+ "target": "ES2023",
5
+ "lib": ["ES2023"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+
9
+ /* Bundler mode */
10
+ "moduleResolution": "bundler",
11
+ "allowImportingTsExtensions": true,
12
+ "verbatimModuleSyntax": true,
13
+ "moduleDetection": "force",
14
+ "noEmit": true,
15
+
16
+ /* Linting */
17
+ "strict": true,
18
+ "noUnusedLocals": true,
19
+ "noUnusedParameters": true,
20
+ "erasableSyntaxOnly": true,
21
+ "noFallthroughCasesInSwitch": true,
22
+ "noUncheckedSideEffectImports": true
23
+ },
24
+ "include": ["vite.config.ts"]
25
+ }
@@ -1,19 +1,6 @@
1
- // Auto-generated by gasnuki
2
- // Do NOT edit this file manually.
1
+ // sample code from https://developers.google.com/apps-script/guides/web-apps
3
2
 
4
- export type ServerScripts = {
5
- sayHello(name: string): string;
6
- };
7
-
8
- // Auto-generated Types for GoogleAppsScript in client-side code
9
-
10
- export type RemoveReturnType<T> = {
11
- [P in keyof T]: T[P] extends (...args: infer A) => any
12
- ? (...args: A) => void
13
- : T[P];
14
- };
15
-
16
- type _AppsScriptRun = RemoveReturnType<ServerScripts> & {
3
+ type _AppsScriptRun = {
17
4
  [key: string]: (...args: any[]) => any;
18
5
  withSuccessHandler: <T = string | number | boolean | undefined, U = any>(
19
6
  callback: (returnValues: T, userObject?: U) => void,
@@ -0,0 +1,10 @@
1
+ export interface WebAppParams<T extends string = string>
2
+ extends GoogleAppsScript.Events.DoGet {
3
+ parameter: Record<T, string>;
4
+ parameters: Record<T, string[]>;
5
+ }
6
+
7
+ export type ServerParams = WebAppParams & {
8
+ siteTitle: string;
9
+ userAddress: string;
10
+ };
@@ -0,0 +1,20 @@
1
+ /// <reference types="vitest" />
2
+
3
+ import react from "@vitejs/plugin-react";
4
+ import { defineConfig } from "vite";
5
+ import { gas } from "vite-plugin-google-apps-script";
6
+ import { viteSingleFile } from "vite-plugin-singlefile";
7
+ import tsconfigPaths from "vite-tsconfig-paths";
8
+
9
+ // https://vite.dev/config/
10
+ export default defineConfig({
11
+ build: {
12
+ outDir: "dist",
13
+ },
14
+ test: {
15
+ coverage: {
16
+ include: ["src/**/*.ts", "src/**/*.tsx", "server/**/*.ts"],
17
+ },
18
+ },
19
+ plugins: [react(), tsconfigPaths(), gas(), viteSingleFile()],
20
+ });
@@ -0,0 +1,45 @@
1
+ name: Publish to GoogleAppsScript
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*' # Trigger on tags like v1.0.0, v0.1.2, etc.
7
+ workflow_dispatch: # Trigger manually
8
+
9
+ jobs:
10
+ build-and-publish:
11
+ runs-on: ubuntu-latest
12
+ permissions:
13
+ contents: read
14
+
15
+ steps:
16
+ - name: Checkout repository
17
+ uses: actions/checkout@v4
18
+
19
+ - name: Setup Node.js
20
+ uses: actions/setup-node@v4
21
+ with:
22
+ node-version: '20.x'
23
+ registry-url: 'https://registry.npmjs.org'
24
+
25
+ - name: Install pnpm
26
+ uses: pnpm/action-setup@v4
27
+ with:
28
+ version: 10
29
+
30
+ - name: Install dependencies
31
+ run: pnpm install
32
+
33
+ - name: Prebuild
34
+ run: pnpm run check && pnpm run test
35
+
36
+ - name: Build package
37
+ run: pnpm run build
38
+
39
+ - name: Restore clasp credentials
40
+ uses: ciderjs/clasp-auth@v0.1.3
41
+ with:
42
+ json: {{ secrets.CLASPRC_JSON }}
43
+
44
+ - name: Publish to AppsScript
45
+ run: pnpm run push
@@ -0,0 +1,20 @@
1
+ # React + TypeScript + Vite + AppsScript
2
+
3
+ This template provides a minimal setup to get React working in Vite with HMR and Apps Script Backend.
4
+
5
+ Currently, these plugins are available:
6
+
7
+ - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
8
+ - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9
+ - [@ciderjs/gasnuki](https://github.com/luthpg/gasnuki) for Type Definition Bridge
10
+ - [@ciderjs/city-gas](https://github.com/luthpg/city-gas) for Router
11
+ - [rolldown](https://github.com/rolldown/rolldown) for transpile TypeScript files and bundle files
12
+
13
+ ## Using Clasp authentication in CI/CD workflow with @ciderjs/clasp-auth
14
+
15
+ You can upload your Clasp authentication json file to your Github repository, and use it in CI/CD cycle.
16
+
17
+ 0. Log in with @google/clasp, GitHub CLI
18
+ 1. `pnpm run auth repoOwner/repoName` * replace with repository name
19
+ 2. Push code, and set Version Tag in GitHub
20
+ 3. ...and your codes are pushed and deployed to Apps-Script!
@@ -1,5 +1,5 @@
1
1
  {
2
- "$schema": "https://biomejs.dev/schemas/2.2.4/schema.json",
2
+ "$schema": "https://biomejs.dev/schemas/2.3.4/schema.json",
3
3
  "vcs": {
4
4
  "enabled": false,
5
5
  "clientKind": "git",
@@ -29,7 +29,7 @@
29
29
  },
30
30
  "javascript": {
31
31
  "formatter": {
32
- "quoteStyle": "single"
32
+ "quoteStyle": "double"
33
33
  }
34
34
  },
35
35
  "assist": {
@@ -39,27 +39,5 @@
39
39
  "organizeImports": "on"
40
40
  }
41
41
  }
42
- },
43
- "overrides": [
44
- {
45
- "includes": ["types/**/*", "tests/**/*"],
46
- "linter": {
47
- "rules": {
48
- "suspicious": {
49
- "noExplicitAny": "off"
50
- }
51
- }
52
- }
53
- },
54
- {
55
- "includes": ["src/index.css"],
56
- "linter": {
57
- "rules": {
58
- "suspicious": {
59
- "noUnknownAtRules": "off"
60
- }
61
- }
62
- }
63
- }
64
- ]
42
+ }
65
43
  }
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "<%= projectName %>",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build:server": "rolldown -c && cpy server/*.json dist/",
9
+ "build:front": "tsc -b && vite build",
10
+ "build": "rimraf dist && pnpm run build:front && pnpm run build:server",
11
+ "check": "biome check --write",
12
+ "generate": "gasnuki",
13
+ "test": "vitest run --coverage",
14
+ "auth": "clasp-auth upload",
15
+ "push": "clasp push",
16
+ "deploy": "clasp create-deployment",
17
+ "update": "dotenv cross-var \"clasp update-deployment $GAS_DEPLOYMENT_ID\"",
18
+ "preview:local": "vite preview",
19
+ "preview:web": "clasp open-web-app"
20
+ },
21
+ "dependencies": {
22
+ "@ciderjs/city-gas": "^0.2.0",
23
+ "@ciderjs/gasnuki": "^0.3.2",
24
+ "react": "^19.2.0",
25
+ "react-dom": "^19.2.0"
26
+ },
27
+ "devDependencies": {
28
+ "@biomejs/biome": "^2.2.6",
29
+ "@ciderjs/clasp-auth": "^0.1.3",
30
+ "@google/clasp": "^3.1.0",
31
+ "@rollup/plugin-alias": "^5.1.1",
32
+ "@types/google-apps-script": "^2.0.5",
33
+ "@types/node": "^24.8.1",
34
+ "@types/react": "^19.2.2",
35
+ "@types/react-dom": "^19.2.2",
36
+ "@vitejs/plugin-react": "^5.0.4",
37
+ "@vitest/coverage-v8": "3.2.4",
38
+ "cpy-cli": "^6.0.0",
39
+ "cross-var": "^1.1.0",
40
+ "dotenv-cli": "^10.0.0",
41
+ "rimraf": "^6.0.1",
42
+ "rolldown": "1.0.0-beta.43",
43
+ "rolldown-plugin-remove-export": "^0.1.3",
44
+ "typescript": "~5.9.3",
45
+ "vite": "^7.1.10",
46
+ "vite-plugin-google-apps-script": "^0.4.0",
47
+ "vite-plugin-singlefile": "^2.3.0",
48
+ "vite-tsconfig-paths": "^5.1.4",
49
+ "vitest": "^3.2.4"
50
+ }
51
+ }
@@ -0,0 +1,25 @@
1
+ import path from "node:path";
2
+ import alias from "@rollup/plugin-alias";
3
+ import { defineConfig } from "rolldown";
4
+ import { removeExportPlugin } from "rolldown-plugin-remove-export";
5
+
6
+ const outputFile = "app.js";
7
+
8
+ export default defineConfig({
9
+ input: "server/app.ts",
10
+ output: {
11
+ format: "esm",
12
+ file: `dist/${outputFile}`,
13
+ },
14
+ plugins: [
15
+ alias({
16
+ entries: [
17
+ {
18
+ find: "~",
19
+ replacement: path.resolve(__dirname),
20
+ },
21
+ ],
22
+ }),
23
+ removeExportPlugin(outputFile),
24
+ ],
25
+ });
@@ -1,14 +1,14 @@
1
- import type { ServerParams, WebAppParams } from '~/types/appsscript/server';
1
+ import type { ServerParams, WebAppParams } from "~/types/appsscript/server";
2
2
 
3
- export * from './modules/hello';
3
+ export * from "./modules/hello";
4
4
 
5
- const SITE_TITLE = 'WebApp';
5
+ const SITE_TITLE = "<%= projectName %>";
6
6
 
7
7
  /**
8
8
  * Procedure to handle GET requests when published as a web app
9
9
  */
10
10
  export function doGet(e: WebAppParams) {
11
- const htmlTemplate = HtmlService.createTemplateFromFile('index');
11
+ const htmlTemplate = HtmlService.createTemplateFromFile("index");
12
12
  const title = SITE_TITLE;
13
13
  const userAddress = Session.getActiveUser().getEmail();
14
14
 
@@ -22,8 +22,8 @@ export function doGet(e: WebAppParams) {
22
22
  const htmlOutput = htmlTemplate.evaluate();
23
23
  htmlOutput.setTitle(title);
24
24
  htmlOutput.addMetaTag(
25
- 'viewport',
26
- 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui',
25
+ "viewport",
26
+ "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui",
27
27
  );
28
28
  return htmlOutput;
29
29
  }
@@ -0,0 +1,49 @@
1
+ import { createRouter } from "@ciderjs/city-gas";
2
+ import {
3
+ RouterOutlet,
4
+ RouterProvider,
5
+ useNavigate,
6
+ } from "@ciderjs/city-gas/react";
7
+ import { pages } from "@/generated/routes";
8
+ import "@/App.css";
9
+
10
+ function Navigation() {
11
+ const navigate = useNavigate();
12
+ return (
13
+ <div style={{ marginBottom: "1rem" }}>
14
+ <button
15
+ type="button"
16
+ style={{ marginRight: "1rem" }}
17
+ onClick={() => navigate("/")}
18
+ >
19
+ Home
20
+ </button>
21
+ <button
22
+ type="button"
23
+ style={{ marginRight: "1rem" }}
24
+ onClick={() => navigate("/about")}
25
+ >
26
+ About
27
+ </button>
28
+ <button
29
+ type="button"
30
+ onClick={() => navigate("/detail/user", { id: "1" })}
31
+ >
32
+ Detail of User <code>1</code>
33
+ </button>
34
+ </div>
35
+ );
36
+ }
37
+
38
+ function App() {
39
+ const router = createRouter(pages);
40
+
41
+ return (
42
+ <RouterProvider router={router}>
43
+ <Navigation />
44
+ <RouterOutlet />
45
+ </RouterProvider>
46
+ );
47
+ }
48
+
49
+ export default App;
@@ -1,9 +1,9 @@
1
- import type { ServerParams } from '~/types/appsscript/server';
1
+ import type { ServerParams } from "~/types/appsscript/server";
2
2
 
3
3
  let parameters: ServerParams = {} as ServerParams;
4
4
 
5
5
  try {
6
- const parametersJson = '<?!= JSON.stringify(parameters) ?>';
6
+ const parametersJson = "<?!= JSON.stringify(parameters) ?>";
7
7
  parameters = JSON.parse(
8
8
  parametersJson.slice(1, parametersJson.length - 1).replace(/\\"/g, '"'),
9
9
  );
@@ -12,8 +12,8 @@ try {
12
12
  parameters = {
13
13
  ...parameters,
14
14
  parameter: {},
15
- siteTitle: 'Mockup Site Title',
16
- userAddress: 'mock-user@example.com',
15
+ siteTitle: "Mockup Site Title",
16
+ userAddress: "mock-user@example.com",
17
17
  };
18
18
  }
19
19
 
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  getPromisedServerScripts,
3
3
  type PartialScriptType,
4
- } from '@ciderjs/gasnuki/promise';
5
- import type { ServerScripts } from '~/types/appsscript/client';
4
+ } from "@ciderjs/gasnuki/promise";
5
+ import type { ServerScripts } from "~/types/appsscript/client";
6
6
 
7
7
  // mockup function to simulate as fetching appsscript time
8
8
  export const sleep = (ms: number) =>
@@ -0,0 +1,11 @@
1
+ import { StrictMode } from "react";
2
+ import { createRoot } from "react-dom/client";
3
+ import "./index.css";
4
+ import App from "./App.tsx";
5
+
6
+ // biome-ignore lint/style/noNonNullAssertion: root is not null
7
+ createRoot(document.getElementById("root")!).render(
8
+ <StrictMode>
9
+ <App />
10
+ </StrictMode>,
11
+ );
@@ -0,0 +1,7 @@
1
+ export default function Page() {
2
+ return (
3
+ <>
4
+ <h1>About</h1>
5
+ </>
6
+ );
7
+ }
@@ -0,0 +1,16 @@
1
+ import { useParams } from "@ciderjs/city-gas/react";
2
+
3
+ export const params = {
4
+ id: "string",
5
+ };
6
+
7
+ export default function Page() {
8
+ const { id } = useParams<"/detail/user">();
9
+ return (
10
+ <>
11
+ <h1>
12
+ Detail of User <code>{id}</code>
13
+ </h1>
14
+ </>
15
+ );
16
+ }
@@ -1,24 +1,23 @@
1
- import { useState } from 'react';
2
- import reactLogo from '@/assets/react.svg';
3
- import viteLogo from '/vite.svg';
4
- import '@/App.css';
5
- import { parameters } from '@/lib/parameters';
6
- import { serverScripts } from '@/lib/server';
1
+ import { useState } from "react";
2
+ import reactLogo from "@/assets/react.svg";
3
+ import { parameters } from "@/lib/parameters";
4
+ import { serverScripts } from "@/lib/server";
5
+ import viteLogo from "/vite.svg";
7
6
 
8
- function App() {
7
+ export default function Page() {
9
8
  const [count, setCount] = useState(0);
10
- const [message, setMessage] = useState('');
9
+ const [message, setMessage] = useState("Click to say hello");
11
10
 
12
11
  const { userAddress } = parameters;
13
12
 
14
13
  const handleHelloButton = async () => {
15
14
  try {
16
- setMessage('Waiting...');
15
+ setMessage("Waiting...");
17
16
  const result = await serverScripts.sayHello(userAddress);
18
17
  setMessage(result);
19
18
  } catch (error) {
20
19
  console.error(error);
21
- setMessage('Error. Check the console.');
20
+ setMessage("Error. Check the console.");
22
21
  }
23
22
  };
24
23
 
@@ -40,7 +39,7 @@ function App() {
40
39
  <button
41
40
  type="button"
42
41
  onClick={handleHelloButton}
43
- style={{ marginLeft: '10px' }}
42
+ style={{ marginLeft: "10px" }}
44
43
  >
45
44
  {message}
46
45
  </button>
@@ -54,5 +53,3 @@ function App() {
54
53
  </>
55
54
  );
56
55
  }
57
-
58
- export default App;
@@ -0,0 +1,9 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { sayHello } from "~/server/modules/hello";
3
+
4
+ describe("hello", () => {
5
+ it("should say hello", () => {
6
+ const name = "world";
7
+ expect(sayHello(name)).toBe(`Hello, ${name}!`);
8
+ });
9
+ });
@@ -0,0 +1,8 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { serverScripts } from "@/lib/server";
3
+
4
+ describe("server", () => {
5
+ it("should be defined", () => {
6
+ expect(serverScripts).toBeDefined();
7
+ });
8
+ });
@@ -0,0 +1,33 @@
1
+ /// <reference types="vitest" />
2
+
3
+ import { cityGasRouter } from "@ciderjs/city-gas/plugin";
4
+ import { gasnuki } from "@ciderjs/gasnuki/vite";
5
+ import react from "@vitejs/plugin-react";
6
+ import { defineConfig } from "vite";
7
+ import { gas } from "vite-plugin-google-apps-script";
8
+ import { viteSingleFile } from "vite-plugin-singlefile";
9
+ import tsconfigPaths from "vite-tsconfig-paths";
10
+
11
+ // https://vite.dev/config/
12
+ export default defineConfig({
13
+ build: {
14
+ outDir: "dist",
15
+ },
16
+ test: {
17
+ coverage: {
18
+ include: ["src/**/*.ts", "src/**/*.tsx", "server/**/*.ts"],
19
+ },
20
+ },
21
+ plugins: [
22
+ react(),
23
+ tsconfigPaths(),
24
+ cityGasRouter(),
25
+ gasnuki({
26
+ srcDir: "server",
27
+ outDir: "types/appsscript",
28
+ outputFile: "client.ts",
29
+ }),
30
+ gas(),
31
+ viteSingleFile(),
32
+ ],
33
+ });
@@ -0,0 +1,36 @@
1
+ {
2
+ "$schema": "https://biomejs.dev/schemas/2.3.4/schema.json",
3
+ "vcs": {
4
+ "enabled": false,
5
+ "clientKind": "git",
6
+ "useIgnoreFile": false
7
+ },
8
+ "files": {
9
+ "ignoreUnknown": false,
10
+ "includes": ["src/**/*", "tests/**/*", "types/**/*", "./*.js", "./*.json"]
11
+ },
12
+ "formatter": {
13
+ "enabled": true,
14
+ "indentStyle": "space",
15
+ "indentWidth": 2
16
+ },
17
+ "linter": {
18
+ "enabled": true,
19
+ "rules": {
20
+ "recommended": true
21
+ }
22
+ },
23
+ "javascript": {
24
+ "formatter": {
25
+ "quoteStyle": "double"
26
+ }
27
+ },
28
+ "assist": {
29
+ "enabled": true,
30
+ "actions": {
31
+ "source": {
32
+ "organizeImports": "on"
33
+ }
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "<%= projectName %>",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "scripts": {
8
+ "check": "biome check --write",
9
+ "build": "tsc && rolldown -c && cpy src/*.json dist/",
10
+ "test": "vitest run --coverage",
11
+ "push": "clasp push"
12
+ },
13
+ "devDependencies": {
14
+ "@biomejs/biome": "^2.3.4",
15
+ "@google/clasp": "^3.1.1",
16
+ "@rollup/plugin-alias": "^6.0.0",
17
+ "@types/google-apps-script": "^2.0.7",
18
+ "@types/node": "^24.10.0",
19
+ "@vitest/coverage-v8": "4.0.8",
20
+ "cpy-cli": "^6.0.0",
21
+ "rolldown": "1.0.0-beta.47",
22
+ "rolldown-plugin-remove-export": "^0.1.3",
23
+ "vite-tsconfig-paths": "^5.1.4",
24
+ "vitest": "^4.0.8"
25
+ }
26
+ }
@@ -0,0 +1,29 @@
1
+ import path from "node:path";
2
+ import alias from "@rollup/plugin-alias";
3
+ import { defineConfig } from "rolldown";
4
+ import { removeExportPlugin } from "rolldown-plugin-remove-export";
5
+
6
+ const outputFile = "index.js";
7
+
8
+ export default defineConfig({
9
+ input: "src/main.js",
10
+ output: {
11
+ format: "esm",
12
+ file: `dist/${outputFile}`,
13
+ },
14
+ plugins: [
15
+ alias({
16
+ entries: [
17
+ {
18
+ find: "@",
19
+ replacement: path.resolve(import.meta.dirname, "src"),
20
+ },
21
+ {
22
+ find: "~",
23
+ replacement: path.resolve(import.meta.dirname),
24
+ },
25
+ ],
26
+ }),
27
+ removeExportPlugin(outputFile),
28
+ ],
29
+ });