@walkeros/server-store-fs 3.4.2 → 4.0.0-next-1777463920154

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.
package/README.md CHANGED
@@ -29,7 +29,7 @@ relative to a base directory with path traversal protection.
29
29
  "file": {
30
30
  "package": "@walkeros/server-transformer-file",
31
31
  "config": { "settings": { "prefix": "/static" } },
32
- "env": { "store": "$store:assets" }
32
+ "env": { "store": "$store.assets" }
33
33
  }
34
34
  }
35
35
  }
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.create,r=Object.defineProperty,n=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,i=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty,o=(e,t,i,o)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let c of a(t))s.call(e,c)||c===i||r(e,c,{get:()=>t[c],enumerable:!(o=n(t,c))||o.enumerable});return e},c=(e,n,a)=>(a=null!=e?t(i(e)):{},o(!n&&e&&e.__esModule?a:r(a,"default",{value:e,enumerable:!0}),e)),u={};((e,t)=>{for(var n in t)r(e,n,{get:t[n],enumerable:!0})})(u,{default:()=>p,storeFsInit:()=>p}),module.exports=(e=u,o(r({},"__esModule",{value:!0}),e));var l=c(require("fs/promises")),f=c(require("path"));var p=e=>{const t=e.config.settings,r=f.resolve(t.basePath);function n(t){if(!function(e){return!(!e||e.startsWith("/")||e.startsWith("\\")||e.split(/[/\\]/).includes(".."))}(t))return void e.logger.warn("Path traversal rejected",{key:t});const n=f.join(r,t);return n.startsWith(r+f.sep)||n===r?n:void 0}return{type:"fs",config:e.config,async get(e){const t=n(e);if(t)try{return await l.readFile(t)}catch(e){return}},async set(e,t){const r=n(e);r&&(await l.mkdir(f.dirname(r),{recursive:!0}),await l.writeFile(r,t))},async delete(e){const t=n(e);if(t)try{await l.unlink(t)}catch(e){}}}};//# sourceMappingURL=index.js.map
1
+ "use strict";var e,t=Object.create,r=Object.defineProperty,n=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,i=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty,o=(e,t,i,o)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let c of a(t))s.call(e,c)||c===i||r(e,c,{get:()=>t[c],enumerable:!(o=n(t,c))||o.enumerable});return e},c=(e,n,a)=>(a=null!=e?t(i(e)):{},o(!n&&e&&e.__esModule?a:r(a,"default",{value:e,enumerable:!0}),e)),u={};((e,t)=>{for(var n in t)r(e,n,{get:t[n],enumerable:!0})})(u,{default:()=>p,storeFsInit:()=>p}),module.exports=(e=u,o(r({},"__esModule",{value:!0}),e));var l=c(require("fs/promises")),f=c(require("path"));var p=e=>{const t=e.config.settings,r=f.resolve(t.basePath);function n(t){if(!function(e){return!(!e||e.startsWith("/")||e.startsWith("\\")||e.split(/[/\\]/).includes(".."))}(t))return void e.logger.warn("Path traversal rejected",{key:t});const n=f.join(r,t);return n.startsWith(r+f.sep)||n===r?n:void 0}return{type:"fs",config:e.config,async get(e){const t=n(e);if(t)try{return await l.readFile(t)}catch{return}},async set(e,t){const r=n(e);r&&(await l.mkdir(f.dirname(r),{recursive:!0}),await l.writeFile(r,t))},async delete(e){const t=n(e);if(t)try{await l.unlink(t)}catch{}}}};//# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/store.ts"],"sourcesContent":["export { storeFsInit } from './store';\nexport type { FsStoreSettings } from './types';\nexport { storeFsInit as default } from './store';\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { Store } from '@walkeros/core';\nimport type { FsStoreSettings } from './types';\n\nfunction isValidKey(key: string): boolean {\n if (!key || key.startsWith('/') || key.startsWith('\\\\')) return false;\n return !key.split(/[/\\\\]/).includes('..');\n}\n\nexport const storeFsInit: Store.Init<Store.Types<FsStoreSettings>> = (\n context,\n) => {\n const settings = context.config.settings as FsStoreSettings;\n const basePath = path.resolve(settings.basePath);\n\n function resolvePath(key: string): string | undefined {\n if (!isValidKey(key)) {\n context.logger.warn('Path traversal rejected', { key });\n return undefined;\n }\n const resolved = path.join(basePath, key);\n if (!resolved.startsWith(basePath + path.sep) && resolved !== basePath)\n return undefined;\n return resolved;\n }\n\n return {\n type: 'fs',\n config: context.config as Store.Config<Store.Types<FsStoreSettings>>,\n\n async get(key: string): Promise<Buffer | undefined> {\n const filePath = resolvePath(key);\n if (!filePath) return undefined;\n try {\n return await fs.readFile(filePath);\n } catch {\n return undefined;\n }\n },\n\n async set(key: string, value: unknown): Promise<void> {\n const filePath = resolvePath(key);\n if (!filePath) return;\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, value as Buffer);\n },\n\n async delete(key: string): Promise<void> {\n const filePath = resolvePath(key);\n if (!filePath) return;\n try {\n await fs.unlink(filePath);\n } catch {\n /* ignore */\n }\n },\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAoB;AACpB,WAAsB;AAItB,SAAS,WAAW,KAAsB;AACxC,MAAI,CAAC,OAAO,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,IAAI,EAAG,QAAO;AAChE,SAAO,CAAC,IAAI,MAAM,OAAO,EAAE,SAAS,IAAI;AAC1C;AAEO,IAAM,cAAwD,CACnE,YACG;AACH,QAAM,WAAW,QAAQ,OAAO;AAChC,QAAM,WAAgB,aAAQ,SAAS,QAAQ;AAE/C,WAAS,YAAY,KAAiC;AACpD,QAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAQ,OAAO,KAAK,2BAA2B,EAAE,IAAI,CAAC;AACtD,aAAO;AAAA,IACT;AACA,UAAM,WAAgB,UAAK,UAAU,GAAG;AACxC,QAAI,CAAC,SAAS,WAAW,WAAgB,QAAG,KAAK,aAAa;AAC5D,aAAO;AACT,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ;AAAA,IAEhB,MAAM,IAAI,KAA0C;AAClD,YAAM,WAAW,YAAY,GAAG;AAChC,UAAI,CAAC,SAAU,QAAO;AACtB,UAAI;AACF,eAAO,MAAS,YAAS,QAAQ;AAAA,MACnC,SAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,KAAa,OAA+B;AACpD,YAAM,WAAW,YAAY,GAAG;AAChC,UAAI,CAAC,SAAU;AACf,YAAS,SAAW,aAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,YAAS,aAAU,UAAU,KAAe;AAAA,IAC9C;AAAA,IAEA,MAAM,OAAO,KAA4B;AACvC,YAAM,WAAW,YAAY,GAAG;AAChC,UAAI,CAAC,SAAU;AACf,UAAI;AACF,cAAS,UAAO,QAAQ;AAAA,MAC1B,SAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/store.ts"],"sourcesContent":["export { storeFsInit } from './store';\nexport type { FsStoreSettings } from './types';\nexport { storeFsInit as default } from './store';\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { Store } from '@walkeros/core';\nimport type { FsStoreSettings } from './types';\n\nfunction isValidKey(key: string): boolean {\n if (!key || key.startsWith('/') || key.startsWith('\\\\')) return false;\n return !key.split(/[/\\\\]/).includes('..');\n}\n\nexport const storeFsInit: Store.Init<Store.Types<FsStoreSettings>> = (\n context,\n) => {\n const settings = context.config.settings as FsStoreSettings;\n const basePath = path.resolve(settings.basePath);\n\n function resolvePath(key: string): string | undefined {\n if (!isValidKey(key)) {\n context.logger.warn('Path traversal rejected', { key });\n return undefined;\n }\n const resolved = path.join(basePath, key);\n if (!resolved.startsWith(basePath + path.sep) && resolved !== basePath)\n return undefined;\n return resolved;\n }\n\n return {\n type: 'fs',\n config: context.config as Store.Config<Store.Types<FsStoreSettings>>,\n\n async get(key: string): Promise<Buffer | undefined> {\n const filePath = resolvePath(key);\n if (!filePath) return undefined;\n try {\n return await fs.readFile(filePath);\n } catch {\n return undefined;\n }\n },\n\n async set(key: string, value: unknown): Promise<void> {\n const filePath = resolvePath(key);\n if (!filePath) return;\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, value as Buffer);\n },\n\n async delete(key: string): Promise<void> {\n const filePath = resolvePath(key);\n if (!filePath) return;\n try {\n await fs.unlink(filePath);\n } catch {\n /* ignore */\n }\n },\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAoB;AACpB,WAAsB;AAItB,SAAS,WAAW,KAAsB;AACxC,MAAI,CAAC,OAAO,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,IAAI,EAAG,QAAO;AAChE,SAAO,CAAC,IAAI,MAAM,OAAO,EAAE,SAAS,IAAI;AAC1C;AAEO,IAAM,cAAwD,CACnE,YACG;AACH,QAAM,WAAW,QAAQ,OAAO;AAChC,QAAM,WAAgB,aAAQ,SAAS,QAAQ;AAE/C,WAAS,YAAY,KAAiC;AACpD,QAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAQ,OAAO,KAAK,2BAA2B,EAAE,IAAI,CAAC;AACtD,aAAO;AAAA,IACT;AACA,UAAM,WAAgB,UAAK,UAAU,GAAG;AACxC,QAAI,CAAC,SAAS,WAAW,WAAgB,QAAG,KAAK,aAAa;AAC5D,aAAO;AACT,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ;AAAA,IAEhB,MAAM,IAAI,KAA0C;AAClD,YAAM,WAAW,YAAY,GAAG;AAChC,UAAI,CAAC,SAAU,QAAO;AACtB,UAAI;AACF,eAAO,MAAS,YAAS,QAAQ;AAAA,MACnC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,KAAa,OAA+B;AACpD,YAAM,WAAW,YAAY,GAAG;AAChC,UAAI,CAAC,SAAU;AACf,YAAS,SAAW,aAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,YAAS,aAAU,UAAU,KAAe;AAAA,IAC9C;AAAA,IAEA,MAAM,OAAO,KAA4B;AACvC,YAAM,WAAW,YAAY,GAAG;AAChC,UAAI,CAAC,SAAU;AACf,UAAI;AACF,cAAS,UAAO,QAAQ;AAAA,MAC1B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import*as t from"fs/promises";import*as r from"path";var e=e=>{const i=e.config.settings,s=r.resolve(i.basePath);function a(t){if(!function(t){return!(!t||t.startsWith("/")||t.startsWith("\\")||t.split(/[/\\]/).includes(".."))}(t))return void e.logger.warn("Path traversal rejected",{key:t});const i=r.join(s,t);return i.startsWith(s+r.sep)||i===s?i:void 0}return{type:"fs",config:e.config,async get(r){const e=a(r);if(e)try{return await t.readFile(e)}catch(t){return}},async set(e,i){const s=a(e);s&&(await t.mkdir(r.dirname(s),{recursive:!0}),await t.writeFile(s,i))},async delete(r){const e=a(r);if(e)try{await t.unlink(e)}catch(t){}}}};export{e as default,e as storeFsInit};//# sourceMappingURL=index.mjs.map
1
+ import*as t from"fs/promises";import*as r from"path";var e=e=>{const i=e.config.settings,s=r.resolve(i.basePath);function a(t){if(!function(t){return!(!t||t.startsWith("/")||t.startsWith("\\")||t.split(/[/\\]/).includes(".."))}(t))return void e.logger.warn("Path traversal rejected",{key:t});const i=r.join(s,t);return i.startsWith(s+r.sep)||i===s?i:void 0}return{type:"fs",config:e.config,async get(r){const e=a(r);if(e)try{return await t.readFile(e)}catch{return}},async set(e,i){const s=a(e);s&&(await t.mkdir(r.dirname(s),{recursive:!0}),await t.writeFile(s,i))},async delete(r){const e=a(r);if(e)try{await t.unlink(e)}catch{}}}};export{e as default,e as storeFsInit};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/store.ts"],"sourcesContent":["import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { Store } from '@walkeros/core';\nimport type { FsStoreSettings } from './types';\n\nfunction isValidKey(key: string): boolean {\n if (!key || key.startsWith('/') || key.startsWith('\\\\')) return false;\n return !key.split(/[/\\\\]/).includes('..');\n}\n\nexport const storeFsInit: Store.Init<Store.Types<FsStoreSettings>> = (\n context,\n) => {\n const settings = context.config.settings as FsStoreSettings;\n const basePath = path.resolve(settings.basePath);\n\n function resolvePath(key: string): string | undefined {\n if (!isValidKey(key)) {\n context.logger.warn('Path traversal rejected', { key });\n return undefined;\n }\n const resolved = path.join(basePath, key);\n if (!resolved.startsWith(basePath + path.sep) && resolved !== basePath)\n return undefined;\n return resolved;\n }\n\n return {\n type: 'fs',\n config: context.config as Store.Config<Store.Types<FsStoreSettings>>,\n\n async get(key: string): Promise<Buffer | undefined> {\n const filePath = resolvePath(key);\n if (!filePath) return undefined;\n try {\n return await fs.readFile(filePath);\n } catch {\n return undefined;\n }\n },\n\n async set(key: string, value: unknown): Promise<void> {\n const filePath = resolvePath(key);\n if (!filePath) return;\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, value as Buffer);\n },\n\n async delete(key: string): Promise<void> {\n const filePath = resolvePath(key);\n if (!filePath) return;\n try {\n await fs.unlink(filePath);\n } catch {\n /* ignore */\n }\n },\n };\n};\n"],"mappings":";AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AAItB,SAAS,WAAW,KAAsB;AACxC,MAAI,CAAC,OAAO,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,IAAI,EAAG,QAAO;AAChE,SAAO,CAAC,IAAI,MAAM,OAAO,EAAE,SAAS,IAAI;AAC1C;AAEO,IAAM,cAAwD,CACnE,YACG;AACH,QAAM,WAAW,QAAQ,OAAO;AAChC,QAAM,WAAgB,aAAQ,SAAS,QAAQ;AAE/C,WAAS,YAAY,KAAiC;AACpD,QAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAQ,OAAO,KAAK,2BAA2B,EAAE,IAAI,CAAC;AACtD,aAAO;AAAA,IACT;AACA,UAAM,WAAgB,UAAK,UAAU,GAAG;AACxC,QAAI,CAAC,SAAS,WAAW,WAAgB,QAAG,KAAK,aAAa;AAC5D,aAAO;AACT,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ;AAAA,IAEhB,MAAM,IAAI,KAA0C;AAClD,YAAM,WAAW,YAAY,GAAG;AAChC,UAAI,CAAC,SAAU,QAAO;AACtB,UAAI;AACF,eAAO,MAAS,YAAS,QAAQ;AAAA,MACnC,SAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,KAAa,OAA+B;AACpD,YAAM,WAAW,YAAY,GAAG;AAChC,UAAI,CAAC,SAAU;AACf,YAAS,SAAW,aAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,YAAS,aAAU,UAAU,KAAe;AAAA,IAC9C;AAAA,IAEA,MAAM,OAAO,KAA4B;AACvC,YAAM,WAAW,YAAY,GAAG;AAChC,UAAI,CAAC,SAAU;AACf,UAAI;AACF,cAAS,UAAO,QAAQ;AAAA,MAC1B,SAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/store.ts"],"sourcesContent":["import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { Store } from '@walkeros/core';\nimport type { FsStoreSettings } from './types';\n\nfunction isValidKey(key: string): boolean {\n if (!key || key.startsWith('/') || key.startsWith('\\\\')) return false;\n return !key.split(/[/\\\\]/).includes('..');\n}\n\nexport const storeFsInit: Store.Init<Store.Types<FsStoreSettings>> = (\n context,\n) => {\n const settings = context.config.settings as FsStoreSettings;\n const basePath = path.resolve(settings.basePath);\n\n function resolvePath(key: string): string | undefined {\n if (!isValidKey(key)) {\n context.logger.warn('Path traversal rejected', { key });\n return undefined;\n }\n const resolved = path.join(basePath, key);\n if (!resolved.startsWith(basePath + path.sep) && resolved !== basePath)\n return undefined;\n return resolved;\n }\n\n return {\n type: 'fs',\n config: context.config as Store.Config<Store.Types<FsStoreSettings>>,\n\n async get(key: string): Promise<Buffer | undefined> {\n const filePath = resolvePath(key);\n if (!filePath) return undefined;\n try {\n return await fs.readFile(filePath);\n } catch {\n return undefined;\n }\n },\n\n async set(key: string, value: unknown): Promise<void> {\n const filePath = resolvePath(key);\n if (!filePath) return;\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, value as Buffer);\n },\n\n async delete(key: string): Promise<void> {\n const filePath = resolvePath(key);\n if (!filePath) return;\n try {\n await fs.unlink(filePath);\n } catch {\n /* ignore */\n }\n },\n };\n};\n"],"mappings":";AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AAItB,SAAS,WAAW,KAAsB;AACxC,MAAI,CAAC,OAAO,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,IAAI,EAAG,QAAO;AAChE,SAAO,CAAC,IAAI,MAAM,OAAO,EAAE,SAAS,IAAI;AAC1C;AAEO,IAAM,cAAwD,CACnE,YACG;AACH,QAAM,WAAW,QAAQ,OAAO;AAChC,QAAM,WAAgB,aAAQ,SAAS,QAAQ;AAE/C,WAAS,YAAY,KAAiC;AACpD,QAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAQ,OAAO,KAAK,2BAA2B,EAAE,IAAI,CAAC;AACtD,aAAO;AAAA,IACT;AACA,UAAM,WAAgB,UAAK,UAAU,GAAG;AACxC,QAAI,CAAC,SAAS,WAAW,WAAgB,QAAG,KAAK,aAAa;AAC5D,aAAO;AACT,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ;AAAA,IAEhB,MAAM,IAAI,KAA0C;AAClD,YAAM,WAAW,YAAY,GAAG;AAChC,UAAI,CAAC,SAAU,QAAO;AACtB,UAAI;AACF,eAAO,MAAS,YAAS,QAAQ;AAAA,MACnC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,KAAa,OAA+B;AACpD,YAAM,WAAW,YAAY,GAAG;AAChC,UAAI,CAAC,SAAU;AACf,YAAS,SAAW,aAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,YAAS,aAAU,UAAU,KAAe;AAAA,IAC9C;AAAA,IAEA,MAAM,OAAO,KAA4B;AACvC,YAAM,WAAW,YAAY,GAAG;AAChC,UAAI,CAAC,SAAU;AACf,UAAI;AACF,cAAS,UAAO,QAAQ;AAAA,MAC1B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/server-store-fs",
4
- "version": "3.4.2",
4
+ "version": "4.0.0-next-1777463920154",
5
5
  "type": "store",
6
6
  "platform": [
7
7
  "server"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/server-store-fs",
3
3
  "description": "Filesystem store for walkerOS server - reads and writes files via the Store interface",
4
- "version": "3.4.2",
4
+ "version": "4.0.0-next-1777463920154",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -32,10 +32,10 @@
32
32
  "update": "npx npm-check-updates -u && npm update"
33
33
  },
34
34
  "dependencies": {
35
- "@walkeros/core": "3.4.2"
35
+ "@walkeros/core": "4.0.0-next-1777463920154"
36
36
  },
37
37
  "devDependencies": {
38
- "@walkeros/core": "3.4.2"
38
+ "@walkeros/core": "4.0.0-next-1777463920154"
39
39
  },
40
40
  "repository": {
41
41
  "url": "git+https://github.com/elbwalker/walkerOS.git",