wcz-layout 7.6.0 → 7.6.2
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.
Potentially problematic release.
This version of wcz-layout might be problematic. Click here for more details.
- package/dist/{RouterListItemButton-CvfZk2zD.js → RouterListItemButton-DeaQB4ym.js} +1 -1
- package/dist/{RouterListItemButton-CvfZk2zD.js.map → RouterListItemButton-DeaQB4ym.js.map} +1 -1
- package/dist/components/core/Layout.d.ts +1 -1
- package/dist/components/core/navigation/NavigationList.d.ts +4 -4
- package/dist/components/core/navigation/NavigationListItem.d.ts +3 -3
- package/dist/components.js +2 -2
- package/dist/hooks.js +1 -1
- package/dist/index.js +617 -621
- package/dist/index.js.map +1 -1
- package/dist/lib/auth/msalClient.d.ts +8 -2
- package/dist/middleware.js +11 -11
- package/dist/models/Navigation.d.ts +23 -11
- package/dist/{queries-DzKY6YXz.js → queries-D-DV5lCw.js} +3 -3
- package/dist/{queries-DzKY6YXz.js.map → queries-D-DV5lCw.js.map} +1 -1
- package/dist/query.js +2 -2
- package/dist/{queryClient-uWNhcABg.js → queryClient-B__OEZ70.js} +1 -1
- package/dist/{queryClient-uWNhcABg.js.map → queryClient-B__OEZ70.js.map} +1 -1
- package/dist/{msalClient-BLrbVP5z.js → utils-C4oJ0tr5.js} +58 -47
- package/dist/utils-C4oJ0tr5.js.map +1 -0
- package/dist/utils.js +5 -5
- package/package.json +38 -6
- package/skills/api-routes/SKILL.md +251 -0
- package/skills/auth/SKILL.md +268 -0
- package/skills/data-grid/SKILL.md +229 -0
- package/skills/database-schema/SKILL.md +182 -0
- package/skills/dialogs-notifications/SKILL.md +241 -0
- package/skills/forms-validation/SKILL.md +331 -0
- package/skills/forms-validation/references/field-components.md +212 -0
- package/skills/layout-navigation/SKILL.md +259 -0
- package/skills/project-initialization/SKILL.md +181 -0
- package/skills/project-structure/SKILL.md +157 -0
- package/skills/tanstack-db-collections/SKILL.md +270 -0
- package/skills/ui-pages/SKILL.md +278 -0
- package/dist/msalClient-BLrbVP5z.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"msalClient-BLrbVP5z.js","names":["AnyFieldApi","permissions","clientEnv","TokenPayload","User","getUser","WISTRON_PRIMARY_COLOR","WISTRON_SECONDARY_COLOR","Platform","isAndroid","test","userAgent","isIOS","isWindows","isMacOS","navigator","RootRouteHeadOptions","manifest","rootRouteHead","options","meta","charSet","name","content","title","VITE_APP_TITLE","links","rel","sizes","href","type","requirePermission","permissionKey","user","hasPermission","Error","FormOmittedProps","getFieldStatus","field","state","isTouched","hasError","errors","length","helperText","message","toKebabCase","str","replaceAll","toLowerCase","decodeJwt","token","base64Payload","split","base64","replace","payload","decodeURIComponent","atob","map","c","charCodeAt","toString","slice","join","JSON","parse","buildUser","id","sub","email","preferred_username","department","toUpperCase","employeeId","companyName","key","allowedGroups","some","k","groups","includes","AuthenticationResult","EventMessage","EventType","InteractionRequiredAuthError","PublicClientApplication","createClientOnlyFn","createIsomorphicFn","scopes","definedScopes","clientEnv","buildUser","decodeJwt","User","TokenInteractionListener","Array","pca","auth","clientId","VITE_ENTRA_CLIENT_ID","authority","VITE_ENTRA_TENANT_ID","redirectUri","initialize","then","addEventCallback","event","eventType","LOGIN_SUCCESS","payload","account","setActiveAccount","handleRedirectPromise","response","tokenInteractionListeners","Set","subscribeToTokenInteractionRequired","listener","add","delete","getUser","server","client","Promise","getActiveAccount","idToken","getAccessToken","scopeKey","Error","accessToken","acquireTokenSilent","error","forEach"],"sources":["../src/env.ts","../src/lib/utils.ts","../src/lib/auth/msalClient.ts"],"sourcesContent":["import { createEnv } from \"@t3-oss/env-core\";\nimport { z } from \"zod\";\n\nexport const clientEnv = createEnv({\n clientPrefix: \"VITE_\",\n client: {\n VITE_ENTRA_CLIENT_ID: z.string(),\n VITE_ENTRA_TENANT_ID: z.string(),\n VITE_APP_TITLE: z.string(),\n VITE_MUI_LICENSE_KEY: z.string(),\n },\n runtimeEnv: import.meta.env,\n emptyStringAsUndefined: true,\n});\n\nexport const serverEnv = createEnv({\n server: {\n ENTRA_CLIENT_ID: z.string(),\n ENTRA_TENANT_ID: z.string(),\n ENTRA_CLIENT_SECRET: z.string(),\n },\n runtimeEnv: process.env,\n emptyStringAsUndefined: true,\n});\n","import type { AnyFieldApi } from \"@tanstack/react-form\";\r\nimport { permissions } from \"virtual:wcz-layout\";\r\nimport { clientEnv } from \"~/env\";\r\nimport type { TokenPayload } from \"~/models/TokenPayload\";\r\nimport type { User } from \"~/models/User\";\r\nimport { getUser } from \"./auth/msalClient\";\r\n\r\nexport const WISTRON_PRIMARY_COLOR = \"#00506E\";\r\nexport const WISTRON_SECONDARY_COLOR = \"#64DC00\";\r\n\r\nexport class Platform {\r\n static get isAndroid() {\r\n return /android/i.test(this.userAgent);\r\n }\r\n static get isIOS() {\r\n return /iPad|iPhone|iPod/.test(this.userAgent);\r\n }\r\n static get isWindows() {\r\n return /windows/i.test(this.userAgent);\r\n }\r\n static get isMacOS() {\r\n return /Macintosh|MacIntel|MacPPC|Mac68K/.test(this.userAgent);\r\n }\r\n\r\n private static get userAgent() {\r\n return typeof navigator === \"undefined\" ? \"\" : navigator.userAgent;\r\n }\r\n}\r\n\r\ninterface RootRouteHeadOptions {\r\n manifest?: string;\r\n}\r\n\r\nexport const rootRouteHead = (options?: RootRouteHeadOptions) => ({\r\n meta: [\r\n { charSet: \"utf-8\" },\r\n { name: \"viewport\", content: \"width=device-width, initial-scale=1\" },\r\n { title: clientEnv.VITE_APP_TITLE },\r\n { name: \"og:type\", content: \"website\" },\r\n { name: \"og:title\", content: clientEnv.VITE_APP_TITLE },\r\n { name: \"og:image\", content: \"/favicon-32x32.png\" },\r\n ],\r\n links: [\r\n { rel: \"apple-touch-icon\", sizes: \"180x180\", href: \"/apple-touch-icon.png\" },\r\n { rel: \"icon\", type: \"image/png\", sizes: \"32x32\", href: \"/favicon-32x32.png\" },\r\n { rel: \"icon\", type: \"image/png\", sizes: \"16x16\", href: \"/favicon-16x16.png\" },\r\n { rel: \"manifest\", href: options?.manifest || \"/manifest.json\" },\r\n { rel: \"icon\", href: \"/favicon.ico\" },\r\n ],\r\n});\r\n\r\nexport const requirePermission = (permissionKey: keyof typeof permissions) => {\r\n return async () => {\r\n const user = await getUser();\r\n\r\n if (!user?.hasPermission(permissionKey))\r\n throw new Error(\"You do not have permission to access this page.\");\r\n\r\n return { user };\r\n };\r\n};\r\n\r\n/* Internal Utils */\r\nexport type FormOmittedProps =\r\n | \"name\"\r\n | \"value\"\r\n | \"onChange\"\r\n | \"onBlur\"\r\n | \"error\"\r\n | \"helperText\"\r\n | \"renderInput\"\r\n | \"type\"\r\n | \"aria-label\";\r\n\r\nexport const getFieldStatus = (field: AnyFieldApi) => {\r\n const { meta } = field.state;\r\n\r\n const isTouched = meta.isTouched;\r\n const hasError = !!meta.errors.length;\r\n const helperText = meta.errors[0]?.message;\r\n\r\n return { isTouched, hasError, helperText };\r\n};\r\n\r\nexport const toKebabCase = (str: string): string => {\r\n return str\r\n .replaceAll(/([a-z])([A-Z])/g, \"$1-$2\")\r\n .replaceAll(/[\\s_]+/g, \"-\")\r\n .replaceAll(/[^a-zA-Z0-9-]/g, \"\")\r\n .toLowerCase()\r\n .replaceAll(/-+/g, \"-\")\r\n .replaceAll(/(^-|-$)/g, \"\");\r\n};\r\n\r\nexport const decodeJwt = (token: string) => {\r\n const base64Payload = token.split(\".\")[1];\r\n const base64 = base64Payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n const payload = decodeURIComponent(\r\n atob(base64)\r\n .split(\"\")\r\n .map((c) => \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2))\r\n .join(\"\"),\r\n );\r\n return JSON.parse(payload) as TokenPayload;\r\n};\r\n\r\nexport const buildUser = (payload: TokenPayload): User => ({\r\n id: payload.sub,\r\n name: payload.name?.split(\"/\")[0],\r\n email: payload.preferred_username?.toLowerCase(),\r\n department: payload.department?.toUpperCase() || \"\",\r\n employeeId: payload.employeeId?.toUpperCase() || \"\",\r\n companyName: payload.companyName || \"\",\r\n hasPermission: (key: keyof typeof permissions) => {\r\n const allowedGroups = permissions[key];\r\n return allowedGroups.some((k) => (payload.groups ?? []).includes(k));\r\n },\r\n});\r\n","import { AuthenticationResult, EventMessage, EventType, InteractionRequiredAuthError, PublicClientApplication } from \"@azure/msal-browser\";\r\nimport { createClientOnlyFn, createIsomorphicFn } from \"@tanstack/react-start\";\r\nimport { scopes as definedScopes } from \"virtual:wcz-layout\";\r\nimport { clientEnv } from \"~/env\";\r\nimport { buildUser, decodeJwt } from \"~/lib/utils\";\r\nimport type { User } from \"~/models/User\";\r\n\r\ntype TokenInteractionListener = (scopes: Array<string>) => void;\r\n\r\nexport const pca = new PublicClientApplication({\r\n auth: {\r\n clientId: clientEnv.VITE_ENTRA_CLIENT_ID,\r\n authority: `https://login.microsoftonline.com/${clientEnv.VITE_ENTRA_TENANT_ID}`,\r\n redirectUri: \"/\",\r\n },\r\n});\r\n\r\nawait pca.initialize()\r\n .then(() => {\r\n pca.addEventCallback((event: EventMessage) => {\r\n if (event.eventType === EventType.LOGIN_SUCCESS && event.payload) {\r\n const payload = event.payload as AuthenticationResult;\r\n const account = payload.account;\r\n pca.setActiveAccount(account);\r\n }\r\n });\r\n\r\n return pca.handleRedirectPromise();\r\n })\r\n .then((response) => {\r\n if (response?.account) pca.setActiveAccount(response.account);\r\n });\r\n\r\nconst tokenInteractionListeners = new Set<TokenInteractionListener>();\r\n\r\nexport const subscribeToTokenInteractionRequired = (listener: TokenInteractionListener) => {\r\n tokenInteractionListeners.add(listener);\r\n\r\n return () => {\r\n tokenInteractionListeners.delete(listener);\r\n };\r\n};\r\n\r\nexport const getUser = createIsomorphicFn()\r\n .server(() => null)\r\n .client(async (): Promise<User | null> => {\r\n const account = pca.getActiveAccount();\r\n if (!account?.idToken) return null;\r\n\r\n return buildUser(decodeJwt(account.idToken));\r\n });\r\n\r\n/**\r\n * Token Acquisition: Get authenticated access token.\r\n * Use when: Making API calls from the browser to secured endpoints\r\n */\r\nexport const getAccessToken = createClientOnlyFn(async (scopeKey: keyof typeof definedScopes) => {\r\n const account = pca.getActiveAccount();\r\n if (!account) throw new Error(\"No active account. User not signed in.\");\r\n\r\n const scopes = [...definedScopes[scopeKey]];\r\n\r\n try {\r\n const { accessToken } = await pca.acquireTokenSilent({ scopes, account });\r\n return accessToken;\r\n } catch (error) {\r\n if (error instanceof InteractionRequiredAuthError) {\r\n tokenInteractionListeners.forEach((listener) => listener(scopes));\r\n }\r\n\r\n throw error;\r\n }\r\n});\r\n"],"mappings":"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"}
|