Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
cd00146
feat: add initial playground package with permission management examples
productdevbook Mar 12, 2025
a4083f1
feat: implement Permask class for flexible permission management
productdevbook Mar 12, 2025
2ce4bcc
refactor: update Permask class to enforce stricter permission types a…
productdevbook Mar 12, 2025
3950c74
refactor: simplify permission check methods in Permask class by using…
productdevbook Mar 12, 2025
58acb58
test: add comprehensive tests for permission helper methods in Permas…
productdevbook Mar 12, 2025
f8cab75
feat: default add
productdevbook Mar 12, 2025
145b4a8
feat: enhance Permask class with CRUD permissions and update default …
productdevbook Mar 12, 2025
202bbc8
test: update Permask tests to reflect changes in permission handling …
productdevbook Mar 12, 2025
1a14bcc
feat: add parseSimple method to Permask class and corresponding test …
productdevbook Mar 12, 2025
a166dab
feat: define PermissionSimple type and update parseSimple method in P…
productdevbook Mar 12, 2025
6e67162
feat: update PermaskBuilder and PermissionCheck to support ALL permis…
productdevbook Mar 12, 2025
9271170
feat: update PermaskBuilder and PermissionCheck to handle 'ALL' permi…
productdevbook Mar 12, 2025
7f0eab7
feat: add auto-assignment of permission values and enhance ALL permis…
productdevbook Mar 12, 2025
d5f19f7
feat: enhance PermissionCheck and Permask to support 'ALL' permission…
productdevbook Mar 12, 2025
162847d
feat: enhance PermaskBuilder to validate permission values against ac…
productdevbook Mar 12, 2025
d526aa3
feat: add comprehensive usage guide for Permask library
productdevbook Mar 12, 2025
e2d7a6b
feat: update examples in run.ts to demonstrate enhanced PermaskBuilde…
productdevbook Mar 12, 2025
7628697
feat: rename WRITE permission to UPDATE and adjust related tests and …
productdevbook Mar 12, 2025
c01a27e
feat: update document permission to grant CREATE instead of WRITE and…
productdevbook Mar 12, 2025
c6ab7f5
feat: add automated tests for access bits calculation and group versi…
productdevbook Mar 12, 2025
f36e6a2
feat: update permissionMapping type to be partial in GroupMigration i…
productdevbook Mar 12, 2025
0dc18f0
feat: restrict MigratedCheckResult type to extend Record<string, number>
productdevbook Mar 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
456 changes: 456 additions & 0 deletions USAGE.md

Large diffs are not rendered by default.

14 changes: 14 additions & 0 deletions playground/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"name": "playground",
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "tsx run.ts"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"permask": "workspace:*"
}
}
167 changes: 167 additions & 0 deletions playground/run.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
import { DefaultPermissionAccess, PermaskBuilder } from 'permask';

console.log('=== Permask API Usage Examples ===\n');

// Example 1: Using default CRUD permissions
console.log('== Example 1: Default CRUD Permissions ==');

const crudPermask = new PermaskBuilder({
permissions: DefaultPermissionAccess,
groups: {
USERS: 1,
DOCUMENTS: 2,
PHOTOS: 3
}
}).build();

// Create a permission for documents with read and write access
const documentPermission = crudPermask.for('DOCUMENTS')
.grant(['READ', 'CREATE'])
.value();

console.log('Document Permission Details:', crudPermask.check(documentPermission).explain());
console.log('Can Read:', crudPermask.check(documentPermission).canRead()); // true
console.log('Can Write:', crudPermask.check(documentPermission).canCreate()); // true
console.log('Can Delete:', crudPermask.check(documentPermission).canDelete()); // false
console.log('String Representation:', crudPermask.toString(documentPermission)); // "DOCUMENTS:READ,WRITE"

// Parse from string
const parsedPermission = crudPermask.fromString('PHOTOS:CREATE,READ,UPDATE');
console.log('Parsed Permission Details:', crudPermask.check(parsedPermission).explain());

console.log('\n== Example 2: Custom Permissions ==');

// Example 2: Custom permissions with named groups
const customPermask = new PermaskBuilder<{
VIEW: number;
EDIT: number;
DELETE: number;
SHARE: number;
PRINT: number;
DOWNLOAD: number;
}>({
permissions: {
VIEW: 1, // 0b000001
EDIT: 2, // 0b000010
DELETE: 4, // 0b000100
SHARE: 8, // 0b001000
PRINT: 16, // 0b010000
DOWNLOAD: 32, // 0b100000
},
accessBits: 8,
groups: {
DOCUMENTS: 1,
PHOTOS: 2,
VIDEOS: 3,
FILES: 4,
ADMIN: 100
}
})
.definePermissionSet('VIEWER', ['VIEW', 'DOWNLOAD'])
.definePermissionSet('EDITOR', ['VIEW', 'EDIT', 'DOWNLOAD'])
.definePermissionSet('MANAGER', ['VIEW', 'EDIT', 'DELETE', 'SHARE'])
.definePermissionSet('ADMIN', ['VIEW', 'EDIT', 'DELETE', 'SHARE', 'PRINT', 'DOWNLOAD'])
.build();

