zrb 0.0.51__py3-none-any.whl → 0.0.52__py3-none-any.whl

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 (23) hide show
  1. zrb/builtin/generator/fastapp/add.py +3 -2
  2. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/.gitignore +2 -1
  3. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/.gitignore +2 -2
  4. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/package-lock.json +6 -0
  5. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/package.json +1 -0
  6. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/auth/auth.ts +83 -0
  7. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/auth/store.ts +4 -0
  8. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/auth/type.ts +10 -0
  9. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/components/navigation/Menu.svelte +1 -2
  10. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/components/navigation/Navigation.svelte +58 -4
  11. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/cookie/cookie.ts +19 -0
  12. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/routes/+layout.svelte +4 -4
  13. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/static/favicon.png +0 -0
  14. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/static/logo.png +0 -0
  15. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/entity/user/api.py +5 -4
  16. zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/schema/request.py +10 -0
  17. zrb/builtin/generator/project/template/.gitignore +1 -1
  18. zrb/builtin/generator/simple_python_app/template/src/kebab-app-name/src/.gitignore +1 -1
  19. {zrb-0.0.51.dist-info → zrb-0.0.52.dist-info}/METADATA +4 -3
  20. {zrb-0.0.51.dist-info → zrb-0.0.52.dist-info}/RECORD +23 -17
  21. {zrb-0.0.51.dist-info → zrb-0.0.52.dist-info}/LICENSE +0 -0
  22. {zrb-0.0.51.dist-info → zrb-0.0.52.dist-info}/WHEEL +0 -0
  23. {zrb-0.0.51.dist-info → zrb-0.0.52.dist-info}/entry_points.txt +0 -0
@@ -67,8 +67,9 @@ copy_resource = ResourceMaker(
67
67
  excludes=[
68
68
  '*/deployment/venv',
69
69
  '*/src/kebab-app-name/venv',
70
- '*/src/kebab-app-name/frontend/node_modules',
71
- '*/src/kebab-app-name/frontend/build',
70
+ '*/src/kebab-app-name/src/frontend/node_modules',
71
+ '*/src/kebab-app-name/src/frontend/build',
72
+ '*/src/kebab-app-name/src/frontend/.svelte-kit',
72
73
  ]
73
74
  )
74
75
 
@@ -1,4 +1,5 @@
1
- .env
1
+ /.env
2
+ frontend/build
2
3
  frontend/build
3
4
  __pycache__
4
5
  venv
@@ -3,8 +3,8 @@ node_modules
3
3
  /build
4
4
  /.svelte-kit
5
5
  /package
6
- .env
7
- .env.*
6
+ # .env
7
+ # .env.*
8
8
  !.env.example
9
9
  vite.config.js.timestamp-*
10
10
  vite.config.ts.timestamp-*
@@ -10,6 +10,7 @@
10
10
  "dependencies": {
11
11
  "axios": "^1.4.0",
12
12
  "daisyui": "^2.51.6",
13
+ "jwt-decode": "^3.1.2",
13
14
  "process": "^0.11.10"
14
15
  },
15
16
  "devDependencies": {
@@ -1884,6 +1885,11 @@
1884
1885
  "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
1885
1886
  "dev": true
1886
1887
  },
1888
+ "node_modules/jwt-decode": {
1889
+ "version": "3.1.2",
1890
+ "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz",
1891
+ "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="
1892
+ },
1887
1893
  "node_modules/kleur": {
1888
1894
  "version": "4.1.5",
1889
1895
  "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
@@ -40,6 +40,7 @@
40
40
  "dependencies": {
41
41
  "axios": "^1.4.0",
42
42
  "daisyui": "^2.51.6",
43
+ "jwt-decode": "^3.1.2",
43
44
  "process": "^0.11.10"
44
45
  }
45
46
  }
