@kb-labs/workflow-artifacts 1.5.0 → 2.6.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
@@ -56,6 +56,7 @@ var FileSystemArtifactClient = class {
56
56
  constructor(options) {
57
57
  this.options = options;
58
58
  }
59
+ options;
59
60
  basePath() {
60
61
  return this.options.root;
61
62
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fs-client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { createWriteStream, createReadStream } from 'node:fs'\nimport { mkdir, stat, readdir, readFile, writeFile } from 'node:fs/promises'\nimport { pipeline } from 'node:stream/promises'\nimport { dirname, resolve, join, relative } from 'pathe'\nimport type {\n ArtifactClient,\n ArtifactInput,\n ArtifactOutput,\n ArtifactReference,\n} from './types'\n\nfunction ensureWithinRoot(root: string, targetPath: string): string {\n const normalizedRoot = root.endsWith('/') ? root : `${root}/`\n const target = resolve(root, targetPath)\n if (target === normalizedRoot.slice(0, -1)) {\n return target\n }\n if (!target.startsWith(normalizedRoot)) {\n throw new Error(`Artifact path escapes root: ${targetPath}`)\n }\n return target\n}\n\nasync function writeInput(\n destination: string,\n input: ArtifactInput,\n): Promise<void> {\n if (\n typeof input === 'string' ||\n input instanceof Buffer ||\n input instanceof Uint8Array\n ) {\n await createParentDir(destination)\n await writeFile(destination, input)\n return\n }\n\n if (input && typeof input.pipe === 'function') {\n await createParentDir(destination)\n await pipeline(input, createWriteStream(destination))\n return\n }\n\n throw new Error('Unsupported artifact input type')\n}\n\nasync function createParentDir(path: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true })\n}\n\nasync function walk(root: string, prefix?: string): Promise<ArtifactReference[]> {\n const base = prefix ? ensureWithinRoot(root, prefix) : root\n const entries = await readdir(base, { withFileTypes: true })\n\n // Process all entries in parallel\n const entryPromises = entries.map(async (entry) => {\n const absolute = join(base, entry.name)\n const rel = relative(root, absolute)\n\n if (entry.isDirectory()) {\n return walk(root, rel)\n } else if (entry.isFile()) {\n const s = await stat(absolute)\n return [{\n path: rel,\n size: s.size,\n modifiedAt: s.mtime,\n }]\n }\n return []\n })\n\n const nestedResults = await Promise.all(entryPromises)\n return nestedResults.flat()\n}\n\nexport interface FileSystemArtifactClientOptions {\n root: string\n defaultContentType?: string\n}\n\nexport class FileSystemArtifactClient implements ArtifactClient {\n constructor(private readonly options: FileSystemArtifactClientOptions) {}\n\n basePath(): string {\n return this.options.root\n }\n\n async produce(path: string, input: ArtifactInput): Promise<void> {\n const target = ensureWithinRoot(this.options.root, path)\n await writeInput(target, input)\n }\n\n async consume(path: string): Promise<ArtifactOutput> {\n const target = ensureWithinRoot(this.options.root, path)\n return readFile(target)\n }\n\n async stream(path: string): Promise<NodeJS.ReadableStream> {\n const target = ensureWithinRoot(this.options.root, path)\n return createReadStream(target)\n }\n\n async list(prefix?: string): Promise<ArtifactReference[]> {\n return walk(this.options.root, prefix)\n }\n}\n\nexport function createFileSystemArtifactClient(\n root: string,\n): FileSystemArtifactClient {\n return new FileSystemArtifactClient({ root })\n}\n\n\n"]}
1
+ {"version":3,"sources":["../src/fs-client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { createWriteStream, createReadStream } from 'node:fs'\nimport { mkdir, stat, readdir, readFile, writeFile } from 'node:fs/promises'\nimport { pipeline } from 'node:stream/promises'\nimport { dirname, resolve, join, relative } from 'pathe'\nimport type {\n ArtifactClient,\n ArtifactInput,\n ArtifactOutput,\n ArtifactReference,\n} from './types'\n\nfunction ensureWithinRoot(root: string, targetPath: string): string {\n const normalizedRoot = root.endsWith('/') ? root : `${root}/`\n const target = resolve(root, targetPath)\n if (target === normalizedRoot.slice(0, -1)) {\n return target\n }\n if (!target.startsWith(normalizedRoot)) {\n throw new Error(`Artifact path escapes root: ${targetPath}`)\n }\n return target\n}\n\nasync function writeInput(\n destination: string,\n input: ArtifactInput,\n): Promise<void> {\n if (\n typeof input === 'string' ||\n input instanceof Buffer ||\n input instanceof Uint8Array\n ) {\n await createParentDir(destination)\n await writeFile(destination, input)\n return\n }\n\n if (input && typeof input.pipe === 'function') {\n await createParentDir(destination)\n await pipeline(input, createWriteStream(destination))\n return\n }\n\n throw new Error('Unsupported artifact input type')\n}\n\nasync function createParentDir(path: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true })\n}\n\nasync function walk(root: string, prefix?: string): Promise<ArtifactReference[]> {\n const base = prefix ? ensureWithinRoot(root, prefix) : root\n const entries = await readdir(base, { withFileTypes: true })\n\n // Process all entries in parallel\n const entryPromises = entries.map(async (entry) => {\n const absolute = join(base, entry.name)\n const rel = relative(root, absolute)\n\n if (entry.isDirectory()) {\n return walk(root, rel)\n } else if (entry.isFile()) {\n const s = await stat(absolute)\n return [{\n path: rel,\n size: s.size,\n modifiedAt: s.mtime,\n }]\n }\n return []\n })\n\n const nestedResults = await Promise.all(entryPromises)\n return nestedResults.flat()\n}\n\nexport interface FileSystemArtifactClientOptions {\n root: string\n defaultContentType?: string\n}\n\nexport class FileSystemArtifactClient implements ArtifactClient {\n constructor(private readonly options: FileSystemArtifactClientOptions) {}\n\n basePath(): string {\n return this.options.root\n }\n\n async produce(path: string, input: ArtifactInput): Promise<void> {\n const target = ensureWithinRoot(this.options.root, path)\n await writeInput(target, input)\n }\n\n async consume(path: string): Promise<ArtifactOutput> {\n const target = ensureWithinRoot(this.options.root, path)\n return readFile(target)\n }\n\n async stream(path: string): Promise<NodeJS.ReadableStream> {\n const target = ensureWithinRoot(this.options.root, path)\n return createReadStream(target)\n }\n\n async list(prefix?: string): Promise<ArtifactReference[]> {\n return walk(this.options.root, prefix)\n }\n}\n\nexport function createFileSystemArtifactClient(\n root: string,\n): FileSystemArtifactClient {\n return new FileSystemArtifactClient({ root })\n}\n\n\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kb-labs/workflow-artifacts",
3
- "version": "1.5.0",
3
+ "version": "2.6.0",
4
4
  "type": "module",
5
5
  "description": "Artifact helpers for KB Labs workflow engine.",
6
6
  "main": "./dist/index.js",
@@ -32,7 +32,7 @@
32
32
  "pathe": "^1.1.2"
33
33
  },
34
34
  "devDependencies": {
35
- "@kb-labs/devkit": "link:../../../../infra/kb-labs-devkit",
35
+ "@kb-labs/devkit": "workspace:*",
36
36
  "@types/node": "^24.3.3",
37
37
  "@typescript-eslint/eslint-plugin": "^8",
38
38
  "@typescript-eslint/parser": "^8",