Skip to content

Commit f0fc103

Browse files
committed
Add Material UI login page sample and menu via tsx
Todo: fix , just a test --- For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/jkone27/feliz-vite?shareId=XXXX-XXXX-XXXX-XXXX).
1 parent ea7e485 commit f0fc103

8 files changed

+312
-4
lines changed

src/App.fs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,44 @@
33
open Feliz
44
open Browser.Dom
55
open Fable.Core.JsInterop
6-
6+
open Feliz.Router
77

88
importSideEffects "./index.css"
9-
109

1110
let root = ReactDOM.createRoot(document.getElementById "root")
12-
root.render(App.Components.Counter())
11+
12+
let menu =
13+
Html.div [
14+
Html.a [
15+
prop.href (Router.formatPath [])
16+
prop.text "Home"
17+
]
18+
Html.a [
19+
prop.href (Router.formatPath ["login"])
20+
prop.text "Login"
21+
]
22+
]
23+
24+
let homePage =
25+
Html.div [
26+
menu
27+
App.Components.Counter()
28+
]
29+
30+
let loginPage =
31+
Html.div [
32+
menu
33+
App.Components.MaterialUiLogin()
34+
]
35+
36+
let app =
37+
React.router [
38+
router.onUrlChanged (fun url ->
39+
match url with
40+
| [] -> homePage
41+
| ["login"] -> loginPage
42+
| _ -> Html.h1 "Page not found"
43+
)
44+
]
45+
46+
root.render(app)

src/Components.fs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,52 @@ type Components() =
6969
prop.className "read-the-docs"
7070
prop.text " Click on the Vite, React or Fable Vite Plugin logos to learn more"
7171
]
72-
]
72+
]
73+
74+
[<ReactComponent>]
75+
static member MaterialUiLogin() =
76+
let (username, setUsername) = React.useState("")
77+
let (password, setPassword) = React.useState("")
78+
let (message, setMessage) = React.useState("")
79+
80+
let handleSubmit (e: Browser.Types.Event) =
81+
e.preventDefault()
82+
setMessage("Login successful!")
83+
84+
Html.div [
85+
Html.h2 "Login"
86+
Html.form [
87+
prop.onSubmit handleSubmit
88+
prop.children [
89+
Html.div [
90+
Html.label [
91+
prop.htmlFor "username"
92+
prop.text "Username"
93+
]
94+
Html.input [
95+
prop.id "username"
96+
prop.type' "text"
97+
prop.value username
98+
prop.onChange (fun (e: string) -> setUsername(e))
99+
]
100+
]
101+
Html.div [
102+
Html.label [
103+
prop.htmlFor "password"
104+
prop.text "Password"
105+
]
106+
Html.input [
107+
prop.id "password"
108+
prop.type' "password"
109+
prop.value password
110+
prop.onChange (fun (e: string) -> setPassword(e))
111+
]
112+
]
113+
Html.button [
114+
prop.type' "submit"
115+
prop.text "Submit"
116+
]
117+
]
118+
]
119+
Html.p message
120+
]

src/Components.test.fs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,23 @@ Jest.describe("Counter component", fun () ->
2828
Jest.expect(updatedButtonElement).toBeInTheDocument()
2929
)
3030
)
31+
32+
Jest.describe("MaterialUiLogin component", fun () ->
33+
let element = RTL.render(Components.MaterialUiLogin())
34+
35+
Jest.test("should render login form", fun () ->
36+
let usernameLabel = element.getByText("Username")
37+
let passwordLabel = element.getByText("Password")
38+
let submitButton = element.getByText("Submit")
39+
Jest.expect(usernameLabel).toBeInTheDocument()
40+
Jest.expect(passwordLabel).toBeInTheDocument()
41+
Jest.expect(submitButton).toBeInTheDocument()
42+
)
43+
44+
Jest.test("should show success message on submit", fun () ->
45+
let submitButton = element.getByText("Submit")
46+
RTL.fireEvent.click(submitButton)
47+
let successMessage = element.getByText("Login successful!")
48+
Jest.expect(successMessage).toBeInTheDocument()
49+
)
50+
)

