@stacksjs/auth 0.75.254 → 0.75.256

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 (2) hide show
  1. package/dist/policy.js +1 -1
  2. package/package.json +14 -14
package/dist/policy.js CHANGED
@@ -1 +1 @@
1
- import{AuthorizationResponse}from"./gate";export class BasePolicy{allow(message){return AuthorizationResponse.allow(message)}deny(message,code){return AuthorizationResponse.deny(message,code)}denyIf(condition,message){if(condition)return this.deny(message);return!0}denyUnless(condition,message){if(!condition)return this.deny(message);return!0}allowIf(condition,message){if(condition)return this.allow(message);return!1}}import{log}from"@stacksjs/logging";import*as p from"@stacksjs/path";import{existsSync}from"node:fs";import{policy as registerPolicy}from"./gate";let policyRegistry=null;async function loadPolicyRegistry(){if(policyRegistry)return policyRegistry;policyRegistry=(async()=>{const dir=p.storagePath("framework/auto-imports"),registryPath=`${dir}/policies.ts`;if(!existsSync(registryPath))return null;const module=await import(registryPath);if(!module.policies)throw Error(`Invalid policies registry: ${registryPath}`);return Object.fromEntries(Object.entries(module.policies).map(([name,file])=>[name,p.resolveModulePath(file,dir)]))})();return policyRegistry}function policyDirectories(){return[p.appPath("Policies"),p.storagePath("framework/defaults/app/Policies")]}async function findPolicyFile(name){const registry=await loadPolicyRegistry();if(registry)return registry[name]??null;const{fs}=await import("@stacksjs/storage");for(const dir of policyDirectories()){const candidate=`${dir}/${name}.ts`;if(fs.existsSync(candidate))return candidate}return null}export function resetPolicyRegistry(){policyRegistry=null}export async function discoverPolicies(){const{fs}=await import("@stacksjs/storage"),explicit=new Set,mappings=(await loadGatesModule())?.policies??{};for(const[modelName,config]of Object.entries(mappings)){const policyFile=typeof config==="string"?config:config.policy,policyPath=await findPolicyFile(policyFile);if(!policyPath){log.warn(`[auth] app/Gates.ts maps ${modelName} to ${policyFile}, and no such policy exists`);continue}try{const policyModule=await import(policyPath),PolicyClass=policyModule.default||policyModule[policyFile];if(!PolicyClass){log.warn(`[auth] ${policyPath} has no default export, so ${modelName} has no policy`);continue}registerPolicy(modelName,PolicyClass);explicit.add(modelName);log.debug(`Registered policy: ${policyFile} for ${modelName}`)}catch(error){log.error(`Failed to load policy ${policyFile}:`,error)}}const registry=await loadPolicyRegistry();let discovered;if(registry)discovered=Object.entries(registry).filter(([name])=>name.endsWith("Policy")).map(([policyName,policyPath])=>({policyName,policyPath}));else{const policiesDir=p.appPath("Policies");if(!fs.existsSync(policiesDir)){log.debug("No Policies directory found");return}discovered=fs.readdirSync(policiesDir).filter((file)=>file.endsWith("Policy.ts")).map((file)=>({policyName:file.replace(".ts",""),policyPath:`${policiesDir}/${file}`}))}for(const{policyName,policyPath}of discovered){const modelName=policyName.replace(/Policy$/,"");if(explicit.has(modelName))continue;try{const policyModule=await import(policyPath),PolicyClass=policyModule.default||policyModule[policyName];if(PolicyClass){registerPolicy(modelName,PolicyClass);log.debug(`Auto-discovered policy: ${policyName} for ${modelName}`)}}catch(error){log.error(`Failed to load policy ${policyName}:`,error)}}}async function loadGatesModule(){const{fs}=await import("@stacksjs/storage"),gatesPath=p.appPath("Gates.ts");if(!fs.existsSync(gatesPath))return null;const module=await import(gatesPath);return{gates:module.default?.gates??module.gates,policies:module.default?.policies??module.policies,before:module.default?.before??module.before,after:module.default?.after??module.after}}export async function registerGates(){const{define,before,after}=await import("./gate"),authorization=await loadGatesModule();if(!authorization){log.debug("No Gates.ts found");return}for(const[ability,callback]of Object.entries(authorization.gates??{}))if(typeof callback==="function"){define(ability,callback);log.debug(`Registered gate: ${ability}`)}for(const callback of authorization.before??[])if(typeof callback==="function")before(callback);for(const callback of authorization.after??[])if(typeof callback==="function")after(callback);log.debug("Gates registered successfully")}export async function initializeAuthorization(){try{await registerGates()}catch(error){log.error("[auth] app/Gates.ts failed to load - no gates are registered and every Gate check will deny:",error)}try{await discoverPolicies()}catch(error){log.error("[auth] policy discovery failed - model authorization will deny:",error)}}export{AuthorizationResponse};
1
+ import{AuthorizationResponse}from"./gate";export class BasePolicy{allow(message){return AuthorizationResponse.allow(message)}deny(message,code){return AuthorizationResponse.deny(message,code)}denyIf(condition,message){if(condition)return this.deny(message);return!0}denyUnless(condition,message){if(!condition)return this.deny(message);return!0}allowIf(condition,message){if(condition)return this.allow(message);return!1}}import{log}from"@stacksjs/logging";import*as p from"@stacksjs/path";import{existsSync}from"node:fs";import{policy as registerPolicy}from"./gate";let policyRegistry=null;async function loadPolicyRegistry(){if(policyRegistry)return policyRegistry;policyRegistry=(async()=>{const dir=p.storagePath("framework/auto-imports"),registryPath=`${dir}/policies.ts`;if(!existsSync(registryPath))return null;const module=await import(registryPath);if(!module.policies)throw Error(`Invalid policies registry: ${registryPath}`);return Object.fromEntries(Object.entries(module.policies).map(([name,file])=>[name,p.resolveModulePath(file,dir)]))})();return policyRegistry}function policyDirectories(){return[p.appPath("Policies"),p.defaultsPath("app/Policies")]}async function findPolicyFile(name){const registry=await loadPolicyRegistry();if(registry)return registry[name]??null;const{fs}=await import("@stacksjs/storage");for(const dir of policyDirectories()){const candidate=`${dir}/${name}.ts`;if(fs.existsSync(candidate))return candidate}return null}export function resetPolicyRegistry(){policyRegistry=null}export async function discoverPolicies(){const{fs}=await import("@stacksjs/storage"),explicit=new Set,mappings=(await loadGatesModule())?.policies??{};for(const[modelName,config]of Object.entries(mappings)){const policyFile=typeof config==="string"?config:config.policy,policyPath=await findPolicyFile(policyFile);if(!policyPath){log.warn(`[auth] app/Gates.ts maps ${modelName} to ${policyFile}, and no such policy exists`);continue}try{const policyModule=await import(policyPath),PolicyClass=policyModule.default||policyModule[policyFile];if(!PolicyClass){log.warn(`[auth] ${policyPath} has no default export, so ${modelName} has no policy`);continue}registerPolicy(modelName,PolicyClass);explicit.add(modelName);log.debug(`Registered policy: ${policyFile} for ${modelName}`)}catch(error){log.error(`Failed to load policy ${policyFile}:`,error)}}const registry=await loadPolicyRegistry();let discovered;if(registry)discovered=Object.entries(registry).filter(([name])=>name.endsWith("Policy")).map(([policyName,policyPath])=>({policyName,policyPath}));else{const policiesDir=p.appPath("Policies");if(!fs.existsSync(policiesDir)){log.debug("No Policies directory found");return}discovered=fs.readdirSync(policiesDir).filter((file)=>file.endsWith("Policy.ts")).map((file)=>({policyName:file.replace(".ts",""),policyPath:`${policiesDir}/${file}`}))}for(const{policyName,policyPath}of discovered){const modelName=policyName.replace(/Policy$/,"");if(explicit.has(modelName))continue;try{const policyModule=await import(policyPath),PolicyClass=policyModule.default||policyModule[policyName];if(PolicyClass){registerPolicy(modelName,PolicyClass);log.debug(`Auto-discovered policy: ${policyName} for ${modelName}`)}}catch(error){log.error(`Failed to load policy ${policyName}:`,error)}}}async function loadGatesModule(){const{fs}=await import("@stacksjs/storage"),gatesPath=p.appPath("Gates.ts");if(!fs.existsSync(gatesPath))return null;const module=await import(gatesPath);return{gates:module.default?.gates??module.gates,policies:module.default?.policies??module.policies,before:module.default?.before??module.before,after:module.default?.after??module.after}}export async function registerGates(){const{define,before,after}=await import("./gate"),authorization=await loadGatesModule();if(!authorization){log.debug("No Gates.ts found");return}for(const[ability,callback]of Object.entries(authorization.gates??{}))if(typeof callback==="function"){define(ability,callback);log.debug(`Registered gate: ${ability}`)}for(const callback of authorization.before??[])if(typeof callback==="function")before(callback);for(const callback of authorization.after??[])if(typeof callback==="function")after(callback);log.debug("Gates registered successfully")}export async function initializeAuthorization(){try{await registerGates()}catch(error){log.error("[auth] app/Gates.ts failed to load - no gates are registered and every Gate check will deny:",error)}try{await discoverPolicies()}catch(error){log.error("[auth] policy discovery failed - model authorization will deny:",error)}}export{AuthorizationResponse};
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/auth",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.75.254",
5
+ "version": "0.75.256",
6
6
  "description": "A more simplistic way to authenticate.",
