@interfere/build 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,7 +8,6 @@ chunk uploads, and local artifact cleanup. Framework integrations own the sequen
8
8
  of API calls and only delete source maps after the server accepts the full batch.
9
9
 
10
10
  Source-map uploads use 20 concurrent workers by default. Set
11
- `INTERFERE_SOURCEMAP_UPLOAD_CONCURRENCY` to a positive integer to change the limit;
12
11
  the `uploadSourceMapChunks` `concurrency` option takes precedence. Next.js and Vite
13
12
  share this setting. Pass the variable through your build runner when it filters
14
13
  environment variables, such as Turborepo's strict environment mode.
@@ -26,8 +25,7 @@ unless they opt in; Next.js and Vite configure both automatically.
26
25
 
27
26
  `resolveBuildServiceName` from `@interfere/build/service-name` supplies the same
28
27
  service identity policy to Next.js and Vite: an explicit plugin option, then
29
- `OTEL_SERVICE_NAME`, then the app's unscoped `package.json` name. Vite also accepts
30
- its legacy `VITE_INTERFERE_SERVICE_NAME` variable before the package fallback.
28
+ `OTEL_SERVICE_NAME`, then the app's unscoped `package.json` name.
31
29
  Blank values are skipped; a missing or invalid package name leaves the default
32
30
  unset. Each framework injects this value into its browser and server entry points,
33
31
  where explicit runtime service names still take precedence.
package/dist/config.d.cts CHANGED
@@ -1,5 +1,7 @@
1
1
  //#region src/config.d.ts