@@ -0,0 +1,83 @@
1
+ import axios from 'axios';
2
+ import jwt_decode from 'jwt-decode';
3
+ import { appAuthTokenCookieKey } from '../config/config';
4
+ import { getCookie, setCookie, unsetCookie } from '../cookie/cookie';
5
+ import { userIdStore, userNameStore } from './store';
6
+ import type { TokenData } from './type';
7
+
8
+ export async function refreshToken(refreshTokenUrl: string): Promise<boolean> {
9
+ try {
10
+ const oldToken: string = getCookie(appAuthTokenCookieKey);
11
+ const oldTokenData: TokenData = decodeToken(oldToken);
12
+ const { expireAt } = oldTokenData;
13
+ const now = new Date();
14
+ if (now.getTime()/1000 > expireAt) {
15
+ throw new Error('Expired token');
16
+ }
17
+ const response = await axios.post(refreshTokenUrl, {token: oldToken});
18
+ if (response && response.status == 200 && response.data && response.data.access_token) {
19
+ const newToken: string = response.data.access_token;
20
+ setCookie(appAuthTokenCookieKey, newToken);
21
+ setAuthStoreByToken(newToken);
22
+ return true;
23
+ }
24
+ } catch(error) {
25
+ console.error(error);
26
+ }
27
+ logout();
28
+ return false;
29
+ }
30
+
31
+ export async function login(loginUrl: string, identity: string, password: string): Promise<boolean> {
32
+ try {
33
+ const response = await axios.post(loginUrl, {identity, password});
34
+ if (response && response.status == 200 && response.data && response.data.access_token) {
35
+ const token: string = response.data.access_token;
36
+ setCookie(appAuthTokenCookieKey, token);
37
+ setAuthStoreByToken(token);
38
+ return true;
39
+ }
40
+ } catch(error) {
41
+ console.error(error);
42
+ }
43
+ logout();
44
+ return false;
45
+ }
46
+
47
+ export function logout() {
48
+ unsetCookie(appAuthTokenCookieKey)
49
+ unsetAuthStore();
50
+ }
51
+
52
+ function unsetAuthStore() {
53
+ setAuthStore('', '');
54
+ }
55
+
56
+ function setAuthStoreByToken(token: string) {
57
+ const tokenData = decodeToken(token);
58
+ setAuthStore(tokenData.sub.userId, tokenData.sub.userName);
59
+ }
60
+
61
+ function setAuthStore(newUserId: string, newUserName: string) {
62
+ userIdStore.set(newUserId);
63
+ userNameStore.set(newUserName);
64
+ }
65
+
66
+ function decodeToken(token: string): TokenData {
67
+ const jwtTokenData: {
68
+ exp: number,
69
+ sub: {
70
+ user_id: string,
71
+ username: string,
72
+ expire_seconds: number
73
+ }
74
+ } = jwt_decode(token);
75
+ return {
76
+ sub: {
77
+ userId: jwtTokenData.sub.user_id,
78
+ userName: jwtTokenData.sub.username,
79
+ expireSeconds: jwtTokenData.sub.expire_seconds,
80
+ },
81
+ expireAt: jwtTokenData.exp
82
+ }
83
+ }
@@ -0,0 +1,4 @@
1
+ import { writable } from 'svelte/store';
2
+
3
+ export const userIdStore = writable('');
4
+ export const userNameStore = writable('');
@@ -0,0 +1,10 @@
1
+ export interface TokenData {
2
+ sub: TokenDataSub;
3
+ expireAt: number;
4
+ }
5
+
6
+ export interface TokenDataSub {
7
+ userId: string;
8
+ userName: string;
9
+ expireSeconds: number;
10
+ }
@@ -5,8 +5,7 @@
5
5
  {#if 'submenus' in data && data.submenus}
6
6
  <!-- svelte-ignore a11y-no-noninteractive-tabindex -->
7
7
  <li tabindex="0">
8
- <!-- svelte-ignore a11y-invalid-attribute -->
9
- <a href="#">
8
+ <a href="#top">
10
9
  Parent
11
10
  <svg class="fill-current" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24"><path d="M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z"/></svg>
12
11
  </a>
@@ -1,13 +1,47 @@
1
1
  <script lang="ts">
2
- import type {SingleNavData} from './type';
2
+ import { goto } from '$app/navigation';
3
+ import { onMount } from 'svelte';
3
4
  import Menu from './Menu.svelte';
5
+ import type { SingleNavData } from './type';
6
+ import { login, logout, refreshToken } from '../../auth/auth';
7
+ import { userIdStore } from '../../auth/store';
8
+
4
9
  export let logo: string;
5
10
  export let brand: string;
6
11
  export let data: SingleNavData[];
7
- export let authTokenCookieKey: string;
12
+ export let loginTitle: string = 'Login';
13
+ export let logoutTitle: string = 'Logout';
14
+ export let loginApiUrl: string = '/api/v1/auth/login';
15
+ export let refreshTokenApiUrl: string = '/api/v1/auth/refresh-token';
16
+
17
+ let identity: string;
18
+ let password: string;
19
+
20
+ let userId = '';
21
+ userIdStore.subscribe((value) => {
22
+ userId = value;
23
+ });
24
+
25
+ onMount(async() => {
26
+ await refreshToken(refreshTokenApiUrl);
27
+ });
28
+
29
+ async function onLoginClick() {
30
+ const loginSuccess = await login(loginApiUrl, identity, password);
31
+ if (loginSuccess) {
32
+ await goto('/');
33
+ return;
34
+ }
35
+ alert('salah');
36
+ }
37
+
38
+ async function onLogoutClick() {
39
+ logout();
40
+ await goto('/');
41
+ }
8
42
  </script>
9
43
 
10
- <div class="navbar bg-base-100">
44
+ <div class="navbar sticky top-0 bg-base-100">
11
45
  <div class="flex-1">
12
46
  <img class="h-8 mr-3" src={logo} alt="Logo">
13
47
  <a href="/" class="btn btn-ghost normal-case text-xl">{brand}</a>
@@ -17,7 +51,27 @@
17
51
  {#each data as menuData}
18
52
  <Menu data={menuData} />
19
53
  {/each}
54
+ {#if userId == ''}
55
+ <li><a href="#login-modal" class="px-4">{loginTitle}</a></li>
56
+ {:else}
57
+ <li><a href="#top" class="px-4" on:click={onLogoutClick}>{logoutTitle}</a></li>
58
+ {/if}
20
59
  </ul>
21
60
  </div>
22
61
  </div>
23
- {authTokenCookieKey}
62
+
63
+ <div class="modal" id="login-modal">
64
+ <form class="modal-box">
65
+ <div class="mb-6">
66
+ <label class="block text-gray-700 font-bold mb-2" for="identity">Identity</label>
67
+ <input class="w-full px-3 py-2 border rounded-lg text-gray-700 focus:outline-none focus:shadow-outline" id="identity" type="text" placeholder="Enter your username/email/phone" bind:value={identity} />
68
+ </div>
69
+ <div class="mb-6">
70
+ <label class="block text-gray-700 font-bold mb-2" for="password">Password</label>
71
+ <input class="w-full px-3 py-2 border rounded-lg text-gray-700 focus:outline-none focus:shadow-outline" id="password" type="password" placeholder="Enter your password" bind:value={password} />
72
+ </div>
73
+ <div class="modal-action">
74
+ <a href="#top" class="btn btn-primary" on:click={onLoginClick}>Sign in</a>
75
+ </div>
76
+ </form>
77
+ </div>
@@ -0,0 +1,19 @@
1
+ export function setCookie(cookieName: string, cookieValue: string) {
2
+ document.cookie = cookieName + '=' + cookieValue + ';path=/';
3
+ }
4
+
5
+ export function unsetCookie(cookieName: string) {
6
+ document.cookie = cookieName + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/'
7
+ }
8
+
9
+ export function getCookie(cookieName: string): string {
10
+ let valuePrefix = cookieName + '=';
11
+ let cookieParts = document.cookie.split(';');
12
+ for(let partIndex = 0; partIndex < cookieParts.length; partIndex++) {
13
+ let cookiePart = cookieParts[partIndex].trim();
14
+ if (cookiePart.indexOf(valuePrefix) == 0) {
15
+ return cookiePart.substring(valuePrefix.length, cookiePart.length);
16
+ }
17
+ }
18
+ return '';
19
+ }
@@ -1,13 +1,13 @@
1
1
  <script lang="ts">
2
2
  import "../app.css";
3
3
  import Navigation from '$lib/components/navigation/Navigation.svelte';
4
- import {navData} from '$lib/config/navData';
5
- import {appBrand, appTitle, appAuthTokenCookieKey} from '$lib/config/config';
6
- import logo from '$lib/assets/logo.png';
4
+ import { navData } from '$lib/config/navData';
5
+ import { appBrand, appTitle } from '$lib/config/config';
6
+ import logo from '/static/logo.png';
7
7
  </script>
8
8
 
9
9
  <title>{appTitle}</title>
10
- <Navigation data={navData} logo={logo} brand={appBrand} authTokenCookieKey={appAuthTokenCookieKey}></Navigation>
10
+ <Navigation data={navData} logo={logo} brand={appBrand}></Navigation>
11
11
  <div class="pl-10 pr-10">
12
12
  <slot></slot>
13
13
  </div>
@@ -10,6 +10,7 @@ from module.auth.schema.user import (
10
10
  User, UserData, UserResult, UserLogin
11
11
  )
12
12
  from module.auth.schema.token import TokenData, TokenResponse
13
+ from module.auth.schema.request import RefreshTokenRequest, IsAuthorizedRequest
13
14
  from module.auth.component import token_scheme
14
15
 
15
16
 
@@ -46,10 +47,10 @@ def register_auth_api(
46
47
  raise HTTPAPIException(error=e)
47
48
 
48
49
  @app.post('/api/v1/auth/refresh-token', response_model=TokenResponse)
49
- async def refresh_token(token: str) -> TokenResponse:
50
+ async def refresh_token(data: RefreshTokenRequest) -> TokenResponse:
50
51
  try:
51
52
  token = await rpc_caller.call(
52
- 'auth_refresh_token', token=token
53
+ 'auth_refresh_token', token=data.token
53
54
  )
54
55
  return TokenResponse(access_token=token, token_type='bearer')
55
56
  except Exception as e:
@@ -57,13 +58,13 @@ def register_auth_api(
57
58
 
58
59
  @app.post('/api/v1/auth/is-authorized', response_model=Mapping[str, bool])
59
60
  async def is_authorized(
60
- permission_names: List[str],
61
+ data: IsAuthorizedRequest,
61
62
  user_token_data: TokenData = Depends(token_scheme)
62
63
  ) -> Mapping[str, str]:
63
64
  try:
64
65
  user_id = user_token_data.user_id
65
66
  return await rpc_caller.call(
66
- 'auth_is_user_authorized', id=user_id, *permission_names
67
+ 'auth_is_user_authorized', id=user_id, *data.permission_names
67
68
  )
68
69
  except Exception as e:
69
70
  raise HTTPAPIException(error=e)
@@ -0,0 +1,10 @@
1
+ from typing import List
2
+ from pydantic import BaseModel
3
+
4
+
5
+ class RefreshTokenRequest(BaseModel):
6
+ token: str
7
+
8
+
9
+ class IsAuthorizedRequest(BaseModel):
10
+ permission_names: List[str]
@@ -1,3 +1,3 @@
1
1
  __pycache__
2
2
  venv
3
- .env
3
+ /.env
@@ -1,3 +1,3 @@
1
- .env
1
+ /.env
2
2
  __pycache__
3
3
  venv
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zrb
3
- Version: 0.0.51
3
+ Version: 0.0.52
4
4
  Summary: Your faithful companion
5
5
  Author-email: Go Frendi Gunawan <gofrendiasgard@gmail.com>
6
6
  Requires-Python: >=3.8
@@ -29,10 +29,11 @@ Project-URL: Homepage, https://github.com/state-alchemists/zaruba
29
29
  Provides-Extra: dev
30
30
  Provides-Extra: test
31
31
 
32
- # Zrb (WIP)
32
+ # Zrb (WIP): Your Faithful Companion
33
33
 
34
- Your faithful companion.
34
+ ![](images/zrb/android-chrome-192x192.png)
35
35
 
36
+ Zrb is a task runner to help you automate day-to-day tasks.
36
37
  # Installation
37
38
 
38
39
  ```bash
@@ -64,7 +64,7 @@ zrb/builtin/generator/docker_compose_task/template/src/kebab-task-name/image/Doc
64
64
  zrb/builtin/generator/docker_compose_task/template/src/kebab-task-name/image/main.py,sha256=UpJoBSo4zNKFSa8-0pdJwCymjJDxVZicdoENshogtjE,447
65
65
  zrb/builtin/generator/docker_compose_task/template/src/kebab-task-name/image/requirements.txt,sha256=HX56Al9bOoM8Mq1Yc44UE2cfT3XrTZGmHI6T3q7xn50,15
66
66
  zrb/builtin/generator/fastapp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
- zrb/builtin/generator/fastapp/add.py,sha256=FB9lVVQuUsPU4ji2tJwRWZnpyvuj0Hx72a8fK0Kn34E,6340
67
+ zrb/builtin/generator/fastapp/add.py,sha256=2-_v7iltxVht-MDKP91J8mCD4syfABi2dMrRgLsTjT0,6405
68
68
  zrb/builtin/generator/fastapp/template/_automate/snake_app_name/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
69
  zrb/builtin/generator/fastapp/template/_automate/snake_app_name/_common.py,sha256=vrUaOJDgOasN6DokF_CKqi6S5_Zq7n14T_ErQiMpD7M,6430
70
70
  zrb/builtin/generator/fastapp/template/_automate/snake_app_name/container.py,sha256=s9b3ZoXE_0H8Ppg6ubUIVsGnlr6_054sE9WoQa74uXE,3032
@@ -268,7 +268,7 @@ zrb/builtin/generator/fastapp/template/src/kebab-app-name/deployment/helm-charts
268
268
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/deployment/helm-charts/redpanda/templates/tests/test-schemaregistry-status.yaml,sha256=yV08o9QWh33u-0M5xuhl78v5_T9C9HYJGH-IphoBvw8,1715
269
269
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/deployment/state/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
270
270
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/.dockerignore,sha256=NJZTsJz5Imm-i1oUu2Yn0JYQOTRSQKq-c8YKaC_uZPE,134
271
- zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/.gitignore,sha256=oPsLRzweETyqd5y5dbqUsPZjz67PjL29Ci4Snuuipyg,37
271
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/.gitignore,sha256=GHLs2R2u2mD59AsvK8IXHtJQhkZGpPjy6BqpHT6hvos,53
272
272
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/Dockerfile,sha256=IfvkYdmKEC4FZdIKXkp1_8vF-3BFyy8Hp1G_UpfmbaY,479
273
273
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/README.md,sha256=pvV-h3kGkAjtVRDHc3Tn0PE3_NzQ3dOr2iIIvlt1rSE,2282
274
274
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -317,13 +317,13 @@ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/core/serializer/__
317
317
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/core/serializer/serializer.py,sha256=9T-s4WoHv2gbRcigprfsQbxLQoYjpEIPNtrQhgFBzgw,867
318
318
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/.eslintignore,sha256=GQjxOuGuHvjVorAu-_WqdOZ_4-_JogxRekxKb04O9pA,160
319
319
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/.eslintrc.cjs,sha256=JWmR2kjxxvTiONl2tcu9hsgRuvBqp5bBznY3xVraak8,494
320
- zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/.gitignore,sha256=Z9ZFA9hnYjEQ6-LuPm5RML5iOm37qSw1bezXXXd3wvc,132
320
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/.gitignore,sha256=874zNlvNnzpmvsleSP8EUkCWvkDf5aaXZ6hOsoMokoY,136
321
321
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/.npmrc,sha256=cVHPOX3vDCywq2VkNwHSfTNacskPd1Z1tfgmvHAFgYo,19
322
322
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/.prettierignore,sha256=GQjxOuGuHvjVorAu-_WqdOZ_4-_JogxRekxKb04O9pA,160
323
323
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/.prettierrc,sha256=SzMzteA8Sd5xT7ZnAXch9jK97yzw_VeUitpRwIUFUdU,233
324
324
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/README.md,sha256=7ASuL7J7y3W44wn_izhZ_mBnzxWMXV4I0f2DL9-OHX0,944
325
- zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/package-lock.json,sha256=n8Vt5SRiUzEDkyEljWBu1vefia-6icY5Ov4KoDjpVUo,113341
326
- zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/package.json,sha256=AiBMXmbOfw0iFYETNyHU1slHdzzFD57GgRD1l3nsUZc,1279
325
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/package-lock.json,sha256=De5DlMWcl6_VheELB-M-2QV3dblwnnAQB3P9oWV6Uws,113621
326
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/package.json,sha256=n7Njh97vg9_PWuxIFWgpMOh23rKnwT2h9h7Q3mlBJPQ,1305
327
327
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/playwright.config.ts,sha256=HWngDBBeLyQi5QZx0EGQoc9lzdzycE32aivx3i4J21Q,225
328
328
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/postcss.config.js,sha256=GQyHfbRmmVvxSC9KFqvQbgSont4xGTQeKob_luFzeyc,80
329
329
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/svelte.config.js,sha256=5YezIFqxywUYpH3DIm_o5JZpWmw7igRc0HEOa7NYZ18,317
@@ -335,20 +335,25 @@ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/app.d
335
335
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/app.html,sha256=DhfIA5XPCNSr16VgpSjlLlqBufA7CD4bXqa2znJnOIA,350
336
336
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/index.test.ts,sha256=v1ozost_88J5VDCjzItbD_wE3rID6UQFq1p9sWMQZps,148
337
337
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/assets/logo.png,sha256=uQmQW4KHBPa0z0tu438zpHz3kSfa8p_aH81cOI-SrVg,130279
338
- zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/components/navigation/Menu.svelte,sha256=ZCzbSkqORJAqopYdYg4PJKvsOrDJtUV81KHXT4QlPyM,791
339
- zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/components/navigation/Navigation.svelte,sha256=-2yliheAXyRu7KOSTCXAbgGusV6VcWPdwGIIQ33VRz0,676
338
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/auth/auth.ts,sha256=2n6ylVGgiSfl5zVgH7qJyB5nKrGihXq_whzrAxfTqko,2634
339
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/auth/store.ts,sha256=2Utq3GyPed9_Uri4zZzNISBvC1vTJXeurJATqnbi8mg,125
340
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/auth/type.ts,sha256=iSNFBmAWJQ4UirhhH1ldPr3EUXvxmuTvxc1kmokSayA,179
341
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/components/navigation/Menu.svelte,sha256=usyHTN7UlI2LdPO5NzCX9k_VKZNohPmJO6kJISRckww,740
342
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/components/navigation/Navigation.svelte,sha256=pOGx35WSpWAuR5YXJpMo5AQhks_0nIxNY-E94ZqApNY,2754
340
343
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/components/navigation/type.ts,sha256=rpSLZ4skDiBsRLhmDxZ9NfwGXY2-HQslazm5Rj5awMk,127
341
344
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/config/config.ts,sha256=6UoJfuAMdmkn9XawWUsSzyHHnwsrkwS5sIlem96lwpQ,289
342
345
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/config/navData.ts,sha256=18iNdEbVOriIX6Pfa1UCg2anB--LDzjKCB5Zpd2HDC4,701
346
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/lib/cookie/cookie.ts,sha256=GgHs_xGB0ntK6WQ7GJU-X37m96JcGeriunnXsO1ud5Q,717
343
347
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/routes/+layout.js,sha256=IepBDK8VpfSwS_akOn9eRqRlv8erCF4VtsBXWvBUlH4,65
344
- zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/routes/+layout.svelte,sha256=1T6Cto4bqcih5T3ra92Xay1-R3B2wYNTX3Iu3soskzg,480
348
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/routes/+layout.svelte,sha256=KF2KsGC91WUguT4hrQxwo0iBOvyw49pzqsh-0p1BIRo,414
345
349
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/routes/+page.svelte,sha256=CMxE4JxxWW1wgjxKwSXq1vDbbKci3QtEZJHbJJ8MWGE,259
346
350
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/routes/about/+page.svelte,sha256=KerO5WcqYfom2DqSltTEcpHKiUFdLGIq224sdbSW1HQ,105
347
351
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/routes/greetings/[slug]/+page.js,sha256=lKiwBHrsn4Q8DX8njyeGixh1vg1Jo5jhZyaa_b8tylk,140
348
352
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/routes/greetings/[slug]/+page.svelte,sha256=iBUwihQYp3w38IkhL7lgaDTMqyjmaN1Hku6nFCAOWPo,91
349
353
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/routes/sample/+page.svelte,sha256=E4Pu2J9v-PYmtlzYw7JIpSmYsAm9dvv0y40V5rF9PhE,1277
350
354
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/src/routes/sample/delete/[id]/+page.svelte,sha256=jEEztCqzkWLYWyo8Vhb2GGjTLHRkAoT3eOja59CYSnk,9
351
- zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/static/favicon.png,sha256=UUbtebSGy54c3N14FM0irnjnDOsw-ga0zZoWzxIbyeY,1571
355
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/static/favicon.png,sha256=I4yNgTGWihNr9ek0tmeKA9arQJC4Vo0-WR4j_-2XYjM,1321
356
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/static/logo.png,sha256=m-FSk0M9NrxlRnfaEjObW0e416Tw419QVNiCr3F6Ymo,12221
352
357
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/frontend/tests/test.ts,sha256=Zn47gMooUsmXRYTuDvtVajL07cEwPMhL5pOXeolSnEg,224
353
358
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/helper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
354
359
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/helper/async_task.py,sha256=xoBJz_4XApjT7MZwRYPs2EF1IMEjaOJJX5WuGtAS8ug,499
@@ -401,13 +406,14 @@ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/entity
401
406
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/entity/permission/repo.py,sha256=CHquoqL_FPpp6WlszpWhLYgnGw1EZ2Zg0Bkbrs88x1s,1085
402
407
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/entity/permission/rpc.py,sha256=NOSXDqaWOZyMzywqNqfL0g6ycPzAEkwpFdx1EWwOKLc,2642
403
408
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/entity/user/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
404
- zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/entity/user/api.py,sha256=hKB9AABZgoNwkzzvG6Ro52nNNIXUVYp4ONW91IZySUg,6107
409
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/entity/user/api.py,sha256=V1x0Xes218w81k7MzOXFwrSBR9l4jbX1R24Y_tHpEA0,6210
405
410
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/entity/user/model.py,sha256=BWR1F8hs7tbSGppPhVpuTlg12YjvZVfyXltcpGcU_t0,5503
406
411
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/entity/user/repo.py,sha256=NhBmFdQFy9svhSElWJTtJlZh_n03un5JNunfM_Y-7lk,3274
407
412
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/entity/user/rpc.py,sha256=SybDghtNFVQLZPdXLFWxVn5VjtOrc2HluVBNsRlppiY,3373
408
413
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
409
414
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/schema/group.py,sha256=dOmadgsAz_JX9Liv8OhdjBarJ07zTYhml9uHrZF4NK0,448
410
415
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/schema/permission.py,sha256=2CNUWKaCZqS_TTu2DGio7ARrMHHMoOvvhFiQbuenYRg,324
416
+ zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/schema/request.py,sha256=WR8aEcNB_iukr_jJlM4FWPhdas0eC8VCWrx7DmBTh9o,181
411
417
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/schema/token.py,sha256=vLh2IbWs13vmeTWWuo4gwN49O05MAEgg1eYij8BUseg,196
412
418
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/src/module/auth/schema/user.py,sha256=A6BhTexDIn4BUFlXBkR4SqzPZO6o6lz0GDCdsgcbNI4,706
413
419
  zrb/builtin/generator/fastapp/template/src/kebab-app-name/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -457,7 +463,7 @@ zrb/builtin/generator/fastapp_module/template/src/kebab-app-name/src/module/snak
457
463
  zrb/builtin/generator/fastapp_module/template/src/kebab-app-name/test/snake_module_name/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
458
464
  zrb/builtin/generator/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
459
465
  zrb/builtin/generator/project/create.py,sha256=Y7OvrDZrVI-0F5EcAsnW1t1KaK4X32mZN8y0cLkSyVg,1826
460
- zrb/builtin/generator/project/template/.gitignore,sha256=DIByeKJ8nyQj4z5mWbOL_UPzVsJhtREqMaP8RLaznpc,21
466
+ zrb/builtin/generator/project/template/.gitignore,sha256=PsyvqP0HrgCKOPxDUWJxwstpBF1H3Hy7Bt_-Fg4IO9M,22
461
467
  zrb/builtin/generator/project/template/README.md,sha256=pNGAZkZIhSEmiAyKdP3cVYmBNQ756hlLZpgJtCtLOVw,1832
462
468
  zrb/builtin/generator/project/template/project.sh,sha256=rMq01ZcojBMS3x6LP82FHWeHf-LIbxMPSsDFN6DzPQ8,1517
463
469
  zrb/builtin/generator/project/template/requirements.txt,sha256=X6wrfgHOG6KaaMpDJEsXUp2Eyb-1oLY4e7QnMQqcq68,16
@@ -497,7 +503,7 @@ zrb/builtin/generator/simple_python_app/template/src/kebab-app-name/deployment/_
497
503
  zrb/builtin/generator/simple_python_app/template/src/kebab-app-name/deployment/requirements.txt,sha256=iCdFXkdFyErro4RBXygTg-2w3SLAyO8khhtrHN4uIrI,75
498
504
  zrb/builtin/generator/simple_python_app/template/src/kebab-app-name/deployment/state/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
499
505
  zrb/builtin/generator/simple_python_app/template/src/kebab-app-name/src/.dockerignore,sha256=Adno7oEVeo0HrAX3s4RzQvgRSxeu0VqDbrdK4g-okX4,21
500
- zrb/builtin/generator/simple_python_app/template/src/kebab-app-name/src/.gitignore,sha256=Q63GDlt-GxDtkQ84tg70v5wXqE7dYTKOrhBuaojUxeM,22
506
+ zrb/builtin/generator/simple_python_app/template/src/kebab-app-name/src/.gitignore,sha256=wxouZk_385X1IglYHDVty5eBaeh_PdzDbP6RQfiP4Bw,23
501
507
  zrb/builtin/generator/simple_python_app/template/src/kebab-app-name/src/Dockerfile,sha256=Yl5euBK6oKwoo3r4KhiLNMR8PwCkn7uziXOZe1zBewY,187
502
508
  zrb/builtin/generator/simple_python_app/template/src/kebab-app-name/src/main.py,sha256=UpJoBSo4zNKFSa8-0pdJwCymjJDxVZicdoENshogtjE,447
503
509
  zrb/builtin/generator/simple_python_app/template/src/kebab-app-name/src/requirements.txt,sha256=HX56Al9bOoM8Mq1Yc44UE2cfT3XrTZGmHI6T3q7xn50,15
@@ -575,8 +581,8 @@ zrb/task_input/input.py,sha256=I4KrdJR3muxAWgd8zX6CErogHYcFM80Si0DmC5-YJGE,69
575
581
  zrb/task_input/int_input.py,sha256=YTxeRvHGe60hUto3vGtjA3GVLsR2zPtlIca20XO_94A,1568
576
582
  zrb/task_input/password_input.py,sha256=-ygMqy3JoHtZB5aA7uwlwgntFBJKBasfP3eX9iaOxKE,1521
577
583
  zrb/task_input/str_input.py,sha256=RUw5zTUDAo1kyl5kcUpXyk073xh09N04D41PmH76RVk,1568
578
- zrb-0.0.51.dist-info/entry_points.txt,sha256=xTgXc1kBKYhJHEujdaSPHUcJT3-hbyP1mLgwkv-5sSk,40
579
- zrb-0.0.51.dist-info/LICENSE,sha256=hVM_U_SOdNZ9mLpaAZ5qn3HRXQXucGX9rliGPEifzVs,1073
580
- zrb-0.0.51.dist-info/WHEEL,sha256=rSgq_JpHF9fHR1lx53qwg_1-2LypZE_qmcuXbVUq948,81
581
- zrb-0.0.51.dist-info/METADATA,sha256=TTj2ejQBJ_jYFdsZFOvpPiitzGWA4NubJ4_F5mSW3bw,15340
582
- zrb-0.0.51.dist-info/RECORD,,
584
+ zrb-0.0.52.dist-info/entry_points.txt,sha256=xTgXc1kBKYhJHEujdaSPHUcJT3-hbyP1mLgwkv-5sSk,40
585
+ zrb-0.0.52.dist-info/LICENSE,sha256=hVM_U_SOdNZ9mLpaAZ5qn3HRXQXucGX9rliGPEifzVs,1073
586
+ zrb-0.0.52.dist-info/WHEEL,sha256=rSgq_JpHF9fHR1lx53qwg_1-2LypZE_qmcuXbVUq948,81
587
+ zrb-0.0.52.dist-info/METADATA,sha256=orUvRZpskjKxTQlQ38uJ5WGM99pvOWxrddiLn15xH90,15443
588
+ zrb-0.0.52.dist-info/RECORD,,
File without changes
File without changes