src/MaterialUiLogin.tsx

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import React, { useState } from 'react';
2+
3+
const MaterialUiLogin = () => {
4+
const [username, setUsername] = useState('');
5+
const [password, setPassword] = useState('');
6+
const [message, setMessage] = useState('');
7+
8+
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
9+
e.preventDefault();
10+
setMessage('Login successful!');
11+
};
12+
13+
return (
14+
<div>
15+
<h2>Login</h2>
16+
<form onSubmit={handleSubmit}>
17+
<div>
18+
<label htmlFor="username">Username</label>
19+
<input
20+
id="username"
21+
type="text"
22+
value={username}
23+
onChange={(e: React.ChangeEvent<HTMLInputElement>) => setUsername(e.target.value)}
24+
/>
25+
</div>
26+
<div>
27+
<label htmlFor="password">Password</label>
28+
<input
29+
id="password"
30+
type="password"
31+
value={password}
32+
onChange={(e: React.ChangeEvent<HTMLInputElement>) => setPassword(e.target.value)}
33+
/>
34+
</div>
35+
<button type="submit">Submit</button>
36+
</form>
37+
<p>{message}</p>
38+
</div>
39+
);
40+
};
41+
42+
export default MaterialUiLogin;
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// vite.config.js
2+
import { defineConfig } from "file:///workspaces/feliz-vite/node_modules/vite/dist/node/index.js";
3+
import fable from "file:///workspaces/feliz-vite/node_modules/vite-plugin-fable/index.js";
4+
import react from "file:///workspaces/feliz-vite/node_modules/@vitejs/plugin-react/dist/index.mjs";
5+
import { configDefaults } from "file:///workspaces/feliz-vite/node_modules/vitest/dist/config.js";
6+
var vite_config_default = defineConfig({
7+
// order of plugins matters, fable needs to be first
8+
plugins: [
9+
fable({
10+
fsproj: "./src/App.fsproj",
11+
jsx: "automatic"
12+
}),
13+
react({
14+
include: /\.(fs|js|jsx|ts|tsx)$/,
15+
jsxRuntime: "classic"
16+
})
17+
],
18+
root: "./src",
19+
build: {
20+
outDir: "../dist",
21+
sourcemap: "inline"
22+
},
23+
define: {
24+
// required if u have: `process is undefined`
25+
// while loading react jsoncomponents
26+
"process.env": {}
27+
},
28+
test: {
29+
include: ["**/*.{test,spec}.{js,jsx,ts,tsx,fs}"],
30+
exclude: [...configDefaults.exclude, "dist", ".idea", ".git", ".cache"],
31+
environment: "jsdom",
32+
setupFiles: "../vitest.ts",
33+
transform: {
34+
"^.+\\.fs$": "vite-plugin-fable"
35+
}
36+
}
37+
});
38+
export {
39+
vite_config_default as default
40+
};
41+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvd29ya3NwYWNlcy9mZWxpei12aXRlXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvd29ya3NwYWNlcy9mZWxpei12aXRlL3ZpdGUuY29uZmlnLmpzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy93b3Jrc3BhY2VzL2ZlbGl6LXZpdGUvdml0ZS5jb25maWcuanNcIjtpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlJztcbmltcG9ydCBmYWJsZSBmcm9tICd2aXRlLXBsdWdpbi1mYWJsZSc7XG5pbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3QnO1xuaW1wb3J0IHsgY29uZmlnRGVmYXVsdHMgfSBmcm9tICd2aXRlc3QvY29uZmlnJztcblxuLy8gaHR0cHM6Ly9ub2phZi5jb20vdml0ZS1wbHVnaW4tZmFibGUvcmVjaXBlcy5odG1sI1VzaW5nLVJlYWN0XG4vLyBodHRwczovL25vamFmLmNvbS92aXRlLXBsdWdpbi1mYWJsZS9yZWNpcGVzLmh0bWwjRmFibGUtQ29yZS1KU1hcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAvLyBvcmRlciBvZiBwbHVnaW5zIG1hdHRlcnMsIGZhYmxlIG5lZWRzIHRvIGJlIGZpcnN0XG4gcGx1Z2luczogW1xuIFxuICBmYWJsZSh7IFxuICAgZnNwcm9qOiBcIi4vc3JjL0FwcC5mc3Byb2pcIiwgXG4gICBqc3g6ICdhdXRvbWF0aWMnXG4gIH0pLFxuICByZWFjdCh7XG4gICBpbmNsdWRlOiAvXFwuKGZzfGpzfGpzeHx0c3x0c3gpJC8sXG4gICBqc3hSdW50aW1lOiBcImNsYXNzaWNcIlxuICB9KVxuIF0sXG4gcm9vdDogXCIuL3NyY1wiLFxuIGJ1aWxkOiB7XG4gb3V0RGlyOiBcIi4uL2Rpc3RcIixcbiBzb3VyY2VtYXA6ICdpbmxpbmUnXG4gfSxcbiBkZWZpbmU6IHtcbiAvLyByZXF1aXJlZCBpZiB1IGhhdmU6IGBwcm9jZXNzIGlzIHVuZGVmaW5lZGAgXG4gLy8gd2hpbGUgbG9hZGluZyByZWFjdCBqc29uY29tcG9uZW50c1xuICdwcm9jZXNzLmVudic6IHt9XG4gfSxcbiB0ZXN0OiB7XG4gICBpbmNsdWRlOiBbJyoqLyoue3Rlc3Qsc3BlY30ue2pzLGpzeCx0cyx0c3gsZnN9J10sXG4gICBleGNsdWRlOiBbLi4uY29uZmlnRGVmYXVsdHMuZXhjbHVkZSwgJ2Rpc3QnLCAnLmlkZWEnLCAnLmdpdCcsICcuY2FjaGUnXSxcbiAgIGVudmlyb25tZW50OiAnanNkb20nLFxuICAgc2V0dXBGaWxlczogJy4uL3ZpdGVzdC50cycsIFxuICAgdHJhbnNmb3JtOiB7XG4gICAgICdeLitcXFxcLmZzJCc6ICd2aXRlLXBsdWdpbi1mYWJsZSdcbiAgIH1cbiB9XG59KVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFvUCxTQUFTLG9CQUFvQjtBQUNqUixPQUFPLFdBQVc7QUFDbEIsT0FBTyxXQUFXO0FBQ2xCLFNBQVMsc0JBQXNCO0FBSy9CLElBQU8sc0JBQVEsYUFBYTtBQUFBO0FBQUEsRUFFM0IsU0FBUztBQUFBLElBRVIsTUFBTTtBQUFBLE1BQ0wsUUFBUTtBQUFBLE1BQ1IsS0FBSztBQUFBLElBQ04sQ0FBQztBQUFBLElBQ0QsTUFBTTtBQUFBLE1BQ0wsU0FBUztBQUFBLE1BQ1QsWUFBWTtBQUFBLElBQ2IsQ0FBQztBQUFBLEVBQ0Y7QUFBQSxFQUNBLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxJQUNQLFFBQVE7QUFBQSxJQUNSLFdBQVc7QUFBQSxFQUNYO0FBQUEsRUFDQSxRQUFRO0FBQUE7QUFBQTtBQUFBLElBR1IsZUFBZSxDQUFDO0FBQUEsRUFDaEI7QUFBQSxFQUNBLE1BQU07QUFBQSxJQUNKLFNBQVMsQ0FBQyxxQ0FBcUM7QUFBQSxJQUMvQyxTQUFTLENBQUMsR0FBRyxlQUFlLFNBQVMsUUFBUSxTQUFTLFFBQVEsUUFBUTtBQUFBLElBQ3RFLGFBQWE7QUFBQSxJQUNiLFlBQVk7QUFBQSxJQUNaLFdBQVc7QUFBQSxNQUNULGFBQWE7QUFBQSxJQUNmO0FBQUEsRUFDRjtBQUNELENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg==
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// vite.config.js
2+
import { defineConfig } from "file:///workspaces/feliz-vite/node_modules/vite/dist/node/index.js";
3+
import fable from "file:///workspaces/feliz-vite/node_modules/vite-plugin-fable/index.js";
4+
import react from "file:///workspaces/feliz-vite/node_modules/@vitejs/plugin-react/dist/index.mjs";
5+
import { configDefaults } from "file:///workspaces/feliz-vite/node_modules/vitest/dist/config.js";
6+
var vite_config_default = defineConfig({
7+
// order of plugins matters, fable needs to be first
8+
plugins: [
9+
fable({
10+
fsproj: "./src/App.fsproj",
11+
jsx: "automatic"
12+
}),
13+
react({
14+
include: /\.(fs|js|jsx|ts|tsx)$/,
15+
jsxRuntime: "classic"
16+
})
17+
],
18+
root: "./src",
19+
build: {
20+
outDir: "../dist",
21+
sourcemap: "inline"
22+
},
23+
define: {
24+
// required if u have: `process is undefined`
25+
// while loading react jsoncomponents
26+
"process.env": {}
27+
},
28+
test: {
29+
include: ["**/*.{test,spec}.{js,jsx,ts,tsx,fs}"],
30+
exclude: [...configDefaults.exclude, "dist", ".idea", ".git", ".cache"],
31+
environment: "jsdom",
32+
setupFiles: "../vitest.ts",
33+
transform: {
34+
"^.+\\.fs$": "vite-plugin-fable"
35+
}
36+
}
37+
});
38+
export {
39+
vite_config_default as default
40+
};
41+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvd29ya3NwYWNlcy9mZWxpei12aXRlXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvd29ya3NwYWNlcy9mZWxpei12aXRlL3ZpdGUuY29uZmlnLmpzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy93b3Jrc3BhY2VzL2ZlbGl6LXZpdGUvdml0ZS5jb25maWcuanNcIjtpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlJztcbmltcG9ydCBmYWJsZSBmcm9tICd2aXRlLXBsdWdpbi1mYWJsZSc7XG5pbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3QnO1xuaW1wb3J0IHsgY29uZmlnRGVmYXVsdHMgfSBmcm9tICd2aXRlc3QvY29uZmlnJztcblxuLy8gaHR0cHM6Ly9ub2phZi5jb20vdml0ZS1wbHVnaW4tZmFibGUvcmVjaXBlcy5odG1sI1VzaW5nLVJlYWN0XG4vLyBodHRwczovL25vamFmLmNvbS92aXRlLXBsdWdpbi1mYWJsZS9yZWNpcGVzLmh0bWwjRmFibGUtQ29yZS1KU1hcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAvLyBvcmRlciBvZiBwbHVnaW5zIG1hdHRlcnMsIGZhYmxlIG5lZWRzIHRvIGJlIGZpcnN0XG4gcGx1Z2luczogW1xuIFxuICBmYWJsZSh7IFxuICAgZnNwcm9qOiBcIi4vc3JjL0FwcC5mc3Byb2pcIiwgXG4gICBqc3g6ICdhdXRvbWF0aWMnXG4gIH0pLFxuICByZWFjdCh7XG4gICBpbmNsdWRlOiAvXFwuKGZzfGpzfGpzeHx0c3x0c3gpJC8sXG4gICBqc3hSdW50aW1lOiBcImNsYXNzaWNcIlxuICB9KVxuIF0sXG4gcm9vdDogXCIuL3NyY1wiLFxuIGJ1aWxkOiB7XG4gb3V0RGlyOiBcIi4uL2Rpc3RcIixcbiBzb3VyY2VtYXA6ICdpbmxpbmUnXG4gfSxcbiBkZWZpbmU6IHtcbiAvLyByZXF1aXJlZCBpZiB1IGhhdmU6IGBwcm9jZXNzIGlzIHVuZGVmaW5lZGAgXG4gLy8gd2hpbGUgbG9hZGluZyByZWFjdCBqc29uY29tcG9uZW50c1xuICdwcm9jZXNzLmVudic6IHt9XG4gfSxcbiB0ZXN0OiB7XG4gICBpbmNsdWRlOiBbJyoqLyoue3Rlc3Qsc3BlY30ue2pzLGpzeCx0cyx0c3gsZnN9J10sXG4gICBleGNsdWRlOiBbLi4uY29uZmlnRGVmYXVsdHMuZXhjbHVkZSwgJ2Rpc3QnLCAnLmlkZWEnLCAnLmdpdCcsICcuY2FjaGUnXSxcbiAgIGVudmlyb25tZW50OiAnanNkb20nLFxuICAgc2V0dXBGaWxlczogJy4uL3ZpdGVzdC50cycsIFxuICAgdHJhbnNmb3JtOiB7XG4gICAgICdeLitcXFxcLmZzJCc6ICd2aXRlLXBsdWdpbi1mYWJsZSdcbiAgIH1cbiB9XG59KVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFvUCxTQUFTLG9CQUFvQjtBQUNqUixPQUFPLFdBQVc7QUFDbEIsT0FBTyxXQUFXO0FBQ2xCLFNBQVMsc0JBQXNCO0FBSy9CLElBQU8sc0JBQVEsYUFBYTtBQUFBO0FBQUEsRUFFM0IsU0FBUztBQUFBLElBRVIsTUFBTTtBQUFBLE1BQ0wsUUFBUTtBQUFBLE1BQ1IsS0FBSztBQUFBLElBQ04sQ0FBQztBQUFBLElBQ0QsTUFBTTtBQUFBLE1BQ0wsU0FBUztBQUFBLE1BQ1QsWUFBWTtBQUFBLElBQ2IsQ0FBQztBQUFBLEVBQ0Y7QUFBQSxFQUNBLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxJQUNQLFFBQVE7QUFBQSxJQUNSLFdBQVc7QUFBQSxFQUNYO0FBQUEsRUFDQSxRQUFRO0FBQUE7QUFBQTtBQUFBLElBR1IsZUFBZSxDQUFDO0FBQUEsRUFDaEI7QUFBQSxFQUNBLE1BQU07QUFBQSxJQUNKLFNBQVMsQ0FBQyxxQ0FBcUM7QUFBQSxJQUMvQyxTQUFTLENBQUMsR0FBRyxlQUFlLFNBQVMsUUFBUSxTQUFTLFFBQVEsUUFBUTtBQUFBLElBQ3RFLGFBQWE7QUFBQSxJQUNiLFlBQVk7QUFBQSxJQUNaLFdBQVc7QUFBQSxNQUNULGFBQWE7QUFBQSxJQUNmO0FBQUEsRUFDRjtBQUNELENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg==
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// vite.config.js
2+
import { defineConfig } from "file:///workspaces/feliz-vite/node_modules/vite/dist/node/index.js";
3+
import fable from "file:///workspaces/feliz-vite/node_modules/vite-plugin-fable/index.js";
4+
import react from "file:///workspaces/feliz-vite/node_modules/@vitejs/plugin-react/dist/index.mjs";
5+
import { configDefaults } from "file:///workspaces/feliz-vite/node_modules/vitest/dist/config.js";
6+
var vite_config_default = defineConfig({
7+
// order of plugins matters, fable needs to be first
8+
plugins: [
9+
fable({
10+
fsproj: "./src/App.fsproj",
11+
jsx: "automatic"
12+
}),
13+
react({
14+
include: /\.(fs|js|jsx|ts|tsx)$/,
15+
jsxRuntime: "classic"
16+
})
17+
],
18+
root: "./src",
19+
build: {
20+
outDir: "../dist",
21+
sourcemap: "inline"
22+
},
23+
define: {
24+
// required if u have: `process is undefined`
25+
// while loading react jsoncomponents
26+
"process.env": {}
27+
},
28+
test: {
29+
include: ["**/*.{test,spec}.{js,jsx,ts,tsx,fs}"],
30+
exclude: [...configDefaults.exclude, "dist", ".idea", ".git", ".cache"],
31+
environment: "jsdom",
32+
setupFiles: "../vitest.ts",
33+
transform: {
34+
"^.+\\.fs$": "vite-plugin-fable"
35+
}
36+
}
37+
});
38+
export {
39+
vite_config_default as default
40+
};
41+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvd29ya3NwYWNlcy9mZWxpei12aXRlXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvd29ya3NwYWNlcy9mZWxpei12aXRlL3ZpdGUuY29uZmlnLmpzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy93b3Jrc3BhY2VzL2ZlbGl6LXZpdGUvdml0ZS5jb25maWcuanNcIjtpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlJztcbmltcG9ydCBmYWJsZSBmcm9tICd2aXRlLXBsdWdpbi1mYWJsZSc7XG5pbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3QnO1xuaW1wb3J0IHsgY29uZmlnRGVmYXVsdHMgfSBmcm9tICd2aXRlc3QvY29uZmlnJztcblxuLy8gaHR0cHM6Ly9ub2phZi5jb20vdml0ZS1wbHVnaW4tZmFibGUvcmVjaXBlcy5odG1sI1VzaW5nLVJlYWN0XG4vLyBodHRwczovL25vamFmLmNvbS92aXRlLXBsdWdpbi1mYWJsZS9yZWNpcGVzLmh0bWwjRmFibGUtQ29yZS1KU1hcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAvLyBvcmRlciBvZiBwbHVnaW5zIG1hdHRlcnMsIGZhYmxlIG5lZWRzIHRvIGJlIGZpcnN0XG4gcGx1Z2luczogW1xuIFxuICBmYWJsZSh7IFxuICAgZnNwcm9qOiBcIi4vc3JjL0FwcC5mc3Byb2pcIiwgXG4gICBqc3g6ICdhdXRvbWF0aWMnXG4gIH0pLFxuICByZWFjdCh7XG4gICBpbmNsdWRlOiAvXFwuKGZzfGpzfGpzeHx0c3x0c3gpJC8sXG4gICBqc3hSdW50aW1lOiBcImNsYXNzaWNcIlxuICB9KVxuIF0sXG4gcm9vdDogXCIuL3NyY1wiLFxuIGJ1aWxkOiB7XG4gb3V0RGlyOiBcIi4uL2Rpc3RcIixcbiBzb3VyY2VtYXA6ICdpbmxpbmUnXG4gfSxcbiBkZWZpbmU6IHtcbiAvLyByZXF1aXJlZCBpZiB1IGhhdmU6IGBwcm9jZXNzIGlzIHVuZGVmaW5lZGAgXG4gLy8gd2hpbGUgbG9hZGluZyByZWFjdCBqc29uY29tcG9uZW50c1xuICdwcm9jZXNzLmVudic6IHt9XG4gfSxcbiB0ZXN0OiB7XG4gICBpbmNsdWRlOiBbJyoqLyoue3Rlc3Qsc3BlY30ue2pzLGpzeCx0cyx0c3gsZnN9J10sXG4gICBleGNsdWRlOiBbLi4uY29uZmlnRGVmYXVsdHMuZXhjbHVkZSwgJ2Rpc3QnLCAnLmlkZWEnLCAnLmdpdCcsICcuY2FjaGUnXSxcbiAgIGVudmlyb25tZW50OiAnanNkb20nLFxuICAgc2V0dXBGaWxlczogJy4uL3ZpdGVzdC50cycsIFxuICAgdHJhbnNmb3JtOiB7XG4gICAgICdeLitcXFxcLmZzJCc6ICd2aXRlLXBsdWdpbi1mYWJsZSdcbiAgIH1cbiB9XG59KVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFvUCxTQUFTLG9CQUFvQjtBQUNqUixPQUFPLFdBQVc7QUFDbEIsT0FBTyxXQUFXO0FBQ2xCLFNBQVMsc0JBQXNCO0FBSy9CLElBQU8sc0JBQVEsYUFBYTtBQUFBO0FBQUEsRUFFM0IsU0FBUztBQUFBLElBRVIsTUFBTTtBQUFBLE1BQ0wsUUFBUTtBQUFBLE1BQ1IsS0FBSztBQUFBLElBQ04sQ0FBQztBQUFBLElBQ0QsTUFBTTtBQUFBLE1BQ0wsU0FBUztBQUFBLE1BQ1QsWUFBWTtBQUFBLElBQ2IsQ0FBQztBQUFBLEVBQ0Y7QUFBQSxFQUNBLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxJQUNQLFFBQVE7QUFBQSxJQUNSLFdBQVc7QUFBQSxFQUNYO0FBQUEsRUFDQSxRQUFRO0FBQUE7QUFBQTtBQUFBLElBR1IsZUFBZSxDQUFDO0FBQUEsRUFDaEI7QUFBQSxFQUNBLE1BQU07QUFBQSxJQUNKLFNBQVMsQ0FBQyxxQ0FBcUM7QUFBQSxJQUMvQyxTQUFTLENBQUMsR0FBRyxlQUFlLFNBQVMsUUFBUSxTQUFTLFFBQVEsUUFBUTtBQUFBLElBQ3RFLGFBQWE7QUFBQSxJQUNiLFlBQVk7QUFBQSxJQUNaLFdBQVc7QUFBQSxNQUNULGFBQWE7QUFBQSxJQUNmO0FBQUEsRUFDRjtBQUNELENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg==

0 commit comments

Comments
 (0)