// Create permission using specific permissions
const editorPermission = customPermask.for('DOCUMENTS')
.grant(['VIEW', 'EDIT', 'SHARE'])
.value();

console.log('Editor Permission Details:', customPermask.check(editorPermission).explain());

// Check specific permissions
console.log('Can View:', customPermask.check(editorPermission).can('VIEW')); // true
console.log('Can Delete:', customPermask.check(editorPermission).can('DELETE')); // false
console.log('Can View and Edit:', customPermask.check(editorPermission).canAll(['VIEW', 'EDIT'])); // true
console.log('Can Delete or Print:', customPermask.check(editorPermission).canAny(['DELETE', 'PRINT'])); // false

// Create permission using a permission set
const managerPermission = customPermask.for('PHOTOS')
.grantSet('MANAGER')
.value();

console.log('\nManager Permission Details:', customPermask.check(managerPermission).explain());

// Grant all permissions
const adminPermission = customPermask.for('ADMIN')
.grantAll()
.value();

console.log('\nAdmin Permission Details:', customPermask.check(adminPermission).explain());
console.log('Has all permissions:', customPermask.check(adminPermission).canEverything()); // true
console.log('String Representation:', customPermask.toString(adminPermission)); // "ADMIN:ALL"

console.log('\n== Example 3: Permission Sets and Extensions ==');

// Extend the permissions system
const extendedPermask = customPermask.toBuilder()
.definePermission('APPROVE', 64)
.defineGroup('REPORTS', 101)
.definePermissionSet('APPROVER', ['VIEW', 'APPROVE'])
.build();

// Create permission using new components
const reportPermission = extendedPermask.for('REPORTS')
.grantSet('APPROVER')
.value();

console.log('Report Permission Details:', extendedPermask.check(reportPermission).explain());

// Combine permission sets with individual permissions
const customPermission = extendedPermask.for('DOCUMENTS')
.grantSet('EDITOR')
.grant(['APPROVE'])
.value();

console.log('\nCustom Permission Details:', extendedPermask.check(customPermission).explain());

console.log('\n== Example 4: String Conversion ==');

// Convert to string and back
const permissionString = extendedPermask.toString(customPermission);
console.log('Permission String:', permissionString);

const reconvertedPermission = extendedPermask.fromString(permissionString);
console.log('Reconverted Permission Details:', extendedPermask.check(reconvertedPermission).explain());

// Special string formats
console.log('\nSpecial String Formats:');
console.log('From "DOCUMENTS:ALL":', extendedPermask.check(extendedPermask.fromString('DOCUMENTS:ALL')).explain());
console.log('From "VIDEOS:*":', extendedPermask.check(extendedPermask.fromString('VIDEOS:*')).explain());
console.log('From "PHOTOS:VIEWER":', extendedPermask.check(extendedPermask.fromString('PHOTOS:VIEWER')).explain());

console.log('\n== Example 5: Auto-assigned Permission Values ==');

// Auto-assign permission values
const autoPermask = new PermaskBuilder<{
READ: number;
WRITE: number;
EXECUTE: number;
CONFIGURE: number;
}>({
permissions: {
READ: null, // Will be auto-assigned to 1
WRITE: null, // Will be auto-assigned to 2
EXECUTE: null, // Will be auto-assigned to 4
CONFIGURE: null, // Will be auto-assigned to 8
},
groups: {
FILES: 1,
PROGRAMS: 2,
SETTINGS: 3
}
}).build();

const filePermission = autoPermask.for('FILES')
.grant(['READ', 'WRITE'])
.value();

console.log('Auto-assigned Permission Details:', autoPermask.check(filePermission).explain());
console.log('Permission Values:');
console.log('- READ:', autoPermask.getPermissionValue('READ'));
console.log('- WRITE:', autoPermask.getPermissionValue('WRITE'));
console.log('- EXECUTE:', autoPermask.getPermissionValue('EXECUTE'));
console.log('- CONFIGURE:', autoPermask.getPermissionValue('CONFIGURE'));
console.log('- ALL:', autoPermask.getPermissionValue('ALL'));

6 changes: 6 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions pnpm-workspace.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
packages:
- playground
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ export * from "./permask";
export * from "./utils/bitmask";
export * from "./constants/permission";
export * from "./integrations/express";
export * from "./permask-class";
Loading