@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.
- package/README.ja.md +9 -4
- package/README.md +9 -4
- package/dist/cli.cjs +46 -5
- package/dist/cli.mjs +46 -5
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +1 -1
- package/dist/templates/react/.env.ejs +1 -0
- package/dist/templates/{react-tsx → react}/README.md.ejs +0 -1
- package/dist/templates/react/biome.json.ejs +43 -0
- package/dist/templates/react/index.html.ejs +13 -0
- package/dist/templates/{react-tsx → react}/package.json.ejs +0 -2
- package/dist/templates/react/public/vite.svg.ejs +1 -0
- package/dist/templates/react/rolldown.config.ts.ejs +25 -0
- package/dist/templates/react/server/app.ts.ejs +29 -0
- package/dist/templates/react/server/appsscript.json.ejs +12 -0
- package/dist/templates/react/server/modules/hello.ts.ejs +3 -0
- package/dist/templates/react/src/App.css.ejs +42 -0
- package/dist/templates/react/src/App.tsx.ejs +63 -0
- package/dist/templates/react/src/assets/react.svg.ejs +1 -0
- package/dist/templates/react/src/index.css.ejs +68 -0
- package/dist/templates/react/src/lib/parameters.ts.ejs +20 -0
- package/dist/templates/react/src/main.tsx.ejs +11 -0
- package/dist/templates/react/src/vite-env.d.ts.ejs +1 -0
- package/dist/templates/react/tests/server/modules/hello.spec.ts.ejs +9 -0
- package/dist/templates/react/tsconfig.app.json.ejs +31 -0
- package/dist/templates/react/tsconfig.json.ejs +13 -0
- package/dist/templates/react/tsconfig.node.json.ejs +25 -0
- package/dist/templates/{react-tsx → react}/types/appsscript/client.ts.ejs +2 -15
- package/dist/templates/react/types/appsscript/server.ts.ejs +10 -0
- package/dist/templates/react/vite.config.ts.ejs +20 -0
- package/dist/templates/react-ciderjs/.github/workflows/appsscript.yml.ejs +45 -0
- package/dist/templates/react-ciderjs/README.md.ejs +20 -0
- package/dist/templates/{react-tsx → react-ciderjs}/biome.json.ejs +3 -25
- package/dist/templates/react-ciderjs/package.json.ejs +51 -0
- package/dist/templates/react-ciderjs/rolldown.config.ts.ejs +25 -0
- package/dist/templates/{react-tsx → react-ciderjs}/server/app.ts.ejs +6 -6
- package/dist/templates/react-ciderjs/src/App.tsx.ejs +49 -0
- package/dist/templates/{react-tsx → react-ciderjs}/src/lib/parameters.ts.ejs +4 -4
- package/dist/templates/{react-tsx → react-ciderjs}/src/lib/server.ts.ejs +2 -2
- package/dist/templates/react-ciderjs/src/main.tsx.ejs +11 -0
- package/dist/templates/react-ciderjs/src/pages/about.tsx.ejs +7 -0
- package/dist/templates/react-ciderjs/src/pages/detail/user.tsx.ejs +16 -0
- package/dist/templates/{react-tsx/src/App.tsx.ejs → react-ciderjs/src/pages/index.tsx.ejs} +10 -13
- package/dist/templates/react-ciderjs/tests/server/modules/hello.spec.ts.ejs +9 -0
- package/dist/templates/react-ciderjs/tests/src/lib/server.spec.ts.ejs +8 -0
- package/dist/templates/react-ciderjs/vite.config.ts.ejs +33 -0
- package/dist/templates/server-js/biome.json.ejs +36 -0
- package/dist/templates/server-js/package.json.ejs +26 -0
- package/dist/templates/server-js/rolldown.config.mjs.ejs +29 -0
- package/dist/templates/server-js/src/main.js.ejs +5 -0
- package/dist/templates/server-js/src/modules/hello.js.ejs +3 -0
- package/dist/templates/server-js/tests/main.test.js.ejs +15 -0
- package/dist/templates/server-js/tsconfig.json.ejs +34 -0
- package/dist/templates/server-js/vitest.config.js.ejs +11 -0
- package/dist/templates/server-ts/.clasp.json.ejs +5 -0
- package/dist/templates/server-ts/README.md.ejs +7 -0
- package/dist/templates/{vanilla-ts → server-ts}/biome.json.ejs +2 -2
- package/dist/templates/{vanilla-ts → server-ts}/package.json.ejs +8 -9
- package/dist/templates/server-ts/rolldown.config.ts.ejs +29 -0
- package/dist/templates/server-ts/src/appsscript.json.ejs +8 -0
- package/dist/templates/server-ts/src/main.ts.ejs +5 -0
- package/dist/templates/server-ts/tests/main.test.ts.ejs +15 -0
- package/dist/templates/server-ts/vitest.config.ts.ejs +11 -0
- package/dist/templates/vue/.clasp.json.ejs +5 -0
- package/dist/templates/vue/.env.ejs +1 -0
- package/dist/templates/vue/.vscode/extensions.json.ejs +3 -0
- package/dist/templates/vue/README.md.ejs +5 -0
- package/dist/templates/vue/biome.json.ejs +35 -0
- package/dist/templates/vue/index.html.ejs +13 -0
- package/dist/templates/vue/package.json.ejs +45 -0
- package/dist/templates/vue/public/vite.svg.ejs +1 -0
- package/dist/templates/vue/rolldown.config.ts.ejs +25 -0
- package/dist/templates/vue/server/app.ts.ejs +29 -0
- package/dist/templates/vue/server/appsscript.json.ejs +12 -0
- package/dist/templates/vue/server/modules/hello.ts.ejs +3 -0
- package/dist/templates/vue/src/App.vue.ejs +30 -0
- package/dist/templates/vue/src/assets/vue.svg.ejs +1 -0
- package/dist/templates/vue/src/components/HelloWorld.vue.ejs +60 -0
- package/dist/templates/vue/src/lib/parameters.ts.ejs +20 -0
- package/dist/templates/vue/src/main.ts.ejs +5 -0
- package/dist/templates/vue/src/style.css.ejs +79 -0
- package/dist/templates/vue/tests/server/modules/hello.spec.ts.ejs +9 -0
- package/dist/templates/vue/tsconfig.app.json.ejs +21 -0
- package/dist/templates/vue/tsconfig.json.ejs +13 -0
- package/dist/templates/vue/tsconfig.node.json.ejs +26 -0
- package/dist/templates/vue/types/appsscript/client.ts.ejs +44 -0
- package/dist/templates/vue/types/appsscript/server.ts.ejs +10 -0
- package/dist/templates/vue/vite.config.ts.ejs +19 -0
- package/package.json +17 -12
- package/dist/templates/react-tsx/rolldown.config.ts.ejs +0 -25
- package/dist/templates/react-tsx/src/main.tsx.ejs +0 -11
- package/dist/templates/react-tsx/tests/server/modules/hello.spec.ts.ejs +0 -9
- package/dist/templates/react-tsx/tests/src/lib/server.spec.ts.ejs +0 -8
- package/dist/templates/react-tsx/vite.config.ts.ejs +0 -31
- package/dist/templates/vanilla-ts/rolldown.config.ts.ejs +0 -29
- package/dist/templates/vanilla-ts/src/main.ts.ejs +0 -5
- package/dist/templates/vanilla-ts/tests/main.test.ts.ejs +0 -15
- package/dist/templates/vanilla-ts/vitest.config.ts.ejs +0 -11
- /package/dist/templates/{vanilla-ts → react}/.clasp.json.ejs +0 -0
- /package/dist/templates/{react-tsx → react-ciderjs}/.clasp.json.ejs +0 -0
- /package/dist/templates/{react-tsx → react-ciderjs}/.env.ejs +0 -0
- /package/dist/templates/{react-tsx → react-ciderjs}/index.html.ejs +0 -0
- /package/dist/templates/{react-tsx → react-ciderjs}/public/vite.svg.ejs +0 -0
- /package/dist/templates/{react-tsx → react-ciderjs}/server/appsscript.json.ejs +0 -0
- /package/dist/templates/{react-tsx → react-ciderjs}/server/modules/hello.ts.ejs +0 -0
- /package/dist/templates/{react-tsx → react-ciderjs}/src/App.css.ejs +0 -0
- /package/dist/templates/{react-tsx → react-ciderjs}/src/assets/react.svg.ejs +0 -0
- /package/dist/templates/{react-tsx → react-ciderjs}/src/index.css.ejs +0 -0
- /package/dist/templates/{react-tsx → react-ciderjs}/src/vite-env.d.ts.ejs +0 -0
- /package/dist/templates/{react-tsx → react-ciderjs}/tsconfig.app.json.ejs +0 -0
- /package/dist/templates/{react-tsx → react-ciderjs}/tsconfig.json.ejs +0 -0
- /package/dist/templates/{react-tsx → react-ciderjs}/tsconfig.node.json.ejs +0 -0
- /package/dist/templates/{react-tsx → react-ciderjs}/types/appsscript/server.ts.ejs +0 -0
- /package/dist/templates/{vanilla-ts → server-js}/README.md.ejs +0 -0
- /package/dist/templates/{vanilla-ts → server-js}/src/appsscript.json.ejs +0 -0
- /package/dist/templates/{vanilla-ts → server-ts}/src/modules/hello.ts.ejs +0 -0
- /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,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
|
-
//
|
|
2
|
-
// Do NOT edit this file manually.
|
|
1
|
+
// sample code from https://developers.google.com/apps-script/guides/web-apps
|
|
3
2
|
|
|
4
|
-
|
|
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
|
+
"$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": "
|
|
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
|
|
1
|
+
import type { ServerParams, WebAppParams } from "~/types/appsscript/server";
|
|
2
2
|
|
|
3
|
-
export * from
|
|
3
|
+
export * from "./modules/hello";
|
|
4
4
|
|
|
5
|
-
const SITE_TITLE =
|
|
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(
|
|
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
|
-
|
|
26
|
-
|
|
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
|
|
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 =
|
|
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:
|
|
16
|
-
userAddress:
|
|
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
|
|
5
|
-
import type { ServerScripts } from
|
|
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,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
|
|
2
|
-
import reactLogo from
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
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
|
|
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(
|
|
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(
|
|
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:
|
|
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,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
|
+
});
|