functype-os 0.60.7 → 1.0.0

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/dist/fs/Fs.js CHANGED
@@ -1,2 +1,2 @@
1
- import{FsError as e}from"../errors/errors.js";import{Err as t,Left as n,List as r,Ok as i,Option as a,Right as o}from"functype";import*as s from"node:fs";import*as c from"node:fs/promises";const l=e=>({size:e.size,isFile:e.isFile(),isDirectory:e.isDirectory(),isSymbolicLink:e.isSymbolicLink(),createdAt:e.birthtime,modifiedAt:e.mtime,accessedAt:e.atime,permissions:e.mode}),u=(t,n,r)=>e(t,n,r instanceof Error?r:Error(String(r))),d=(e,t)=>{let n=t.replace(/[\\^$+?.()|[\]{}]/g,`\\$&`).replace(/\*\*\//g,`{{GLOBSTAR}}`).replace(/\*\*/g,`{{GLOBSTAR}}`).replace(/\*/g,`[^/]*`).replace(/\{\{GLOBSTAR\}\}/g,`(?:.*/)?`);return RegExp(`^${n}$`).test(e)},f={exists:async e=>{try{return await c.access(e),i(!0)}catch{return i(!1)}},readFile:async(e,n=`utf8`)=>{try{return i(await c.readFile(e,{encoding:n}))}catch(n){return t(u(e,`readFile`,n))}},readFileOpt:async(e,n=`utf8`)=>{try{return i(a(await c.readFile(e,{encoding:n})))}catch(n){return n instanceof Error&&`code`in n&&n.code===`ENOENT`?i(a(void 0)):t(u(e,`readFile`,n))}},stat:async e=>{try{return i(l(await c.stat(e)))}catch(n){return t(u(e,`stat`,n))}},copyFile:async(e,n)=>{try{return await c.copyFile(e,n),i(void 0)}catch(n){return t(u(e,`copyFile`,n))}},rename:async(e,n)=>{try{return await c.rename(e,n),i(void 0)}catch(n){return t(u(e,`rename`,n))}},readdir:async e=>{try{return i(r(await c.readdir(e)))}catch(n){return t(u(e,`readdir`,n))}},glob:async(e,n)=>{try{return i(r((await c.readdir(e,{recursive:!0,encoding:`utf8`})).filter(e=>d(e,n))))}catch(n){return t(u(e,`glob`,n))}},writeFile:async(e,n,r=`utf8`)=>{try{return await c.writeFile(e,n,{encoding:r}),i(void 0)}catch(n){return t(u(e,`writeFile`,n))}},appendFile:async(e,n,r=`utf8`)=>{try{return await c.appendFile(e,n,{encoding:r}),i(void 0)}catch(n){return t(u(e,`appendFile`,n))}},mkdir:async(e,n)=>{try{return await c.mkdir(e,n),i(void 0)}catch(n){return t(u(e,`mkdir`,n))}},existsSync:e=>{try{return s.accessSync(e),!0}catch{return!1}},readFileSync:(e,t=`utf8`)=>{try{return o(s.readFileSync(e,{encoding:t}))}catch(t){return n(u(e,`readFileSync`,t))}},readFileOptSync:(e,t=`utf8`)=>{try{return o(a(s.readFileSync(e,{encoding:t})))}catch(t){return t instanceof Error&&`code`in t&&t.code===`ENOENT`?o(a(void 0)):n(u(e,`readFileOptSync`,t))}},statSync:e=>{try{return o(l(s.statSync(e)))}catch(t){return n(u(e,`statSync`,t))}},copyFileSync:(e,t)=>{try{return s.copyFileSync(e,t),o(void 0)}catch(t){return n(u(e,`copyFileSync`,t))}},renameSync:(e,t)=>{try{return s.renameSync(e,t),o(void 0)}catch(t){return n(u(e,`renameSync`,t))}},readdirSync:e=>{try{return o(r(s.readdirSync(e)))}catch(t){return n(u(e,`readdirSync`,t))}},writeFileSync:(e,t,r=`utf8`)=>{try{return s.writeFileSync(e,t,{encoding:r}),o(void 0)}catch(t){return n(u(e,`writeFileSync`,t))}},appendFileSync:(e,t,r=`utf8`)=>{try{return s.appendFileSync(e,t,{encoding:r}),o(void 0)}catch(t){return n(u(e,`appendFileSync`,t))}},mkdirSync:(e,t)=>{try{return s.mkdirSync(e,t),o(void 0)}catch(t){return n(u(e,`mkdirSync`,t))}},unlink:async e=>{try{return await c.unlink(e),i(void 0)}catch(n){return t(u(e,`unlink`,n))}},unlinkSync:e=>{try{return s.unlinkSync(e),o(void 0)}catch(t){return n(u(e,`unlinkSync`,t))}}};export{f as Fs};
1
+ import{FsError as e}from"../errors/errors.js";import{Err as t,Left as n,List as r,Ok as i,Option as a,Right as o}from"functype";import*as s from"node:fs";import*as c from"node:fs/promises";const l=e=>({size:e.size,isFile:e.isFile(),isDirectory:e.isDirectory(),isSymbolicLink:e.isSymbolicLink(),createdAt:e.birthtime,modifiedAt:e.mtime,accessedAt:e.atime,permissions:e.mode}),u=(t,n,r)=>e(t,n,r instanceof Error?r:Error(String(r))),d=[`/proc/`,`/sys/`,`/dev/`],f=e=>d.some(t=>e.startsWith(t)),p=(e,t)=>{let n=t.replace(/[\\^$+?.()|[\]{}]/g,`\\$&`).replace(/\*\*\//g,`{{GLOBSTAR}}`).replace(/\*\*/g,`{{GLOBSTAR}}`).replace(/\*/g,`[^/]*`).replace(/\{\{GLOBSTAR\}\}/g,`(?:.*/)?`);return RegExp(`^${n}$`).test(e)},m={exists:async e=>{try{return await c.access(e),i(!0)}catch{return i(!1)}},readFile:async(e,n=`utf8`)=>{try{return i(await c.readFile(e,{encoding:n}))}catch(n){return t(u(e,`readFile`,n))}},readFileOpt:async(e,n=`utf8`)=>{try{return i(a(await c.readFile(e,{encoding:n})))}catch(n){return n instanceof Error&&`code`in n&&n.code===`ENOENT`?i(a(void 0)):t(u(e,`readFile`,n))}},stat:async e=>{try{return i(l(await c.stat(e)))}catch(n){return t(u(e,`stat`,n))}},copyFile:async(e,n)=>{try{return await c.copyFile(e,n),i(void 0)}catch(n){return t(u(e,`copyFile`,n))}},rename:async(e,n)=>{try{return await c.rename(e,n),i(void 0)}catch(n){return t(u(e,`rename`,n))}},readdir:async e=>{try{return i(r(await c.readdir(e)))}catch(n){return t(u(e,`readdir`,n))}},glob:async(e,n)=>{try{return i(r((await c.readdir(e,{recursive:!0,encoding:`utf8`})).filter(e=>p(e,n))))}catch(n){return t(u(e,`glob`,n))}},writeFile:async(e,n,r=`utf8`)=>{try{return await c.writeFile(e,n,{encoding:r}),i(void 0)}catch(n){return t(u(e,`writeFile`,n))}},appendFile:async(e,n,r=`utf8`)=>{try{return await c.appendFile(e,n,{encoding:r}),i(void 0)}catch(n){return t(u(e,`appendFile`,n))}},mkdir:async(e,n)=>{if(n?.recursive&&f(e))return t(u(e,`mkdir`,Error(`recursive mkdir refused under magic filesystem root (/proc, /sys, /dev)`)));try{return await c.mkdir(e,n),i(void 0)}catch(n){return t(u(e,`mkdir`,n))}},existsSync:e=>{try{return s.accessSync(e),!0}catch{return!1}},readFileSync:(e,t=`utf8`)=>{try{return o(s.readFileSync(e,{encoding:t}))}catch(t){return n(u(e,`readFileSync`,t))}},readFileOptSync:(e,t=`utf8`)=>{try{return o(a(s.readFileSync(e,{encoding:t})))}catch(t){return t instanceof Error&&`code`in t&&t.code===`ENOENT`?o(a(void 0)):n(u(e,`readFileOptSync`,t))}},statSync:e=>{try{return o(l(s.statSync(e)))}catch(t){return n(u(e,`statSync`,t))}},copyFileSync:(e,t)=>{try{return s.copyFileSync(e,t),o(void 0)}catch(t){return n(u(e,`copyFileSync`,t))}},renameSync:(e,t)=>{try{return s.renameSync(e,t),o(void 0)}catch(t){return n(u(e,`renameSync`,t))}},readdirSync:e=>{try{return o(r(s.readdirSync(e)))}catch(t){return n(u(e,`readdirSync`,t))}},writeFileSync:(e,t,r=`utf8`)=>{try{return s.writeFileSync(e,t,{encoding:r}),o(void 0)}catch(t){return n(u(e,`writeFileSync`,t))}},appendFileSync:(e,t,r=`utf8`)=>{try{return s.appendFileSync(e,t,{encoding:r}),o(void 0)}catch(t){return n(u(e,`appendFileSync`,t))}},mkdirSync:(e,t)=>{if(t?.recursive&&f(e))return n(u(e,`mkdirSync`,Error(`recursive mkdir refused under magic filesystem root (/proc, /sys, /dev)`)));try{return s.mkdirSync(e,t),o(void 0)}catch(t){return n(u(e,`mkdirSync`,t))}},unlink:async e=>{try{return await c.unlink(e),i(void 0)}catch(n){return t(u(e,`unlink`,n))}},unlinkSync:e=>{try{return s.unlinkSync(e),o(void 0)}catch(t){return n(u(e,`unlinkSync`,t))}}};export{m as Fs};
2
2
  //# sourceMappingURL=Fs.js.map
package/dist/fs/Fs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Fs.js","names":[],"sources":["../../src/fs/Fs.ts"],"sourcesContent":["import * as fsSync from \"node:fs\"\nimport * as fs from \"node:fs/promises\"\n\nimport type { Either, TaskResult } from \"functype\"\nimport { Err, Left, List, Ok, Option, Right } from \"functype\"\n\nimport { FsError } from \"../errors/errors\"\n\nexport type FileInfo = {\n readonly size: number\n readonly isFile: boolean\n readonly isDirectory: boolean\n readonly isSymbolicLink: boolean\n readonly createdAt: Date\n readonly modifiedAt: Date\n readonly accessedAt: Date\n readonly permissions: number\n}\n\nconst toFileInfo = (stats: fsSync.Stats): FileInfo => ({\n size: stats.size,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n isSymbolicLink: stats.isSymbolicLink(),\n createdAt: stats.birthtime,\n modifiedAt: stats.mtime,\n accessedAt: stats.atime,\n permissions: stats.mode,\n})\n\nconst toFsError = (p: string, op: string, error: unknown): FsError =>\n FsError(p, op, error instanceof Error ? error : new Error(String(error)))\n\nconst matchGlob = (filePath: string, pattern: string): boolean => {\n // Escape every regex metachar EXCEPT '*' first, so the subsequent\n // '*' transformations are the only special characters in the output.\n // Order matters: backslashes must be escaped before any '\\\\' insertion below.\n const escaped = pattern.replace(/[\\\\^$+?.()|[\\]{}]/g, \"\\\\$&\")\n const regex = escaped\n .replace(/\\*\\*\\//g, \"{{GLOBSTAR}}\")\n .replace(/\\*\\*/g, \"{{GLOBSTAR}}\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\{\\{GLOBSTAR\\}\\}/g, \"(?:.*/)?\")\n return new RegExp(`^${regex}$`).test(filePath)\n}\n\nexport const Fs = {\n // Async methods — return TaskResult<T>\n\n exists: async (p: string): TaskResult<boolean> => {\n try {\n await fs.access(p)\n return Ok(true)\n } catch {\n return Ok(false)\n }\n },\n\n readFile: async (p: string, encoding: BufferEncoding = \"utf8\"): TaskResult<string> => {\n try {\n return Ok(await fs.readFile(p, { encoding }))\n } catch (error) {\n return Err(toFsError(p, \"readFile\", error))\n }\n },\n\n readFileOpt: async (p: string, encoding: BufferEncoding = \"utf8\"): TaskResult<Option<string>> => {\n try {\n return Ok(Option(await fs.readFile(p, { encoding })))\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return Ok(Option<string>(undefined))\n }\n return Err(toFsError(p, \"readFile\", error))\n }\n },\n\n stat: async (p: string): TaskResult<FileInfo> => {\n try {\n return Ok(toFileInfo(await fs.stat(p)))\n } catch (error) {\n return Err(toFsError(p, \"stat\", error))\n }\n },\n\n copyFile: async (src: string, dest: string): TaskResult<void> => {\n try {\n await fs.copyFile(src, dest)\n return Ok(undefined as void)\n } catch (error) {\n return Err(toFsError(src, \"copyFile\", error))\n }\n },\n\n rename: async (oldPath: string, newPath: string): TaskResult<void> => {\n try {\n await fs.rename(oldPath, newPath)\n return Ok(undefined as void)\n } catch (error) {\n return Err(toFsError(oldPath, \"rename\", error))\n }\n },\n\n readdir: async (p: string): TaskResult<List<string>> => {\n try {\n return Ok(List(await fs.readdir(p)))\n } catch (error) {\n return Err(toFsError(p, \"readdir\", error))\n }\n },\n\n glob: async (dir: string, pattern: string): TaskResult<List<string>> => {\n try {\n const entries = await fs.readdir(dir, { recursive: true, encoding: \"utf8\" })\n const matched = entries.filter((entry) => matchGlob(entry, pattern))\n return Ok(List(matched))\n } catch (error) {\n return Err(toFsError(dir, \"glob\", error))\n }\n },\n\n writeFile: async (p: string, data: string, encoding: BufferEncoding = \"utf8\"): TaskResult<void> => {\n try {\n await fs.writeFile(p, data, { encoding })\n return Ok(undefined as void)\n } catch (error) {\n return Err(toFsError(p, \"writeFile\", error))\n }\n },\n\n appendFile: async (p: string, data: string, encoding: BufferEncoding = \"utf8\"): TaskResult<void> => {\n try {\n await fs.appendFile(p, data, { encoding })\n return Ok(undefined as void)\n } catch (error) {\n return Err(toFsError(p, \"appendFile\", error))\n }\n },\n\n mkdir: async (p: string, options?: { recursive?: boolean }): TaskResult<void> => {\n try {\n await fs.mkdir(p, options)\n return Ok(undefined as void)\n } catch (error) {\n return Err(toFsError(p, \"mkdir\", error))\n }\n },\n\n // Sync methods — return Either<FsError, T>\n\n existsSync: (p: string): boolean => {\n try {\n fsSync.accessSync(p)\n return true\n } catch {\n return false\n }\n },\n\n readFileSync: (p: string, encoding: BufferEncoding = \"utf8\"): Either<FsError, string> => {\n try {\n return Right(fsSync.readFileSync(p, { encoding }))\n } catch (error) {\n return Left(toFsError(p, \"readFileSync\", error))\n }\n },\n\n readFileOptSync: (p: string, encoding: BufferEncoding = \"utf8\"): Either<FsError, Option<string>> => {\n try {\n return Right(Option(fsSync.readFileSync(p, { encoding })))\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return Right(Option<string>(undefined))\n }\n return Left(toFsError(p, \"readFileOptSync\", error))\n }\n },\n\n statSync: (p: string): Either<FsError, FileInfo> => {\n try {\n return Right(toFileInfo(fsSync.statSync(p)))\n } catch (error) {\n return Left(toFsError(p, \"statSync\", error))\n }\n },\n\n copyFileSync: (src: string, dest: string): Either<FsError, void> => {\n try {\n fsSync.copyFileSync(src, dest)\n return Right(undefined as void)\n } catch (error) {\n return Left(toFsError(src, \"copyFileSync\", error))\n }\n },\n\n renameSync: (oldPath: string, newPath: string): Either<FsError, void> => {\n try {\n fsSync.renameSync(oldPath, newPath)\n return Right(undefined as void)\n } catch (error) {\n return Left(toFsError(oldPath, \"renameSync\", error))\n }\n },\n\n readdirSync: (p: string): Either<FsError, List<string>> => {\n try {\n return Right(List(fsSync.readdirSync(p)))\n } catch (error) {\n return Left(toFsError(p, \"readdirSync\", error))\n }\n },\n\n writeFileSync: (p: string, data: string, encoding: BufferEncoding = \"utf8\"): Either<FsError, void> => {\n try {\n fsSync.writeFileSync(p, data, { encoding })\n return Right(undefined as void)\n } catch (error) {\n return Left(toFsError(p, \"writeFileSync\", error))\n }\n },\n\n appendFileSync: (p: string, data: string, encoding: BufferEncoding = \"utf8\"): Either<FsError, void> => {\n try {\n fsSync.appendFileSync(p, data, { encoding })\n return Right(undefined as void)\n } catch (error) {\n return Left(toFsError(p, \"appendFileSync\", error))\n }\n },\n\n mkdirSync: (p: string, options?: { recursive?: boolean }): Either<FsError, void> => {\n try {\n fsSync.mkdirSync(p, options)\n return Right(undefined as void)\n } catch (error) {\n return Left(toFsError(p, \"mkdirSync\", error))\n }\n },\n\n unlink: async (p: string): TaskResult<void> => {\n try {\n await fs.unlink(p)\n return Ok(undefined as void)\n } catch (error) {\n return Err(toFsError(p, \"unlink\", error))\n }\n },\n\n unlinkSync: (p: string): Either<FsError, void> => {\n try {\n fsSync.unlinkSync(p)\n return Right(undefined as void)\n } catch (error) {\n return Left(toFsError(p, \"unlinkSync\", error))\n }\n },\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Fs.js","names":[],"sources":["../../src/fs/Fs.ts"],"sourcesContent":["import * as fsSync from \"node:fs\"\nimport * as fs from \"node:fs/promises\"\n\nimport type { Either, TaskResult } from \"functype\"\nimport { Err, Left, List, Ok, Option, Right } from \"functype\"\n\nimport { FsError } from \"../errors/errors\"\n\nexport type FileInfo = {\n readonly size: number\n readonly isFile: boolean\n readonly isDirectory: boolean\n readonly isSymbolicLink: boolean\n readonly createdAt: Date\n readonly modifiedAt: Date\n readonly accessedAt: Date\n readonly permissions: number\n}\n\nconst toFileInfo = (stats: fsSync.Stats): FileInfo => ({\n size: stats.size,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n isSymbolicLink: stats.isSymbolicLink(),\n createdAt: stats.birthtime,\n modifiedAt: stats.mtime,\n accessedAt: stats.atime,\n permissions: stats.mode,\n})\n\nconst toFsError = (p: string, op: string, error: unknown): FsError =>\n FsError(p, op, error instanceof Error ? error : new Error(String(error)))\n\n/**\n * Linux magic filesystems where recursive mkdir can hang indefinitely against\n * unwritable subpaths (libuv quirk; macOS errors immediately instead).\n * Refusing recursive mkdir under these prefixes keeps `mkdir({ recursive: true })`\n * fast-failing and predictable across platforms. See issue #135.\n */\nconst MAGIC_FS_PREFIXES: ReadonlyArray<string> = [\"/proc/\", \"/sys/\", \"/dev/\"]\n\nconst isMagicFsPath = (p: string): boolean => MAGIC_FS_PREFIXES.some((prefix) => p.startsWith(prefix))\n\nconst matchGlob = (filePath: string, pattern: string): boolean => {\n // Escape every regex metachar EXCEPT '*' first, so the subsequent\n // '*' transformations are the only special characters in the output.\n // Order matters: backslashes must be escaped before any '\\\\' insertion below.\n const escaped = pattern.replace(/[\\\\^$+?.()|[\\]{}]/g, \"\\\\$&\")\n const regex = escaped\n .replace(/\\*\\*\\//g, \"{{GLOBSTAR}}\")\n .replace(/\\*\\*/g, \"{{GLOBSTAR}}\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\{\\{GLOBSTAR\\}\\}/g, \"(?:.*/)?\")\n return new RegExp(`^${regex}$`).test(filePath)\n}\n\nexport const Fs = {\n // Async methods — return TaskResult<T>\n\n exists: async (p: string): TaskResult<boolean> => {\n try {\n await fs.access(p)\n return Ok(true)\n } catch {\n return Ok(false)\n }\n },\n\n readFile: async (p: string, encoding: BufferEncoding = \"utf8\"): TaskResult<string> => {\n try {\n return Ok(await fs.readFile(p, { encoding }))\n } catch (error) {\n return Err(toFsError(p, \"readFile\", error))\n }\n },\n\n readFileOpt: async (p: string, encoding: BufferEncoding = \"utf8\"): TaskResult<Option<string>> => {\n try {\n return Ok(Option(await fs.readFile(p, { encoding })))\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return Ok(Option<string>(undefined))\n }\n return Err(toFsError(p, \"readFile\", error))\n }\n },\n\n stat: async (p: string): TaskResult<FileInfo> => {\n try {\n return Ok(toFileInfo(await fs.stat(p)))\n } catch (error) {\n return Err(toFsError(p, \"stat\", error))\n }\n },\n\n copyFile: async (src: string, dest: string): TaskResult<void> => {\n try {\n await fs.copyFile(src, dest)\n return Ok(undefined as void)\n } catch (error) {\n return Err(toFsError(src, \"copyFile\", error))\n }\n },\n\n rename: async (oldPath: string, newPath: string): TaskResult<void> => {\n try {\n await fs.rename(oldPath, newPath)\n return Ok(undefined as void)\n } catch (error) {\n return Err(toFsError(oldPath, \"rename\", error))\n }\n },\n\n readdir: async (p: string): TaskResult<List<string>> => {\n try {\n return Ok(List(await fs.readdir(p)))\n } catch (error) {\n return Err(toFsError(p, \"readdir\", error))\n }\n },\n\n glob: async (dir: string, pattern: string): TaskResult<List<string>> => {\n try {\n const entries = await fs.readdir(dir, { recursive: true, encoding: \"utf8\" })\n const matched = entries.filter((entry) => matchGlob(entry, pattern))\n return Ok(List(matched))\n } catch (error) {\n return Err(toFsError(dir, \"glob\", error))\n }\n },\n\n writeFile: async (p: string, data: string, encoding: BufferEncoding = \"utf8\"): TaskResult<void> => {\n try {\n await fs.writeFile(p, data, { encoding })\n return Ok(undefined as void)\n } catch (error) {\n return Err(toFsError(p, \"writeFile\", error))\n }\n },\n\n appendFile: async (p: string, data: string, encoding: BufferEncoding = \"utf8\"): TaskResult<void> => {\n try {\n await fs.appendFile(p, data, { encoding })\n return Ok(undefined as void)\n } catch (error) {\n return Err(toFsError(p, \"appendFile\", error))\n }\n },\n\n mkdir: async (p: string, options?: { recursive?: boolean }): TaskResult<void> => {\n if (options?.recursive && isMagicFsPath(p)) {\n return Err(\n toFsError(p, \"mkdir\", new Error(\"recursive mkdir refused under magic filesystem root (/proc, /sys, /dev)\")),\n )\n }\n try {\n await fs.mkdir(p, options)\n return Ok(undefined as void)\n } catch (error) {\n return Err(toFsError(p, \"mkdir\", error))\n }\n },\n\n // Sync methods — return Either<FsError, T>\n\n existsSync: (p: string): boolean => {\n try {\n fsSync.accessSync(p)\n return true\n } catch {\n return false\n }\n },\n\n readFileSync: (p: string, encoding: BufferEncoding = \"utf8\"): Either<FsError, string> => {\n try {\n return Right(fsSync.readFileSync(p, { encoding }))\n } catch (error) {\n return Left(toFsError(p, \"readFileSync\", error))\n }\n },\n\n readFileOptSync: (p: string, encoding: BufferEncoding = \"utf8\"): Either<FsError, Option<string>> => {\n try {\n return Right(Option(fsSync.readFileSync(p, { encoding })))\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return Right(Option<string>(undefined))\n }\n return Left(toFsError(p, \"readFileOptSync\", error))\n }\n },\n\n statSync: (p: string): Either<FsError, FileInfo> => {\n try {\n return Right(toFileInfo(fsSync.statSync(p)))\n } catch (error) {\n return Left(toFsError(p, \"statSync\", error))\n }\n },\n\n copyFileSync: (src: string, dest: string): Either<FsError, void> => {\n try {\n fsSync.copyFileSync(src, dest)\n return Right(undefined as void)\n } catch (error) {\n return Left(toFsError(src, \"copyFileSync\", error))\n }\n },\n\n renameSync: (oldPath: string, newPath: string): Either<FsError, void> => {\n try {\n fsSync.renameSync(oldPath, newPath)\n return Right(undefined as void)\n } catch (error) {\n return Left(toFsError(oldPath, \"renameSync\", error))\n }\n },\n\n readdirSync: (p: string): Either<FsError, List<string>> => {\n try {\n return Right(List(fsSync.readdirSync(p)))\n } catch (error) {\n return Left(toFsError(p, \"readdirSync\", error))\n }\n },\n\n writeFileSync: (p: string, data: string, encoding: BufferEncoding = \"utf8\"): Either<FsError, void> => {\n try {\n fsSync.writeFileSync(p, data, { encoding })\n return Right(undefined as void)\n } catch (error) {\n return Left(toFsError(p, \"writeFileSync\", error))\n }\n },\n\n appendFileSync: (p: string, data: string, encoding: BufferEncoding = \"utf8\"): Either<FsError, void> => {\n try {\n fsSync.appendFileSync(p, data, { encoding })\n return Right(undefined as void)\n } catch (error) {\n return Left(toFsError(p, \"appendFileSync\", error))\n }\n },\n\n mkdirSync: (p: string, options?: { recursive?: boolean }): Either<FsError, void> => {\n if (options?.recursive && isMagicFsPath(p)) {\n return Left(\n toFsError(p, \"mkdirSync\", new Error(\"recursive mkdir refused under magic filesystem root (/proc, /sys, /dev)\")),\n )\n }\n try {\n fsSync.mkdirSync(p, options)\n return Right(undefined as void)\n } catch (error) {\n return Left(toFsError(p, \"mkdirSync\", error))\n }\n },\n\n unlink: async (p: string): TaskResult<void> => {\n try {\n await fs.unlink(p)\n return Ok(undefined as void)\n } catch (error) {\n return Err(toFsError(p, \"unlink\", error))\n }\n },\n\n unlinkSync: (p: string): Either<FsError, void> => {\n try {\n fsSync.unlinkSync(p)\n return Right(undefined as void)\n } catch (error) {\n return Left(toFsError(p, \"unlinkSync\", error))\n }\n },\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "functype-os",
3
- "version": "0.60.7",
3
+ "version": "1.0.0",
4
4
  "description": "Functional OS utilities using functype data structures — env vars, path expansion, file ops, platform detection",
5
5
  "keywords": [
6
6
  "functype",
@@ -20,15 +20,15 @@
20
20
  "directory": "packages/functype-os"
21
21
  },
22
22
  "peerDependencies": {
23
- "functype": "^0.60.7"
23
+ "functype": "^0.61.0"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^24.12.4",
27
27
  "eslint-config-prettier": "^10.1.8",
28
- "ts-builds": "^2.8.0",
28
+ "ts-builds": "^2.8.1",
29
29
  "tsdown": "^0.22.0",
30
- "vitest": "^4.1.6",
31
- "functype": "^0.60.7"
30
+ "vitest": "^4.1.7",
31
+ "functype": "^0.61.0"
32
32
  },
33
33
  "type": "module",
34
34
  "main": "./dist/index.js",