From fbbe3c99ef01d88e0b1d469dfd931d464f446d8e Mon Sep 17 00:00:00 2001 From: ztimson Date: Thu, 17 Oct 2024 10:24:18 -0400 Subject: [PATCH] Updated ASet & Path Events --- .npmignore | 12 ++++++++++++ index.html | 18 ++++++++++++++++++ package.json | 2 +- src/aset.ts | 15 ++++++++++++++- src/index.ts | 2 ++ src/path-events.ts | 17 +++++------------ vite.config.ts | 2 +- 7 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 .npmignore create mode 100644 index.html diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..c19db7e --- /dev/null +++ b/.npmignore @@ -0,0 +1,12 @@ +src +tests +.editorconfig +.gitignore +.gitmodules +.npmignore +CODEOWNERS +Dockerfile +index.html +jest.config.js +tsconfig.json +vite.config.js diff --git a/index.html b/index.html new file mode 100644 index 0000000..dc11201 --- /dev/null +++ b/index.html @@ -0,0 +1,18 @@ + + + + + @ztimson/utils sandbox + + + + + diff --git a/package.json b/package.json index f348b13..ade230a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ztimson/utils", - "version": "0.21.0", + "version": "0.21.3", "description": "Utility library", "author": "Zak Timson", "license": "MIT", diff --git a/src/aset.ts b/src/aset.ts index dd89fb0..6e2faee 100644 --- a/src/aset.ts +++ b/src/aset.ts @@ -1,3 +1,5 @@ +import {isEqual} from './objects.ts'; + /** * An array which functions as a set. It guarantees unique elements * and provides set functions for comparisons @@ -34,7 +36,7 @@ export class ASet extends Array { delete(...items: T[]) { items.forEach(el => { const index = this.indexOf(el); - if(index != -1) this.slice(index, 1); + if(index != -1) this.splice(index, 1); }) return this; } @@ -57,6 +59,17 @@ export class ASet extends Array { return this.indexOf(el) != -1; } + /** + * Find index number of element, or -1 if it doesn't exist. Matches by equality not reference + * + * @param {T} search Element to find + * @param {number} fromIndex Starting index position + * @return {number} Element index number or -1 if missing + */ + indexOf(search: T, fromIndex?: number): number { + return super.findIndex((el: T) => isEqual(el, search), fromIndex); + } + /** * Create list of elements this set has in common with the comparison set * @param {ASet} set Set to compare against diff --git a/src/index.ts b/src/index.ts index ebf8a22..ee540ff 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,5 @@ +import {PE} from './path-events.ts'; + export * from './array'; export * from './aset'; export * from './cache'; diff --git a/src/path-events.ts b/src/path-events.ts index b8b9ff0..f5c5c83 100644 --- a/src/path-events.ts +++ b/src/path-events.ts @@ -113,7 +113,7 @@ export class PathEvent { * @param {string | PathEvent} paths Events as strings or pre-parsed * @return {PathEvent} Final combined permission */ - static combine(paths: (string | PathEvent)[]): PathEvent { + static combine(...paths: (string | PathEvent)[]): PathEvent { let hitNone = false; const combined = paths.map(p => new PathEvent(p)) .toSorted((p1, p2) => { @@ -123,18 +123,10 @@ export class PathEvent { if(p.none) hitNone = true; if(!acc) return p; if(hitNone) return acc; - if(p.all) acc.all = true; - if(p.all || p.create) acc.create = true; - if(p.all || p.read) acc.read = true; - if(p.all || p.update) acc.update = true; - if(p.all || p.delete) acc.delete = true; acc.methods = [...acc.methods, ...p.methods]; return acc; }, null); - if(combined.all) combined.methods = ['*']; - if(combined.none) combined.methods = ['n']; - combined.methods = new ASet(combined.methods); // Make unique - combined.raw = PES`${combined.fullPath}:${combined.methods}`; + combined.methods = new ASet(combined.methods); return combined; } @@ -152,7 +144,7 @@ export class PathEvent { if(!r.fullPath && r.all) return true; const filtered = parsedTarget.filter(p => r.fullPath.startsWith(p.fullPath)); if(!filtered.length) return false; - const combined = PathEvent.combine(filtered); + const combined = PathEvent.combine(...filtered); return !combined.none && (combined.all || new ASet(combined.methods).intersection(new ASet(r.methods)).length); }); } @@ -197,8 +189,9 @@ export class PathEvent { */ static toString(path: string | string[], methods: Method | Method[]): string { let p = makeArray(path).filter(p => p != null).join('/'); + p = p?.trim().replaceAll(/\/{2,}/g, '/').replaceAll(/(^\/|\/$)/g, ''); if(methods?.length) p += `:${makeArray(methods).map(m => m.toLowerCase()).join('')}`; - return p?.trim().replaceAll(/\/{2,}/g, '/').replaceAll(/(^\/|\/$)/g, ''); + return p; } /** diff --git a/vite.config.ts b/vite.config.ts index 3fece4a..9a4f49c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -13,7 +13,7 @@ export default defineConfig({ } }, emptyOutDir: true, - minify: true, + minify: false, sourcemap: true }, plugins: [dts()],