7
7
  "author": "Chris Breuer",
8
8
  "contributors": [
@@ -59,19 +59,19 @@
59
59
  },
60
60
  "dependencies": {
61
61
  "@stacksjs/bun-router": "^0.1.24",
62
- "@stacksjs/cache": "0.75.254",
63
- "@stacksjs/config": "0.75.254",
64
- "@stacksjs/database": "0.75.254",
65
- "@stacksjs/email": "0.75.254",
66
- "@stacksjs/env": "0.75.254",
67
- "@stacksjs/error-handling": "0.75.254",
68
- "@stacksjs/logging": "0.75.254",
69
- "@stacksjs/orm": "0.75.254",
70
- "@stacksjs/path": "0.75.254",
71
- "@stacksjs/router": "0.75.254",
72
- "@stacksjs/security": "0.75.254",
73
- "@stacksjs/socials": "0.75.254",
74
- "@stacksjs/storage": "0.75.254",
62
+ "@stacksjs/cache": "0.75.256",
63
+ "@stacksjs/config": "0.75.256",
64
+ "@stacksjs/database": "0.75.256",
65
+ "@stacksjs/email": "0.75.256",
66
+ "@stacksjs/env": "0.75.256",
67
+ "@stacksjs/error-handling": "0.75.256",
68
+ "@stacksjs/logging": "0.75.256",
69
+ "@stacksjs/orm": "0.75.256",
70
+ "@stacksjs/path": "0.75.256",
71
+ "@stacksjs/router": "0.75.256",
72
+ "@stacksjs/security": "0.75.256",
73
+ "@stacksjs/socials": "0.75.256",
74
+ "@stacksjs/storage": "0.75.256",
75
75
  "@stacksjs/ts-auth": "^0.4.7",
76
76
  "ts-qr-codes": "^0.1.8"
77
77
  },