@cmflow/source-pack 3.19.0 → 3.21.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.
@@ -1,4 +1,4 @@
1
- import { g as MANIFEST_FILE, h as GITLAB_TOKEN_ENV, m as GITHUB_TOKEN_ENV } from "./constants-DkiLCuIK.mjs";
1
+ import { h as MANIFEST_FILE, m as GITLAB_TOKEN_ENV, p as GITHUB_TOKEN_ENV } from "./constants-o4tbCIrY.mjs";
2
2
  import { n as silentLogger } from "./logger-D1XGzzjT.mjs";
3
3
  import { r as rt, t as projectIdentity } from "./projectIdentity-F97vs1H-.mjs";
4
4
  import path from "node:path";
@@ -293,4 +293,4 @@ async function publishSourcePack(options) {
293
293
 
294
294
  //#endregion
295
295
  export { readArchiveEntries as n, publishSourcePack as t };
296
- //# sourceMappingURL=publishSourcePack-xNr9RBgv.mjs.map
296
+ //# sourceMappingURL=publishSourcePack-BfPLD37B.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"publishSourcePack-xNr9RBgv.mjs","names":["Parser"],"sources":["../src/pack/readArchiveEntries.ts","../src/publish/HttpError.ts","../src/publish/requestJson.ts","../src/publish/ensureRelease.ts","../src/publish/publishGithubRelease.ts","../src/publish/publishGitlabRelease.ts","../src/publish/publishSourcePack.ts"],"sourcesContent":["import { createReadStream } from \"node:fs\";\nimport { Parser, type ReadEntry } from \"tar\";\n\nexport interface ReadArchiveEntriesOptions {\n /** Stop reading the archive as soon as this entry has been read (the rest of the file is not read). */\n until?: string;\n}\n\n/** Reads the regular files of a (gzipped) tar archive, given as a file path (streamed) or as bytes, in memory. */\nexport function readArchiveEntries(archive: string | Uint8Array, { until }: ReadArchiveEntriesOptions = {}): Promise<Map<string, Buffer>> {\n const files = new Map<string, Buffer>();\n let done = false;\n let stopInput = () => {};\n\n return new Promise((resolve, reject) => {\n const parser = new Parser({\n strict: true,\n onReadEntry(entry: ReadEntry) {\n if (done || entry.type !== \"File\") {\n entry.resume();\n return;\n }\n\n const file = entry.path.replace(/^\\.\\//, \"\");\n const parts: Buffer[] = [];\n\n entry.on(\"data\", (data: Buffer) => parts.push(data));\n entry.on(\"end\", () => {\n files.set(file, Buffer.concat(parts));\n\n if (file === until) {\n done = true;\n stopInput();\n resolve(files);\n }\n });\n }\n });\n\n parser.on(\"error\", reject);\n parser.on(\"end\", () => resolve(files));\n\n if (typeof archive === \"string\") {\n const input = createReadStream(archive);\n\n stopInput = () => input.destroy();\n input.on(\"error\", reject).pipe(parser);\n } else {\n parser.end(Buffer.from(archive.buffer, archive.byteOffset, archive.byteLength));\n }\n });\n}\n","export class HttpError extends Error {\n constructor(\n readonly method: string,\n readonly url: string,\n readonly status: number,\n readonly body: string\n ) {\n super(`${method} ${url} failed with HTTP ${status}: ${body.slice(0, 300)}`);\n this.name = \"HttpError\";\n }\n}\n","import { HttpError } from \"./HttpError\";\n\nexport interface RequestJsonOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: string | Uint8Array;\n /** Statuses returned as `undefined` instead of throwing (e.g. 404). */\n allow?: number[];\n}\n\n/** fetch + JSON decoding; throws an HttpError (never including request headers) on unexpected statuses. */\nexport async function requestJson<T>(\n fetch: typeof globalThis.fetch,\n url: string,\n { method = \"GET\", headers, body, allow = [] }: RequestJsonOptions = {}\n): Promise<T | undefined> {\n const response = await fetch(url, { method, headers, body });\n\n if (allow.includes(response.status)) {\n return undefined;\n }\n\n const text = await response.text();\n\n if (!response.ok) {\n throw new HttpError(method, url, response.status, text);\n }\n\n return (text ? JSON.parse(text) : undefined) as T;\n}\n","import type { PublishContext } from \"./interfaces/PublishContext\";\nimport { requestJson } from \"./requestJson\";\n\nexport interface EnsureReleaseOptions {\n /** Provider name used in messages, e.g. `GitHub`. */\n provider: string;\n /** Repository shown in the \"missing release\" error, when the provider message needs it. */\n repository?: string;\n /** Release of `manifest.tag`. */\n releaseUrl: string;\n /** Collection the release is created in when missing. */\n releasesUrl: string;\n headers: Record<string, string>;\n jsonHeaders: Record<string, string>;\n /** Statuses meaning \"no release\" on `releaseUrl`. */\n missing: number[];\n}\n\n/**\n * Returns the release of `manifest.tag`. When it does not exist, fails unless `publish.createRelease` is set,\n * in which case the release is created (named after the tag).\n */\nexport async function ensureRelease<T>(\n { config, manifest, fetch, logger }: Pick<PublishContext, \"config\" | \"manifest\" | \"fetch\" | \"logger\">,\n { provider, repository, releaseUrl, releasesUrl, headers, jsonHeaders, missing }: EnsureReleaseOptions\n): Promise<T> {\n const release = await requestJson<T>(fetch, releaseUrl, { headers, allow: missing });\n\n if (release) {\n return release;\n }\n\n if (!config.publish.createRelease) {\n throw new Error(\n `No ${provider} release for tag ${manifest.tag}${repository ? ` in ${repository}` : \"\"} (set publish.createRelease to create it)`\n );\n }\n\n logger.info(`creating ${provider} release ${manifest.tag}`);\n\n return (await requestJson<T>(fetch, releasesUrl, {\n method: \"POST\",\n headers: jsonHeaders,\n body: JSON.stringify({ tag_name: manifest.tag, name: manifest.tag })\n })) as T;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { GITHUB_TOKEN_ENV } from \"../constants\";\nimport { ensureRelease } from \"./ensureRelease\";\nimport type { PublishContext, PublishResult } from \"./interfaces/PublishContext\";\nimport { requestJson } from \"./requestJson\";\n\ninterface GithubAsset {\n id: number;\n name: string;\n browser_download_url: string;\n}\n\ninterface GithubRelease {\n id: number;\n upload_url: string;\n html_url: string;\n assets?: GithubAsset[];\n}\n\n/**\n * Uploads the archive as an asset of the GitHub release of `manifest.tag`, replacing an asset with the same name.\n * Requires GITHUB_TOKEN (contents: write).\n */\nexport async function publishGithubRelease(context: PublishContext): Promise<PublishResult> {\n const { config, manifest, archivePath, assetName, dryRun, env, fetch, logger } = context;\n const { owner, name, apiUrl } = config.repository;\n const repoUrl = `${apiUrl}/repos/${encodeURIComponent(owner!)}/${encodeURIComponent(name!)}`;\n const plannedUrl = `https://github.com/${owner}/${name}/releases/download/${encodeURIComponent(manifest.tag)}/${encodeURIComponent(assetName)}`;\n\n if (dryRun) {\n logger.info(\n `[dry-run] would upload ${assetName} (${(await stat(archivePath)).size} bytes) to the GitHub release ${manifest.tag} of ${owner}/${name}`\n );\n logger.info(\n `[dry-run] ${config.publish.createRelease ? \"would create the release if missing\" : \"requires the release to exist\"}; an existing ${assetName} asset would be replaced`\n );\n\n return { target: \"github-release\", dryRun, url: plannedUrl, replaced: false };\n }\n\n const token = env[GITHUB_TOKEN_ENV];\n\n if (!token) {\n throw new Error(`${GITHUB_TOKEN_ENV} is not set (required to publish on a GitHub release)`);\n }\n\n const headers = {\n Accept: \"application/vnd.github+json\",\n Authorization: `Bearer ${token}`,\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n \"User-Agent\": \"cmflow-source-pack\"\n };\n const release = await ensureRelease<GithubRelease>(context, {\n provider: \"GitHub\",\n repository: `${owner}/${name}`,\n releaseUrl: `${repoUrl}/releases/tags/${encodeURIComponent(manifest.tag)}`,\n releasesUrl: `${repoUrl}/releases`,\n headers,\n jsonHeaders: { ...headers, \"Content-Type\": \"application/json\" },\n missing: [404]\n });\n const existing = release.assets?.find((asset) => asset.name === assetName);\n\n if (existing) {\n logger.info(`replacing existing asset ${assetName}`);\n await requestJson(fetch, `${repoUrl}/releases/assets/${existing.id}`, { method: \"DELETE\", headers });\n }\n\n const archive = await readFile(archivePath);\n const uploadUrl = `${release.upload_url.replace(/\\{.*\\}$/, \"\")}?name=${encodeURIComponent(assetName)}`;\n const asset = (await requestJson<GithubAsset>(fetch, uploadUrl, {\n method: \"POST\",\n headers: { ...headers, \"Content-Type\": \"application/gzip\", \"Content-Length\": String(archive.length) },\n body: archive\n }))!;\n\n logger.info(`published ${asset.browser_download_url}`);\n\n return { target: \"github-release\", dryRun, url: asset.browser_download_url, replaced: Boolean(existing) };\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { GITLAB_TOKEN_ENV } from \"../constants\";\nimport { ensureRelease } from \"./ensureRelease\";\nimport type { PublishContext, PublishResult } from \"./interfaces/PublishContext\";\nimport { requestJson } from \"./requestJson\";\n\ninterface GitlabPackageFile {\n id: number;\n package_id: number;\n file_name: string;\n}\n\ninterface GitlabReleaseLink {\n id: number;\n name: string;\n url: string;\n}\n\nfunction gitlabHeaders(env: NodeJS.ProcessEnv): Record<string, string> {\n const token = env[GITLAB_TOKEN_ENV];\n\n if (token) {\n return { \"PRIVATE-TOKEN\": token };\n }\n\n if (env.CI_JOB_TOKEN) {\n return { \"JOB-TOKEN\": env.CI_JOB_TOKEN };\n }\n\n throw new Error(`${GITLAB_TOKEN_ENV} is not set (required to publish on a GitLab release; CI_JOB_TOKEN is used as a fallback)`);\n}\n\n/**\n * Uploads the archive to the project's Generic Package Registry\n * (`/projects/:id/packages/generic/<packageName>/<version>/<assetName>`), removes older files with the same name\n * in that package version, and links it from the GitLab release of `manifest.tag` (link updated when it exists).\n */\nexport async function publishGitlabRelease(context: PublishContext): Promise<PublishResult> {\n const { config, manifest, archivePath, assetName, dryRun, env, fetch, logger } = context;\n const { apiUrl, projectId, owner, name } = config.repository;\n const { packageName } = config.publish;\n const project = encodeURIComponent(projectId ?? `${owner}/${name}`);\n const projectUrl = `${apiUrl}/projects/${project}`;\n const packageUrl = `${projectUrl}/packages/generic/${encodeURIComponent(packageName)}/${encodeURIComponent(manifest.version)}/${encodeURIComponent(assetName)}`;\n const releaseUrl = `${projectUrl}/releases/${encodeURIComponent(manifest.tag)}`;\n\n if (dryRun) {\n logger.info(`[dry-run] would PUT ${assetName} (${(await stat(archivePath)).size} bytes) to ${packageUrl}`);\n logger.info(\n `[dry-run] would link it from the GitLab release ${manifest.tag}${config.publish.createRelease ? \" (created if missing)\" : \"\"}`\n );\n\n return { target: \"gitlab-release\", dryRun, url: packageUrl, replaced: false };\n }\n\n const headers = gitlabHeaders(env);\n const jsonHeaders = { ...headers, \"Content-Type\": \"application/json\" };\n const uploaded = (await requestJson<GitlabPackageFile>(fetch, `${packageUrl}?select=package_file`, {\n method: \"PUT\",\n headers: { ...headers, \"Content-Type\": \"application/octet-stream\" },\n body: await readFile(archivePath)\n }))!;\n const files =\n (await requestJson<GitlabPackageFile[]>(fetch, `${projectUrl}/packages/${uploaded.package_id}/package_files?per_page=100`, {\n headers\n })) ?? [];\n const duplicates = files.filter((file) => file.file_name === assetName && file.id !== uploaded.id);\n\n for (const duplicate of duplicates) {\n await requestJson(fetch, `${projectUrl}/packages/${uploaded.package_id}/package_files/${duplicate.id}`, { method: \"DELETE\", headers });\n }\n\n await ensureRelease(context, {\n provider: \"GitLab\",\n releaseUrl,\n releasesUrl: `${projectUrl}/releases`,\n headers,\n jsonHeaders,\n missing: [404, 403]\n });\n\n const links = (await requestJson<GitlabReleaseLink[]>(fetch, `${releaseUrl}/assets/links?per_page=100`, { headers })) ?? [];\n const existing = links.find((link) => link.name === assetName);\n const linkBody = JSON.stringify({ name: assetName, url: packageUrl, link_type: \"package\" });\n\n if (existing) {\n await requestJson(fetch, `${releaseUrl}/assets/links/${existing.id}`, { method: \"PUT\", headers: jsonHeaders, body: linkBody });\n } else {\n await requestJson(fetch, `${releaseUrl}/assets/links`, { method: \"POST\", headers: jsonHeaders, body: linkBody });\n }\n\n logger.info(`published ${packageUrl}`);\n\n return { target: \"gitlab-release\", dryRun, url: packageUrl, replaced: duplicates.length > 0 || Boolean(existing) };\n}\n","import { access, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { ResolvedConfig } from \"../config/interfaces/ResolvedConfig\";\nimport { MANIFEST_FILE } from \"../constants\";\nimport type { SourcePackManifest } from \"../interfaces/SourcePackManifest\";\nimport { projectIdentity } from \"../pack/projectIdentity\";\nimport { readArchiveEntries } from \"../pack/readArchiveEntries\";\nimport { type Logger, silentLogger } from \"../utils/logger\";\nimport type { PublishResult } from \"./interfaces/PublishContext\";\nimport { publishGithubRelease } from \"./publishGithubRelease\";\nimport { publishGitlabRelease } from \"./publishGitlabRelease\";\n\nexport interface PublishSourcePackOptions {\n config: ResolvedConfig;\n /** Archive to publish. Default: the archive of the last `build` in `outputDir`. */\n archivePath?: string;\n dryRun?: boolean;\n env?: NodeJS.ProcessEnv;\n fetch?: typeof globalThis.fetch;\n logger?: Logger;\n}\n\nasync function locateArchive(config: ResolvedConfig, archivePath?: string): Promise<{ archivePath: string; manifest: SourcePackManifest }> {\n if (archivePath) {\n const resolved = path.resolve(config.cwd, archivePath);\n const manifestFile = (await readArchiveEntries(resolved, { until: MANIFEST_FILE })).get(MANIFEST_FILE);\n\n if (!manifestFile) {\n throw new Error(`${resolved} is not a source pack (no ${MANIFEST_FILE})`);\n }\n\n return { archivePath: resolved, manifest: JSON.parse(manifestFile.toString(\"utf8\")) as SourcePackManifest };\n }\n\n const manifestPath = path.join(config.outputDir, MANIFEST_FILE);\n let manifest: SourcePackManifest;\n\n try {\n manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as SourcePackManifest;\n } catch {\n throw new Error(`No built source pack in ${config.outputDir}: run \"source-pack build\" first or pass --archive`);\n }\n\n const resolved = path.join(config.outputDir, manifest.publish.assetName);\n\n await access(resolved).catch(() => {\n throw new Error(`Archive ${resolved} declared by ${manifestPath} is missing: run \"source-pack build\" again`);\n });\n\n return { archivePath: resolved, manifest };\n}\n\n/** Publishes a built source pack on the release of its tag, on the provider of `repository`. Idempotent. */\nexport async function publishSourcePack(options: PublishSourcePackOptions): Promise<PublishResult> {\n const { config, env = process.env, fetch = globalThis.fetch, logger = silentLogger } = options;\n const { archivePath, manifest } = await locateArchive(config, options.archivePath);\n const context = {\n config,\n manifest,\n archivePath,\n assetName: path.basename(archivePath),\n dryRun: Boolean(options.dryRun),\n env,\n fetch,\n logger\n };\n\n const expectedProject = projectIdentity(config.repository).id;\n\n if (manifest.project.id !== expectedProject) {\n throw new Error(`Archive belongs to ${manifest.project.id}, not to the configured repository ${expectedProject}`);\n }\n\n return config.repository.provider === \"github\" ? publishGithubRelease(context) : publishGitlabRelease(context);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"publishSourcePack-BfPLD37B.mjs","names":["Parser"],"sources":["../src/pack/readArchiveEntries.ts","../src/publish/HttpError.ts","../src/publish/requestJson.ts","../src/publish/ensureRelease.ts","../src/publish/publishGithubRelease.ts","../src/publish/publishGitlabRelease.ts","../src/publish/publishSourcePack.ts"],"sourcesContent":["import { createReadStream } from \"node:fs\";\nimport { Parser, type ReadEntry } from \"tar\";\n\nexport interface ReadArchiveEntriesOptions {\n /** Stop reading the archive as soon as this entry has been read (the rest of the file is not read). */\n until?: string;\n}\n\n/** Reads the regular files of a (gzipped) tar archive, given as a file path (streamed) or as bytes, in memory. */\nexport function readArchiveEntries(archive: string | Uint8Array, { until }: ReadArchiveEntriesOptions = {}): Promise<Map<string, Buffer>> {\n const files = new Map<string, Buffer>();\n let done = false;\n let stopInput = () => {};\n\n return new Promise((resolve, reject) => {\n const parser = new Parser({\n strict: true,\n onReadEntry(entry: ReadEntry) {\n if (done || entry.type !== \"File\") {\n entry.resume();\n return;\n }\n\n const file = entry.path.replace(/^\\.\\//, \"\");\n const parts: Buffer[] = [];\n\n entry.on(\"data\", (data: Buffer) => parts.push(data));\n entry.on(\"end\", () => {\n files.set(file, Buffer.concat(parts));\n\n if (file === until) {\n done = true;\n stopInput();\n resolve(files);\n }\n });\n }\n });\n\n parser.on(\"error\", reject);\n parser.on(\"end\", () => resolve(files));\n\n if (typeof archive === \"string\") {\n const input = createReadStream(archive);\n\n stopInput = () => input.destroy();\n input.on(\"error\", reject).pipe(parser);\n } else {\n parser.end(Buffer.from(archive.buffer, archive.byteOffset, archive.byteLength));\n }\n });\n}\n","export class HttpError extends Error {\n constructor(\n readonly method: string,\n readonly url: string,\n readonly status: number,\n readonly body: string\n ) {\n super(`${method} ${url} failed with HTTP ${status}: ${body.slice(0, 300)}`);\n this.name = \"HttpError\";\n }\n}\n","import { HttpError } from \"./HttpError\";\n\nexport interface RequestJsonOptions {\n method?: string;\n headers?: Record<string, string>;\n body?: string | Uint8Array;\n /** Statuses returned as `undefined` instead of throwing (e.g. 404). */\n allow?: number[];\n}\n\n/** fetch + JSON decoding; throws an HttpError (never including request headers) on unexpected statuses. */\nexport async function requestJson<T>(\n fetch: typeof globalThis.fetch,\n url: string,\n { method = \"GET\", headers, body, allow = [] }: RequestJsonOptions = {}\n): Promise<T | undefined> {\n const response = await fetch(url, { method, headers, body });\n\n if (allow.includes(response.status)) {\n return undefined;\n }\n\n const text = await response.text();\n\n if (!response.ok) {\n throw new HttpError(method, url, response.status, text);\n }\n\n return (text ? JSON.parse(text) : undefined) as T;\n}\n","import type { PublishContext } from \"./interfaces/PublishContext\";\nimport { requestJson } from \"./requestJson\";\n\nexport interface EnsureReleaseOptions {\n /** Provider name used in messages, e.g. `GitHub`. */\n provider: string;\n /** Repository shown in the \"missing release\" error, when the provider message needs it. */\n repository?: string;\n /** Release of `manifest.tag`. */\n releaseUrl: string;\n /** Collection the release is created in when missing. */\n releasesUrl: string;\n headers: Record<string, string>;\n jsonHeaders: Record<string, string>;\n /** Statuses meaning \"no release\" on `releaseUrl`. */\n missing: number[];\n}\n\n/**\n * Returns the release of `manifest.tag`. When it does not exist, fails unless `publish.createRelease` is set,\n * in which case the release is created (named after the tag).\n */\nexport async function ensureRelease<T>(\n { config, manifest, fetch, logger }: Pick<PublishContext, \"config\" | \"manifest\" | \"fetch\" | \"logger\">,\n { provider, repository, releaseUrl, releasesUrl, headers, jsonHeaders, missing }: EnsureReleaseOptions\n): Promise<T> {\n const release = await requestJson<T>(fetch, releaseUrl, { headers, allow: missing });\n\n if (release) {\n return release;\n }\n\n if (!config.publish.createRelease) {\n throw new Error(\n `No ${provider} release for tag ${manifest.tag}${repository ? ` in ${repository}` : \"\"} (set publish.createRelease to create it)`\n );\n }\n\n logger.info(`creating ${provider} release ${manifest.tag}`);\n\n return (await requestJson<T>(fetch, releasesUrl, {\n method: \"POST\",\n headers: jsonHeaders,\n body: JSON.stringify({ tag_name: manifest.tag, name: manifest.tag })\n })) as T;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { GITHUB_TOKEN_ENV } from \"../constants\";\nimport { ensureRelease } from \"./ensureRelease\";\nimport type { PublishContext, PublishResult } from \"./interfaces/PublishContext\";\nimport { requestJson } from \"./requestJson\";\n\ninterface GithubAsset {\n id: number;\n name: string;\n browser_download_url: string;\n}\n\ninterface GithubRelease {\n id: number;\n upload_url: string;\n html_url: string;\n assets?: GithubAsset[];\n}\n\n/**\n * Uploads the archive as an asset of the GitHub release of `manifest.tag`, replacing an asset with the same name.\n * Requires GITHUB_TOKEN (contents: write).\n */\nexport async function publishGithubRelease(context: PublishContext): Promise<PublishResult> {\n const { config, manifest, archivePath, assetName, dryRun, env, fetch, logger } = context;\n const { owner, name, apiUrl } = config.repository;\n const repoUrl = `${apiUrl}/repos/${encodeURIComponent(owner!)}/${encodeURIComponent(name!)}`;\n const plannedUrl = `https://github.com/${owner}/${name}/releases/download/${encodeURIComponent(manifest.tag)}/${encodeURIComponent(assetName)}`;\n\n if (dryRun) {\n logger.info(\n `[dry-run] would upload ${assetName} (${(await stat(archivePath)).size} bytes) to the GitHub release ${manifest.tag} of ${owner}/${name}`\n );\n logger.info(\n `[dry-run] ${config.publish.createRelease ? \"would create the release if missing\" : \"requires the release to exist\"}; an existing ${assetName} asset would be replaced`\n );\n\n return { target: \"github-release\", dryRun, url: plannedUrl, replaced: false };\n }\n\n const token = env[GITHUB_TOKEN_ENV];\n\n if (!token) {\n throw new Error(`${GITHUB_TOKEN_ENV} is not set (required to publish on a GitHub release)`);\n }\n\n const headers = {\n Accept: \"application/vnd.github+json\",\n Authorization: `Bearer ${token}`,\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n \"User-Agent\": \"cmflow-source-pack\"\n };\n const release = await ensureRelease<GithubRelease>(context, {\n provider: \"GitHub\",\n repository: `${owner}/${name}`,\n releaseUrl: `${repoUrl}/releases/tags/${encodeURIComponent(manifest.tag)}`,\n releasesUrl: `${repoUrl}/releases`,\n headers,\n jsonHeaders: { ...headers, \"Content-Type\": \"application/json\" },\n missing: [404]\n });\n const existing = release.assets?.find((asset) => asset.name === assetName);\n\n if (existing) {\n logger.info(`replacing existing asset ${assetName}`);\n await requestJson(fetch, `${repoUrl}/releases/assets/${existing.id}`, { method: \"DELETE\", headers });\n }\n\n const archive = await readFile(archivePath);\n const uploadUrl = `${release.upload_url.replace(/\\{.*\\}$/, \"\")}?name=${encodeURIComponent(assetName)}`;\n const asset = (await requestJson<GithubAsset>(fetch, uploadUrl, {\n method: \"POST\",\n headers: { ...headers, \"Content-Type\": \"application/gzip\", \"Content-Length\": String(archive.length) },\n body: archive\n }))!;\n\n logger.info(`published ${asset.browser_download_url}`);\n\n return { target: \"github-release\", dryRun, url: asset.browser_download_url, replaced: Boolean(existing) };\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { GITLAB_TOKEN_ENV } from \"../constants\";\nimport { ensureRelease } from \"./ensureRelease\";\nimport type { PublishContext, PublishResult } from \"./interfaces/PublishContext\";\nimport { requestJson } from \"./requestJson\";\n\ninterface GitlabPackageFile {\n id: number;\n package_id: number;\n file_name: string;\n}\n\ninterface GitlabReleaseLink {\n id: number;\n name: string;\n url: string;\n}\n\nfunction gitlabHeaders(env: NodeJS.ProcessEnv): Record<string, string> {\n const token = env[GITLAB_TOKEN_ENV];\n\n if (token) {\n return { \"PRIVATE-TOKEN\": token };\n }\n\n if (env.CI_JOB_TOKEN) {\n return { \"JOB-TOKEN\": env.CI_JOB_TOKEN };\n }\n\n throw new Error(`${GITLAB_TOKEN_ENV} is not set (required to publish on a GitLab release; CI_JOB_TOKEN is used as a fallback)`);\n}\n\n/**\n * Uploads the archive to the project's Generic Package Registry\n * (`/projects/:id/packages/generic/<packageName>/<version>/<assetName>`), removes older files with the same name\n * in that package version, and links it from the GitLab release of `manifest.tag` (link updated when it exists).\n */\nexport async function publishGitlabRelease(context: PublishContext): Promise<PublishResult> {\n const { config, manifest, archivePath, assetName, dryRun, env, fetch, logger } = context;\n const { apiUrl, projectId, owner, name } = config.repository;\n const { packageName } = config.publish;\n const project = encodeURIComponent(projectId ?? `${owner}/${name}`);\n const projectUrl = `${apiUrl}/projects/${project}`;\n const packageUrl = `${projectUrl}/packages/generic/${encodeURIComponent(packageName)}/${encodeURIComponent(manifest.version)}/${encodeURIComponent(assetName)}`;\n const releaseUrl = `${projectUrl}/releases/${encodeURIComponent(manifest.tag)}`;\n\n if (dryRun) {\n logger.info(`[dry-run] would PUT ${assetName} (${(await stat(archivePath)).size} bytes) to ${packageUrl}`);\n logger.info(\n `[dry-run] would link it from the GitLab release ${manifest.tag}${config.publish.createRelease ? \" (created if missing)\" : \"\"}`\n );\n\n return { target: \"gitlab-release\", dryRun, url: packageUrl, replaced: false };\n }\n\n const headers = gitlabHeaders(env);\n const jsonHeaders = { ...headers, \"Content-Type\": \"application/json\" };\n const uploaded = (await requestJson<GitlabPackageFile>(fetch, `${packageUrl}?select=package_file`, {\n method: \"PUT\",\n headers: { ...headers, \"Content-Type\": \"application/octet-stream\" },\n body: await readFile(archivePath)\n }))!;\n const files =\n (await requestJson<GitlabPackageFile[]>(fetch, `${projectUrl}/packages/${uploaded.package_id}/package_files?per_page=100`, {\n headers\n })) ?? [];\n const duplicates = files.filter((file) => file.file_name === assetName && file.id !== uploaded.id);\n\n for (const duplicate of duplicates) {\n await requestJson(fetch, `${projectUrl}/packages/${uploaded.package_id}/package_files/${duplicate.id}`, { method: \"DELETE\", headers });\n }\n\n await ensureRelease(context, {\n provider: \"GitLab\",\n releaseUrl,\n releasesUrl: `${projectUrl}/releases`,\n headers,\n jsonHeaders,\n missing: [404, 403]\n });\n\n const links = (await requestJson<GitlabReleaseLink[]>(fetch, `${releaseUrl}/assets/links?per_page=100`, { headers })) ?? [];\n const existing = links.find((link) => link.name === assetName);\n const linkBody = JSON.stringify({ name: assetName, url: packageUrl, link_type: \"package\" });\n\n if (existing) {\n await requestJson(fetch, `${releaseUrl}/assets/links/${existing.id}`, { method: \"PUT\", headers: jsonHeaders, body: linkBody });\n } else {\n await requestJson(fetch, `${releaseUrl}/assets/links`, { method: \"POST\", headers: jsonHeaders, body: linkBody });\n }\n\n logger.info(`published ${packageUrl}`);\n\n return { target: \"gitlab-release\", dryRun, url: packageUrl, replaced: duplicates.length > 0 || Boolean(existing) };\n}\n","import { access, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { ResolvedConfig } from \"../config/interfaces/ResolvedConfig\";\nimport { MANIFEST_FILE } from \"../constants\";\nimport type { SourcePackManifest } from \"../interfaces/SourcePackManifest\";\nimport { projectIdentity } from \"../pack/projectIdentity\";\nimport { readArchiveEntries } from \"../pack/readArchiveEntries\";\nimport { type Logger, silentLogger } from \"../utils/logger\";\nimport type { PublishResult } from \"./interfaces/PublishContext\";\nimport { publishGithubRelease } from \"./publishGithubRelease\";\nimport { publishGitlabRelease } from \"./publishGitlabRelease\";\n\nexport interface PublishSourcePackOptions {\n config: ResolvedConfig;\n /** Archive to publish. Default: the archive of the last `build` in `outputDir`. */\n archivePath?: string;\n dryRun?: boolean;\n env?: NodeJS.ProcessEnv;\n fetch?: typeof globalThis.fetch;\n logger?: Logger;\n}\n\nasync function locateArchive(config: ResolvedConfig, archivePath?: string): Promise<{ archivePath: string; manifest: SourcePackManifest }> {\n if (archivePath) {\n const resolved = path.resolve(config.cwd, archivePath);\n const manifestFile = (await readArchiveEntries(resolved, { until: MANIFEST_FILE })).get(MANIFEST_FILE);\n\n if (!manifestFile) {\n throw new Error(`${resolved} is not a source pack (no ${MANIFEST_FILE})`);\n }\n\n return { archivePath: resolved, manifest: JSON.parse(manifestFile.toString(\"utf8\")) as SourcePackManifest };\n }\n\n const manifestPath = path.join(config.outputDir, MANIFEST_FILE);\n let manifest: SourcePackManifest;\n\n try {\n manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as SourcePackManifest;\n } catch {\n throw new Error(`No built source pack in ${config.outputDir}: run \"source-pack build\" first or pass --archive`);\n }\n\n const resolved = path.join(config.outputDir, manifest.publish.assetName);\n\n await access(resolved).catch(() => {\n throw new Error(`Archive ${resolved} declared by ${manifestPath} is missing: run \"source-pack build\" again`);\n });\n\n return { archivePath: resolved, manifest };\n}\n\n/** Publishes a built source pack on the release of its tag, on the provider of `repository`. Idempotent. */\nexport async function publishSourcePack(options: PublishSourcePackOptions): Promise<PublishResult> {\n const { config, env = process.env, fetch = globalThis.fetch, logger = silentLogger } = options;\n const { archivePath, manifest } = await locateArchive(config, options.archivePath);\n const context = {\n config,\n manifest,\n archivePath,\n assetName: path.basename(archivePath),\n dryRun: Boolean(options.dryRun),\n env,\n fetch,\n logger\n };\n\n const expectedProject = projectIdentity(config.repository).id;\n\n if (manifest.project.id !== expectedProject) {\n throw new Error(`Archive belongs to ${manifest.project.id}, not to the configured repository ${expectedProject}`);\n }\n\n return config.repository.provider === \"github\" ? publishGithubRelease(context) : publishGitlabRelease(context);\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { t as publishSourcePack } from "./publishSourcePack-BfPLD37B.mjs";
2
+
3
+ export { publishSourcePack };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cmflow/source-pack",
3
- "version": "3.19.0",
3
+ "version": "3.21.0",
4
4
  "description": "Versioned source code index (chunks + embeddings) built and published at each production release",
5
5
  "license": "MIT",
6
6
  "author": "romakita",
@@ -24,6 +24,7 @@
24
24
  "scripts": {
25
25
  "build": "tsdown",
26
26
  "dev": "tsdown --watch",
27
+ "prepare": "yarn build",
27
28
  "test": "vitest run",
28
29
  "test:agent": "vitest run --agent"
29
30
  },
@@ -1,3 +0,0 @@
1
- import { t as buildSourcePack } from "./buildSourcePack-CaaMZ_tw.mjs";
2
-
3
- export { buildSourcePack };
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants-DkiLCuIK.mjs","names":[],"sources":["../src/constants.ts"],"sourcesContent":["export const PACKAGE_NAME = \"@cmflow/source-pack\";\n\n/** Version of the archive layout (manifest, chunks, embeddings, attachments). */\nexport const SOURCE_PACK_FORMAT_VERSION = 2;\n\n/** Version of the chunking algorithm. Bump it whenever chunk boundaries or ids change. */\nexport const CHUNKING_FORMAT_VERSION = 1;\n\nexport const CHUNK_ID_ALGORITHM = \"sha256(path:startLine:text)\";\n\nexport const EMBEDDING_INPUT_FORMAT = \"path\\\\ntext\";\n\nexport const MANIFEST_FILE = \"manifest.json\";\nexport const CHUNKS_FILE = \"chunks.jsonl.gz\";\nexport const EMBEDDINGS_FILE = \"embeddings.f32\";\nexport const ATTACHMENTS_DIR = \"attachments\";\n\nexport const DEFAULT_CONFIG_FILE = \"source-pack.config.ts\";\nexport const DEFAULT_OUTPUT_DIR = \"./tmp/source-pack\";\nexport const DEFAULT_TAG_TEMPLATE = \"version-{version}\";\nexport const DEFAULT_ASSET_NAME_TEMPLATE = \"source-pack-{version}.tar.gz\";\nexport const DEFAULT_GITLAB_PACKAGE_NAME = \"source-pack\";\nexport const DEFAULT_GITHUB_API_URL = \"https://api.github.com\";\nexport const DEFAULT_GITLAB_API_URL = \"https://gitlab.com/api/v4\";\nexport const GITHUB_TOKEN_ENV = \"GITHUB_TOKEN\";\nexport const GITLAB_TOKEN_ENV = \"GITLAB_TOKEN\";\n"],"mappings":";AAAA,MAAa,eAAe;;AAG5B,MAAa,6BAA6B;;AAG1C,MAAa,0BAA0B;AAEvC,MAAa,qBAAqB;AAElC,MAAa,yBAAyB;AAEtC,MAAa,gBAAgB;AAC7B,MAAa,cAAc;AAC3B,MAAa,kBAAkB;AAC/B,MAAa,kBAAkB;AAE/B,MAAa,sBAAsB;AACnC,MAAa,qBAAqB;AAClC,MAAa,uBAAuB;AACpC,MAAa,8BAA8B;AAC3C,MAAa,8BAA8B;AAC3C,MAAa,yBAAyB;AACtC,MAAa,yBAAyB;AACtC,MAAa,mBAAmB;AAChC,MAAa,mBAAmB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"loadConfig-CNrL90dq.mjs","names":["z.string","z.array","z.number","z\n .strictObject","z.enum","z.union","z.url","z.strictObject","z\n .string","z.boolean"],"sources":["../src/config/registerSelfResolution.ts","../src/config/configSchema.ts","../src/config/formatConfigIssues.ts","../src/config/resolveConfig.ts","../src/config/loadConfig.ts"],"sourcesContent":["import { register } from \"node:module\";\nimport { PACKAGE_NAME } from \"../constants\";\n\nlet registered = false;\n\nconst hookSource = `\nlet selfUrl;\nexport function initialize(data) { selfUrl = data.selfUrl; }\nexport async function resolve(specifier, context, nextResolve) {\n try {\n return await nextResolve(specifier, context);\n } catch (error) {\n if (specifier === ${JSON.stringify(PACKAGE_NAME)} && selfUrl) {\n return { url: selfUrl, shortCircuit: true };\n }\n throw error;\n }\n}\n`;\n\n/**\n * Lets a config file `import { defineConfig } from \"@cmflow/source-pack\"` even when the package is not installed\n * in the project (e.g. `npx @cmflow/source-pack build` in CI): the import falls back to the running package.\n */\nexport function registerSelfResolution(): void {\n if (registered) {\n return;\n }\n\n let selfUrl: string;\n\n try {\n selfUrl = import.meta.resolve(PACKAGE_NAME);\n } catch {\n return;\n }\n\n register(`data:text/javascript,${encodeURIComponent(hookSource)}`, { data: { selfUrl } });\n registered = true;\n}\n","import { z } from \"zod\";\nimport { DEFAULT_CHUNK_LINES, DEFAULT_CHUNK_OVERLAP } from \"./defaults\";\n\nconst nonEmptyString = z.string().trim().min(1, \"expected a non-empty string\");\nconst globList = z.array(nonEmptyString, \"expected an array of glob strings\");\nconst positiveInt = z.number(\"expected a number\").int(\"expected an integer\").positive(\"expected a positive integer\");\n\nexport const repositorySchema = z\n .strictObject({\n provider: z.enum([\"github\", \"gitlab\"], 'expected \"github\" or \"gitlab\"'),\n owner: nonEmptyString.optional(),\n name: nonEmptyString.optional(),\n projectId: z.union([nonEmptyString, positiveInt], \"expected a GitLab project id or path\").optional(),\n apiUrl: z.url(\"expected an absolute URL\").optional()\n })\n .superRefine((repository, ctx) => {\n if (repository.provider === \"github\" && (!repository.owner || !repository.name)) {\n ctx.addIssue({ code: \"custom\", path: [repository.owner ? \"name\" : \"owner\"], message: \"required for a GitHub repository\" });\n }\n\n if (repository.provider === \"gitlab\" && repository.projectId === undefined && (!repository.owner || !repository.name)) {\n ctx.addIssue({ code: \"custom\", path: [\"projectId\"], message: \"required for a GitLab project (or set both owner and name)\" });\n }\n });\n\nexport const sourcesSchema = z.strictObject({\n include: globList.min(1, \"expected at least one glob\").optional(),\n exclude: globList.optional(),\n maxFileBytes: positiveInt.optional()\n});\n\nexport const chunkingSchema = z\n .strictObject({\n lines: positiveInt.optional(),\n overlap: z.number(\"expected a number\").int(\"expected an integer\").min(0, \"expected an integer >= 0\").optional()\n })\n .superRefine((chunking, ctx) => {\n if ((chunking.overlap ?? DEFAULT_CHUNK_OVERLAP) >= (chunking.lines ?? DEFAULT_CHUNK_LINES)) {\n ctx.addIssue({ code: \"custom\", path: [\"overlap\"], message: \"expected a value lower than chunking.lines\" });\n }\n });\n\nexport const embeddingSchema = z.strictObject({\n baseUrl: z.url(\"expected an absolute URL\"),\n model: nonEmptyString,\n fallbackModels: z.array(nonEmptyString, \"expected an array of model names\").optional(),\n referenceModel: nonEmptyString.optional(),\n dimensions: positiveInt.optional(),\n batchSize: positiveInt.max(2048, \"expected at most 2048\").optional(),\n concurrency: positiveInt.optional(),\n maxRetries: z.number(\"expected a number\").int(\"expected an integer\").min(0, \"expected an integer >= 0\").optional(),\n maxInputChars: positiveInt.optional(),\n apiKeyEnv: nonEmptyString.optional()\n});\n\nconst templateWithVersion = nonEmptyString.refine((value) => value.includes(\"{version}\"), 'expected a template containing \"{version}\"');\n\nexport const publishSchema = z.strictObject({\n tag: templateWithVersion.optional(),\n assetName: templateWithVersion.optional(),\n packageName: z\n .string()\n .regex(/^[A-Za-z0-9._-]+$/, \"expected letters, digits, dots, dashes or underscores\")\n .optional(),\n createRelease: z.boolean(\"expected a boolean\").optional()\n});\n\nexport const userConfigSchema = z.strictObject({\n outputDir: nonEmptyString.optional(),\n repository: repositorySchema,\n sources: sourcesSchema.optional(),\n chunking: chunkingSchema.optional(),\n embedding: embeddingSchema.optional(),\n attachments: z.array(nonEmptyString, \"expected an array of repository paths\").optional(),\n publish: publishSchema.optional()\n});\n","import type { z } from \"zod\";\n\nfunction describeInput(input: unknown): string {\n if (input === undefined) {\n return \"nothing\";\n }\n\n const text = JSON.stringify(input) ?? String(input);\n\n return text.length > 80 ? `${text.slice(0, 77)}...` : text;\n}\n\n/**\n * Turns zod issues into one explicit line per field: `<field>: <expected> (received <value>)`.\n */\nexport function formatConfigIssues(issues: z.core.$ZodIssue[]): string[] {\n return issues.map((issue) => {\n const field = issue.path.length ? issue.path.map(String).join(\".\") : \"(root)\";\n\n if (issue.code === \"unrecognized_keys\") {\n return `${field}: unknown option(s) ${issue.keys.map((key) => `\"${key}\"`).join(\", \")}`;\n }\n\n const received = \"input\" in issue && issue.code !== \"custom\" ? ` (received ${describeInput(issue.input)})` : \"\";\n\n return `${field}: ${issue.message}${received}`;\n });\n}\n","import path from \"node:path\";\nimport {\n DEFAULT_ASSET_NAME_TEMPLATE,\n DEFAULT_GITHUB_API_URL,\n DEFAULT_GITLAB_API_URL,\n DEFAULT_GITLAB_PACKAGE_NAME,\n DEFAULT_OUTPUT_DIR,\n DEFAULT_TAG_TEMPLATE\n} from \"../constants\";\nimport { userConfigSchema } from \"./configSchema\";\nimport {\n DEFAULT_API_KEY_ENV,\n DEFAULT_BATCH_SIZE,\n DEFAULT_CHUNK_LINES,\n DEFAULT_CHUNK_OVERLAP,\n DEFAULT_DIMENSIONS,\n DEFAULT_EMBEDDING_CONCURRENCY,\n DEFAULT_EXCLUDE,\n DEFAULT_INCLUDE,\n DEFAULT_MAX_FILE_BYTES,\n DEFAULT_MAX_INPUT_CHARS,\n DEFAULT_MAX_RETRIES\n} from \"./defaults\";\nimport { formatConfigIssues } from \"./formatConfigIssues\";\nimport type { ResolvedConfig } from \"./interfaces/ResolvedConfig\";\n\nexport interface ResolveConfigOptions {\n cwd?: string;\n configPath?: string;\n env?: NodeJS.ProcessEnv;\n}\n\n/**\n * Validates a raw user config and fills every default. Throws an explicit, field-level error message on invalid input.\n */\nexport function resolveConfig(\n raw: unknown,\n { cwd = process.cwd(), configPath = \"\", env = process.env }: ResolveConfigOptions = {}\n): ResolvedConfig {\n const result = userConfigSchema.safeParse(raw, { reportInput: true });\n\n if (!result.success) {\n const lines = formatConfigIssues(result.error.issues);\n throw new Error(`Invalid source-pack config${configPath ? ` (${configPath})` : \"\"}:\\n${lines.map((line) => ` - ${line}`).join(\"\\n\")}`);\n }\n\n const config = result.data;\n const { repository } = config;\n const defaultApiUrl = repository.provider === \"github\" ? DEFAULT_GITHUB_API_URL : (env.CI_API_V4_URL ?? DEFAULT_GITLAB_API_URL);\n const embedding = config.embedding;\n\n return {\n configPath,\n cwd,\n outputDir: path.resolve(cwd, config.outputDir ?? DEFAULT_OUTPUT_DIR),\n repository: {\n provider: repository.provider,\n owner: repository.owner,\n name: repository.name,\n projectId: repository.projectId === undefined ? undefined : String(repository.projectId),\n apiUrl: (repository.apiUrl ?? defaultApiUrl).replace(/\\/+$/, \"\")\n },\n sources: {\n include: config.sources?.include ?? DEFAULT_INCLUDE,\n exclude: config.sources?.exclude ?? DEFAULT_EXCLUDE,\n maxFileBytes: config.sources?.maxFileBytes ?? DEFAULT_MAX_FILE_BYTES\n },\n chunking: {\n lines: config.chunking?.lines ?? DEFAULT_CHUNK_LINES,\n overlap: config.chunking?.overlap ?? DEFAULT_CHUNK_OVERLAP\n },\n embedding: embedding\n ? {\n baseUrl: embedding.baseUrl,\n model: embedding.model,\n fallbackModels: embedding.fallbackModels ?? [],\n referenceModel: embedding.referenceModel ?? embedding.model,\n dimensions: embedding.dimensions ?? DEFAULT_DIMENSIONS,\n batchSize: embedding.batchSize ?? DEFAULT_BATCH_SIZE,\n concurrency: embedding.concurrency ?? DEFAULT_EMBEDDING_CONCURRENCY,\n maxRetries: embedding.maxRetries ?? DEFAULT_MAX_RETRIES,\n maxInputChars: embedding.maxInputChars ?? DEFAULT_MAX_INPUT_CHARS,\n apiKeyEnv: embedding.apiKeyEnv ?? DEFAULT_API_KEY_ENV\n }\n : null,\n attachments: config.attachments ?? [],\n publish: {\n tag: config.publish?.tag ?? DEFAULT_TAG_TEMPLATE,\n assetName: config.publish?.assetName ?? DEFAULT_ASSET_NAME_TEMPLATE,\n packageName: config.publish?.packageName ?? DEFAULT_GITLAB_PACKAGE_NAME,\n createRelease: config.publish?.createRelease ?? false\n }\n };\n}\n","import { access } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { errorMessage } from \"../utils/errorMessage\";\nimport type { ResolvedConfig } from \"./interfaces/ResolvedConfig\";\nimport { registerSelfResolution } from \"./registerSelfResolution\";\nimport { resolveConfig } from \"./resolveConfig\";\n\nasync function importConfigModule(filePath: string): Promise<unknown> {\n const url = pathToFileURL(filePath).href;\n\n if (!/\\.[cm]?ts$/.test(filePath)) {\n return import(url);\n }\n\n const { register } = await import(\"tsx/esm/api\");\n const unregister = register();\n\n try {\n return await import(url);\n } finally {\n await unregister();\n }\n}\n\n/**\n * Loads `source-pack.config.ts` (through tsx) or a `.mjs`/`.js` config, then validates it.\n * Relative paths of the config are resolved against `cwd` (the command's directory).\n */\nexport async function loadConfig(\n configPath: string,\n { cwd = process.cwd(), env = process.env }: { cwd?: string; env?: NodeJS.ProcessEnv } = {}\n): Promise<ResolvedConfig> {\n const filePath = path.resolve(cwd, configPath);\n\n try {\n await access(filePath);\n } catch {\n throw new Error(`source-pack config not found at ${filePath}. Run \"source-pack init\" or pass --config <path>.`);\n }\n\n registerSelfResolution();\n\n let mod: { default?: unknown };\n\n try {\n mod = (await importConfigModule(filePath)) as { default?: unknown };\n } catch (error) {\n throw new Error(`Unable to load source-pack config at ${filePath}: ${errorMessage(error)}`);\n }\n\n return resolveConfig(mod.default ?? mod, { cwd, configPath: filePath, env });\n}\n"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { t as publishSourcePack } from "./publishSourcePack-xNr9RBgv.mjs";
2
-
3
- export { publishSourcePack };