2
2
  export declare function createBuildConfigResolver(observe?: (result: Awaited<ReturnType<typeof fetchBuildConfig>>) => void): (apiUrl: string, publicKey: string, buildScope?: string) => Promise<{
3
+ anonymousReplayPolicy?: "always" | "never" | "on_error" | undefined;
4
+ backendHosts?: string[] | undefined;
3
5
  ingestUrl?: string | undefined;
4
6
  logSourcing?: "drain" | "sdk" | undefined;
5
7
  platform?: "cloudflare" | "vercel" | undefined;
@@ -13,6 +15,8 @@ export declare function createBuildConfigResolver(observe?: (result: Awaited<Ret
13
15
  } | undefined;
14
16
  serverTracing?: "drain" | "full" | undefined;
15
17
  } | {
18
+ anonymousReplayPolicy?: "always" | "never" | "on_error" | undefined;
19
+ backendHosts?: string[] | undefined;
16
20
  ingestUrl?: string | undefined;
17
21
  logSourcing?: "drain" | "sdk" | undefined;
18
22
  plugins?: {
@@ -28,6 +32,8 @@ export declare function createBuildConfigResolver(observe?: (result: Awaited<Ret
28
32
  }>;
29
33
  declare function fetchBuildConfig(apiUrl: string, publicKey: string): Promise<{
30
34
  config: {
35
+ anonymousReplayPolicy?: "always" | "never" | "on_error" | undefined;
36
+ backendHosts?: string[] | undefined;
31
37
  ingestUrl?: string | undefined;
32
38
  logSourcing?: "drain" | "sdk" | undefined;
33
39
  plugins?: {
@@ -44,6 +50,8 @@ declare function fetchBuildConfig(apiUrl: string, publicKey: string): Promise<{
44
50
  status: "fallback" | "fetched";
45
51
  } | {
46
52
  config: {
53
+ anonymousReplayPolicy?: "always" | "never" | "on_error" | undefined;
54
+ backendHosts?: string[] | undefined;
47
55
  ingestUrl?: string | undefined;
48
56
  logSourcing?: "drain" | "sdk" | undefined;
49
57
  platform?: "cloudflare" | "vercel" | undefined;
package/dist/config.d.mts CHANGED
@@ -1,5 +1,7 @@
1
1
  //#region src/config.d.ts
2
2
  export declare function createBuildConfigResolver(observe?: (result: Awaited<ReturnType<typeof fetchBuildConfig>>) => void): (apiUrl: string, publicKey: string, buildScope?: string) => Promise<{
3
+ anonymousReplayPolicy?: "always" | "never" | "on_error" | undefined;
4
+ backendHosts?: string[] | undefined;
3
5
  ingestUrl?: string | undefined;
4
6
  logSourcing?: "drain" | "sdk" | undefined;
5
7
  platform?: "cloudflare" | "vercel" | undefined;
@@ -13,6 +15,8 @@ export declare function createBuildConfigResolver(observe?: (result: Awaited<Ret
13
15
  } | undefined;
14
16
  serverTracing?: "drain" | "full" | undefined;
15
17
  } | {
18
+ anonymousReplayPolicy?: "always" | "never" | "on_error" | undefined;
19
+ backendHosts?: string[] | undefined;
16
20
  ingestUrl?: string | undefined;
17
21
  logSourcing?: "drain" | "sdk" | undefined;
18
22
  plugins?: {
@@ -28,6 +32,8 @@ export declare function createBuildConfigResolver(observe?: (result: Awaited<Ret
28
32
  }>;
29
33
  declare function fetchBuildConfig(apiUrl: string, publicKey: string): Promise<{
30
34
  config: {
35
+ anonymousReplayPolicy?: "always" | "never" | "on_error" | undefined;
36
+ backendHosts?: string[] | undefined;
31
37
  ingestUrl?: string | undefined;
32
38
  logSourcing?: "drain" | "sdk" | undefined;
33
39
  plugins?: {
@@ -44,6 +50,8 @@ declare function fetchBuildConfig(apiUrl: string, publicKey: string): Promise<{
44
50
  status: "fallback" | "fetched";
45
51
  } | {
46
52
  config: {
53
+ anonymousReplayPolicy?: "always" | "never" | "on_error" | undefined;
54
+ backendHosts?: string[] | undefined;
47
55
  ingestUrl?: string | undefined;
48
56
  logSourcing?: "drain" | "sdk" | undefined;
49
57
  platform?: "cloudflare" | "vercel" | undefined;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_destinations_cloudflare_destination=require("./destinations/cloudflare-destination.cjs"),require_destinations_vercel_destination=require("./destinations/vercel-destination.cjs");let _interfere_types_integrations=require("@interfere/types/integrations"),_interfere_types_sdk_cli_destination=require("@interfere/types/sdk/cli-destination"),_interfere_types_sdk_deploy_environment=require("@interfere/types/sdk/deploy-environment"),_interfere_types_sdk_github_source=require("@interfere/types/sdk/github-source"),node_child_process=require("node:child_process");function git(command){try{return(0,node_child_process.execSync)(command,{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim()||null}catch{return null}}function resolveReleaseRequest(input){if(!_interfere_types_integrations.configuredSourceProviderSchema.safeParse(input.config.surface.sourceProvider).success)return{ok:!1,reason:`missing_source_provider`};let provider=_interfere_types_integrations.releaseDestinationProviderSchema.safeParse(input.config.surface.destinationProvider);if(!provider.success)return{ok:!1,reason:`missing_destination_provider`};let destinations={cli:()=>(0,_interfere_types_sdk_cli_destination.resolveCliReleaseDestination)(process.env,input.releaseSlug),cloudflare:require_destinations_cloudflare_destination.resolve,vercel:require_destinations_vercel_destination.resolve};return{ok:!0,request:{buildId:input.buildId,destination:(0,_interfere_types_sdk_deploy_environment.applyDeployEnvironment)(destinations[provider.data](),input.environment),producerVersion:input.producerVersion,slug:input.releaseSlug,source:(0,_interfere_types_sdk_github_source.resolveGithubReleaseSource)(process.env,git)}}}exports.resolveReleaseRequest=resolveReleaseRequest;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_destinations_cloudflare_destination=require("./destinations/cloudflare-destination.cjs"),require_destinations_vercel_destination=require("./destinations/vercel-destination.cjs");let zod=require("zod"),_interfere_types_integrations=require("@interfere/types/integrations"),_interfere_types_sdk_cli_destination=require("@interfere/types/sdk/cli-destination"),_interfere_types_sdk_deploy_environment=require("@interfere/types/sdk/deploy-environment"),_interfere_types_sdk_github_source=require("@interfere/types/sdk/github-source"),node_child_process=require("node:child_process");function git(command){try{return(0,node_child_process.execSync)(command,{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim()||null}catch{return null}}function resolveReleaseRequest(input){if(!_interfere_types_integrations.configuredSourceProviderSchema.safeParse(input.config.surface.sourceProvider).success)return{ok:!1,reason:`missing_source_provider`};let provider=_interfere_types_integrations.releaseDestinationProviderSchema.safeParse(input.config.surface.destinationProvider);if(!provider.success)return{ok:!1,reason:`missing_destination_provider`};let destinations={cli:()=>(0,_interfere_types_sdk_cli_destination.resolveCliReleaseDestination)(process.env,input.releaseSlug),cloudflare:require_destinations_cloudflare_destination.resolve,vercel:require_destinations_vercel_destination.resolve};return{ok:!0,request:{buildId:input.buildId,destination:(0,_interfere_types_sdk_deploy_environment.applyDeployEnvironment)(destinations[provider.data](),input.environment),producerVersion:input.producerVersion,slug:input.releaseSlug,source:(0,_interfere_types_sdk_github_source.resolveGithubReleaseSource)(process.env,git)}}}const releaseBindingSchema=zod.z.object({org:zod.z.object({id:zod.z.string(),slug:zod.z.string().min(1)}),surface:zod.z.object({id:zod.z.string(),slug:zod.z.string().min(1),sourceProvider:zod.z.string().nullable(),destinationProvider:zod.z.string().nullable()})});async function preflightReleaseBinding(client){try{let config=await client.releases.getReleasesConfig({abortSignal:AbortSignal.timeout(1e4)});return releaseBindingSchema.safeParse(config).success?config:null}catch{return null}}function missingReleaseBinding(config){let source=_interfere_types_integrations.configuredSourceProviderSchema.safeParse(config.surface.sourceProvider),destination=_interfere_types_integrations.releaseDestinationProviderSchema.safeParse(config.surface.destinationProvider);return source.success&&destination.success?null:`Interfere is disabled for this build: configure the surface's ${source.success?`deployment target`:`version control provider`} at https://interfere.com/~/${config.org.slug}/apps/${config.surface.slug}`}exports.missingReleaseBinding=missingReleaseBinding,exports.preflightReleaseBinding=preflightReleaseBinding,exports.resolveReleaseRequest=resolveReleaseRequest;
@@ -1,4 +1,4 @@
1
- import { Interfere } from "@interfere/javascript";
1
+ import { Interfere, InterfereClient } from "@interfere/javascript";
2
2
  import { ReleaseSlug } from "@interfere/types/releases/slug";
3
3
  //#region src/release-request.d.ts
4
4
  export declare function resolveReleaseRequest(input: {
@@ -49,6 +49,8 @@ export declare function resolveReleaseRequest(input: {
49
49
  producerVersion?: string | undefined;
50
50
  slug?: string | undefined;
51
51
  source: {
52
+ authorLogin?: string | null | undefined;
53
+ authorAvatarUrl?: string | null | undefined;
52
54
  branch: string;
53
55
  commitMessage: string;
54
56
  commitSha: string | null;
@@ -70,4 +72,8 @@ export declare function resolveReleaseRequest(input: {
70
72
  };
71
73
  };
72
74
  };
75
+ /** Fetch release bindings before compilation, retaining runtime capture when lookup is unavailable. */
76
+ export declare function preflightReleaseBinding(client: InterfereClient): Promise<Interfere.ReleasesConfigResponse | null>;
77
+ /** Describe a confirmed incomplete surface without exposing credentials. */
78
+ export declare function missingReleaseBinding(config: Interfere.ReleasesConfigResponse): string | null;
73
79
  //#endregion
@@ -1,4 +1,4 @@
1
- import { Interfere } from "@interfere/javascript";
1
+ import { Interfere, InterfereClient } from "@interfere/javascript";
2
2
  import { ReleaseSlug } from "@interfere/types/releases/slug";
3
3
  //#region src/release-request.d.ts
4
4
  export declare function resolveReleaseRequest(input: {
@@ -49,6 +49,8 @@ export declare function resolveReleaseRequest(input: {
49
49
  producerVersion?: string | undefined;
50
50
  slug?: string | undefined;
51
51
  source: {
52
+ authorLogin?: string | null | undefined;
53
+ authorAvatarUrl?: string | null | undefined;
52
54
  branch: string;
53
55
  commitMessage: string;
54
56
  commitSha: string | null;
@@ -70,4 +72,8 @@ export declare function resolveReleaseRequest(input: {
70
72
  };
71
73
  };
72
74
  };
75
+ /** Fetch release bindings before compilation, retaining runtime capture when lookup is unavailable. */
76
+ export declare function preflightReleaseBinding(client: InterfereClient): Promise<Interfere.ReleasesConfigResponse | null>;
77
+ /** Describe a confirmed incomplete surface without exposing credentials. */
78
+ export declare function missingReleaseBinding(config: Interfere.ReleasesConfigResponse): string | null;
73
79
  //#endregion
@@ -1 +1 @@
1
- import{resolve}from"./destinations/cloudflare-destination.mjs";import{resolve as resolve$1}from"./destinations/vercel-destination.mjs";import{configuredSourceProviderSchema,releaseDestinationProviderSchema}from"@interfere/types/integrations";import{resolveCliReleaseDestination}from"@interfere/types/sdk/cli-destination";import{applyDeployEnvironment}from"@interfere/types/sdk/deploy-environment";import{resolveGithubReleaseSource}from"@interfere/types/sdk/github-source";import{execSync}from"node:child_process";function git(command){try{return execSync(command,{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim()||null}catch{return null}}function resolveReleaseRequest(input){if(!configuredSourceProviderSchema.safeParse(input.config.surface.sourceProvider).success)return{ok:!1,reason:`missing_source_provider`};let provider=releaseDestinationProviderSchema.safeParse(input.config.surface.destinationProvider);if(!provider.success)return{ok:!1,reason:`missing_destination_provider`};let destinations={cli:()=>resolveCliReleaseDestination(process.env,input.releaseSlug),cloudflare:resolve,vercel:resolve$1};return{ok:!0,request:{buildId:input.buildId,destination:applyDeployEnvironment(destinations[provider.data](),input.environment),producerVersion:input.producerVersion,slug:input.releaseSlug,source:resolveGithubReleaseSource(process.env,git)}}}export{resolveReleaseRequest};
1
+ import{resolve}from"./destinations/cloudflare-destination.mjs";import{resolve as resolve$1}from"./destinations/vercel-destination.mjs";import{z}from"zod";import{configuredSourceProviderSchema,releaseDestinationProviderSchema}from"@interfere/types/integrations";import{resolveCliReleaseDestination}from"@interfere/types/sdk/cli-destination";import{applyDeployEnvironment}from"@interfere/types/sdk/deploy-environment";import{resolveGithubReleaseSource}from"@interfere/types/sdk/github-source";import{execSync}from"node:child_process";function git(command){try{return execSync(command,{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]}).trim()||null}catch{return null}}function resolveReleaseRequest(input){if(!configuredSourceProviderSchema.safeParse(input.config.surface.sourceProvider).success)return{ok:!1,reason:`missing_source_provider`};let provider=releaseDestinationProviderSchema.safeParse(input.config.surface.destinationProvider);if(!provider.success)return{ok:!1,reason:`missing_destination_provider`};let destinations={cli:()=>resolveCliReleaseDestination(process.env,input.releaseSlug),cloudflare:resolve,vercel:resolve$1};return{ok:!0,request:{buildId:input.buildId,destination:applyDeployEnvironment(destinations[provider.data](),input.environment),producerVersion:input.producerVersion,slug:input.releaseSlug,source:resolveGithubReleaseSource(process.env,git)}}}const releaseBindingSchema=z.object({org:z.object({id:z.string(),slug:z.string().min(1)}),surface:z.object({id:z.string(),slug:z.string().min(1),sourceProvider:z.string().nullable(),destinationProvider:z.string().nullable()})});async function preflightReleaseBinding(client){try{let config=await client.releases.getReleasesConfig({abortSignal:AbortSignal.timeout(1e4)});return releaseBindingSchema.safeParse(config).success?config:null}catch{return null}}function missingReleaseBinding(config){let source=configuredSourceProviderSchema.safeParse(config.surface.sourceProvider),destination=releaseDestinationProviderSchema.safeParse(config.surface.destinationProvider);return source.success&&destination.success?null:`Interfere is disabled for this build: configure the surface's ${source.success?`deployment target`:`version control provider`} at https://interfere.com/~/${config.org.slug}/apps/${config.surface.slug}`}export{missingReleaseBinding,preflightReleaseBinding,resolveReleaseRequest};
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let _interfere_types_sdk_runtime=require("@interfere/types/sdk/runtime"),node_fs=require("node:fs"),node_path=require("node:path");const SCOPE_PREFIX=/^@[^/]+\//u;function nonEmpty(value){return value?.trim()||void 0}function packageServiceName(root){let manifest;try{manifest=JSON.parse((0,node_fs.readFileSync)((0,node_path.join)(root,`package.json`),`utf8`))}catch{return}if(typeof manifest==`object`&&manifest&&`name`in manifest)return typeof manifest.name==`string`?nonEmpty(manifest.name.trim().replace(SCOPE_PREFIX,``)):void 0}function resolveBuildServiceName({root,option,env=(0,_interfere_types_sdk_runtime.readProcessEnv)()??{},legacyEnvName}){return nonEmpty(option)??nonEmpty(env.OTEL_SERVICE_NAME)??nonEmpty(legacyEnvName?env[legacyEnvName]:void 0)??packageServiceName(root)}exports.resolveBuildServiceName=resolveBuildServiceName;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let _interfere_types_sdk_runtime=require("@interfere/types/sdk/runtime"),node_fs=require("node:fs"),node_path=require("node:path");const SCOPE_PREFIX=/^@[^/]+\//u;function nonEmpty(value){return value?.trim()||void 0}function packageServiceName(root){let manifest;try{manifest=JSON.parse((0,node_fs.readFileSync)((0,node_path.join)(root,`package.json`),`utf8`))}catch{return}if(typeof manifest==`object`&&manifest&&`name`in manifest)return typeof manifest.name==`string`?nonEmpty(manifest.name.trim().replace(SCOPE_PREFIX,``)):void 0}function resolveBuildServiceName({root,option,env=(0,_interfere_types_sdk_runtime.readProcessEnv)()??{}}){return nonEmpty(option)??nonEmpty(env.OTEL_SERVICE_NAME)??packageServiceName(root)}exports.resolveBuildServiceName=resolveBuildServiceName;
@@ -1,9 +1,8 @@
1
1
  //#region src/service-name.d.ts
2
- /** Resolve a build's service name from an option, OTEL_SERVICE_NAME, a legacy environment alias, or its unscoped app package name. */
3
- export declare function resolveBuildServiceName({ root, option, env, legacyEnvName }: {
2
+ /** Resolve a build's service name from an option, OTEL_SERVICE_NAME, or its unscoped app package name. */
3
+ export declare function resolveBuildServiceName({ root, option, env }: {
4
4
  root: string;
5
5
  option?: string | undefined;
6
6
  env?: Readonly<Record<string, string | undefined>>;
7
- legacyEnvName?: string;
8
7
  }): string | undefined;
9
8
  //#endregion
@@ -1,9 +1,8 @@
1
1
  //#region src/service-name.d.ts
2
- /** Resolve a build's service name from an option, OTEL_SERVICE_NAME, a legacy environment alias, or its unscoped app package name. */
3
- export declare function resolveBuildServiceName({ root, option, env, legacyEnvName }: {
2
+ /** Resolve a build's service name from an option, OTEL_SERVICE_NAME, or its unscoped app package name. */
3
+ export declare function resolveBuildServiceName({ root, option, env }: {
4
4
  root: string;
5
5
  option?: string | undefined;
6
6
  env?: Readonly<Record<string, string | undefined>>;
7
- legacyEnvName?: string;
8
7
  }): string | undefined;
9
8
  //#endregion
@@ -1 +1 @@
1
- import{readProcessEnv}from"@interfere/types/sdk/runtime";import{readFileSync}from"node:fs";import{join}from"node:path";const SCOPE_PREFIX=/^@[^/]+\//u;function nonEmpty(value){return value?.trim()||void 0}function packageServiceName(root){let manifest;try{manifest=JSON.parse(readFileSync(join(root,`package.json`),`utf8`))}catch{return}if(typeof manifest==`object`&&manifest&&`name`in manifest)return typeof manifest.name==`string`?nonEmpty(manifest.name.trim().replace(SCOPE_PREFIX,``)):void 0}function resolveBuildServiceName({root,option,env=readProcessEnv()??{},legacyEnvName}){return nonEmpty(option)??nonEmpty(env.OTEL_SERVICE_NAME)??nonEmpty(legacyEnvName?env[legacyEnvName]:void 0)??packageServiceName(root)}export{resolveBuildServiceName};
1
+ import{readProcessEnv}from"@interfere/types/sdk/runtime";import{readFileSync}from"node:fs";import{join}from"node:path";const SCOPE_PREFIX=/^@[^/]+\//u;function nonEmpty(value){return value?.trim()||void 0}function packageServiceName(root){let manifest;try{manifest=JSON.parse(readFileSync(join(root,`package.json`),`utf8`))}catch{return}if(typeof manifest==`object`&&manifest&&`name`in manifest)return typeof manifest.name==`string`?nonEmpty(manifest.name.trim().replace(SCOPE_PREFIX,``)):void 0}function resolveBuildServiceName({root,option,env=readProcessEnv()??{}}){return nonEmpty(option)??nonEmpty(env.OTEL_SERVICE_NAME)??packageServiceName(root)}export{resolveBuildServiceName};
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_source_maps_upload_source_map_batch=require("./upload-source-map-batch.cjs"),require_source_maps_upload_source_map_request=require("./upload-source-map-request.cjs");let _interfere_types_data_source_map_upload_batch=require("@interfere/types/data/source-map-upload-batch");async function uploadSourceMapChunks(options){let{client,environment,files,releaseSlug,signed}=options,concurrency=options.concurrency??Number(process.env.INTERFERE_SOURCEMAP_UPLOAD_CONCURRENCY??20);if(!Number.isSafeInteger(concurrency)||concurrency<1)throw Error(`Source-map upload concurrency must be a positive integer`);let capability=_interfere_types_data_source_map_upload_batch.sourceMapBatchCapability.safeParse(signed.batchUpload),supportsGzip=capability.success&&capability.data.compression===`gzip`,chunkBytes=supportsGzip?8388608:524288,headers=options.compression===`gzip`&&supportsGzip?{"content-encoding":`gzip`}:void 0,controller=new AbortController;try{let sessionDeadlineMs=signed.expiresAt*1e3,assertSessionOpen=()=>{if(!Number.isFinite(sessionDeadlineMs)||Date.now()>=sessionDeadlineMs)throw Error(`Source-map upload session expired`)};assertSessionOpen();let abortSignal=AbortSignal.any([controller.signal,AbortSignal.timeout(sessionDeadlineMs-Date.now())]),expected=new Set(files.map(file=>file.path));if(signed.uploads.length!==files.length||new Set(signed.uploads.map(file=>file.path)).size!==files.length||signed.uploads.some(file=>!expected.has(file.path)))throw Error(`Source-map server returned a different batch`);let jobs=require_source_maps_upload_source_map_batch.sourceMapUploadJobs(files,signed.batchUpload),totalBytes=0;return await Promise.all(Array.from({length:Math.min(concurrency,files.length)},async()=>{for(let job of jobs){if(abortSignal.throwIfAborted(),assertSessionOpen(),job.chunks){await require_source_maps_upload_source_map_request.uploadSourceMapRequest(async()=>await client.releases.uploadSourceMapBatch({releaseSlug,environment,chunks:job.chunks},{abortSignal,headers}),abortSignal),totalBytes+=job.rawBytes;continue}let{file}=job,bytes=new TextEncoder().encode(file.content);for(let offset=0;offset<bytes.byteLength;offset+=chunkBytes){assertSessionOpen();let chunk=new Blob([bytes.subarray(offset,offset+chunkBytes)]);await require_source_maps_upload_source_map_request.uploadSourceMapRequest(async()=>await client.releases.uploadSourceMap(chunk,releaseSlug,{environment,path:file.path,offset},{abortSignal,headers:{...headers,"x-interfere-source-map-size":String(chunk.size)}}),abortSignal)}totalBytes+=bytes.byteLength}})),assertSessionOpen(),totalBytes}finally{controller.abort()}}exports.uploadSourceMapChunks=uploadSourceMapChunks;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const require_source_maps_upload_source_map_batch=require("./upload-source-map-batch.cjs"),require_source_maps_upload_source_map_request=require("./upload-source-map-request.cjs");let _interfere_types_data_source_map_upload_batch=require("@interfere/types/data/source-map-upload-batch");async function uploadSourceMapChunks(options){let{client,environment,files,releaseSlug,signed}=options,concurrency=options.concurrency??20;if(!Number.isSafeInteger(concurrency)||concurrency<1)throw Error(`Source-map upload concurrency must be a positive integer`);let capability=_interfere_types_data_source_map_upload_batch.sourceMapBatchCapability.safeParse(signed.batchUpload),supportsGzip=capability.success&&capability.data.compression===`gzip`,chunkBytes=supportsGzip?8388608:524288,headers=options.compression===`gzip`&&supportsGzip?{"content-encoding":`gzip`}:void 0,controller=new AbortController;try{let sessionDeadlineMs=signed.expiresAt*1e3,assertSessionOpen=()=>{if(!Number.isFinite(sessionDeadlineMs)||Date.now()>=sessionDeadlineMs)throw Error(`Source-map upload session expired`)};assertSessionOpen();let abortSignal=AbortSignal.any([controller.signal,AbortSignal.timeout(sessionDeadlineMs-Date.now())]),expected=new Set(files.map(file=>file.path));if(signed.uploads.length!==files.length||new Set(signed.uploads.map(file=>file.path)).size!==files.length||signed.uploads.some(file=>!expected.has(file.path)))throw Error(`Source-map server returned a different batch`);let jobs=require_source_maps_upload_source_map_batch.sourceMapUploadJobs(files,signed.batchUpload),totalBytes=0;return await Promise.all(Array.from({length:Math.min(concurrency,files.length)},async()=>{for(let job of jobs){if(abortSignal.throwIfAborted(),assertSessionOpen(),job.chunks){await require_source_maps_upload_source_map_request.uploadSourceMapRequest(async()=>await client.releases.uploadSourceMapBatch({releaseSlug,environment,chunks:job.chunks},{abortSignal,headers}),abortSignal),totalBytes+=job.rawBytes;continue}let{file}=job,bytes=new TextEncoder().encode(file.content);for(let offset=0;offset<bytes.byteLength;offset+=chunkBytes){assertSessionOpen();let chunk=new Blob([bytes.subarray(offset,offset+chunkBytes)]);await require_source_maps_upload_source_map_request.uploadSourceMapRequest(async()=>await client.releases.uploadSourceMap(chunk,releaseSlug,{environment,path:file.path,offset},{abortSignal,headers:{...headers,"x-interfere-source-map-size":String(chunk.size)}}),abortSignal)}totalBytes+=bytes.byteLength}})),assertSessionOpen(),totalBytes}finally{controller.abort()}}exports.uploadSourceMapChunks=uploadSourceMapChunks;
@@ -5,7 +5,7 @@ export declare function uploadSourceMapChunks(options: {
5
5
  releaseSlug: string;
6
6
  environment?: string | undefined;
7
7
  signed: Interfere.SourceMapUploadSessionResponse;
8
- concurrency?: number;
8
+ concurrency?: number | undefined;
9
9
  /** Requires sourceMapUploadFetch on the client; defaults to identity. */
10
10
  compression?: "gzip";
11
11
  files: readonly (Interfere.CompleteSourceMapFile & {
@@ -5,7 +5,7 @@ export declare function uploadSourceMapChunks(options: {
5
5
  releaseSlug: string;
6
6
  environment?: string | undefined;
7
7
  signed: Interfere.SourceMapUploadSessionResponse;
8
- concurrency?: number;
8
+ concurrency?: number | undefined;
9
9
  /** Requires sourceMapUploadFetch on the client; defaults to identity. */
10
10
  compression?: "gzip";
11
11
  files: readonly (Interfere.CompleteSourceMapFile & {
@@ -1 +1 @@
1
- import{sourceMapUploadJobs}from"./upload-source-map-batch.mjs";import{uploadSourceMapRequest}from"./upload-source-map-request.mjs";import{sourceMapBatchCapability}from"@interfere/types/data/source-map-upload-batch";async function uploadSourceMapChunks(options){let{client,environment,files,releaseSlug,signed}=options,concurrency=options.concurrency??Number(process.env.INTERFERE_SOURCEMAP_UPLOAD_CONCURRENCY??20);if(!Number.isSafeInteger(concurrency)||concurrency<1)throw Error(`Source-map upload concurrency must be a positive integer`);let capability=sourceMapBatchCapability.safeParse(signed.batchUpload),supportsGzip=capability.success&&capability.data.compression===`gzip`,chunkBytes=supportsGzip?8388608:524288,headers=options.compression===`gzip`&&supportsGzip?{"content-encoding":`gzip`}:void 0,controller=new AbortController;try{let sessionDeadlineMs=signed.expiresAt*1e3,assertSessionOpen=()=>{if(!Number.isFinite(sessionDeadlineMs)||Date.now()>=sessionDeadlineMs)throw Error(`Source-map upload session expired`)};assertSessionOpen();let abortSignal=AbortSignal.any([controller.signal,AbortSignal.timeout(sessionDeadlineMs-Date.now())]),expected=new Set(files.map(file=>file.path));if(signed.uploads.length!==files.length||new Set(signed.uploads.map(file=>file.path)).size!==files.length||signed.uploads.some(file=>!expected.has(file.path)))throw Error(`Source-map server returned a different batch`);let jobs=sourceMapUploadJobs(files,signed.batchUpload),totalBytes=0;return await Promise.all(Array.from({length:Math.min(concurrency,files.length)},async()=>{for(let job of jobs){if(abortSignal.throwIfAborted(),assertSessionOpen(),job.chunks){await uploadSourceMapRequest(async()=>await client.releases.uploadSourceMapBatch({releaseSlug,environment,chunks:job.chunks},{abortSignal,headers}),abortSignal),totalBytes+=job.rawBytes;continue}let{file}=job,bytes=new TextEncoder().encode(file.content);for(let offset=0;offset<bytes.byteLength;offset+=chunkBytes){assertSessionOpen();let chunk=new Blob([bytes.subarray(offset,offset+chunkBytes)]);await uploadSourceMapRequest(async()=>await client.releases.uploadSourceMap(chunk,releaseSlug,{environment,path:file.path,offset},{abortSignal,headers:{...headers,"x-interfere-source-map-size":String(chunk.size)}}),abortSignal)}totalBytes+=bytes.byteLength}})),assertSessionOpen(),totalBytes}finally{controller.abort()}}export{uploadSourceMapChunks};
1
+ import{sourceMapUploadJobs}from"./upload-source-map-batch.mjs";import{uploadSourceMapRequest}from"./upload-source-map-request.mjs";import{sourceMapBatchCapability}from"@interfere/types/data/source-map-upload-batch";async function uploadSourceMapChunks(options){let{client,environment,files,releaseSlug,signed}=options,concurrency=options.concurrency??20;if(!Number.isSafeInteger(concurrency)||concurrency<1)throw Error(`Source-map upload concurrency must be a positive integer`);let capability=sourceMapBatchCapability.safeParse(signed.batchUpload),supportsGzip=capability.success&&capability.data.compression===`gzip`,chunkBytes=supportsGzip?8388608:524288,headers=options.compression===`gzip`&&supportsGzip?{"content-encoding":`gzip`}:void 0,controller=new AbortController;try{let sessionDeadlineMs=signed.expiresAt*1e3,assertSessionOpen=()=>{if(!Number.isFinite(sessionDeadlineMs)||Date.now()>=sessionDeadlineMs)throw Error(`Source-map upload session expired`)};assertSessionOpen();let abortSignal=AbortSignal.any([controller.signal,AbortSignal.timeout(sessionDeadlineMs-Date.now())]),expected=new Set(files.map(file=>file.path));if(signed.uploads.length!==files.length||new Set(signed.uploads.map(file=>file.path)).size!==files.length||signed.uploads.some(file=>!expected.has(file.path)))throw Error(`Source-map server returned a different batch`);let jobs=sourceMapUploadJobs(files,signed.batchUpload),totalBytes=0;return await Promise.all(Array.from({length:Math.min(concurrency,files.length)},async()=>{for(let job of jobs){if(abortSignal.throwIfAborted(),assertSessionOpen(),job.chunks){await uploadSourceMapRequest(async()=>await client.releases.uploadSourceMapBatch({releaseSlug,environment,chunks:job.chunks},{abortSignal,headers}),abortSignal),totalBytes+=job.rawBytes;continue}let{file}=job,bytes=new TextEncoder().encode(file.content);for(let offset=0;offset<bytes.byteLength;offset+=chunkBytes){assertSessionOpen();let chunk=new Blob([bytes.subarray(offset,offset+chunkBytes)]);await uploadSourceMapRequest(async()=>await client.releases.uploadSourceMap(chunk,releaseSlug,{environment,path:file.path,offset},{abortSignal,headers:{...headers,"x-interfere-source-map-size":String(chunk.size)}}),abortSignal)}totalBytes+=bytes.byteLength}})),assertSessionOpen(),totalBytes}finally{controller.abort()}}export{uploadSourceMapChunks};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@interfere/build",
3
- "version": "0.4.3",
3
+ "version": "0.4.4",
4
4
  "description": "Release preparation for Interfere build integrations.",
5
5
  "keywords": [
6
6
  "build",
@@ -103,8 +103,9 @@
103
103
  "typecheck": "bun check"
104
104
  },
105
105
  "dependencies": {
106
- "@interfere/javascript": "^0.3.1",
107
- "@interfere/types": "^10.6.1"
106
+ "@interfere/javascript": "^0.3.2",
107
+ "@interfere/types": "^10.6.2",
108
+ "zod": "4.6.6"
108
109
  },
109
110
  "devDependencies": {
110
111
  "@interfere/typescript-config": "^9.0.2",