jax 판매

Permify is a scalable, Google Zanzibar-inspired authorization service for building fine-grained access controls supporting RBAC, ReBAC, and ABAC. Deploy in minutes via Docker and integrate via REST or gRPC SDKs in Go, Python, TypeScript, JavaScript, and Java.
This block provides the Permify Playground frontend: a React application for authoring, visualizing, and testing Permify authorization schemas (using the custom perm DSL) and relationship data (YAML). The typical buyer is a backend team embedding or self-hosting a schema editor and visualizer alongside a Permify authorization service instance.
playground/src/main.js - Root React component; wires Ant Design provider, dark theme, routing, Vercel Analytics, and SpeedInsights.playground/src/routes/index.js - React Router v6 BrowserRouter with a / route for the Play page and a * fallback NotFound page.playground/src/lib/editor/perm/index.js - Monaco-based editor for the perm DSL: custom syntax highlighting, theme, bracket pairs, and keyword autocomplete.playground/src/lib/editor/yaml/index.js - Monaco-based YAML editor with JSON-Schema validation, format-on-save, and error surfacing via a Zustand store.playground/src/lib/visualizer/index.js - vis-network graph renderer that converts Permify graph nodes/edges into an interactive network diagram.cmd/ - Go CLI entrypoint for the Permify server binary (not used by the frontend).internal/ - Core Go authorization engine, storage adapters, and gRPC handlers.pkg/ - Shared Go packages (attribute, tuple, token helpers).proto/ - Protobuf definitions for the Permify gRPC/HTTP API.assets/example-shapes/ - YAML fixtures for common authorization patterns (RBAC, Google Docs, Facebook Groups, etc.).docs/ - Product documentation source files.npm install react react-dom react-router-dom antd
npm install @monaco-editor/react monaco-editor monaco-yaml
npm install vis-network
npm install zustand
npm install @vercel/analytics @vercel/speed-insights
No native modules, no pod install, no Expo prebuild required. The Monaco editor bundles its own workers; you must configure your bundler (Webpack or Vite) to serve them correctly (see Project setup).
Copy the playground/src/ directory into your project, e.g. src/permify-playground/.
격리된 샌드박스를 띄워 서버에서 바로 실행하세요 — 로컬 설정 불필요.
이 버전에 대한 Tetrees AI Review
This Express backend / api completed archive review. Structure, dependency manifests, documentation, functional source, and common risk patterns were checked by the Tetrees verification pipeline; runtime phases are stated separately.
Deterministic AVCP artifact review
파이프라인 avcp-2026-08-04.1 · SHA-256 80b2d53c2804df9c…
This version-scoped review deterministically inspects the submitted archive for structure, dependencies, documentation, functional source, and common malicious or high-risk signals. Build and test phases are reported as passed only after an isolated sandbox audition. It is not a guarantee of perfect security.
검토일 2026년 8월 4일
이 제품을 AI IDE, 웹 빌더 또는 클라우드 IDE로 바로 가져오세요.
Tetrees를 호환 AI IDE에 연결해 보유 제품을 불러오고, 판매자 업로드 권한을 노출하지 않은 채 검증된 ZIP을 받으세요.
아직 리뷰가 없습니다.
토론을 불러오는 중…
Add path aliases to your bundler config so the internal @-prefixed imports resolve:
// tsconfig.json (paths)
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@routes": ["src/permify-playground/routes"],
"@context/layout": ["src/permify-playground/context/layout"],
"@pages/play": ["src/permify-playground/pages/play"],
"@pages/not-found":["src/permify-playground/pages/not-found"],
"@state/shape": ["src/permify-playground/state/shape"],
"@/*": ["src/permify-playground/*"]
}
}
}
resolve.alias entries in vite.config.ts:import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path';
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
'@routes': path.resolve(__dirname, 'src/permify-playground/routes'),
'@context/layout': path.resolve(__dirname, 'src/permify-playground/context/layout'),
'@pages/play': path.resolve(__dirname, 'src/permify-playground/pages/play'),
'@pages/not-found': path.resolve(__dirname, 'src/permify-playground/pages/not-found'),
'@state/shape': path.resolve(__dirname, 'src/permify-playground/state/shape'),
},
},
worker: { format: 'es' },
});
VITE_PERMIFY_API_URL=http://localhost:3476
VITE_PERMIFY_TENANT_ID=t1
Main as the React tree root:// src/index.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import Main from './permify-playground/main';
ReactDOM.createRoot(document.getElementById('root')!).render(<Main />);
function Main(): JSX.Element
Top-level application shell. Wraps the entire tree in an Ant Design ConfigProvider with the Permify dark theme (colorPrimary: '#6318FF', darkAlgorithm), the layout context, React Router, and telemetry providers. Mount this once at the React root.
function AppRouter(): JSX.Element
Self-contained BrowserRouter with two routes: / renders <Play/> and * renders <NotFound/> inside the full layout. Drop this anywhere you want isolated routing; it does not need an outer BrowserRouter.
function PermEditor(props: { setCode: (value: string) => void; value?: string }): JSX.Element
Monaco editor preconfigured for the perm authorization DSL. Registers the perm language with Monarch token rules, a custom dark theme, bracket auto-close for {} and (), and keyword completion. Pass a setCode callback to receive schema changes; use it wherever you let users author entity / permission / relation definitions.
function YamlEditor(props: { setCode: (value: string) => void; value?: string }): JSX.Element
Monaco editor for relationship tuple YAML. Activates monaco-yaml with completion, validation, formatting, and hover. Validation errors are written to the useShapeStore Zustand store (yamlValidationErrors). Use this to let users author or paste relationship data that will be sent to the Permify check/write API.
function Visualizer(props: {
graph: {
nodes: Array<{ id: string; label: string; type: 'entity' | 'operation' | string }>;
edges: Array<{ from: { id: string; type: string }; to: { id: string; type: string } }>;
}
}): JSX.Element
Renders a vis-network interactive graph. Operation nodes (OPERATION_UNION, OPERATION_INTERSECTION, OPERATION_EXCLUSION) are remapped to human labels (or, and, not). Edges from entity nodes render in purple. Use this to visualize the permission graph returned by the Permify schema expansion API.
You have a settings page and want to let admins edit the Permify authorization schema in-browser.
import React, { useState } from 'react';
import PermEditor from './permify-playground/lib/editor/perm';
export default function SchemaEditorPage() {
const [schema, setSchema] = useState<string>(`
entity user {}
entity document {
relation owner @user
permission view = owner
}
`);
async function saveSchema() {
await fetch(import.meta.env.VITE_PERMIFY_API_URL + '/v1/tenants/t1/schemas/write', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ schema }),
});
}
return (
<div style={{ height: '80vh' }}>
<PermEditor setCode={setSchema} value={schema} />
<button onClick={saveSchema}>Save Schema</button>
</div>
);
}
Use YamlEditor alongside the Zustand shape store to surface YAML errors before submitting tuples.
import React, { useState } from 'react';
import YamlEditor from './permify-playground/lib/editor/yaml';
import { useShapeStore } from './permify-playground/state/shape';
export default function RelationshipEditor() {
const [yaml, setYaml] = useState<string>('');
const { yamlValidationErrors } = useShapeStore();
return (
<div>
{yamlValidationErrors && (
<div style={{ color: 'red' }}>Validation error: {yamlValidationErrors}</div>
)}
<YamlEditor setCode={setYaml} value={yaml} />
</div>
);
}
Fetch the expansion of a permission and feed it to Visualizer.
import React, { useEffect, useState } from 'react';
import Visualizer from './permify-playground/lib/visualizer';
interface GraphData {
nodes: Array<{ id: string; label: string; type: string }>;
edges: Array<{ from: { id: string; type: string }; to: { id: string; type: string } }>;
}
export default function PermissionGraph() {
const [graph, setGraph] = useState<GraphData>({ nodes: [], edges: [] });
useEffect(() => {
fetch(`${import.meta.env.VITE_PERMIFY_API_URL}/v1/tenants/t1/permissions/expand`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
metadata: { schema_version: '', snap_token: '', depth: 20 },
entity: { type: 'document', id: '1' },
permission: 'view',
}),
})
.then(r => r.json())
.then(data => setGraph(data.tree)); // map API response to GraphData shape
}, []);
return <Visualizer graph={graph} />;
}
playground/src/main.js - Application root; configures Ant Design theme tokens and mounts the router and telemetry.playground/src/routes/index.js - Declares all client-side routes; exports AppRouter.playground/src/lib/editor/perm/index.js - Custom Monaco language definition and editor component for the Permify schema DSL.playground/src/lib/editor/yaml/index.js - YAML Monaco editor with schema validation wired to global Zustand error state.playground/src/lib/visualizer/index.js - vis-network wrapper that renders permission graph nodes and edges.assets/example-shapes/ - Ready-made YAML fixtures (RBAC, Notion, Instagram, etc.) you can load as defaults in the editor.proto/ - Protobuf service definitions; use with buf generate if you need typed gRPC clients.cmd/permify/permify.go - Go CLI entrypoint; irrelevant to the frontend but needed to run a local Permify server.internal/ - Go authorization engine; not imported by the frontend.pkg/ - Shared Go utility packages; not imported by the frontend.docs/ - Mintlify documentation source; not deployed with the playground.optimizeDeps: { exclude: ['monaco-editor'] } and configure MonacoEditorWebpackPlugin or the Vite equivalent (vite-plugin-monaco-editor) to copy worker scripts.@-alias resolution fails at runtime: Every @context/layout, @state/shape, etc. alias must be declared both in tsconfig.json paths and in your bundler alias config; one without the other causes silent resolution failures.monaco-yaml version mismatch: monaco-yaml must be version-locked to match the monaco-editor version; mixing minor versions breaks the YAML worker.vis-network SSR crash: vis-network accesses window/document at import time; wrap Visualizer in a dynamic import (React.lazy or Next.js dynamic({ ssr: false })) when using SSR.useShapeStore is defined inside the playground's own state module; if you move files, update the import path in YamlEditor or the store will be a different singleton.useId errors at startup; pin user@example.com if you cannot upgrade.I have copied the Permify Playground source into `source/` in my project.
I also have `source/USAGE.md` which documents the real exports and setup steps.
My project is a React 18 + Vite + TypeScript application.
Please help me integrate the Permify Playground step-by-step:
1. Install all required npm dependencies listed in USAGE.md.
2. Configure Vite path aliases for all `@`-prefixed imports used in `source/playground/src/`.
3. Mount the `Main` component from `source/playground/src/main.js` as the application root.
4. Embed `PermEditor` from `source/playground/src/lib/editor/perm/index.js` in my existing
settings page, wiring `setCode` to local state and adding a "Save Schema" button that
POSTs to `VITE_PERMIFY_API_URL`.
5. Embed `YamlEditor` from `source/playground/src/lib/editor/yaml/index.js` and display
`yamlValidationErrors` from the Zustand store above the editor.
6. Embed `Visualizer` from `source/playground/src/lib/visualizer/index.js`, fetching the
expand API response and mapping it to the `{ nodes, edges }` prop shape.
7. Point out any Monaco worker configuration I need to add to vite.config.ts.
Use only the exports documented in USAGE.md. Do not invent any new APIs.
Permify is licensed under the Apache 2.0 License (see source/LICENSE). It was originally developed by the Permify team and has been acquired by FusionAuth. Upstream repository: https://github.com/Permify/permify.
This product’s unique contribution is clean room implementation of valuable code block into AVCP compatible standard.
전체 설치 가이드와 연동 프롬프트는 구매 후 열람할 수 있습니다.
Automation, Utilities & Developer Tools
무료