@stacksjs/storage 0.62.0 → 0.63.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/index.js CHANGED
@@ -17,7 +17,7 @@ import {detectIndent, detectNewline} from "@stacksjs/strings";
17
17
 
18
18
  // src/fs.ts
19
19
  import * as fs from "fs-extra";
20
- import {pathExists as existsSync, mkdirSync, readFileSync, writeFileSync} from "fs-extra";
20
+ import {pathExists as existsSync, watch as fsWatch, mkdirSync, readFileSync, watchFile, writeFileSync} from "fs-extra";
21
21
  async function exists(path) {
22
22
  return await existsSync(path);
23
23
  }
@@ -425,6 +425,7 @@ __export(exports_storage, {
425
425
  writeJsonFile: () => writeJsonFile,
426
426
  writeFileSync: () => writeFileSync,
427
427
  writeFile: () => writeFile,
428
+ watchFile: () => watchFile,
428
429
  updateConfigFile: () => updateConfigFile,
429
430
  unzip: () => unzip,
430
431
  unarchive: () => unarchive,
@@ -452,6 +453,7 @@ __export(exports_storage, {
452
453
  getFolders: () => getFolders,
453
454
  getFiles: () => getFiles,
454
455
  get: () => get,
456
+ fsWatch: () => fsWatch,
455
457
  fs: () => fs,
456
458
  folders: () => folders,
457
459
  files: () => files,
@@ -541,6 +543,7 @@ export {
541
543
  writeJsonFile,
542
544
  writeFileSync,
543
545
  writeFile,
546
+ watchFile,
544
547
  updateConfigFile,
545
548
  unzip,
546
549
  unarchive,
@@ -571,6 +574,7 @@ export {
571
574
  getFolders,
572
575
  getFiles,
573
576
  get,
577
+ fsWatch,
574
578
  fs,
575
579
  folders,
576
580
  files,
@@ -596,3 +600,6 @@ export {
596
600
  archive,
597
601
  _dirname
598
602
  };
603
+
604
+ //# debugId=27105D11366120D564756E2164756E21
605
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,20 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/files.ts", "../src/fs.ts", "../src/folders.ts", "../src/hash.ts", "../src/helpers.ts", "../src/copy.ts", "../src/glob.ts", "../src/delete.ts", "../src/zip.ts", "../src/move.ts", "../src/visibility.ts"],
4
+ "sourcesContent": [
5
+ "import { contains } from '@stacksjs/arrays'\nimport { dirname, join, path as p } from '@stacksjs/path'\nimport { createFolder, isFolder } from '@stacksjs/storage'\nimport { detectIndent, detectNewline } from '@stacksjs/strings'\nimport type { JsonFile, PackageJson, TextFile } from '@stacksjs/types'\nimport { fs, existsSync } from './fs'\n\n/**\n * Reads a JSON file and returns the parsed data.\n */\nexport async function readJsonFile(name: string, cwd?: string): Promise<JsonFile> {\n const file = await readTextFile(name, cwd)\n const data = JSON.parse(file.data)\n const indent = detectIndent(file.data).indent\n const newline = detectNewline(file.data)\n\n return { ...file, data, indent, newline }\n}\n\n/**\n * Reads a package.json file and returns the parsed data.\n */\nexport async function readPackageJson(name: string, cwd?: string) {\n const file = await readJsonFile(name, cwd)\n return file.data as PackageJson\n}\n\n/**\n * Writes the given text to the specified file.\n */\nexport async function writeFile(path: string, data: any): Promise<number> {\n // export async function writeFile(path: Path, data: Data): Promise<number> {\n if (typeof path === 'string') {\n const dirPath = dirname(path)\n if (!(await existsSync(dirPath))) await createFolder(dirPath)\n\n return await Bun.write(Bun.file(path), data)\n }\n\n return await Bun.write(path, data)\n}\n\n/**\n * Writes the given data to the specified JSON file.\n */\nexport async function writeJsonFile(file: JsonFile): Promise<number> {\n let json = JSON.stringify(file.data, undefined, file.indent)\n\n if (file.newline) json += file.newline\n\n return writeTextFile({ ...file, data: json })\n}\n\n/**\n * Reads a text file and returns its contents.\n */\nexport function readTextFile(name: string, cwd?: string): Promise<TextFile> {\n return new Promise((resolve, reject) => {\n let filePath: string\n\n if (cwd) filePath = join(cwd, name)\n else filePath = name\n\n fs.readFile(filePath, 'utf8', (err, text) => {\n if (err) {\n reject(err)\n } else {\n resolve({\n path: filePath,\n data: text,\n })\n }\n })\n })\n}\n\n/**\n * Writes the given text to the specified file.\n */\nexport async function writeTextFile(file: TextFile): Promise<number> {\n return await Bun.write(file.path, file.data)\n}\n\n/**\n * Determine whether a path exists.\n */\nexport function isFile(path: string): boolean {\n return fs.existsSync(path)\n}\n\nexport function doesExist(path: string): boolean {\n return !isFile(path) || !isFolder(path)\n}\n\nexport function doesNotExist(path: string): boolean {\n return !isFile(path) && !isFolder(path)\n}\n\n/**\n * Determine whether a folder has any files in it.\n */\nexport function hasFiles(folder: string): boolean {\n try {\n return fs.readdirSync(folder).length > 0\n } catch (err) {\n return false\n }\n}\n\nexport function hasComponents(): boolean {\n return hasFiles(p.componentsPath())\n}\n\nexport function hasFunctions(): boolean {\n return hasFiles(p.functionsPath())\n}\n\nexport function deleteFiles(dir: string, exclude: string[] = []) {\n if (fs.existsSync(dir)) {\n fs.readdirSync(dir).forEach((file) => {\n const p = join(dir, file)\n if (fs.statSync(p).isDirectory()) {\n if (fs.readdirSync(p).length === 0) fs.rmSync(p, { recursive: true, force: true })\n else deleteFiles(p, exclude)\n } else if (!contains(p, exclude)) {\n fs.rmSync(p)\n }\n })\n }\n}\n\nexport function getFiles(dir: string, exclude: string[] = []): string[] {\n let results: string[] = []\n const list = fs.readdirSync(dir)\n\n list.forEach((file) => {\n file = join(dir, file)\n const stat = fs.statSync(file)\n\n if (stat.isDirectory()) results = results.concat(getFiles(file, exclude))\n else if (!contains(file, exclude)) results.push(file)\n })\n\n return results\n}\n\nexport function put(path: string, contents: string) {\n const dirPath = dirname(path)\n\n if (!fs.existsSync(dirPath)) fs.mkdirSync(dirPath, { recursive: true })\n\n fs.writeFileSync(path, contents, 'utf-8')\n}\n\nexport async function get(path: string): Promise<string> {\n return Bun.file(path).text()\n}\n\nexport const files = {\n readJsonFile,\n readPackageJson,\n readTextFile,\n writeJsonFile,\n writeTextFile,\n isFile,\n hasFiles,\n hasComponents,\n hasFunctions,\n deleteFiles,\n getFiles,\n put,\n get,\n}\n",
6
+ "import * as fs from 'fs-extra'\nimport { pathExists as existsSync, watch as fsWatch, mkdirSync, readFileSync, watchFile, writeFileSync } from 'fs-extra'\n\nexport async function exists(path: string): Promise<boolean> {\n return await existsSync(path)\n}\n\nexport { fs, existsSync, mkdirSync, writeFileSync, readFileSync, fsWatch, watchFile }\n",
7
+ "import { join } from '@stacksjs/path'\nimport { fs } from './fs'\n\n/**\n * Determine whether a path is a folder.\n */\nexport function isFolder(path: string): boolean {\n try {\n return fs.statSync(path).isDirectory()\n } catch {\n return false\n }\n}\n\nexport function isDirectory(path: string): boolean {\n return isFolder(path)\n}\n\nexport function isDir(path: string): boolean {\n return isFolder(path)\n}\n\nexport function doesFolderExist(path: string) {\n return fs.existsSync(path)\n}\n\nexport function createFolder(dir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.mkdirs(dir, (err: any) => {\n if (err) reject(err)\n else resolve()\n })\n })\n}\n\nexport function getFolders(dir: string): string[] {\n return fs.readdirSync(dir).filter((file) => {\n return fs.statSync(join(dir, file)).isDirectory()\n })\n}\n\nexport const folders = {\n isFolder,\n doesFolderExist,\n createFolder,\n getFolders,\n}\n",
8
+ "import type { Hash } from 'node:crypto'\nimport { createHash } from 'node:crypto'\nimport { path as p } from '@stacksjs/path'\nimport { fs } from './fs'\n\nexport function hashFileOrDirectory(path: string, hash: Hash): void {\n // Check if the path exists before proceeding\n if (!fs.existsSync(path)) {\n console.error(`Path does not exist: ${path}`)\n // Handle the non-existent path as needed (e.g., skip or log)\n return\n }\n\n if (fs.statSync(path).isDirectory()) {\n const files = fs.readdirSync(path)\n for (const file of files) {\n const filePath = p.join(path, file)\n hashFileOrDirectory(filePath, hash)\n }\n } else {\n hash.update(fs.readFileSync(path))\n }\n}\n\nexport function hashDirectory(directory: string): string {\n const hash = createHash('sha256')\n hashFileOrDirectory(directory, hash)\n return hash.digest('hex')\n}\n\nexport function hashPath(path: string): string {\n const hash = createHash('sha256')\n hashFileOrDirectory(path, hash)\n return hash.digest('hex')\n}\n\nexport function hashPaths(paths: string | string[]): string {\n const hash = createHash('sha256')\n const pathsArray = Array.isArray(paths) ? paths : [paths]\n\n for (const path of pathsArray) hashFileOrDirectory(path, hash)\n\n return hash.digest('hex')\n}\n",
9
+ "import { fileURLToPath } from 'node:url'\nimport { dirname } from '@stacksjs/path'\nimport { fs } from './fs'\n\nexport const _dirname = typeof __dirname !== 'undefined' ? __dirname : dirname(fileURLToPath(import.meta.url))\n\nexport function updateConfigFile(filePath: string, newConfig: Record<string, unknown>): Promise<void> {\n return new Promise((resolve, reject) => {\n const config = JSON.parse(fs.readFileSync(filePath, 'utf8')) as Record<string, unknown>\n\n for (const key in newConfig) config[key] = newConfig[key]\n\n try {\n fs.writeFileSync(filePath, JSON.stringify(config, null, 2))\n resolve()\n } catch (error) {\n reject(error)\n }\n })\n}\n\nexport const helpers = {\n _dirname,\n updateConfigFile,\n}\n",
10
+ "import { contains } from '@stacksjs/arrays'\nimport { join } from '@stacksjs/path'\nimport { fs } from './fs'\n\nexport function copy(src: string | string[], dest: string, exclude: string[] = []): void {\n if (Array.isArray(src)) {\n src.forEach((file) => {\n copy(file, dest, exclude)\n })\n } else {\n if (fs.statSync(src).isDirectory()) copyFolder(src, dest, exclude)\n else copyFile(src, dest)\n }\n}\n\nexport function copyFile(src: string, dest: string): void {\n fs.copyFileSync(src, dest)\n}\n\nexport function copyFolder(src: string, dest: string, exclude: string[] = []): void {\n if (!fs.existsSync(dest)) fs.mkdirSync(dest, { recursive: true })\n\n if (fs.existsSync(src)) {\n fs.readdirSync(src).forEach((file) => {\n if (!contains(join(src, file), exclude)) {\n const srcPath = join(src, file)\n const destPath = join(dest, file)\n\n if (fs.statSync(srcPath).isDirectory()) copyFolder(srcPath, destPath, exclude)\n else fs.copyFileSync(srcPath, destPath)\n }\n })\n }\n}\n",
11
+ "export { default as glob } from 'fast-glob'\n",
12
+ "import { italic, log } from '@stacksjs/cli'\nimport type { Result } from '@stacksjs/error-handling'\nimport { err, handleError, ok } from '@stacksjs/error-handling'\nimport { join } from '@stacksjs/path'\nimport { isFile } from './files'\nimport { isFolder } from './folders'\nimport { fs } from './fs'\nimport { glob } from './glob'\n\nexport function deleteFolder(path: string): Promise<Result<string, Error>> {\n return new Promise((resolve, reject) => {\n try {\n if (isFolder(path)) {\n fs.rmSync(path, { recursive: true, force: true })\n return resolve(ok(`Deleted ${path}`))\n }\n\n return resolve(ok(`Path ${path} was not a directory`))\n } catch (error) {\n return reject(err(error))\n }\n })\n}\n\nexport async function isDirectoryEmpty(path: string): Promise<Result<boolean, Error>> {\n return new Promise((resolve, reject) => {\n try {\n if (fs.statSync(path).isDirectory()) {\n if (fs.readdirSync(path).length === 0) return resolve(ok(true))\n return resolve(ok(false))\n }\n\n return resolve(ok(false))\n } catch (error) {\n return reject(err(error))\n }\n })\n}\n\nexport async function deleteEmptyFolder(path: string): Promise<Result<string, Error>> {\n return new Promise((resolve, reject) => {\n try {\n if (fs.statSync(path).isDirectory()) {\n if (fs.readdirSync(path).length === 0) {\n fs.rmSync(path, { recursive: true, force: true })\n return resolve(ok(`Deleted ${path}`))\n }\n\n return resolve(ok(`Path ${path} was not empty`))\n }\n\n return resolve(ok(`Path ${path} was not a directory`))\n } catch (error) {\n return reject(err(error))\n }\n })\n}\n\nexport async function deleteEmptyFolders(dir: string): Promise<Result<string, Error>> {\n try {\n if (!fs.existsSync(dir)) return ok(`Path ${dir} does not exist`)\n\n const files = fs.readdirSync(dir)\n for (const file of files) {\n const p = join(dir, file)\n if (isFolder(p)) {\n if (fs.readdirSync(p).length === 0) fs.rmSync(p, { recursive: true, force: true })\n else await deleteEmptyFolders(p)\n }\n }\n\n return ok(`Deleted empty folders located in ${dir}`)\n } catch (error: any) {\n return err(error)\n }\n}\n\nexport function deleteFile(path: string): Promise<Result<string, Error>> {\n return new Promise((resolve, reject) => {\n try {\n if (isFile(path)) {\n fs.rmSync(path, { recursive: true, force: true })\n return resolve(ok(`Deleted ${path}`))\n }\n\n return resolve(ok(`Path ${path} was not a file`))\n } catch (error) {\n return reject(err(error))\n }\n })\n}\n\nexport async function deleteGlob(path: string): Promise<Result<string, Error>> {\n if (!path.includes('*')) return err(handleError(`Path ${path} does not contain a glob`))\n\n const directories = await glob([path], { onlyDirectories: true })\n\n for (const directory of directories) {\n const result = await deleteFolder(directory)\n if (result.isErr()) {\n log.error(result.error)\n return result\n }\n\n log.info(`Deleted ${italic(directory)}`)\n }\n\n return ok(`Deleted ${directories.length} directories`)\n}\n\nexport async function del(path: string): Promise<Result<string, Error>> {\n if (isFile(path)) return await deleteFile(path)\n\n if (isFolder(path)) return await deleteFolder(path)\n\n if (path.includes('*')) return await deleteGlob(path)\n\n return err(handleError(`Path ${path} cannot be deleted due to an unhandled condition. Please report this issue.`))\n}\n",
13
+ "import { runCommand } from '@stacksjs/cli'\nimport type { ZlibCompressionOptions } from 'bun'\n\ninterface ZipOptions {\n cwd?: string\n}\n\nexport async function zip(from: string | string[], to?: string, options?: ZipOptions) {\n const toPath = to || 'archive.zip'\n const fromPath = Array.isArray(from) ? from.join(' ') : from\n\n if (Array.isArray(from)) return runCommand(`zip -r ${toPath} ${fromPath}`, options)\n\n return runCommand(`zip -r ${to} ${from}`, options)\n}\n\nexport async function unzip(paths: string | string[]) {\n if (Array.isArray(paths)) return runCommand(`unzip ${paths.join(' ')}`)\n\n return runCommand(`unzip ${paths}`)\n}\n\nexport function archive(paths: string | string[]) {\n return zip(paths)\n}\n\nexport function unarchive(paths: string | string[]) {\n return unzip(paths)\n}\n\nexport function compress(paths: string[]) {\n return zip(paths)\n}\n\nexport function decompress(paths: string | string[]) {\n return unzip(paths)\n}\n\nexport function gzipSync(data: Uint8Array, options?: ZlibCompressionOptions) {\n return Bun.gzipSync(data, options) // buffer extends Uint8Array\n}\n\nexport function gunzipSync(data: Uint8Array) {\n return Bun.gunzipSync(data) // decompressed\n}\n\nexport function deflateSync(data: Uint8Array, options?: ZlibCompressionOptions) {\n return Bun.deflateSync(data, options) // compressed\n}\n\nexport function inflateSync(data: Uint8Array) {\n return Bun.inflateSync(data) // decompressed\n}\n",
14
+ "import { type Result, err, handleError, ok } from '@stacksjs/error-handling'\nimport { log } from '@stacksjs/logging'\nimport { path } from '@stacksjs/path'\nimport { fs } from './fs'\n\ninterface MoveOptions {\n // glob?: glob.Options\n overwrite?: boolean\n}\n\nexport async function move(\n src: string | string[],\n dest: string,\n options?: MoveOptions,\n): Promise<Result<{ message: string }, Error>> {\n try {\n if (Array.isArray(src)) {\n const operations = src.map(async (file) => {\n const from = file\n const to = path.resolve(dest, path.basename(file))\n const result = await rename(from, to, options)\n\n if (result.isErr()) return log.error(result.error)\n })\n\n await Promise.all(operations)\n\n return ok({ message: 'Files moved successfully' })\n }\n\n const from = src\n const to = dest\n const result = await rename(from, to, options)\n\n if (result.isErr()) {\n log.error(result.error)\n return err(handleError(result.error))\n }\n\n return ok({ message: 'File moved successfully' })\n } catch (error: any) {\n return err(handleError(error))\n }\n}\n\nexport async function rename(\n from: string,\n to: string,\n options?: MoveOptions,\n): Promise<Result<{ message: string }, Error>> {\n return new Promise((resolve, reject) => {\n try {\n // Check if the \"to\" directory exists\n const dir = path.dirname(to)\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })\n\n // Ensure the \"from\" file exists\n if (!fs.existsSync(from)) return reject(err(new Error(`File or directory does not exist: ${from}`)))\n\n // Ensure the \"to\" file does not exist\n if (fs.existsSync(to)) {\n if (!options?.overwrite) return reject(err(new Error(`File or directory already exists: ${to}`)))\n\n fs.unlinkSync(to)\n }\n\n // \"Move\" the file\n fs.renameSync(from, to)\n\n return resolve(ok({ message: 'File moved successfully' }))\n } catch (error: any) {\n if (error.code === 'ENOENT') log.error('File or directory does not exist\\n\\n', error)\n else log.error(error)\n\n return reject(err(new Error(error)))\n }\n })\n}\n",
15
+ "// type Visibility = 'public' | 'private'\n\n// export function setVisibility(path: string, visibility: Visibility) {\nexport function setVisibility() {\n return 'wip'\n}\n"
16
+ ],
17
+ "mappings": "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",
18
+ "debugId": "27105D11366120D564756E2164756E21",
19
+ "names": []
20
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@stacksjs/storage",
3
3
  "type": "module",
4
- "version": "0.62.0",
4
+ "version": "0.63.0",
5
5
  "description": "The Stacks file system.",
6
6
  "author": "Chris Breuer",
7
7
  "license": "MIT",
package/src/fs.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as fs from 'fs-extra'
2
- import { pathExists as existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs-extra'
2
+ import { pathExists as existsSync, watch as fsWatch, mkdirSync, readFileSync, watchFile, writeFileSync } from 'fs-extra'
3
3
 
4
4
  export async function exists(path: string): Promise<boolean> {
5
5
  return await existsSync(path)
6
6
  }
7
7
 
8
- export { fs, existsSync, mkdirSync, writeFileSync, readFileSync }
8
+ export { fs, existsSync, mkdirSync, writeFileSync, readFileSync, fsWatch, watchFile }