@shipstatic/ship 3.4.0-beta.9 → 3.4.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.d.cts CHANGED
@@ -1846,15 +1846,17 @@ declare const SPA_DEFAULT_CONFIG: {
1846
1846
  * "100KB". `INDEX_FILE` is the selection rule (the file whose content rides
1847
1847
  * `SPACheckRequest.index`), restated by every client that builds the request.
1848
1848
  *
1849
- * Neither member is a validation boundary: a client over the cap simply
1850
- * skips the pre-flight, because the server answers an oversized index
1851
- * `isSPA: false` anyway. A consumer that cannot import this (n8n) needs no
1852
- * size copy at all — outcome parity is the server's, not the client's.
1849
+ * Neither member is a validation boundary: a client over the cap skips the
1850
+ * pre-flight and answers "no" itself, which is the answer the server gives an
1851
+ * oversized index. Every client holds the cap, in bytes: the server's own
1852
+ * route refuses a body over the JSON intake cap, so a client that asked about
1853
+ * any index would fail a deploy whose upload succeeds. The n8n node, which
1854
+ * cannot import this, restates the number under its contract fence.
1853
1855
  */
1854
1856
  declare const SPA_CHECK_CONSTRAINTS: {
1855
1857
  /** The file whose content is the check's subject. */
1856
1858
  readonly INDEX_FILE: "index.html";
1857
- /** Skip the pre-flight above this size — the server would answer false. */
1859
+ /** Skip the pre-flight above this many UTF-8 bytes: the server answers no. */
1858
1860
  readonly MAX_INDEX_BYTES: number;
1859
1861
  };
1860
1862
  /**
@@ -1979,28 +1981,19 @@ interface SPACheckRequest {
1979
1981
  index: string;
1980
1982
  }
1981
1983
  /**
1982
- * Response from SPA check endpoint
1983
- */
1984
- /**
1985
- * Which of the classifier's tiers reached the verdict, and why. Named rather
1986
- * than inline so the API's own `checkSPA` can return `SPACheckResponse`
1987
- * instead of restating its shape.
1988
- */
1989
- interface SPACheckDebug {
1990
- /** Which tier made the detection */
1991
- tier: 'exclusions' | 'inclusions' | 'scoring' | 'ai' | 'fallback';
1992
- /** The reason for the detection result */
1993
- reason: string;
1994
- }
1995
- /**
1996
- * A report: it answers a question and carries only the answer (`CLAUDE.md`,
1997
- * "A report answers a question").
1984
+ * The `/spa-check` answer: whether the upload is a single-page app, and the
1985
+ * one sentence saying why it was or was not detected.
1986
+ *
1987
+ * `reason` is there so anyone can ask the open route about an upload and
1988
+ * read the answer. It is human-readable text under the message authoring law:
1989
+ * clients branch on `isSPA`, never on the sentence, so its wording is not a
1990
+ * contract.
1998
1991
  */
1999
1992
  interface SPACheckResponse {
2000
- /** Whether the project is detected as a Single Page Application */
1993
+ /** Whether the upload is detected as a single-page app */
2001
1994
  isSPA: boolean;
2002
- /** Debugging information about detection */
2003
- debug: SPACheckDebug;
1995
+ /** Why it was or was not detected, for a person to read */
1996
+ reason: string;
2004
1997
  }
2005
1998
  /**
2006
1999
  * Represents a file that has been processed and is ready for deploy.
@@ -3694,27 +3687,25 @@ declare function calculateMD5(input: Blob | Buffer | string): Promise<MD5Result>
3694
3687
  * and add nothing, so a sentence names its file exactly once and states the
3695
3688
  * limit, and reads without a prefix. The family is subject first: `File
3696
3689
  * "<path>" <verdict>. Maximum <limit> allowed.`, and `File name "<path>" …`
3697
- * where the name is the subject. The total-size rule's subject is the set of
3698
- * files, which is why it names no path. A limit's sentence ends with the way
3699
- * forward the API delivered for it (`withWayForward`), so the whole reads
3700
- * `File "x" is too large. Maximum 20 MB allowed. Upgrade to Pro for more.`
3701
- *
3702
- * **Wording follows the API where a choice existed**, so the deferred Phase B
3703
- * (promoting this table to `@shipstatic/types` with the API consuming it) has
3704
- * less to move. Two deliberate deviations, recorded rather than silent:
3705
- *
3706
- * - **Sizes are formatted, not raw bytes.** The API says `20971520 bytes`;
3707
- * a browser upload UI showing that is worse for the person reading it, and
3708
- * the unit is the smaller half of the sentence to reconcile later.
3709
- * - **The path is named.** The API has no path to name; the throwing renderer
3710
- * has nothing BUT the message, so dropping it would leave a CLI user asking
3711
- * which file.
3690
+ * where the name is the subject. The two rules about the SET, the count and
3691
+ * the total, name no path. A limit's sentence ends with the suggestion the
3692
+ * API delivered for it (`withSuggestion`), so the whole reads `File "x" is
3693
+ * too large. Maximum 20 MB allowed. Upgrade to Pro for more.`
3694
+ *
3695
+ * **The API words the same rules the same way, in the same order**
3696
+ * (`cloudflare/api/src/lib/validation.ts`), so a refusal reads alike whether
3697
+ * the SDK made it before uploading or the boundary made it after. Sizes are
3698
+ * formatted on both sides, and the path is named on both. That is a
3699
+ * restatement, and it is fenced from the API's side: a test there imports
3700
+ * this package's `validateFiles` and compares every shared rule's sentence to
3701
+ * `validateUpload`'s. The fence dies the day the table is promoted to
3702
+ * `@shipstatic/types` and the API imports it (Phase B, `CLAUDE.md`).
3712
3703
  *
3713
3704
  * Out of scope, and left where they are: `validateDeployPath` (a rule about
3714
3705
  * the deploy PATH rather than the file, and pipelines-only), and
3715
- * `validateFiles`' UI-tier pre-checks (empty, negative, count, unbuilt
3716
- * marker, processing error), which have one holder each and no drift, and
3717
- * word their sentences by the same family.
3706
+ * `validateFiles`' UI-tier pre-checks (empty, negative, unbuilt marker,
3707
+ * processing error), which have one holder each and no drift, and word their
3708
+ * sentences by the same family.
3718
3709
  */
3719
3710
 
3720
3711
  /** What a rule is asked about: one file, and the deploy so far. */
@@ -3766,6 +3757,15 @@ declare function validateDeployPath(deployPath: string, sourceIdentifier: string
3766
3757
  * @throws {ShipError} The first broken rule's sentence
3767
3758
  */
3768
3759
  declare function validateDeployFile(input: FileRuleInput, limits: PlatformLimits): void;
3760
+ /**
3761
+ * The throwing renderer of `COUNT_RULE`: the deploy's file count, judged over
3762
+ * the files the pipeline will send.
3763
+ *
3764
+ * @param count - How many files the deploy carries
3765
+ * @param limits - The platform's limits, from `/limits`
3766
+ * @throws {ShipError} The count rule's sentence
3767
+ */
3768
+ declare function validateDeployCount(count: number, limits: PlatformLimits): void;
3769
3769
 
3770
3770
  /**
3771
3771
  * Utility functions for string manipulation.
@@ -3855,6 +3855,6 @@ declare class Ship extends Ship$1 {
3855
3855
  }
3856
3856
 
3857
3857
  declare namespace Ship {
3858
- export { ACCOUNT_HEADER, API_KEY, API_PATHS, AUTH_BASE_PATH, Account, AccountAccess, AccountDeleteResponse, AccountKeyResponse, AccountPlan, AccountPlanType, AccountRefusal, AccountRefusalType, AccountResource, AccountRole, Activity, ActivityEvent, ActivityListResponse, ActivityMeta, ApiDeployOptions, ApiHttp, ApiHttpOptions, AuthMethod, AuthMethodType, BUILD_SETTINGS, BillingInterval, BillingPortalSession, BillingSyncResponse, BuildFailureDetails, CALLER, Caps, ConsoleErrand, ConsolePaths, ConsoleSection, DEFAULT_API, DEPLOYMENT_CONFIG_FILENAME, DEPLOY_FIELDS, DEPLOY_FILE_GRAMMAR, DEPLOY_TOKEN, DeployBodyContext, DeployFile, DeployFileEncoding, DeployFileSpec, DeployInput, DeployTransport, Deployment, DeploymentCreateResponse, DeploymentDeleteResponse, DeploymentListResponse, DeploymentOptions, DeploymentResource, DeploymentResourceContext, DeploymentSetOptions, DeploymentStatus, DeploymentStatusType, DeploymentUploadOptions, DeploymentVia, DeploymentViaType, DnsLookup, DnsProvider, DnsRecord, DnsRecordType, Domain, DomainDeleteResponse, DomainDnsResponse, DomainListResponse, DomainRecordsResponse, DomainResource, DomainSetOptions, DomainSetResult, DomainShareResponse, DomainStatus, DomainStatusType, DomainValidateResponse, DomainVerification, DomainVerificationType, DomainVerifyResponse, ErrorResponse, ErrorType, ExecutionEnvironment, FileValidationStatus as FILE_VALIDATION_STATUS, Fetch, FileValidationResult, FileValidationStatus, FileValidationStatusType, IDEMPOTENCY_KEY_CONSTRAINTS, JUNK_DIRECTORIES, LABEL_CONSTRAINTS, LABEL_PATTERN, LabelsResponse, ListOptions, ListResponse, MD5Result, MY_API_KEY_URL, OAUTH_TOKEN, OAuthScope, OAuthScopeType, PASSWORD_CONSTRAINTS, PUBLIC_DEPLOYMENT_TTL_SECONDS, PingResponse, Plan, PlanChangeRefusalDetails, PlanChangeRequest, PlanChangeResponse, PlanDestination, PlansResponse, PlatformLimitKey, PlatformLimits, RequestResult, ResourceContext, SECTIONS, SETUP_TROUBLESHOOTING_ANCHOR, SHIP_ENV, SHIP_VIA_ENV, SIGN_IN_RETURN_PARAM, SPACheckDebug, SPACheckRequest, SPACheckResponse, SPA_CHECK_CONSTRAINTS, SPA_DEFAULT_CONFIG, ScheduledChange, SettingsFragment, SetupInstructionsResponse, ShipClientOptions, ShipError, ShipEvents, ShipRequestInit, StaticFile, TTL_CONSTRAINTS, Token, TokenCreateOptions, TokenCreateResponse, TokenDeleteResponse, TokenKind, TokenKindType, TokenListResponse, TokenProvider, TokenResource, Transport, UNBUILT_PROJECT_MARKERS, UNSAFE_FILENAME_CHARS, USER_VISIBLE_EVENTS, UploadedFile, UserVisibleActivityEvent, ValidatableFile, ValidationIssue, WEB_FILE_ACCEPT, __setTestEnvironment, accountOfPath, allValidFilesReady, assertShipJsonSyntax, billingReturnOf, calculateMD5, classifyToken, consolePaths, createAccountResource, createDeploymentResource, createDomainResource, createTokenResource, deserializeLabels, doors, errandOf, extractSubdomain, filterJunk, formatDuration, formatFileSize, formatTimeRemaining, generateDeploymentUrl, generateDomainUrl, getENV, getValidFiles, hasUnbuiltMarker, hasUnsafeChars, isBlockedExtension, isClaimPath, isCustomDomain, isDeployment, isInvitationPath, isPlatformDomain, isShipError, isUpgradePath, normalizeVia, optimizeDeployPaths, personName, personShortName, pluralize, processFilesForNode, readBearerValue, serializeLabels, validateApiKey, validateApiUrl, validateBuildCommand, validateCaller, validateDeployFile, validateDeployPath, validateDeployToken, validateFileName, validateFiles, validateIdempotencyKey, validateOAuthToken, validateOutputDir, validatePassword, validateToken, validateTtl };
3858
+ export { ACCOUNT_HEADER, API_KEY, API_PATHS, AUTH_BASE_PATH, Account, AccountAccess, AccountDeleteResponse, AccountKeyResponse, AccountPlan, AccountPlanType, AccountRefusal, AccountRefusalType, AccountResource, AccountRole, Activity, ActivityEvent, ActivityListResponse, ActivityMeta, ApiDeployOptions, ApiHttp, ApiHttpOptions, AuthMethod, AuthMethodType, BUILD_SETTINGS, BillingInterval, BillingPortalSession, BillingSyncResponse, BuildFailureDetails, CALLER, Caps, ConsoleErrand, ConsolePaths, ConsoleSection, DEFAULT_API, DEPLOYMENT_CONFIG_FILENAME, DEPLOY_FIELDS, DEPLOY_FILE_GRAMMAR, DEPLOY_TOKEN, DeployBodyContext, DeployFile, DeployFileEncoding, DeployFileSpec, DeployInput, DeployTransport, Deployment, DeploymentCreateResponse, DeploymentDeleteResponse, DeploymentListResponse, DeploymentOptions, DeploymentResource, DeploymentResourceContext, DeploymentSetOptions, DeploymentStatus, DeploymentStatusType, DeploymentUploadOptions, DeploymentVia, DeploymentViaType, DnsLookup, DnsProvider, DnsRecord, DnsRecordType, Domain, DomainDeleteResponse, DomainDnsResponse, DomainListResponse, DomainRecordsResponse, DomainResource, DomainSetOptions, DomainSetResult, DomainShareResponse, DomainStatus, DomainStatusType, DomainValidateResponse, DomainVerification, DomainVerificationType, DomainVerifyResponse, ErrorResponse, ErrorType, ExecutionEnvironment, FileValidationStatus as FILE_VALIDATION_STATUS, Fetch, FileValidationResult, FileValidationStatus, FileValidationStatusType, IDEMPOTENCY_KEY_CONSTRAINTS, JUNK_DIRECTORIES, LABEL_CONSTRAINTS, LABEL_PATTERN, LabelsResponse, ListOptions, ListResponse, MD5Result, MY_API_KEY_URL, OAUTH_TOKEN, OAuthScope, OAuthScopeType, PASSWORD_CONSTRAINTS, PUBLIC_DEPLOYMENT_TTL_SECONDS, PingResponse, Plan, PlanChangeRefusalDetails, PlanChangeRequest, PlanChangeResponse, PlanDestination, PlansResponse, PlatformLimitKey, PlatformLimits, RequestResult, ResourceContext, SECTIONS, SETUP_TROUBLESHOOTING_ANCHOR, SHIP_ENV, SHIP_VIA_ENV, SIGN_IN_RETURN_PARAM, SPACheckRequest, SPACheckResponse, SPA_CHECK_CONSTRAINTS, SPA_DEFAULT_CONFIG, ScheduledChange, SettingsFragment, SetupInstructionsResponse, ShipClientOptions, ShipError, ShipEvents, ShipRequestInit, StaticFile, TTL_CONSTRAINTS, Token, TokenCreateOptions, TokenCreateResponse, TokenDeleteResponse, TokenKind, TokenKindType, TokenListResponse, TokenProvider, TokenResource, Transport, UNBUILT_PROJECT_MARKERS, UNSAFE_FILENAME_CHARS, USER_VISIBLE_EVENTS, UploadedFile, UserVisibleActivityEvent, ValidatableFile, ValidationIssue, WEB_FILE_ACCEPT, __setTestEnvironment, accountOfPath, allValidFilesReady, assertShipJsonSyntax, billingReturnOf, calculateMD5, classifyToken, consolePaths, createAccountResource, createDeploymentResource, createDomainResource, createTokenResource, deserializeLabels, doors, errandOf, extractSubdomain, filterJunk, formatDuration, formatFileSize, formatTimeRemaining, generateDeploymentUrl, generateDomainUrl, getENV, getValidFiles, hasUnbuiltMarker, hasUnsafeChars, isBlockedExtension, isClaimPath, isCustomDomain, isDeployment, isInvitationPath, isPlatformDomain, isShipError, isUpgradePath, normalizeVia, optimizeDeployPaths, personName, personShortName, pluralize, processFilesForNode, readBearerValue, serializeLabels, validateApiKey, validateApiUrl, validateBuildCommand, validateCaller, validateDeployCount, validateDeployFile, validateDeployPath, validateDeployToken, validateFileName, validateFiles, validateIdempotencyKey, validateOAuthToken, validateOutputDir, validatePassword, validateToken, validateTtl };
3859
3859
  }
3860
3860
  export = Ship;
package/dist/index.d.ts CHANGED
@@ -1846,15 +1846,17 @@ declare const SPA_DEFAULT_CONFIG: {
1846
1846
  * "100KB". `INDEX_FILE` is the selection rule (the file whose content rides
1847
1847
  * `SPACheckRequest.index`), restated by every client that builds the request.
1848
1848
  *
1849
- * Neither member is a validation boundary: a client over the cap simply
1850
- * skips the pre-flight, because the server answers an oversized index
1851
- * `isSPA: false` anyway. A consumer that cannot import this (n8n) needs no
1852
- * size copy at all — outcome parity is the server's, not the client's.
1849
+ * Neither member is a validation boundary: a client over the cap skips the
1850
+ * pre-flight and answers "no" itself, which is the answer the server gives an
1851
+ * oversized index. Every client holds the cap, in bytes: the server's own
1852
+ * route refuses a body over the JSON intake cap, so a client that asked about
1853
+ * any index would fail a deploy whose upload succeeds. The n8n node, which
1854
+ * cannot import this, restates the number under its contract fence.
1853
1855
  */
1854
1856
  declare const SPA_CHECK_CONSTRAINTS: {
1855
1857
  /** The file whose content is the check's subject. */
1856
1858
  readonly INDEX_FILE: "index.html";
1857
- /** Skip the pre-flight above this size — the server would answer false. */
1859
+ /** Skip the pre-flight above this many UTF-8 bytes: the server answers no. */
1858
1860
  readonly MAX_INDEX_BYTES: number;
1859
1861
  };
1860
1862
  /**
@@ -1979,28 +1981,19 @@ interface SPACheckRequest {
1979
1981
  index: string;
1980
1982
  }
1981
1983
  /**
1982
- * Response from SPA check endpoint
1983
- */
1984
- /**
1985
- * Which of the classifier's tiers reached the verdict, and why. Named rather
1986
- * than inline so the API's own `checkSPA` can return `SPACheckResponse`
1987
- * instead of restating its shape.
1988
- */
1989
- interface SPACheckDebug {
1990
- /** Which tier made the detection */
1991
- tier: 'exclusions' | 'inclusions' | 'scoring' | 'ai' | 'fallback';
1992
- /** The reason for the detection result */
1993
- reason: string;
1994
- }
1995
- /**
1996
- * A report: it answers a question and carries only the answer (`CLAUDE.md`,
1997
- * "A report answers a question").
1984
+ * The `/spa-check` answer: whether the upload is a single-page app, and the
1985
+ * one sentence saying why it was or was not detected.
1986
+ *
1987
+ * `reason` is there so anyone can ask the open route about an upload and
1988
+ * read the answer. It is human-readable text under the message authoring law:
1989
+ * clients branch on `isSPA`, never on the sentence, so its wording is not a
1990
+ * contract.
1998
1991
  */
1999
1992
  interface SPACheckResponse {
2000
- /** Whether the project is detected as a Single Page Application */
1993
+ /** Whether the upload is detected as a single-page app */
2001
1994
  isSPA: boolean;
2002
- /** Debugging information about detection */
2003
- debug: SPACheckDebug;
1995
+ /** Why it was or was not detected, for a person to read */
1996
+ reason: string;
2004
1997
  }
2005
1998
  /**
2006
1999
  * Represents a file that has been processed and is ready for deploy.
@@ -3694,27 +3687,25 @@ declare function calculateMD5(input: Blob | Buffer | string): Promise<MD5Result>
3694
3687
  * and add nothing, so a sentence names its file exactly once and states the
3695
3688
  * limit, and reads without a prefix. The family is subject first: `File
3696
3689
  * "<path>" <verdict>. Maximum <limit> allowed.`, and `File name "<path>" …`
3697
- * where the name is the subject. The total-size rule's subject is the set of
3698
- * files, which is why it names no path. A limit's sentence ends with the way
3699
- * forward the API delivered for it (`withWayForward`), so the whole reads
3700
- * `File "x" is too large. Maximum 20 MB allowed. Upgrade to Pro for more.`
3701
- *
3702
- * **Wording follows the API where a choice existed**, so the deferred Phase B
3703
- * (promoting this table to `@shipstatic/types` with the API consuming it) has
3704
- * less to move. Two deliberate deviations, recorded rather than silent:
3705
- *
3706
- * - **Sizes are formatted, not raw bytes.** The API says `20971520 bytes`;
3707
- * a browser upload UI showing that is worse for the person reading it, and
3708
- * the unit is the smaller half of the sentence to reconcile later.
3709
- * - **The path is named.** The API has no path to name; the throwing renderer
3710
- * has nothing BUT the message, so dropping it would leave a CLI user asking
3711
- * which file.
3690
+ * where the name is the subject. The two rules about the SET, the count and
3691
+ * the total, name no path. A limit's sentence ends with the suggestion the
3692
+ * API delivered for it (`withSuggestion`), so the whole reads `File "x" is
3693
+ * too large. Maximum 20 MB allowed. Upgrade to Pro for more.`
3694
+ *
3695
+ * **The API words the same rules the same way, in the same order**
3696
+ * (`cloudflare/api/src/lib/validation.ts`), so a refusal reads alike whether
3697
+ * the SDK made it before uploading or the boundary made it after. Sizes are
3698
+ * formatted on both sides, and the path is named on both. That is a
3699
+ * restatement, and it is fenced from the API's side: a test there imports
3700
+ * this package's `validateFiles` and compares every shared rule's sentence to
3701
+ * `validateUpload`'s. The fence dies the day the table is promoted to
3702
+ * `@shipstatic/types` and the API imports it (Phase B, `CLAUDE.md`).
3712
3703
  *
3713
3704
  * Out of scope, and left where they are: `validateDeployPath` (a rule about
3714
3705
  * the deploy PATH rather than the file, and pipelines-only), and
3715
- * `validateFiles`' UI-tier pre-checks (empty, negative, count, unbuilt
3716
- * marker, processing error), which have one holder each and no drift, and
3717
- * word their sentences by the same family.
3706
+ * `validateFiles`' UI-tier pre-checks (empty, negative, unbuilt marker,
3707
+ * processing error), which have one holder each and no drift, and word their
3708
+ * sentences by the same family.
3718
3709
  */
3719
3710
 
3720
3711
  /** What a rule is asked about: one file, and the deploy so far. */
@@ -3766,6 +3757,15 @@ declare function validateDeployPath(deployPath: string, sourceIdentifier: string
3766
3757
  * @throws {ShipError} The first broken rule's sentence
3767
3758
  */
3768
3759
  declare function validateDeployFile(input: FileRuleInput, limits: PlatformLimits): void;
3760
+ /**
3761
+ * The throwing renderer of `COUNT_RULE`: the deploy's file count, judged over
3762
+ * the files the pipeline will send.
3763
+ *
3764
+ * @param count - How many files the deploy carries
3765
+ * @param limits - The platform's limits, from `/limits`
3766
+ * @throws {ShipError} The count rule's sentence
3767
+ */
3768
+ declare function validateDeployCount(count: number, limits: PlatformLimits): void;
3769
3769
 
3770
3770
  /**
3771
3771
  * Utility functions for string manipulation.
@@ -3854,4 +3854,4 @@ declare class Ship extends Ship$1 {
3854
3854
  protected processInput(input: DeployInput, options: DeploymentOptions, limits: PlatformLimits): Promise<StaticFile[]>;
3855
3855
  }
3856
3856
 
3857
- export { ACCOUNT_HEADER, API_KEY, API_PATHS, AUTH_BASE_PATH, type Account, type AccountAccess, type AccountDeleteResponse, type AccountKeyResponse, AccountPlan, type AccountPlanType, AccountRefusal, type AccountRefusalType, type AccountResource, type AccountRole, type Activity, type ActivityEvent, type ActivityListResponse, type ActivityMeta, type ApiDeployOptions, ApiHttp, type ApiHttpOptions, AuthMethod, type AuthMethodType, BUILD_SETTINGS, type BillingInterval, type BillingPortalSession, type BillingSyncResponse, type BuildFailureDetails, CALLER, type Caps, type ConsoleErrand, type ConsolePaths, type ConsoleSection, DEFAULT_API, DEPLOYMENT_CONFIG_FILENAME, DEPLOY_FIELDS, DEPLOY_FILE_GRAMMAR, DEPLOY_TOKEN, type DeployBodyContext, type DeployFile, type DeployFileEncoding, type DeployFileSpec, type DeployInput, type DeployTransport, type Deployment, type DeploymentCreateResponse, type DeploymentDeleteResponse, type DeploymentListResponse, type DeploymentOptions, type DeploymentResource, type DeploymentResourceContext, type DeploymentSetOptions, DeploymentStatus, type DeploymentStatusType, type DeploymentUploadOptions, DeploymentVia, type DeploymentViaType, type DnsLookup, type DnsProvider, type DnsRecord, type DnsRecordType, type Domain, type DomainDeleteResponse, type DomainDnsResponse, type DomainListResponse, type DomainRecordsResponse, type DomainResource, type DomainSetOptions, type DomainSetResult, type DomainShareResponse, DomainStatus, type DomainStatusType, type DomainValidateResponse, DomainVerification, type DomainVerificationType, type DomainVerifyResponse, type ErrorResponse, ErrorType, type ExecutionEnvironment, FileValidationStatus as FILE_VALIDATION_STATUS, type Fetch, type FileValidationResult, FileValidationStatus, type FileValidationStatusType, IDEMPOTENCY_KEY_CONSTRAINTS, JUNK_DIRECTORIES, LABEL_CONSTRAINTS, LABEL_PATTERN, type LabelsResponse, type ListOptions, type ListResponse, type MD5Result, MY_API_KEY_URL, OAUTH_TOKEN, OAuthScope, type OAuthScopeType, PASSWORD_CONSTRAINTS, PUBLIC_DEPLOYMENT_TTL_SECONDS, type PingResponse, type Plan, type PlanChangeRefusalDetails, type PlanChangeRequest, type PlanChangeResponse, type PlanDestination, type PlansResponse, type PlatformLimitKey, type PlatformLimits, type RequestResult, type ResourceContext, SECTIONS, SETUP_TROUBLESHOOTING_ANCHOR, SHIP_ENV, SHIP_VIA_ENV, SIGN_IN_RETURN_PARAM, type SPACheckDebug, type SPACheckRequest, type SPACheckResponse, SPA_CHECK_CONSTRAINTS, SPA_DEFAULT_CONFIG, type ScheduledChange, type SettingsFragment, type SetupInstructionsResponse, Ship, type ShipClientOptions, ShipError, type ShipEvents, type ShipRequestInit, type StaticFile, TTL_CONSTRAINTS, type Token, type TokenCreateOptions, type TokenCreateResponse, type TokenDeleteResponse, TokenKind, type TokenKindType, type TokenListResponse, type TokenProvider, type TokenResource, type Transport, UNBUILT_PROJECT_MARKERS, UNSAFE_FILENAME_CHARS, USER_VISIBLE_EVENTS, type UploadedFile, type UserVisibleActivityEvent, type ValidatableFile, type ValidationIssue, WEB_FILE_ACCEPT, __setTestEnvironment, accountOfPath, allValidFilesReady, assertShipJsonSyntax, billingReturnOf, calculateMD5, classifyToken, consolePaths, createAccountResource, createDeploymentResource, createDomainResource, createTokenResource, Ship as default, deserializeLabels, doors, errandOf, extractSubdomain, filterJunk, formatDuration, formatFileSize, formatTimeRemaining, generateDeploymentUrl, generateDomainUrl, getENV, getValidFiles, hasUnbuiltMarker, hasUnsafeChars, isBlockedExtension, isClaimPath, isCustomDomain, isDeployment, isInvitationPath, isPlatformDomain, isShipError, isUpgradePath, normalizeVia, optimizeDeployPaths, personName, personShortName, pluralize, processFilesForNode, readBearerValue, serializeLabels, validateApiKey, validateApiUrl, validateBuildCommand, validateCaller, validateDeployFile, validateDeployPath, validateDeployToken, validateFileName, validateFiles, validateIdempotencyKey, validateOAuthToken, validateOutputDir, validatePassword, validateToken, validateTtl };
3857
+ export { ACCOUNT_HEADER, API_KEY, API_PATHS, AUTH_BASE_PATH, type Account, type AccountAccess, type AccountDeleteResponse, type AccountKeyResponse, AccountPlan, type AccountPlanType, AccountRefusal, type AccountRefusalType, type AccountResource, type AccountRole, type Activity, type ActivityEvent, type ActivityListResponse, type ActivityMeta, type ApiDeployOptions, ApiHttp, type ApiHttpOptions, AuthMethod, type AuthMethodType, BUILD_SETTINGS, type BillingInterval, type BillingPortalSession, type BillingSyncResponse, type BuildFailureDetails, CALLER, type Caps, type ConsoleErrand, type ConsolePaths, type ConsoleSection, DEFAULT_API, DEPLOYMENT_CONFIG_FILENAME, DEPLOY_FIELDS, DEPLOY_FILE_GRAMMAR, DEPLOY_TOKEN, type DeployBodyContext, type DeployFile, type DeployFileEncoding, type DeployFileSpec, type DeployInput, type DeployTransport, type Deployment, type DeploymentCreateResponse, type DeploymentDeleteResponse, type DeploymentListResponse, type DeploymentOptions, type DeploymentResource, type DeploymentResourceContext, type DeploymentSetOptions, DeploymentStatus, type DeploymentStatusType, type DeploymentUploadOptions, DeploymentVia, type DeploymentViaType, type DnsLookup, type DnsProvider, type DnsRecord, type DnsRecordType, type Domain, type DomainDeleteResponse, type DomainDnsResponse, type DomainListResponse, type DomainRecordsResponse, type DomainResource, type DomainSetOptions, type DomainSetResult, type DomainShareResponse, DomainStatus, type DomainStatusType, type DomainValidateResponse, DomainVerification, type DomainVerificationType, type DomainVerifyResponse, type ErrorResponse, ErrorType, type ExecutionEnvironment, FileValidationStatus as FILE_VALIDATION_STATUS, type Fetch, type FileValidationResult, FileValidationStatus, type FileValidationStatusType, IDEMPOTENCY_KEY_CONSTRAINTS, JUNK_DIRECTORIES, LABEL_CONSTRAINTS, LABEL_PATTERN, type LabelsResponse, type ListOptions, type ListResponse, type MD5Result, MY_API_KEY_URL, OAUTH_TOKEN, OAuthScope, type OAuthScopeType, PASSWORD_CONSTRAINTS, PUBLIC_DEPLOYMENT_TTL_SECONDS, type PingResponse, type Plan, type PlanChangeRefusalDetails, type PlanChangeRequest, type PlanChangeResponse, type PlanDestination, type PlansResponse, type PlatformLimitKey, type PlatformLimits, type RequestResult, type ResourceContext, SECTIONS, SETUP_TROUBLESHOOTING_ANCHOR, SHIP_ENV, SHIP_VIA_ENV, SIGN_IN_RETURN_PARAM, type SPACheckRequest, type SPACheckResponse, SPA_CHECK_CONSTRAINTS, SPA_DEFAULT_CONFIG, type ScheduledChange, type SettingsFragment, type SetupInstructionsResponse, Ship, type ShipClientOptions, ShipError, type ShipEvents, type ShipRequestInit, type StaticFile, TTL_CONSTRAINTS, type Token, type TokenCreateOptions, type TokenCreateResponse, type TokenDeleteResponse, TokenKind, type TokenKindType, type TokenListResponse, type TokenProvider, type TokenResource, type Transport, UNBUILT_PROJECT_MARKERS, UNSAFE_FILENAME_CHARS, USER_VISIBLE_EVENTS, type UploadedFile, type UserVisibleActivityEvent, type ValidatableFile, type ValidationIssue, WEB_FILE_ACCEPT, __setTestEnvironment, accountOfPath, allValidFilesReady, assertShipJsonSyntax, billingReturnOf, calculateMD5, classifyToken, consolePaths, createAccountResource, createDeploymentResource, createDomainResource, createTokenResource, Ship as default, deserializeLabels, doors, errandOf, extractSubdomain, filterJunk, formatDuration, formatFileSize, formatTimeRemaining, generateDeploymentUrl, generateDomainUrl, getENV, getValidFiles, hasUnbuiltMarker, hasUnsafeChars, isBlockedExtension, isClaimPath, isCustomDomain, isDeployment, isInvitationPath, isPlatformDomain, isShipError, isUpgradePath, normalizeVia, optimizeDeployPaths, personName, personShortName, pluralize, processFilesForNode, readBearerValue, serializeLabels, validateApiKey, validateApiUrl, validateBuildCommand, validateCaller, validateDeployCount, validateDeployFile, validateDeployPath, validateDeployToken, validateFileName, validateFiles, validateIdempotencyKey, validateOAuthToken, validateOutputDir, validatePassword, validateToken, validateTtl };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var ot=Object.defineProperty;var A=(e,t)=>()=>(e&&(t=e(e=0)),t);var it=(e,t)=>{for(var n in t)ot(e,n,{get:t[n],enumerable:!0})};function sn(e){if(!e||typeof e!="string")return;let t=e.trim().toLowerCase();return Object.values(st).includes(t)?t:void 0}function Se(e){if(e==null)return;if(typeof e!="string")throw a.validation("Idempotency key must be a string.");let t=e.trim();if(!t)throw a.validation("Idempotency key must not be empty.");if(t.length>N.MAX_LENGTH)throw a.validation(`Idempotency key must be at most ${N.MAX_LENGTH} characters.`);return t}function cn(e){return e.name?.trim()||e.email}function pn(e){return e.name?.trim().split(" ")[0]||e.email}function pt(e){let t=e.code;return t==="ERR_INVALID_URL"?!1:typeof t=="string"?!0:e instanceof TypeError?!/\burl\b/i.test(e.message):!1}function F(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ShipError"&&"status"in e}function ut(e){let t=e.replace(/\\/g,"/").split("/").pop()??"",n=t.lastIndexOf(".");return n<=0||n===t.length-1?null:t.slice(n+1).toLowerCase()}function De(e,t){let n=ut(e);return n===null?!1:Array.isArray(t)?t.includes(n):t.has(n)}function Re(e){return mt.test(e)}function M(e){return e.replace(/\\/g,"/").split("/").filter(Boolean).some(n=>ee.has(n))}function ft(e){return e.startsWith(Ie.PREFIX)?R.API_KEY:e.startsWith(Ne.PREFIX)?R.DEPLOY_TOKEN:e.startsWith(Le.PREFIX)?R.OAUTH:R.OPAQUE}function yn(e){return e.slice(0,Q.length).toLowerCase()!==Q?null:e.slice(Q.length)||null}function Oe(e){let t=e.charCodeAt(0)===65279?e.slice(1):e,n;try{n=JSON.parse(t)}catch(r){throw a.config(`invalid JSON format in config: ${r.message}`,{filePath:S})}if(n===null||typeof n!="object"||Array.isArray(n))throw a.config(`${S} must contain a JSON object`,{filePath:S})}function te(e,t,n){if(!e.startsWith(t.PREFIX))throw a.validation(`${n} must start with "${t.PREFIX}"`);if(e.length!==t.TOTAL_LENGTH)throw a.validation(`${n} must be ${t.TOTAL_LENGTH} characters total (${t.PREFIX} + ${t.HEX_LENGTH} hex chars)`);let r=e.slice(t.PREFIX.length);if(!new RegExp(`^[a-f0-9]{${t.HEX_LENGTH}}$`,"i").test(r))throw a.validation(`${n} must contain ${t.HEX_LENGTH} hexadecimal characters after "${t.PREFIX}" prefix`)}function ht(e){te(e,Ie,"API key")}function yt(e){te(e,Ne,"Deploy token")}function Et(e){te(e,Le,"OAuth access token")}function ne(e){switch(ft(e)){case R.API_KEY:ht(e);return;case R.DEPLOY_TOKEN:yt(e);return;case R.OAUTH:Et(e);return;case R.OPAQUE:if(!e)throw a.validation("Token must be a non-empty string")}}function Pe(e){if(!e||e.length>b.MAX_LENGTH||!b.PATTERN.test(e))throw a.validation(`Caller must be 1-${b.MAX_LENGTH} characters: letters, digits, dots, underscores, or hyphens`)}function gn(e){try{let t=new URL(e);if(!["http:","https:"].includes(t.protocol))throw a.validation("API URL must use http:// or https:// protocol");if(t.pathname!=="/"&&t.pathname!=="")throw a.validation("API URL must not contain a path");if(t.search||t.hash)throw a.validation("API URL must not contain query parameters or fragments")}catch(t){throw F(t)?t:a.validation("API URL must be a valid URL")}}function Tn(e){return/^[a-z]+-[a-z]+-[a-z0-9]{7}(\.[a-z0-9.-]+)?$/i.test(e)}function re(e){if(e!=null){if(typeof e!="number"||!Number.isFinite(e))throw a.validation("TTL must be a number of seconds");if(!Number.isInteger(e))throw a.validation("TTL must be a whole number of seconds");if(e<C.MIN_SECONDS||e>C.MAX_SECONDS)throw a.validation(`TTL must be between ${C.MIN_SECONDS} and ${C.MAX_SECONDS} seconds`);return e}}function St(e){let t=e?`/${e}`:"",n=r=>`${t}${r}`;return{dashboard:()=>t||"/",newSite:()=>n("/new"),deployments:Object.assign(()=>n("/deployments"),{upload:()=>n("/deployments/upload")}),domains:Object.assign(()=>n("/domains"),{connect:r=>n(`/domains/${r}/connect`),deployment:r=>n(`/domains/${r}/deployment`)}),settings:r=>n(r?`/settings#${r}`:"/settings"),settingsAfterBilling:()=>n(`/settings?${ge("portal")}`),upgrade:r=>n(r?`/upgrade/${r}`:"/upgrade"),success:()=>n("/success"),successAfterCheckout:()=>n(`/success?${ge("checkout")}`),apiKey:()=>n("/api-key")}}function Sn(e){let t=new URLSearchParams(e);for(let[n,[r,o]]of Object.entries(xe))if(t.get(r)===o)return n;return null}function k(e){let t=e.split(/[?#]/)[0].toLowerCase(),[n="",r=""]=t.split("/").filter(Boolean);return Dt(n)?{kind:"door",door:n}:n===At?{kind:"admin"}:n===""||Ae(n)?{kind:"account",account:null,section:n===""?null:n}:{kind:"account",account:n,section:Ae(r)?r:null}}function Dn(e){let t=k(e);return t.kind==="account"?t.account:null}function Rn(e){return Rt(e)?"claim":It(e)?"invite":Nt(e)?"upgrade":null}function Lt(e){let t=Math.round(e/60);if(!(t>=1))return"less than a minute";if(t<120)return Z(t,"minute");let n=Math.round(e/3600);return n<48?Z(n,"hour"):Z(Math.round(e/86400),"day")}function bn(e,t=Date.now()/1e3){let n=e-t;return n>0?Lt(n):null}function Z(e,t){return`${e} ${t}${e===1?"":"s"}`}function x(e,t=1){if(e===0)return"0 Bytes";let n=1024,r=["Bytes","KB","MB","GB"],o=Math.floor(Math.log(e)/Math.log(n));return`${Number.parseFloat((e/n**o).toFixed(t))} ${r[o]}`}function _e(e,t){return e.endsWith(`.${t}`)}function Pn(e,t){return!_e(e,t)}function xn(e,t){return _e(e,t)?e.slice(0,-(t.length+1)):null}function _n(e){return`https://${e}`}function wn(e){return`https://${e}`}function Cn(e){return!e||e.length===0?null:JSON.stringify(e)}function vn(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function Ce(e){if(e==null||e==="")return;if(typeof e!="string")throw a.validation("Build command must be a string");let t=e.trim();if(t.length===0||t.length>O.COMMAND_MAX_LENGTH)throw a.validation(`Build command must be between 1 and ${O.COMMAND_MAX_LENGTH} characters`);if(/[\x00-\x1f\x7f]/.test(t))throw a.validation("Build command must be a single line");return t}function ve(e){if(e==null||e==="")return;if(typeof e!="string")throw a.validation("Output folder must be a string");let t=e.trim().replace(/\/+$/,"");if(t.length===0||t.length>O.OUTPUT_DIR_MAX_LENGTH)throw a.validation(`Output folder must be between 1 and ${O.OUTPUT_DIR_MAX_LENGTH} characters`);if(!O.OUTPUT_DIR_PATTERN.test(t)||t.split("/").some(n=>n===".."||n==="."))throw a.validation("Output folder must be a relative path inside the project, like dist or dist/site");return t}function ie(e){if(e==null)return;if(typeof e!="string")throw a.validation("Password must be a string");let t=e.trim();if(t.length<v.MIN_LENGTH||t.length>v.MAX_LENGTH)throw a.validation(`Password must be between ${v.MIN_LENGTH} and ${v.MAX_LENGTH} characters`);return t}var tn,st,nn,rn,on,N,an,ln,m,E,un,d,at,W,lt,ct,a,dt,dn,mt,ee,mn,fn,J,Ie,Ne,Le,b,hn,R,Q,En,S,be,U,C,gt,Tt,At,xe,ge,Te,An,Dt,Ae,Rt,It,Nt,oe,P,In,Nn,Ln,On,h,I,we,O,v,f=A(()=>{"use strict";tn={PENDING:"pending",SUCCESS:"success",FAILED:"failed",DELETING:"deleting"},st={WEB:"web",SDK:"sdk",CLI:"cli",MCP:"mcp",GIT:"git",N8N:"n8n",GPT:"gpt",VSC:"vsc",CLD:"cld",CRS:"crs",GMN:"gmn",API:"api"},nn={LIVE:"live",UNLINKED:"unlinked",UNVERIFIED:"unverified",PAUSED:"paused"},rn={PENDING:"pending",PARTIAL:"partial",VERIFIED:"verified"},on="troubleshooting",N={HEADER:"Idempotency-Key",MAX_LENGTH:256,WINDOW_SECONDS:1440*60};an={FREE:"free",PRO:"pro",TEAM:"team",SCALE:"scale",SPONSORED:"sponsored"},ln={PAUSED:"paused",UNKNOWN:"unknown"};m={DEPLOYMENTS:"/deployments",DEPLOYMENT:e=>`/deployments/${e}`,DEPLOYMENT_CONFIG:e=>`/deployments/${e}/config`,DOMAINS:"/domains",DOMAIN:e=>`/domains/${e}`,DOMAIN_VERIFY:e=>`/domains/${e}/verify`,DOMAIN_DNS:e=>`/domains/${e}/dns`,DOMAIN_RECORDS:e=>`/domains/${e}/records`,DOMAIN_SHARE:e=>`/domains/${e}/share`,DOMAIN_PROPAGATION:e=>`/domains/${e}/propagation`,DOMAINS_VALIDATE:"/domains/validate",TOKENS:"/tokens",TOKEN:e=>`/tokens/${e}`,ACCOUNT:"/account",ACCOUNT_KEY:"/account/key",ACCOUNT_CLAIM:"/account/claim",ACTIVITIES:"/activities",LABELS:"/labels",LIMITS:"/limits",PLANS:"/plans",PING:"/ping",SETUP:"/setup",SPA_CHECK:"/spa-check",UPLOAD:"/upload"},E={FILES:"files[]",CHECKSUMS:"checksums",LABELS:"labels",VIA:"via",PASSWORD:"password",TTL:"ttl",BUILD:"build",PRERENDER:"prerender",SPA:"spa",BUILD_COMMAND:"buildCommand",OUTPUT_DIR:"outputDir",CAPTCHA:"captcha"},un={PATH:"path",CONTENT:"content",ENCODING:"encoding",DEFAULT_ENCODING:"utf-8",ENCODINGS:["utf-8","base64"]},d={Validation:"validation_failed",NotFound:"not_found",Forbidden:"forbidden",RateLimit:"rate_limit_exceeded",Authentication:"authentication_failed",Business:"business_logic_error",Api:"internal_server_error",Maintenance:"maintenance",Build:"build_failed",Network:"network_error",Timeout:"timeout_error",Cancelled:"operation_cancelled",File:"file_error",Config:"config_error"},at=new Set([d.Network,d.Timeout,d.Cancelled,d.File,d.Config]),W={client:new Set([d.Build,d.Business,d.Cancelled,d.Config,d.File,d.Forbidden,d.NotFound,d.RateLimit,d.Validation]),network:new Set([d.Network,d.Timeout]),auth:new Set([d.Authentication])},lt=new Set(Object.values(d).filter(e=>!at.has(e))),ct=200;a=class e extends Error{type;status;details;constructor(t,n,r,o){super(n),this.type=t,this.status=r,this.details=o,this.name="ShipError"}toResponse(){let t=this.details,n=this.type===d.Authentication&&t?.internal?void 0:this.details;return{error:this.type,message:this.message,status:this.status,details:n}}static async fromHttpResponse(t,n){let r,o,i;try{if(t.headers.get("content-type")?.includes("application/json")){let u=await t.json();if(u&&typeof u=="object"){let c=u;typeof c.message=="string"?r=c.message:typeof c.error=="string"&&(r=c.error),o=c.details,typeof c.error=="string"&&lt.has(c.error)&&(i=c.error)}}else{let u=(await t.text()).trim();u&&!u.startsWith("<")&&u.length<=ct&&(r=u)}}catch{}let l=t.headers.get("retry-after");if(l!==null){let s=l.trim(),u=/^\d+$/.test(s)?Number(s):Math.ceil((Date.parse(s)-Date.now())/1e3);if(Number.isFinite(u)&&u>=0){let c=o&&typeof o=="object"?o:{};c.retryAfter===void 0&&(o={...c,retryAfter:u})}}r=r||`${n||"Request"} failed with status ${t.status}`;let p=i??(t.status===401?d.Authentication:t.status===403?d.Forbidden:t.status===429?d.RateLimit:d.Api);return new e(p,r,t.status,o)}static fromFetchError(t,n){if(F(t))return t;let r=n||"Request",o=t?.name;return o==="AbortError"?e.cancelled(`${r} was cancelled`):o==="TimeoutError"?e.timeout(`${r} timed out`,{cause:t}):t instanceof Error?pt(t)?e.network(`${r} failed: ${t.message}`,{cause:t}):new e(d.Api,`${r} failed: ${t.message}`):new e(d.Api,`${r} failed: Unknown error`)}static validation(t,n){return new e(d.Validation,t,400,n)}static notFound(t,n){let r=n?`${t} ${n} not found`:`${t} not found`;return new e(d.NotFound,r,404)}static forbidden(t,n){return new e(d.Forbidden,t,403,n)}static rateLimit(t="Too many requests",n){return new e(d.RateLimit,t,429,n)}static authentication(t="Authentication required",n){return new e(d.Authentication,t,401,n)}static business(t,n=400,r){return new e(d.Business,t,n,r)}static network(t,n){return new e(d.Network,t,void 0,n)}static timeout(t,n){return new e(d.Timeout,t,void 0,n)}static cancelled(t,n){return new e(d.Cancelled,t,void 0,n)}static file(t,n){return new e(d.File,t,void 0,n)}static config(t,n){return new e(d.Config,t,void 0,n)}static api(t,n=500,r){return new e(d.Api,t,n,r)}static maintenance(t,n){return new e(d.Maintenance,t,503,n)}static build(t,n){return new e(d.Build,t,422,n)}isClientError(){return W.client.has(this.type)?!0:this.status!==void 0&&this.status>=400&&this.status<500}isNetworkError(){return W.network.has(this.type)}isAuthError(){return W.auth.has(this.type)}isType(t){return this.type===t}};dt=["html","htm","xhtml","xml","txt","md","markdown","pdf","csv","json","jsonc","webmanifest","map","toml","yaml","yml","rss","atom","css","scss","sass","less","js","mjs","cjs","jsx","ts","tsx","wasm","vue","svelte","png","jpg","jpeg","gif","webp","avif","svg","ico","bmp","tif","tiff","heic","heif","woff","woff2","ttf","otf","eot","mp3","wav","ogg","oga","opus","m4a","aac","flac","weba","mp4","webm","ogv","mov","m4v","avi","glb","gltf","usdz","vtt","srt","zip"],dn=dt.map(e=>`.${e}`).join(","),mt=/[\x00-\x1f\x7f#?%\\<>"]/;ee=new Set(["node_modules","package.json"]);mn="/auth",fn="signing-in",J={SESSION:"session",API_KEY:"apiKey",TOKEN:"token",AGENT:"agent",OAUTH:"oauth",SYSTEM:"system"},Ie={PREFIX:"ship-",HEX_LENGTH:32,TOTAL_LENGTH:37,HINT_LENGTH:4},Ne={PREFIX:"deploy-",HEX_LENGTH:32,TOTAL_LENGTH:39},Le={PREFIX:"oauth-",HEX_LENGTH:32,TOTAL_LENGTH:38},b={HEADER:"X-Caller",MAX_LENGTH:128,PATTERN:/^[a-zA-Z0-9._-]+$/},hn="X-Account",R={API_KEY:J.API_KEY,DEPLOY_TOKEN:J.TOKEN,OAUTH:J.OAUTH,OPAQUE:"opaque"};Q="bearer ";En={ACCOUNT_READ:"account:read",DEPLOYMENTS_READ:"deployments:read",DEPLOYMENTS_WRITE:"deployments:write",DOMAINS_READ:"domains:read",DOMAINS_WRITE:"domains:write"},S="ship.json",be={rewrites:[{source:"/(.*)",destination:"/index.html"}]},U={INDEX_FILE:"index.html",MAX_INDEX_BYTES:100*1024};C={MIN_SECONDS:1,MAX_SECONDS:365*24*60*60};gt={new:{owner:!1},deployments:{owner:!1},domains:{owner:!1},settings:{owner:!1},upgrade:{owner:!0},success:{owner:!0},"api-key":{owner:!0}},Tt=["login","register","logout","invitations","claim","consent"],At="admin",xe={checkout:["upgrading","true"],portal:["billing","returned"]},ge=e=>xe[e].join("="),Te=(e,t)=>t?`${e}?next=${encodeURIComponent(t)}`:e;An={login:e=>Te("/login",e),register:e=>Te("/register",e),logout:()=>"/logout",invitation:e=>`/invitations/${e}`,claim:e=>`/claim/${e}`,consent:()=>"/consent"};Dt=e=>Tt.includes(e),Ae=e=>Object.hasOwn(gt,e);Rt=e=>{let t=k(e);return t.kind==="door"&&t.door==="claim"},It=e=>{let t=k(e);return t.kind==="door"&&t.door==="invitations"},Nt=e=>{let t=k(e);return t.kind==="account"&&t.section==="upgrade"};oe="https://api.shipstatic.com",P={TOKEN:"SHIP_TOKEN",API_URL:"SHIP_API_URL"},In="SHIP_VIA",Nn=`https://my.shipstatic.com${St().apiKey()}`,Ln=4320*60;On=["account.create","account.update","account.delete","account.key.generate","account.plan.transition","deployment.create","deployment.update","deployment.delete","deployment.claim","domain.create","domain.update","domain.delete","domain.verify","token.create","token.consume","token.delete","member.join","member.leave","consent.grant"],h={PENDING:"pending",PROCESSING_ERROR:"processing_error",EXCLUDED:"excluded",VALIDATION_FAILED:"validation_failed",READY:"ready"};I={MIN_LENGTH:3,MAX_LENGTH:25,MAX_COUNT:10,SEPARATORS:"._-"},we=/^[a-z0-9]+(?:[._-][a-z0-9]+)*$/;O={COMMAND_MAX_LENGTH:200,OUTPUT_DIR_MAX_LENGTH:100,OUTPUT_DIR_PATTERN:/^[A-Za-z0-9._-]+(\/[A-Za-z0-9._-]+)*$/};v={MIN_LENGTH:6,MAX_LENGTH:128}});async function Ft(e){let t=(await import("spark-md5")).default,n=new t.ArrayBuffer,r=2097152;for(let o=0;o<e.size;o+=r){let i=Math.min(o+r,e.size);n.append(await e.slice(o,i).arrayBuffer())}return{md5:n.end()}}async function Mt(e){let{createHash:t}=await import("crypto"),n=t("md5");return n.update(e),{md5:n.digest("hex")}}async function Ut(e){let{createHash:t}=await import("crypto"),{createReadStream:n}=await import("fs");return new Promise((r,o)=>{let i=t("md5"),l=n(e);l.on("error",p=>o(a.file(`Failed to read file for MD5: ${p.message}`,{filePath:e}))),l.on("data",p=>i.update(p)),l.on("end",()=>r({md5:i.digest("hex")}))})}async function G(e){if(e instanceof Blob)return Ft(e);if(typeof Buffer<"u"&&Buffer.isBuffer(e))return Mt(e);if(typeof e=="string")return Ut(e);throw a.business("Invalid input for MD5 calculation")}var B=A(()=>{"use strict";f()});function ir(e){ae=e}function Gt(){return typeof process<"u"&&process.versions&&process.versions.node?"node":typeof window<"u"||typeof self<"u"?"browser":"unknown"}function L(){return ae||Gt()}var ae,w=A(()=>{"use strict";ae=null});function qe(e){if(!e||e.length===0)return"";let t=e.filter(i=>i&&typeof i=="string").map(i=>i.replace(/\\/g,"/"));if(t.length===0)return"";if(t.length===1)return t[0];let n=t.map(i=>i.split("/").filter(Boolean)),r=[],o=Math.min(...n.map(i=>i.length));for(let i=0;i<o;i++){let l=n[0][i];if(n.every(p=>p[i]===l))r.push(l);else break}return r.join("/")}function K(e){return e.replace(/\\/g,"/").replace(/\/+/g,"/").replace(/^\/+/,"")}var le=A(()=>{"use strict"});function Xe(e,t={}){if(t.flatten===!1)return e.map(r=>({path:K(r),name:ce(r)}));let n=Vt(e);return e.map(r=>{let o=K(r);if(n){let i=n.endsWith("/")?n:`${n}/`;o.startsWith(i)&&(o=o.substring(i.length))}return o||(o=ce(r)),{path:o,name:ce(r)}})}function Vt(e){if(!e.length)return"";let n=e.map(i=>K(i)).map(i=>i.split("/")),r=[],o=Math.min(...n.map(i=>i.length));for(let i=0;i<o-1;i++){let l=n[0][i];if(n.every(p=>p[i]===l))r.push(l);else break}return r.join("/")}function ce(e){return e.split(/[/\\]/).pop()||e}var pe=A(()=>{"use strict";le()});function j(e,t,n){let r=t.suggestions?.[n];return r?`${e} ${r}`:e}function q(e,t){return Kt.find(n=>n.broken(e,t))}var Kt,de=A(()=>{"use strict";f();me();Kt=[{name:"name",broken:({path:e})=>!ue(e).valid,sentence:({path:e})=>ue(e).reason??`File name "${e}" is invalid.`},{name:"extension",broken:({path:e},t)=>De(e,t.blockedExtensions??[]),sentence:({path:e})=>`File "${e}" has an extension that is not allowed.`},{name:"fileSize",broken:({size:e},t)=>e>t.maxFileSize,sentence:({path:e},t)=>j(`File "${e}" is too large. Maximum ${x(t.maxFileSize)} allowed.`,t,"maxFileSize")},{name:"totalSize",broken:({totalSize:e},t)=>e>t.maxTotalSize,sentence:({totalSize:e},t)=>j(`Files add up to ${x(e)}. Maximum ${x(t.maxTotalSize)} allowed.`,t,"maxTotalSize")}]});function ue(e){let t=o=>({valid:!1,reason:`File name "${e}" ${o}.`});if(Re(e))return t("contains unsafe characters");if(e.startsWith(" ")||e.endsWith(" "))return t("cannot start or end with spaces");if(e.endsWith("."))return t("cannot end with dots");let n=/^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(\.|$)/i,r=e.split("/").pop()||e;return n.test(r)?t("uses a reserved system name"):e.includes("..")?t("contains a path traversal pattern"):{valid:!0}}function Ir(e,t){let n=[],r=[],o=[];if(e.length===0){let s={file:"(no files)",message:"At least one file must be provided."};return n.push(s),{files:[],validFiles:[],errors:n,warnings:[],canDeploy:!1}}for(let s of e)if(M(s.name))return n.push({file:s.name,message:"Unbuilt project detected. Deploy your build output (dist/, build/, out/), not the project folder."}),{files:e.map(u=>({...u,status:h.VALIDATION_FAILED,statusMessage:"Unbuilt project detected"})),validFiles:[],errors:n,warnings:[],canDeploy:!1};if(e.length>t.maxFilesCount){let s={file:`(${e.length} files)`,message:j(`Too many files (${e.length}). Maximum ${t.maxFilesCount} files allowed.`,t,"maxFilesCount")};return n.push(s),{files:e.map(u=>({...u,status:h.VALIDATION_FAILED,statusMessage:s.message})),validFiles:[],errors:n,warnings:[],canDeploy:!1}}let i=0;for(let s of e){let u=h.READY,c="Ready for upload";if(s.status===h.PROCESSING_ERROR)u=h.VALIDATION_FAILED,c=s.statusMessage||`File "${s.name}" could not be read.`,n.push({file:s.name,message:c});else if(s.size===0){u=h.EXCLUDED,c=`File "${s.name}" is empty, so it is excluded.`,r.push({file:s.name,message:c}),o.push({...s,status:u,statusMessage:c});continue}else if(s.size<0)u=h.VALIDATION_FAILED,c=`File "${s.name}" reports a negative size.`,n.push({file:s.name,message:c});else if(!s.name||s.name.trim().length===0)u=h.VALIDATION_FAILED,c="File name cannot be empty.",n.push({file:s.name||"(empty)",message:c});else if(s.name.includes("\0"))u=h.VALIDATION_FAILED,c=`File name "${s.name}" contains invalid characters (null byte).`,n.push({file:s.name,message:c});else{let y={path:s.name,size:s.size,totalSize:i+s.size},D=q(y,t);D?(u=h.VALIDATION_FAILED,c=D.sentence(y,t),n.push({file:D.name==="totalSize"?`(${e.length} files)`:s.name,message:c})):i=y.totalSize}o.push({...s,status:u,statusMessage:c})}n.length>0&&(o=o.map(s=>s.status===h.EXCLUDED?s:{...s,status:h.VALIDATION_FAILED,statusMessage:s.status===h.VALIDATION_FAILED?s.statusMessage:"Deployment failed due to validation errors in bundle"}));let l=n.length===0?o.filter(s=>s.status===h.READY):[],p=n.length===0;return{files:o,validFiles:l,errors:n,warnings:r,canDeploy:p}}function jt(e){return e.filter(t=>t.status===h.READY)}function Nr(e){return jt(e).length>0}var me=A(()=>{"use strict";f();de();f()});import{isJunk as qt}from"junk";function Ye(e,t){if(!e||e.length===0)return[];if(!t?.allowUnbuilt&&e.find(r=>r&&M(r)))throw a.business("Unbuilt project detected \u2014 deploy your build output (dist/, build/, out/), not the project folder");return e.filter(n=>{if(!n)return!1;let r=n.replace(/\\/g,"/").split("/").filter(Boolean);if(r.length===0)return!0;let o=r[r.length-1];if(qt(o))return!1;for(let l of r)if(l!==".well-known"&&(l.startsWith(".")||l.length>255))return!1;let i=r.slice(0,-1);for(let l of i)if(Xt.some(p=>l.toLowerCase()===p.toLowerCase()))return!1;return!0})}var Xt,fe=A(()=>{"use strict";f();Xt=["__MACOSX",".Trashes",".fseventsd",".Spotlight-V100"]});function We(e,t){if(e.includes("\0")||e.includes("/../")||e.startsWith("../")||e.endsWith("/.."))throw a.business(`Security error: Unsafe file path "${e}" for file: ${t}`)}function Je(e,t){let n=q(e,t);if(n)throw a.business(n.sentence(e,t))}var he=A(()=>{"use strict";f();de()});async function Qe(e,t={},n){let r=!!(t.build||t.prerender),o=Xe(e.map(c=>c.path),{flatten:t.pathDetect!==!1}).map(c=>c.path),i=new Set(Ye(o,{allowUnbuilt:r})),l=e.map((c,y)=>({source:c,deployPath:o[y]})).filter(({deployPath:c})=>i.has(c));if(l.length===0)return[];let p=r?null:Yt(n),s=[],u=0;for(let{source:c,deployPath:y}of l){if(p&&We(y,c.origin),c.size===0)continue;p&&(u+=c.size,Je({path:y,size:c.size,totalSize:u},p));let D=await c.read(),{md5:X}=await G(D);s.push({path:y,content:D,size:c.size,md5:X})}if(p&&s.length>p.maxFilesCount)throw a.business(`Too many files to deploy. Maximum allowed is ${p.maxFilesCount} files.`);return s}function Yt(e){if(!e)throw a.config("Platform limits not provided. Deploy-mode validation requires the limits argument \u2014 pass `ship.getLimits()` result.");return e}var Ze=A(()=>{"use strict";f();pe();fe();B();he()});var nt={};it(nt,{processFilesForNode:()=>tt});import*as T from"fs";import*as g from"path";function et(e,t=new Set){let n=[],r=T.realpathSync(e);if(t.has(r))return n;t.add(r);for(let o of T.readdirSync(e)){let i=g.join(e,o),l=T.statSync(i);l.isDirectory()?n.push(...et(i,t)):l.isFile()&&n.push({absPath:i,size:l.size})}return n}async function Wt(e){try{return T.readFileSync(e)}catch(t){let n=t instanceof Error?t.message:String(t);throw a.file(`Failed to read file "${e}": ${n}`,{filePath:e})}}function Jt(e){for(let t of e){let n=g.resolve(t);try{if(T.statSync(n).isDirectory()){let r=T.readdirSync(n).find(o=>ee.has(o));if(r)throw a.business(`"${r}" detected \u2014 deploy your build output (dist/, build/, out/), not the project folder`)}}catch(r){if(F(r))throw r}}}async function tt(e,t={},n){if(L()!=="node")throw a.business("processFilesForNode can only be called in Node.js environment.");Jt(e);let r=e.flatMap(p=>{let s=g.resolve(p);try{let u=T.statSync(s);return u.isDirectory()?et(s):[{absPath:s,size:u.size}]}catch{throw a.file(`Path does not exist: ${p}`,{filePath:p})}}),o=new Map(r.map(p=>[p.absPath,p.size])),i=qe(e.map(p=>g.resolve(p)).map(p=>{try{return T.statSync(p).isDirectory()?p:g.dirname(p)}catch{return g.dirname(p)}})),l=[...o].map(([p,s])=>({path:Qt(p,i),origin:p,size:s,read:()=>Wt(p)}));return Qe(l,t,n)}function Qt(e,t){if(t&&t.length>0){let n=g.relative(t,e);if(n&&typeof n=="string"&&!n.startsWith(".."))return n.replace(/\\/g,"/")}return g.basename(e)}var ye=A(()=>{"use strict";f();Ze();w();le()});f();f();f();var $=class{constructor(){this.handlers=new Map}on(t,n){this.handlers.has(t)||this.handlers.set(t,new Set),this.handlers.get(t)?.add(n)}off(t,n){let r=this.handlers.get(t);r&&(r.delete(n),r.size===0&&this.handlers.delete(t))}emit(t,...n){let r=this.handlers.get(t);if(!r)return;let o=Array.from(r);for(let i of o)try{i(...n)}catch(l){r.delete(i),t!=="error"&&setTimeout(()=>{let p=l instanceof Error?l:new Error(String(l));this.emit("error",p,String(t))},0)}}};var bt=3e4,Ot=2,Pt=300,xt=2e3,_t=new Set([500,502,503,504]);function wt(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason);return}let o=()=>{clearTimeout(l),t?.removeEventListener("abort",i)},i=()=>{o(),r(t?.reason)},l=setTimeout(()=>{o(),n()},e);t?.addEventListener("abort",i)})}var Fe=3e5,Ct=3e5,vt=Fe+Ct,H=class extends ${constructor(n){super();this.globalHeaders={};this.apiUrl=n.apiUrl||oe,this.getAuthHeadersCallback=n.getAuthHeaders,this.session=n.session??!1,this.caller=n.caller,this.timeout=n.timeout??bt,this.maxRetries=Math.max(0,n.maxRetries??Ot),this.fetch=n.fetch??globalThis.fetch.bind(globalThis),this.deploy={endpoint:n.deployEndpoint||m.DEPLOYMENTS,timeout:n.timeout??Fe,buildTimeout:n.timeout??vt}}setGlobalHeaders(n){this.globalHeaders=n}async executeRequest(n,r,o,i=this.timeout){for(let l=0;;l++)try{return await this.attemptOnce(n,r,o,i)}catch(p){let s=a.fromFetchError(p,o);if(l>=this.maxRetries||!this.isRetryable(s,r))throw this.emit("error",s,n),s;this.emit("retry",s,n,l+1);let u=Math.min(xt,Pt*2**l);try{await wt(Math.random()*u,r.signal)}catch(c){let y=a.fromFetchError(c,o);throw this.emit("error",y,n),y}}}isRetryable(n,r){if(r.signal?.aborted||n.isType(d.Maintenance)||n.isType(d.Cancelled)||!(n.isNetworkError()||n.status!==void 0&&_t.has(n.status)))return!1;let i=(r.method??"GET").toUpperCase();return i==="GET"||i==="HEAD"?!0:i==="PUT"||i==="DELETE"?!1:this.hasIdempotencyKey(r.headers)}hasIdempotencyKey(n){if(!n)return!1;let r=N.HEADER.toLowerCase();return Object.keys(n).some(o=>o.toLowerCase()===r)}async attemptOnce(n,r,o,i=this.timeout){let l=()=>{};try{let p=await this.mergeHeaders(r.headers),s=this.createTimeoutSignal(r.signal,i);l=s.cleanup;let u={...r,headers:p,credentials:this.session&&!p.Authorization?"include":void 0,signal:s.signal};this.emit("request",n,u);let c=await this.fetch(n,u);if(l(),!c.ok)throw await a.fromHttpResponse(c,o);return this.emit("response",this.safeClone(c),n),{data:await this.parseResponse(this.safeClone(c)),status:c.status}}catch(p){throw l(),a.fromFetchError(p,o)}}async request(n,r,o,i){let{data:l}=await this.executeRequest(`${this.apiUrl}${n}`,r,o,i);return l}async requestWithStatus(n,r,o){return this.executeRequest(`${this.apiUrl}${n}`,r,o)}async mergeHeaders(n={}){return{...this.globalHeaders,...this.caller?{[b.HEADER]:this.caller}:{},...await this.getAuthHeadersCallback(),...n}}createTimeoutSignal(n,r=this.timeout){let o=new AbortController,i=setTimeout(()=>o.abort(new DOMException(`Timed out after ${r}ms`,"TimeoutError")),r),l=n?()=>o.abort(n.reason):void 0;return n&&l&&(n.addEventListener("abort",l),n.aborted&&o.abort(n.reason)),{signal:o.signal,cleanup:()=>{clearTimeout(i),n&&l&&n.removeEventListener("abort",l)}}}safeClone(n){try{return n.clone()}catch{return n}}async parseResponse(n){if(!(n.headers.get("Content-Length")==="0"||n.status===204))return n.json()}};f();f();async function Me(e,t={}){let{labels:n,via:r,password:o,ttl:i,flags:l,captcha:p}=t,s=new FormData,u=[];for(let c of e){if(typeof c.content=="string"||c.content===null||c.content===void 0)throw a.file(`Unsupported file.content type: ${c.path}`,{filePath:c.path});if(!c.md5)throw a.file(`File missing md5 checksum: ${c.path}`,{filePath:c.path});s.append(E.FILES,new File([c.content],c.path,{type:"application/octet-stream"})),u.push(c.md5)}return s.append(E.CHECKSUMS,JSON.stringify(u)),n&&n.length>0&&s.append(E.LABELS,JSON.stringify(n)),r&&s.append(E.VIA,r),o&&s.append(E.PASSWORD,o),i!==void 0&&s.append(E.TTL,String(i)),l?.build&&s.append(E.BUILD,"true"),l?.prerender&&s.append(E.PRERENDER,"true"),l?.spa&&s.append(E.SPA,"true"),l?.buildCommand&&s.append(E.BUILD_COMMAND,l.buildCommand),l?.outputDir&&s.append(E.OUTPUT_DIR,l.outputDir),p&&s.append(E.CAPTCHA,p),s}f();B();async function kt(){let e=JSON.stringify(be,null,2),t;typeof Buffer<"u"?t=Buffer.from(e,"utf-8"):t=new Blob([e],{type:"application/json"});let{md5:n}=await G(t);return{path:S,content:t,size:e.length,md5:n}}async function $t(e,t,n){let r=e.find(p=>p.path===U.INDEX_FILE||p.path===`/${U.INDEX_FILE}`);if(!r||r.size>U.MAX_INDEX_BYTES)return!1;let o;if(typeof Buffer<"u"&&Buffer.isBuffer(r.content))o=r.content.toString("utf-8");else if(typeof Blob<"u"&&r.content instanceof Blob)o=await r.content.text();else if(typeof File<"u"&&r.content instanceof File)o=await r.content.text();else return!1;let i={files:e.map(p=>p.path),index:o};return(await t.request(m.SPA_CHECK,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i),signal:n??null},"SPA check")).isSPA}async function Ue(e,t,n){if(n.spaDetect===!1||n.spa||n.build||n.prerender||e.some(r=>r.path===S))return e;try{if(await $t(e,t,n.signal)){let o=await kt();return[...e,o]}}catch(r){if(n.signal?.aborted)throw r}return e}f();f();function _(e){if(e==null)return;if(e.length===0)return e;if(e.length>I.MAX_COUNT)throw a.validation(`Maximum ${I.MAX_COUNT} labels allowed`);let t=e.map((r,o)=>{if(typeof r!="string")throw a.validation(`Label at index ${o} must be a string`);let i=r.trim().toLowerCase();if(i.length<I.MIN_LENGTH)throw a.validation(`Labels must be at least ${I.MIN_LENGTH} characters long`);if(i.length>I.MAX_LENGTH)throw a.validation(`Labels must be no more than ${I.MAX_LENGTH} characters long`);if(!we.test(i))throw a.validation(`Labels must start and end with alphanumeric characters, with optional separators (${I.SEPARATORS}) between segments`);return i}),n=[...new Set(t)];if(n.length!==t.length)throw a.validation("Duplicate labels are not allowed");return n}async function ke(e){let t=e.find(o=>o.path===S||o.path===`/${S}`);if(!t)return;let n=t.content,r=typeof n.text=="function"?await n.text():t.content.toString("utf8");Oe(r)}var z={"Content-Type":"application/json"},Ht="sdk";function se(e){let t=new URLSearchParams;e?.limit!==void 0&&t.set("limit",String(e.limit)),e?.cursor!==void 0&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}function $e(e){let{getApi:t,processInput:n}=e;return{upload:async(r,o={})=>{if(!n)throw a.config("processInput function is not provided.");let i=t(),l=await n(r,o),p=await Ue(l,i,o);if(!p.length)throw a.business("No files to deploy");for(let Y of p)if(!Y.md5)throw a.file(`MD5 checksum missing for file: ${Y.path}`,{filePath:Y.path});ie(o.password);let s=re(o.ttl),u=Se(o.idempotencyKey),c=_(o.labels);await ke(p);let y=Ce(o.buildCommand),D=ve(o.outputDir),X=o.build||o.prerender||o.spa?{build:o.build,prerender:o.prerender,spa:o.spa,buildCommand:y,outputDir:D}:void 0,rt=await Me(p,{labels:c,via:o.via??Ht,password:o.password,ttl:s,flags:X,captcha:o.captcha});return i.request(i.deploy.endpoint,{method:"POST",body:rt,...u?{headers:{[N.HEADER]:u}}:{},signal:o.signal||null},"Deploy",o.build||o.prerender?i.deploy.buildTimeout:i.deploy.timeout)},list:async r=>t().request(`${m.DEPLOYMENTS}${se(r)}`,{method:"GET"},"List deployments"),get:async r=>t().request(m.DEPLOYMENT(encodeURIComponent(r)),{method:"GET"},"Get deployment"),set:async(r,o)=>t().request(m.DEPLOYMENT(encodeURIComponent(r)),{method:"PATCH",headers:z,body:JSON.stringify({labels:_(o.labels)})},"Update deployment labels"),delete:async r=>t().request(m.DEPLOYMENT(encodeURIComponent(r)),{method:"DELETE"},"Delete deployment")}}function He(e){let{getApi:t}=e;return{set:async(n,r={})=>{let o=_(r.labels),i={};r.deployment&&(i.deployment=r.deployment),o!==void 0&&(i.labels=o);let{data:l,status:p}=await t().requestWithStatus(m.DOMAIN(encodeURIComponent(n)),{method:"PUT",headers:z,body:JSON.stringify(i)},"Set domain");return{...l,isCreate:p===201}},list:async n=>t().request(`${m.DOMAINS}${se(n)}`,{method:"GET"},"List domains"),get:async n=>t().request(m.DOMAIN(encodeURIComponent(n)),{method:"GET"},"Get domain"),delete:async n=>t().request(m.DOMAIN(encodeURIComponent(n)),{method:"DELETE"},"Delete domain"),verify:async n=>t().request(m.DOMAIN_VERIFY(encodeURIComponent(n)),{method:"POST"},"Verify domain"),validate:async n=>t().request(m.DOMAINS_VALIDATE,{method:"POST",headers:z,body:JSON.stringify({domain:n})},"Validate domain"),dns:async n=>t().request(m.DOMAIN_DNS(encodeURIComponent(n)),{method:"GET"},"Get domain DNS"),records:async n=>t().request(m.DOMAIN_RECORDS(encodeURIComponent(n)),{method:"GET"},"Get domain records"),share:async n=>t().request(m.DOMAIN_SHARE(encodeURIComponent(n)),{method:"GET"},"Get domain share")}}function Ge(e){let{getApi:t}=e;return{get:async()=>t().request(m.ACCOUNT,{method:"GET"},"Get account")}}function Be(e){let{getApi:t}=e;return{create:async(n={})=>{let r=re(n.ttl),o=_(n.labels),i={};return r!==void 0&&(i.ttl=r),o!==void 0&&(i.labels=o),t().request(m.TOKENS,{method:"POST",headers:z,body:JSON.stringify(i)},"Create token")},list:async n=>t().request(`${m.TOKENS}${se(n)}`,{method:"GET"},"List tokens"),get:async n=>t().request(m.TOKEN(encodeURIComponent(n)),{method:"GET"},"Get token"),delete:async n=>t().request(m.TOKEN(encodeURIComponent(n)),{method:"DELETE"},"Delete token")}}var V=class{constructor(t={}){this.credential=null;if(t={...t,apiUrl:t.apiUrl||void 0,token:t.token||void 0,caller:t.caller||void 0},this.clientOptions=t,t.caller!==void 0&&Pe(t.caller),t.token&&t.session)throw a.config("Provide either `token` or `session`, not both.");typeof t.token=="string"?(ne(t.token),this.credential=t.token):t.token&&(this.credential=t.token),this.http=new H({...t,getAuthHeaders:()=>this.getAuthHeaders()});let n={getApi:()=>this.http};this.deployments=$e({...n,processInput:async(r,o)=>this.processInput(r,o,await this.getLimits({signal:o.signal}))}),this.domains=He(n),this.account=Ge(n),this.tokens=Be(n)}async ping(){return this.http.request(m.PING,{method:"GET"},"Ping")}async deploy(t,n){return this.deployments.upload(t,n)}async whoami(){return this.account.get()}async getLimits(t={}){return this.http.request(m.LIMITS,{method:"GET",signal:t.signal??null},"Get limits")}on(t,n){this.http.on(t,n)}off(t,n){this.http.off(t,n)}setHeaders(t){this.http.setGlobalHeaders(t)}clearHeaders(){this.http.setGlobalHeaders({})}setToken(t){if(this.clientOptions.session)throw a.config("Provide either `token` or `session`, not both.");if(typeof t=="string"){if(!t)throw a.business("Invalid token provided. Token must be a non-empty string.");ne(t),this.credential=t;return}if(typeof t!="function")throw a.business("Invalid token provided. Token must be a non-empty string or a provider function.");this.credential=t}async getAuthHeaders(){if(this.credential===null)return{};let t=typeof this.credential=="function"?await this.credential():this.credential;if(!t)throw a.authentication("Token provider returned no token.");if(typeof t!="string")throw a.authentication("Token provider returned a non-string value.");return{Authorization:`Bearer ${t}`}}};w();f();import{z as Ke}from"zod";import{z as ze}from"zod";var Ve={apiUrl:ze.string().url().optional(),token:ze.string().min(1).optional()};w();var Bt=Ke.object(Ve).strict(),zt={apiUrl:P.API_URL,token:P.TOKEN};function je(){if(L()!=="node")return{};let e={apiUrl:process.env[P.API_URL]||void 0,token:process.env[P.TOKEN]||void 0};try{return Bt.parse(e)}catch(t){if(t instanceof Ke.ZodError){let n=t.issues[0],r=n.path[0],o=(r&&zt[r])??"SHIP environment configuration";throw a.config(`Invalid ${o}: ${n.message}`)}throw a.config("Invalid environment configuration")}}f();f();pe();w();me();fe();B();he();function vr(e,t,n,r=!0){let o=e===1?t:n;return r?`${e} ${o}`:o}ye();var Ee=class extends V{constructor(t={}){if(L()!=="node")throw a.business("Node.js Ship class can only be used in Node.js environment.");let n=je();super({...t,apiUrl:t.apiUrl||n.apiUrl,token:t.token||(t.session?void 0:n.token)})}async deploy(t,n){return super.deploy(t,n)}async processInput(t,n,r){let o=typeof t=="string"?[t]:t;if(!Array.isArray(o)||!o.every(l=>typeof l=="string"))throw a.business("Invalid input type for Node.js environment. Expected string or string[].");if(o.length===0)throw a.business("No files to deploy.");let{processFilesForNode:i}=await Promise.resolve().then(()=>(ye(),nt));return i(o,n,r)}},Zt=Ee;export{hn as ACCOUNT_HEADER,Ie as API_KEY,m as API_PATHS,mn as AUTH_BASE_PATH,an as AccountPlan,ln as AccountRefusal,H as ApiHttp,J as AuthMethod,O as BUILD_SETTINGS,b as CALLER,oe as DEFAULT_API,S as DEPLOYMENT_CONFIG_FILENAME,E as DEPLOY_FIELDS,un as DEPLOY_FILE_GRAMMAR,Ne as DEPLOY_TOKEN,tn as DeploymentStatus,st as DeploymentVia,nn as DomainStatus,rn as DomainVerification,d as ErrorType,h as FILE_VALIDATION_STATUS,h as FileValidationStatus,N as IDEMPOTENCY_KEY_CONSTRAINTS,Xt as JUNK_DIRECTORIES,I as LABEL_CONSTRAINTS,we as LABEL_PATTERN,Nn as MY_API_KEY_URL,Le as OAUTH_TOKEN,En as OAuthScope,v as PASSWORD_CONSTRAINTS,Ln as PUBLIC_DEPLOYMENT_TTL_SECONDS,gt as SECTIONS,on as SETUP_TROUBLESHOOTING_ANCHOR,P as SHIP_ENV,In as SHIP_VIA_ENV,fn as SIGN_IN_RETURN_PARAM,U as SPA_CHECK_CONSTRAINTS,be as SPA_DEFAULT_CONFIG,Ee as Ship,a as ShipError,C as TTL_CONSTRAINTS,R as TokenKind,ee as UNBUILT_PROJECT_MARKERS,mt as UNSAFE_FILENAME_CHARS,On as USER_VISIBLE_EVENTS,dn as WEB_FILE_ACCEPT,ir as __setTestEnvironment,Dn as accountOfPath,Nr as allValidFilesReady,Oe as assertShipJsonSyntax,Sn as billingReturnOf,G as calculateMD5,ft as classifyToken,St as consolePaths,Ge as createAccountResource,$e as createDeploymentResource,He as createDomainResource,Be as createTokenResource,Zt as default,vn as deserializeLabels,An as doors,Rn as errandOf,xn as extractSubdomain,Ye as filterJunk,Lt as formatDuration,x as formatFileSize,bn as formatTimeRemaining,_n as generateDeploymentUrl,wn as generateDomainUrl,L as getENV,jt as getValidFiles,M as hasUnbuiltMarker,Re as hasUnsafeChars,De as isBlockedExtension,Rt as isClaimPath,Pn as isCustomDomain,Tn as isDeployment,It as isInvitationPath,_e as isPlatformDomain,F as isShipError,Nt as isUpgradePath,sn as normalizeVia,Xe as optimizeDeployPaths,cn as personName,pn as personShortName,vr as pluralize,tt as processFilesForNode,yn as readBearerValue,Cn as serializeLabels,ht as validateApiKey,gn as validateApiUrl,Ce as validateBuildCommand,Pe as validateCaller,Je as validateDeployFile,We as validateDeployPath,yt as validateDeployToken,ue as validateFileName,Ir as validateFiles,Se as validateIdempotencyKey,Et as validateOAuthToken,ve as validateOutputDir,ie as validatePassword,ne as validateToken,re as validateTtl};
1
+ var st=Object.defineProperty;var A=(e,t)=>()=>(e&&(t=e(e=0)),t);var at=(e,t)=>{for(var n in t)st(e,n,{get:t[n],enumerable:!0})};function ln(e){if(!e||typeof e!="string")return;let t=e.trim().toLowerCase();return Object.values(lt).includes(t)?t:void 0}function De(e){if(e==null)return;if(typeof e!="string")throw a.validation("Idempotency key must be a string.");let t=e.trim();if(!t)throw a.validation("Idempotency key must not be empty.");if(t.length>N.MAX_LENGTH)throw a.validation(`Idempotency key must be at most ${N.MAX_LENGTH} characters.`);return t}function un(e){return e.name?.trim()||e.email}function dn(e){return e.name?.trim().split(" ")[0]||e.email}function dt(e){let t=e.code;return t==="ERR_INVALID_URL"?!1:typeof t=="string"?!0:e instanceof TypeError?!/\burl\b/i.test(e.message):!1}function M(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ShipError"&&"status"in e}function mt(e){let t=e.replace(/\\/g,"/").split("/").pop()??"",n=t.lastIndexOf(".");return n<=0||n===t.length-1?null:t.slice(n+1).toLowerCase()}function Re(e,t){let n=mt(e);return n===null?!1:Array.isArray(t)?t.includes(n):t.has(n)}function Ie(e){return ht.test(e)}function U(e){return e.replace(/\\/g,"/").split("/").filter(Boolean).some(n=>ee.has(n))}function yt(e){return e.startsWith(Ne.PREFIX)?R.API_KEY:e.startsWith(Le.PREFIX)?R.DEPLOY_TOKEN:e.startsWith(be.PREFIX)?R.OAUTH:R.OPAQUE}function gn(e){return e.slice(0,Q.length).toLowerCase()!==Q?null:e.slice(Q.length)||null}function xe(e){let t=e.charCodeAt(0)===65279?e.slice(1):e,n;try{n=JSON.parse(t)}catch(r){throw a.config(`invalid JSON format in config: ${r.message}`,{filePath:S})}if(n===null||typeof n!="object"||Array.isArray(n))throw a.config(`${S} must contain a JSON object`,{filePath:S})}function te(e,t,n){if(!e.startsWith(t.PREFIX))throw a.validation(`${n} must start with "${t.PREFIX}"`);if(e.length!==t.TOTAL_LENGTH)throw a.validation(`${n} must be ${t.TOTAL_LENGTH} characters total (${t.PREFIX} + ${t.HEX_LENGTH} hex chars)`);let r=e.slice(t.PREFIX.length);if(!new RegExp(`^[a-f0-9]{${t.HEX_LENGTH}}$`,"i").test(r))throw a.validation(`${n} must contain ${t.HEX_LENGTH} hexadecimal characters after "${t.PREFIX}" prefix`)}function Et(e){te(e,Ne,"API key")}function gt(e){te(e,Le,"Deploy token")}function Tt(e){te(e,be,"OAuth access token")}function ne(e){switch(yt(e)){case R.API_KEY:Et(e);return;case R.DEPLOY_TOKEN:gt(e);return;case R.OAUTH:Tt(e);return;case R.OPAQUE:if(!e)throw a.validation("Token must be a non-empty string")}}function Pe(e){if(!e||e.length>O.MAX_LENGTH||!O.PATTERN.test(e))throw a.validation(`Caller must be 1-${O.MAX_LENGTH} characters: letters, digits, dots, underscores, or hyphens`)}function An(e){try{let t=new URL(e);if(!["http:","https:"].includes(t.protocol))throw a.validation("API URL must use http:// or https:// protocol");if(t.pathname!=="/"&&t.pathname!=="")throw a.validation("API URL must not contain a path");if(t.search||t.hash)throw a.validation("API URL must not contain query parameters or fragments")}catch(t){throw M(t)?t:a.validation("API URL must be a valid URL")}}function Sn(e){return/^[a-z]+-[a-z]+-[a-z0-9]{7}(\.[a-z0-9.-]+)?$/i.test(e)}function re(e){if(e!=null){if(typeof e!="number"||!Number.isFinite(e))throw a.validation("TTL must be a number of seconds");if(!Number.isInteger(e))throw a.validation("TTL must be a whole number of seconds");if(e<v.MIN_SECONDS||e>v.MAX_SECONDS)throw a.validation(`TTL must be between ${v.MIN_SECONDS} and ${v.MAX_SECONDS} seconds`);return e}}function Rt(e){let t=e?`/${e}`:"",n=r=>`${t}${r}`;return{dashboard:()=>t||"/",newSite:()=>n("/new"),deployments:Object.assign(()=>n("/deployments"),{upload:()=>n("/deployments/upload")}),domains:Object.assign(()=>n("/domains"),{connect:r=>n(`/domains/${r}/connect`),deployment:r=>n(`/domains/${r}/deployment`)}),settings:r=>n(r?`/settings#${r}`:"/settings"),settingsAfterBilling:()=>n(`/settings?${Te("portal")}`),upgrade:r=>n(r?`/upgrade/${r}`:"/upgrade"),success:()=>n("/success"),successAfterCheckout:()=>n(`/success?${Te("checkout")}`),apiKey:()=>n("/api-key")}}function Rn(e){let t=new URLSearchParams(e);for(let[n,[r,o]]of Object.entries(_e))if(t.get(r)===o)return n;return null}function $(e){let t=e.split(/[?#]/)[0].toLowerCase(),[n="",r=""]=t.split("/").filter(Boolean);return It(n)?{kind:"door",door:n}:n===Dt?{kind:"admin"}:n===""||Se(n)?{kind:"account",account:null,section:n===""?null:n}:{kind:"account",account:n,section:Se(r)?r:null}}function In(e){let t=$(e);return t.kind==="account"?t.account:null}function Nn(e){return Nt(e)?"claim":Lt(e)?"invite":bt(e)?"upgrade":null}function Ot(e){let t=Math.round(e/60);if(!(t>=1))return"less than a minute";if(t<120)return Z(t,"minute");let n=Math.round(e/3600);return n<48?Z(n,"hour"):Z(Math.round(e/86400),"day")}function xn(e,t=Date.now()/1e3){let n=e-t;return n>0?Ot(n):null}function Z(e,t){return`${e} ${t}${e===1?"":"s"}`}function _(e,t=1){if(e===0)return"0 Bytes";let n=1024,r=["Bytes","KB","MB","GB"],o=Math.floor(Math.log(e)/Math.log(n));return`${Number.parseFloat((e/n**o).toFixed(t))} ${r[o]}`}function we(e,t){return e.endsWith(`.${t}`)}function _n(e,t){return!we(e,t)}function wn(e,t){return we(e,t)?e.slice(0,-(t.length+1)):null}function Cn(e){return`https://${e}`}function vn(e){return`https://${e}`}function Fn(e){return!e||e.length===0?null:JSON.stringify(e)}function Mn(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function ve(e){if(e==null||e==="")return;if(typeof e!="string")throw a.validation("Build command must be a string");let t=e.trim();if(t.length===0||t.length>x.COMMAND_MAX_LENGTH)throw a.validation(`Build command must be between 1 and ${x.COMMAND_MAX_LENGTH} characters`);if(/[\x00-\x1f\x7f]/.test(t))throw a.validation("Build command must be a single line");return t}function Fe(e){if(e==null||e==="")return;if(typeof e!="string")throw a.validation("Output folder must be a string");let t=e.trim().replace(/\/+$/,"");if(t.length===0||t.length>x.OUTPUT_DIR_MAX_LENGTH)throw a.validation(`Output folder must be between 1 and ${x.OUTPUT_DIR_MAX_LENGTH} characters`);if(!x.OUTPUT_DIR_PATTERN.test(t)||t.split("/").some(n=>n===".."||n==="."))throw a.validation("Output folder must be a relative path inside the project, like dist or dist/site");return t}function ie(e){if(e==null)return;if(typeof e!="string")throw a.validation("Password must be a string");let t=e.trim();if(t.length<F.MIN_LENGTH||t.length>F.MAX_LENGTH)throw a.validation(`Password must be between ${F.MIN_LENGTH} and ${F.MAX_LENGTH} characters`);return t}var rn,lt,on,sn,an,N,cn,pn,m,E,mn,d,ct,W,pt,ut,a,ft,fn,ht,ee,hn,yn,J,Ne,Le,be,O,En,R,Q,Tn,S,Oe,k,v,At,St,Dt,_e,Te,Ae,Dn,It,Se,Nt,Lt,bt,oe,P,Ln,bn,On,Pn,h,I,Ce,x,F,f=A(()=>{"use strict";rn={PENDING:"pending",SUCCESS:"success",FAILED:"failed",DELETING:"deleting"},lt={WEB:"web",SDK:"sdk",CLI:"cli",MCP:"mcp",GIT:"git",N8N:"n8n",GPT:"gpt",VSC:"vsc",CLD:"cld",CRS:"crs",GMN:"gmn",API:"api"},on={LIVE:"live",UNLINKED:"unlinked",UNVERIFIED:"unverified",PAUSED:"paused"},sn={PENDING:"pending",PARTIAL:"partial",VERIFIED:"verified"},an="troubleshooting",N={HEADER:"Idempotency-Key",MAX_LENGTH:256,WINDOW_SECONDS:1440*60};cn={FREE:"free",PRO:"pro",TEAM:"team",SCALE:"scale",SPONSORED:"sponsored"},pn={PAUSED:"paused",UNKNOWN:"unknown"};m={DEPLOYMENTS:"/deployments",DEPLOYMENT:e=>`/deployments/${e}`,DEPLOYMENT_CONFIG:e=>`/deployments/${e}/config`,DOMAINS:"/domains",DOMAIN:e=>`/domains/${e}`,DOMAIN_VERIFY:e=>`/domains/${e}/verify`,DOMAIN_DNS:e=>`/domains/${e}/dns`,DOMAIN_RECORDS:e=>`/domains/${e}/records`,DOMAIN_SHARE:e=>`/domains/${e}/share`,DOMAIN_PROPAGATION:e=>`/domains/${e}/propagation`,DOMAINS_VALIDATE:"/domains/validate",TOKENS:"/tokens",TOKEN:e=>`/tokens/${e}`,ACCOUNT:"/account",ACCOUNT_KEY:"/account/key",ACCOUNT_CLAIM:"/account/claim",ACTIVITIES:"/activities",LABELS:"/labels",LIMITS:"/limits",PLANS:"/plans",PING:"/ping",SETUP:"/setup",SPA_CHECK:"/spa-check",UPLOAD:"/upload"},E={FILES:"files[]",CHECKSUMS:"checksums",LABELS:"labels",VIA:"via",PASSWORD:"password",TTL:"ttl",BUILD:"build",PRERENDER:"prerender",SPA:"spa",BUILD_COMMAND:"buildCommand",OUTPUT_DIR:"outputDir",CAPTCHA:"captcha"},mn={PATH:"path",CONTENT:"content",ENCODING:"encoding",DEFAULT_ENCODING:"utf-8",ENCODINGS:["utf-8","base64"]},d={Validation:"validation_failed",NotFound:"not_found",Forbidden:"forbidden",RateLimit:"rate_limit_exceeded",Authentication:"authentication_failed",Business:"business_logic_error",Api:"internal_server_error",Maintenance:"maintenance",Build:"build_failed",Network:"network_error",Timeout:"timeout_error",Cancelled:"operation_cancelled",File:"file_error",Config:"config_error"},ct=new Set([d.Network,d.Timeout,d.Cancelled,d.File,d.Config]),W={client:new Set([d.Build,d.Business,d.Cancelled,d.Config,d.File,d.Forbidden,d.NotFound,d.RateLimit,d.Validation]),network:new Set([d.Network,d.Timeout]),auth:new Set([d.Authentication])},pt=new Set(Object.values(d).filter(e=>!ct.has(e))),ut=200;a=class e extends Error{type;status;details;constructor(t,n,r,o){super(n),this.type=t,this.status=r,this.details=o,this.name="ShipError"}toResponse(){let t=this.details,n=this.type===d.Authentication&&t?.internal?void 0:this.details;return{error:this.type,message:this.message,status:this.status,details:n}}static async fromHttpResponse(t,n){let r,o,i;try{if(t.headers.get("content-type")?.includes("application/json")){let u=await t.json();if(u&&typeof u=="object"){let c=u;typeof c.message=="string"?r=c.message:typeof c.error=="string"&&(r=c.error),o=c.details,typeof c.error=="string"&&pt.has(c.error)&&(i=c.error)}}else{let u=(await t.text()).trim();u&&!u.startsWith("<")&&u.length<=ut&&(r=u)}}catch{}let l=t.headers.get("retry-after");if(l!==null){let s=l.trim(),u=/^\d+$/.test(s)?Number(s):Math.ceil((Date.parse(s)-Date.now())/1e3);if(Number.isFinite(u)&&u>=0){let c=o&&typeof o=="object"?o:{};c.retryAfter===void 0&&(o={...c,retryAfter:u})}}r=r||`${n||"Request"} failed with status ${t.status}`;let p=i??(t.status===401?d.Authentication:t.status===403?d.Forbidden:t.status===429?d.RateLimit:d.Api);return new e(p,r,t.status,o)}static fromFetchError(t,n){if(M(t))return t;let r=n||"Request",o=t?.name;return o==="AbortError"?e.cancelled(`${r} was cancelled`):o==="TimeoutError"?e.timeout(`${r} timed out`,{cause:t}):t instanceof Error?dt(t)?e.network(`${r} failed: ${t.message}`,{cause:t}):new e(d.Api,`${r} failed: ${t.message}`):new e(d.Api,`${r} failed: Unknown error`)}static validation(t,n){return new e(d.Validation,t,400,n)}static notFound(t,n){let r=n?`${t} ${n} not found`:`${t} not found`;return new e(d.NotFound,r,404)}static forbidden(t,n){return new e(d.Forbidden,t,403,n)}static rateLimit(t="Too many requests",n){return new e(d.RateLimit,t,429,n)}static authentication(t="Authentication required",n){return new e(d.Authentication,t,401,n)}static business(t,n=400,r){return new e(d.Business,t,n,r)}static network(t,n){return new e(d.Network,t,void 0,n)}static timeout(t,n){return new e(d.Timeout,t,void 0,n)}static cancelled(t,n){return new e(d.Cancelled,t,void 0,n)}static file(t,n){return new e(d.File,t,void 0,n)}static config(t,n){return new e(d.Config,t,void 0,n)}static api(t,n=500,r){return new e(d.Api,t,n,r)}static maintenance(t,n){return new e(d.Maintenance,t,503,n)}static build(t,n){return new e(d.Build,t,422,n)}isClientError(){return W.client.has(this.type)?!0:this.status!==void 0&&this.status>=400&&this.status<500}isNetworkError(){return W.network.has(this.type)}isAuthError(){return W.auth.has(this.type)}isType(t){return this.type===t}};ft=["html","htm","xhtml","xml","txt","md","markdown","pdf","csv","json","jsonc","webmanifest","map","toml","yaml","yml","rss","atom","css","scss","sass","less","js","mjs","cjs","jsx","ts","tsx","wasm","vue","svelte","png","jpg","jpeg","gif","webp","avif","svg","ico","bmp","tif","tiff","heic","heif","woff","woff2","ttf","otf","eot","mp3","wav","ogg","oga","opus","m4a","aac","flac","weba","mp4","webm","ogv","mov","m4v","avi","glb","gltf","usdz","vtt","srt","zip"],fn=ft.map(e=>`.${e}`).join(","),ht=/[\x00-\x1f\x7f#?%\\<>"]/;ee=new Set(["node_modules","package.json"]);hn="/auth",yn="signing-in",J={SESSION:"session",API_KEY:"apiKey",TOKEN:"token",AGENT:"agent",OAUTH:"oauth",SYSTEM:"system"},Ne={PREFIX:"ship-",HEX_LENGTH:32,TOTAL_LENGTH:37,HINT_LENGTH:4},Le={PREFIX:"deploy-",HEX_LENGTH:32,TOTAL_LENGTH:39},be={PREFIX:"oauth-",HEX_LENGTH:32,TOTAL_LENGTH:38},O={HEADER:"X-Caller",MAX_LENGTH:128,PATTERN:/^[a-zA-Z0-9._-]+$/},En="X-Account",R={API_KEY:J.API_KEY,DEPLOY_TOKEN:J.TOKEN,OAUTH:J.OAUTH,OPAQUE:"opaque"};Q="bearer ";Tn={ACCOUNT_READ:"account:read",DEPLOYMENTS_READ:"deployments:read",DEPLOYMENTS_WRITE:"deployments:write",DOMAINS_READ:"domains:read",DOMAINS_WRITE:"domains:write"},S="ship.json",Oe={rewrites:[{source:"/(.*)",destination:"/index.html"}]},k={INDEX_FILE:"index.html",MAX_INDEX_BYTES:100*1024};v={MIN_SECONDS:1,MAX_SECONDS:365*24*60*60};At={new:{owner:!1},deployments:{owner:!1},domains:{owner:!1},settings:{owner:!1},upgrade:{owner:!0},success:{owner:!0},"api-key":{owner:!0}},St=["login","register","logout","invitations","claim","consent"],Dt="admin",_e={checkout:["upgrading","true"],portal:["billing","returned"]},Te=e=>_e[e].join("="),Ae=(e,t)=>t?`${e}?next=${encodeURIComponent(t)}`:e;Dn={login:e=>Ae("/login",e),register:e=>Ae("/register",e),logout:()=>"/logout",invitation:e=>`/invitations/${e}`,claim:e=>`/claim/${e}`,consent:()=>"/consent"};It=e=>St.includes(e),Se=e=>Object.hasOwn(At,e);Nt=e=>{let t=$(e);return t.kind==="door"&&t.door==="claim"},Lt=e=>{let t=$(e);return t.kind==="door"&&t.door==="invitations"},bt=e=>{let t=$(e);return t.kind==="account"&&t.section==="upgrade"};oe="https://api.shipstatic.com",P={TOKEN:"SHIP_TOKEN",API_URL:"SHIP_API_URL"},Ln="SHIP_VIA",bn=`https://my.shipstatic.com${Rt().apiKey()}`,On=4320*60;Pn=["account.create","account.update","account.delete","account.key.generate","account.plan.transition","deployment.create","deployment.update","deployment.delete","deployment.claim","domain.create","domain.update","domain.delete","domain.verify","token.create","token.consume","token.delete","member.join","member.leave","consent.grant"],h={PENDING:"pending",PROCESSING_ERROR:"processing_error",EXCLUDED:"excluded",VALIDATION_FAILED:"validation_failed",READY:"ready"};I={MIN_LENGTH:3,MAX_LENGTH:25,MAX_COUNT:10,SEPARATORS:"._-"},Ce=/^[a-z0-9]+(?:[._-][a-z0-9]+)*$/;x={COMMAND_MAX_LENGTH:200,OUTPUT_DIR_MAX_LENGTH:100,OUTPUT_DIR_PATTERN:/^[A-Za-z0-9._-]+(\/[A-Za-z0-9._-]+)*$/};F={MIN_LENGTH:6,MAX_LENGTH:128}});async function Ut(e){let t=(await import("spark-md5")).default,n=new t.ArrayBuffer,r=2097152;for(let o=0;o<e.size;o+=r){let i=Math.min(o+r,e.size);n.append(await e.slice(o,i).arrayBuffer())}return{md5:n.end()}}async function kt(e){let{createHash:t}=await import("crypto"),n=t("md5");return n.update(e),{md5:n.digest("hex")}}async function $t(e){let{createHash:t}=await import("crypto"),{createReadStream:n}=await import("fs");return new Promise((r,o)=>{let i=t("md5"),l=n(e);l.on("error",p=>o(a.file(`Failed to read file for MD5: ${p.message}`,{filePath:e}))),l.on("data",p=>i.update(p)),l.on("end",()=>r({md5:i.digest("hex")}))})}async function B(e){if(e instanceof Blob)return Ut(e);if(typeof Buffer<"u"&&Buffer.isBuffer(e))return kt(e);if(typeof e=="string")return $t(e);throw a.business("Invalid input for MD5 calculation")}var z=A(()=>{"use strict";f()});function ar(e){ae=e}function zt(){return typeof process<"u"&&process.versions&&process.versions.node?"node":typeof window<"u"||typeof self<"u"?"browser":"unknown"}function L(){return ae||zt()}var ae,C=A(()=>{"use strict";ae=null});function Xe(e){if(!e||e.length===0)return"";let t=e.filter(i=>i&&typeof i=="string").map(i=>i.replace(/\\/g,"/"));if(t.length===0)return"";if(t.length===1)return t[0];let n=t.map(i=>i.split("/").filter(Boolean)),r=[],o=Math.min(...n.map(i=>i.length));for(let i=0;i<o;i++){let l=n[0][i];if(n.every(p=>p[i]===l))r.push(l);else break}return r.join("/")}function j(e){return e.replace(/\\/g,"/").replace(/\/+/g,"/").replace(/^\/+/,"")}var le=A(()=>{"use strict"});function Ye(e,t={}){if(t.flatten===!1)return e.map(r=>({path:j(r),name:ce(r)}));let n=jt(e);return e.map(r=>{let o=j(r);if(n){let i=n.endsWith("/")?n:`${n}/`;o.startsWith(i)&&(o=o.substring(i.length))}return o||(o=ce(r)),{path:o,name:ce(r)}})}function jt(e){if(!e.length)return"";let n=e.map(i=>j(i)).map(i=>i.split("/")),r=[],o=Math.min(...n.map(i=>i.length));for(let i=0;i<o-1;i++){let l=n[0][i];if(n.every(p=>p[i]===l))r.push(l);else break}return r.join("/")}function ce(e){return e.split(/[/\\]/).pop()||e}var pe=A(()=>{"use strict";le()});function ue(e,t,n){let r=t.suggestions?.[n];return r?`${e} ${r}`:e}function q(e,t){return qt.find(n=>n.broken(e,t))}var qt,b,me=A(()=>{"use strict";f();fe();qt=[{name:"name",broken:({path:e})=>!de(e).valid,sentence:({path:e})=>de(e).reason??`File name "${e}" is invalid.`},{name:"extension",broken:({path:e},t)=>Re(e,t.blockedExtensions??[]),sentence:({path:e})=>`File "${e}" has an extension that is not allowed.`},{name:"fileSize",broken:({size:e},t)=>e>t.maxFileSize,sentence:({path:e},t)=>ue(`File "${e}" is too large. Maximum ${_(t.maxFileSize)} allowed.`,t,"maxFileSize")},{name:"totalSize",broken:({totalSize:e},t)=>e>t.maxTotalSize,sentence:({totalSize:e},t)=>ue(`Files add up to ${_(e)}. Maximum ${_(t.maxTotalSize)} allowed.`,t,"maxTotalSize")}],b={name:"filesCount",broken:(e,t)=>e>t.maxFilesCount,sentence:(e,t)=>ue(`Too many files (${e}). Maximum ${t.maxFilesCount} files allowed.`,t,"maxFilesCount")}});function de(e){let t=o=>({valid:!1,reason:`File name "${e}" ${o}.`});if(Ie(e))return t("contains unsafe characters");if(e.startsWith(" ")||e.endsWith(" "))return t("cannot start or end with spaces");if(e.endsWith("."))return t("cannot end with dots");let n=/^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(\.|$)/i,r=e.split("/").pop()||e;return n.test(r)?t("uses a reserved system name"):e.includes("..")?t("contains a path traversal pattern"):{valid:!0}}function Lr(e,t){let n=[],r=[],o=[];if(e.length===0){let s={file:"(no files)",message:"At least one file must be provided."};return n.push(s),{files:[],validFiles:[],errors:n,warnings:[],canDeploy:!1}}for(let s of e)if(U(s.name))return n.push({file:s.name,message:"Unbuilt project detected. Deploy your build output (dist/, build/, out/), not the project folder."}),{files:e.map(u=>({...u,status:h.VALIDATION_FAILED,statusMessage:"Unbuilt project detected"})),validFiles:[],errors:n,warnings:[],canDeploy:!1};if(b.broken(e.length,t)){let s={file:`(${e.length} files)`,message:b.sentence(e.length,t)};return n.push(s),{files:e.map(u=>({...u,status:h.VALIDATION_FAILED,statusMessage:s.message})),validFiles:[],errors:n,warnings:[],canDeploy:!1}}let i=0;for(let s of e){let u=h.READY,c="Ready for upload";if(s.status===h.PROCESSING_ERROR)u=h.VALIDATION_FAILED,c=s.statusMessage||`File "${s.name}" could not be read.`,n.push({file:s.name,message:c});else if(s.size===0){u=h.EXCLUDED,c=`File "${s.name}" is empty, so it is excluded.`,r.push({file:s.name,message:c}),o.push({...s,status:u,statusMessage:c});continue}else if(s.size<0)u=h.VALIDATION_FAILED,c=`File "${s.name}" reports a negative size.`,n.push({file:s.name,message:c});else if(!s.name||s.name.trim().length===0)u=h.VALIDATION_FAILED,c="File name cannot be empty.",n.push({file:s.name||"(empty)",message:c});else if(s.name.includes("\0"))u=h.VALIDATION_FAILED,c=`File name "${s.name}" contains invalid characters (null byte).`,n.push({file:s.name,message:c});else{let y={path:s.name,size:s.size,totalSize:i+s.size},D=q(y,t);D?(u=h.VALIDATION_FAILED,c=D.sentence(y,t),n.push({file:D.name==="totalSize"?`(${e.length} files)`:s.name,message:c})):i=y.totalSize}o.push({...s,status:u,statusMessage:c})}n.length>0&&(o=o.map(s=>s.status===h.EXCLUDED?s:{...s,status:h.VALIDATION_FAILED,statusMessage:s.status===h.VALIDATION_FAILED?s.statusMessage:"Deployment failed due to validation errors in bundle"}));let l=n.length===0?o.filter(s=>s.status===h.READY):[],p=n.length===0;return{files:o,validFiles:l,errors:n,warnings:r,canDeploy:p}}function Xt(e){return e.filter(t=>t.status===h.READY)}function br(e){return Xt(e).length>0}var fe=A(()=>{"use strict";f();me();f()});import{isJunk as Yt}from"junk";function We(e,t){if(!e||e.length===0)return[];if(!t?.allowUnbuilt&&e.find(r=>r&&U(r)))throw a.business("Unbuilt project detected \u2014 deploy your build output (dist/, build/, out/), not the project folder");return e.filter(n=>{if(!n)return!1;let r=n.replace(/\\/g,"/").split("/").filter(Boolean);if(r.length===0)return!0;let o=r[r.length-1];if(Yt(o))return!1;for(let l of r)if(l!==".well-known"&&(l.startsWith(".")||l.length>255))return!1;let i=r.slice(0,-1);for(let l of i)if(Wt.some(p=>l.toLowerCase()===p.toLowerCase()))return!1;return!0})}var Wt,he=A(()=>{"use strict";f();Wt=["__MACOSX",".Trashes",".fseventsd",".Spotlight-V100"]});function Je(e,t){if(e.includes("\0")||e.includes("/../")||e.startsWith("../")||e.endsWith("/.."))throw a.business(`Security error: Unsafe file path "${e}" for file: ${t}`)}function Qe(e,t){let n=q(e,t);if(n)throw a.business(n.sentence(e,t))}function Ze(e,t){if(b.broken(e,t))throw a.business(b.sentence(e,t))}var ye=A(()=>{"use strict";f();me()});async function et(e,t={},n){let r=!!(t.build||t.prerender),o=Ye(e.map(c=>c.path),{flatten:t.pathDetect!==!1}).map(c=>c.path),i=new Set(We(o,{allowUnbuilt:r})),l=e.map((c,y)=>({source:c,deployPath:o[y]})).filter(({deployPath:c})=>i.has(c));if(l.length===0)return[];let p=r?null:Jt(n),s=[],u=0;for(let{source:c,deployPath:y}of l){if(p&&Je(y,c.origin),c.size===0)continue;p&&(u+=c.size,Qe({path:y,size:c.size,totalSize:u},p));let D=await c.read(),{md5:X}=await B(D);s.push({path:y,content:D,size:c.size,md5:X})}return p&&Ze(s.length,p),s}function Jt(e){if(!e)throw a.config("Platform limits not provided. Deploy-mode validation requires the limits argument \u2014 pass `ship.getLimits()` result.");return e}var tt=A(()=>{"use strict";f();pe();he();z();ye()});var ot={};at(ot,{processFilesForNode:()=>rt});import*as T from"fs";import*as g from"path";function nt(e,t=new Set){let n=[],r=T.realpathSync(e);if(t.has(r))return n;t.add(r);for(let o of T.readdirSync(e)){let i=g.join(e,o),l=T.statSync(i);l.isDirectory()?n.push(...nt(i,t)):l.isFile()&&n.push({absPath:i,size:l.size})}return n}async function Qt(e){try{return T.readFileSync(e)}catch(t){let n=t instanceof Error?t.message:String(t);throw a.file(`Failed to read file "${e}": ${n}`,{filePath:e})}}function Zt(e){for(let t of e){let n=g.resolve(t);try{if(T.statSync(n).isDirectory()){let r=T.readdirSync(n).find(o=>ee.has(o));if(r)throw a.business(`"${r}" detected \u2014 deploy your build output (dist/, build/, out/), not the project folder`)}}catch(r){if(M(r))throw r}}}async function rt(e,t={},n){if(L()!=="node")throw a.business("processFilesForNode can only be called in Node.js environment.");Zt(e);let r=e.flatMap(p=>{let s=g.resolve(p);try{let u=T.statSync(s);return u.isDirectory()?nt(s):[{absPath:s,size:u.size}]}catch{throw a.file(`Path does not exist: ${p}`,{filePath:p})}}),o=new Map(r.map(p=>[p.absPath,p.size])),i=Xe(e.map(p=>g.resolve(p)).map(p=>{try{return T.statSync(p).isDirectory()?p:g.dirname(p)}catch{return g.dirname(p)}})),l=[...o].map(([p,s])=>({path:en(p,i),origin:p,size:s,read:()=>Qt(p)}));return et(l,t,n)}function en(e,t){if(t&&t.length>0){let n=g.relative(t,e);if(n&&typeof n=="string"&&!n.startsWith(".."))return n.replace(/\\/g,"/")}return g.basename(e)}var Ee=A(()=>{"use strict";f();tt();C();le()});f();f();f();var H=class{constructor(){this.handlers=new Map}on(t,n){this.handlers.has(t)||this.handlers.set(t,new Set),this.handlers.get(t)?.add(n)}off(t,n){let r=this.handlers.get(t);r&&(r.delete(n),r.size===0&&this.handlers.delete(t))}emit(t,...n){let r=this.handlers.get(t);if(!r)return;let o=Array.from(r);for(let i of o)try{i(...n)}catch(l){r.delete(i),t!=="error"&&setTimeout(()=>{let p=l instanceof Error?l:new Error(String(l));this.emit("error",p,String(t))},0)}}};var xt=3e4,Pt=2,_t=300,wt=2e3,Ct=new Set([500,502,503,504]);function vt(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason);return}let o=()=>{clearTimeout(l),t?.removeEventListener("abort",i)},i=()=>{o(),r(t?.reason)},l=setTimeout(()=>{o(),n()},e);t?.addEventListener("abort",i)})}var Me=3e5,Ft=3e5,Mt=Me+Ft,G=class extends H{constructor(n){super();this.globalHeaders={};this.apiUrl=n.apiUrl||oe,this.getAuthHeadersCallback=n.getAuthHeaders,this.session=n.session??!1,this.caller=n.caller,this.timeout=n.timeout??xt,this.maxRetries=Math.max(0,n.maxRetries??Pt),this.fetch=n.fetch??globalThis.fetch.bind(globalThis),this.deploy={endpoint:n.deployEndpoint||m.DEPLOYMENTS,timeout:n.timeout??Me,buildTimeout:n.timeout??Mt}}setGlobalHeaders(n){this.globalHeaders=n}async executeRequest(n,r,o,i=this.timeout){for(let l=0;;l++)try{return await this.attemptOnce(n,r,o,i)}catch(p){let s=a.fromFetchError(p,o);if(l>=this.maxRetries||!this.isRetryable(s,r))throw this.emit("error",s,n),s;this.emit("retry",s,n,l+1);let u=Math.min(wt,_t*2**l);try{await vt(Math.random()*u,r.signal)}catch(c){let y=a.fromFetchError(c,o);throw this.emit("error",y,n),y}}}isRetryable(n,r){if(r.signal?.aborted||n.isType(d.Maintenance)||n.isType(d.Cancelled)||!(n.isNetworkError()||n.status!==void 0&&Ct.has(n.status)))return!1;let i=(r.method??"GET").toUpperCase();return i==="GET"||i==="HEAD"?!0:i==="PUT"||i==="DELETE"?!1:this.hasIdempotencyKey(r.headers)}hasIdempotencyKey(n){if(!n)return!1;let r=N.HEADER.toLowerCase();return Object.keys(n).some(o=>o.toLowerCase()===r)}async attemptOnce(n,r,o,i=this.timeout){let l=()=>{};try{let p=await this.mergeHeaders(r.headers),s=this.createTimeoutSignal(r.signal,i);l=s.cleanup;let u={...r,headers:p,credentials:this.session&&!p.Authorization?"include":void 0,signal:s.signal};this.emit("request",n,u);let c=await this.fetch(n,u);if(l(),!c.ok)throw await a.fromHttpResponse(c,o);return this.emit("response",this.safeClone(c),n),{data:await this.parseResponse(this.safeClone(c)),status:c.status}}catch(p){throw l(),a.fromFetchError(p,o)}}async request(n,r,o,i){let{data:l}=await this.executeRequest(`${this.apiUrl}${n}`,r,o,i);return l}async requestWithStatus(n,r,o){return this.executeRequest(`${this.apiUrl}${n}`,r,o)}async mergeHeaders(n={}){return{...this.globalHeaders,...this.caller?{[O.HEADER]:this.caller}:{},...await this.getAuthHeadersCallback(),...n}}createTimeoutSignal(n,r=this.timeout){let o=new AbortController,i=setTimeout(()=>o.abort(new DOMException(`Timed out after ${r}ms`,"TimeoutError")),r),l=n?()=>o.abort(n.reason):void 0;return n&&l&&(n.addEventListener("abort",l),n.aborted&&o.abort(n.reason)),{signal:o.signal,cleanup:()=>{clearTimeout(i),n&&l&&n.removeEventListener("abort",l)}}}safeClone(n){try{return n.clone()}catch{return n}}async parseResponse(n){if(!(n.headers.get("Content-Length")==="0"||n.status===204))return n.json()}};f();f();async function Ue(e,t={}){let{labels:n,via:r,password:o,ttl:i,flags:l,captcha:p}=t,s=new FormData,u=[];for(let c of e){if(typeof c.content=="string"||c.content===null||c.content===void 0)throw a.file(`Unsupported file.content type: ${c.path}`,{filePath:c.path});if(!c.md5)throw a.file(`File missing md5 checksum: ${c.path}`,{filePath:c.path});s.append(E.FILES,new File([c.content],c.path,{type:"application/octet-stream"})),u.push(c.md5)}return s.append(E.CHECKSUMS,JSON.stringify(u)),n&&n.length>0&&s.append(E.LABELS,JSON.stringify(n)),r&&s.append(E.VIA,r),o&&s.append(E.PASSWORD,o),i!==void 0&&s.append(E.TTL,String(i)),l?.build&&s.append(E.BUILD,"true"),l?.prerender&&s.append(E.PRERENDER,"true"),l?.spa&&s.append(E.SPA,"true"),l?.buildCommand&&s.append(E.BUILD_COMMAND,l.buildCommand),l?.outputDir&&s.append(E.OUTPUT_DIR,l.outputDir),p&&s.append(E.CAPTCHA,p),s}f();z();async function Ht(){let e=JSON.stringify(Oe,null,2),t;typeof Buffer<"u"?t=Buffer.from(e,"utf-8"):t=new Blob([e],{type:"application/json"});let{md5:n}=await B(t);return{path:S,content:t,size:e.length,md5:n}}async function Gt(e,t,n){let r=e.find(p=>p.path===k.INDEX_FILE||p.path===`/${k.INDEX_FILE}`);if(!r||r.size>k.MAX_INDEX_BYTES)return!1;let o;if(typeof Buffer<"u"&&Buffer.isBuffer(r.content))o=r.content.toString("utf-8");else if(typeof Blob<"u"&&r.content instanceof Blob)o=await r.content.text();else if(typeof File<"u"&&r.content instanceof File)o=await r.content.text();else return!1;let i={files:e.map(p=>p.path),index:o};return(await t.request(m.SPA_CHECK,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i),signal:n??null},"SPA check")).isSPA}async function ke(e,t,n){return n.spaDetect===!1||n.spa||n.build||n.prerender||e.some(r=>r.path===S)?e:await Gt(e,t,n.signal)?[...e,await Ht()]:e}f();f();function w(e){if(e==null)return;if(e.length===0)return e;if(e.length>I.MAX_COUNT)throw a.validation(`Maximum ${I.MAX_COUNT} labels allowed`);let t=e.map((r,o)=>{if(typeof r!="string")throw a.validation(`Label at index ${o} must be a string`);let i=r.trim().toLowerCase();if(i.length<I.MIN_LENGTH)throw a.validation(`Labels must be at least ${I.MIN_LENGTH} characters long`);if(i.length>I.MAX_LENGTH)throw a.validation(`Labels must be no more than ${I.MAX_LENGTH} characters long`);if(!Ce.test(i))throw a.validation(`Labels must start and end with alphanumeric characters, with optional separators (${I.SEPARATORS}) between segments`);return i}),n=[...new Set(t)];if(n.length!==t.length)throw a.validation("Duplicate labels are not allowed");return n}async function $e(e){let t=e.find(o=>o.path===S||o.path===`/${S}`);if(!t)return;let n=t.content,r=typeof n.text=="function"?await n.text():t.content.toString("utf8");xe(r)}var V={"Content-Type":"application/json"},Bt="sdk";function se(e){let t=new URLSearchParams;e?.limit!==void 0&&t.set("limit",String(e.limit)),e?.cursor!==void 0&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}function He(e){let{getApi:t,processInput:n}=e;return{upload:async(r,o={})=>{if(!n)throw a.config("processInput function is not provided.");let i=t(),l=await n(r,o),p=await ke(l,i,o);if(!p.length)throw a.business("No files to deploy");for(let Y of p)if(!Y.md5)throw a.file(`MD5 checksum missing for file: ${Y.path}`,{filePath:Y.path});ie(o.password);let s=re(o.ttl),u=De(o.idempotencyKey),c=w(o.labels);await $e(p);let y=ve(o.buildCommand),D=Fe(o.outputDir),X=o.build||o.prerender||o.spa?{build:o.build,prerender:o.prerender,spa:o.spa,buildCommand:y,outputDir:D}:void 0,it=await Ue(p,{labels:c,via:o.via??Bt,password:o.password,ttl:s,flags:X,captcha:o.captcha});return i.request(i.deploy.endpoint,{method:"POST",body:it,...u?{headers:{[N.HEADER]:u}}:{},signal:o.signal||null},"Deploy",o.build||o.prerender?i.deploy.buildTimeout:i.deploy.timeout)},list:async r=>t().request(`${m.DEPLOYMENTS}${se(r)}`,{method:"GET"},"List deployments"),get:async r=>t().request(m.DEPLOYMENT(encodeURIComponent(r)),{method:"GET"},"Get deployment"),set:async(r,o)=>t().request(m.DEPLOYMENT(encodeURIComponent(r)),{method:"PATCH",headers:V,body:JSON.stringify({labels:w(o.labels)})},"Update deployment labels"),delete:async r=>t().request(m.DEPLOYMENT(encodeURIComponent(r)),{method:"DELETE"},"Delete deployment")}}function Ge(e){let{getApi:t}=e;return{set:async(n,r={})=>{let o=w(r.labels),i={};r.deployment&&(i.deployment=r.deployment),o!==void 0&&(i.labels=o);let{data:l,status:p}=await t().requestWithStatus(m.DOMAIN(encodeURIComponent(n)),{method:"PUT",headers:V,body:JSON.stringify(i)},"Set domain");return{...l,isCreate:p===201}},list:async n=>t().request(`${m.DOMAINS}${se(n)}`,{method:"GET"},"List domains"),get:async n=>t().request(m.DOMAIN(encodeURIComponent(n)),{method:"GET"},"Get domain"),delete:async n=>t().request(m.DOMAIN(encodeURIComponent(n)),{method:"DELETE"},"Delete domain"),verify:async n=>t().request(m.DOMAIN_VERIFY(encodeURIComponent(n)),{method:"POST"},"Verify domain"),validate:async n=>t().request(m.DOMAINS_VALIDATE,{method:"POST",headers:V,body:JSON.stringify({domain:n})},"Validate domain"),dns:async n=>t().request(m.DOMAIN_DNS(encodeURIComponent(n)),{method:"GET"},"Get domain DNS"),records:async n=>t().request(m.DOMAIN_RECORDS(encodeURIComponent(n)),{method:"GET"},"Get domain records"),share:async n=>t().request(m.DOMAIN_SHARE(encodeURIComponent(n)),{method:"GET"},"Get domain share")}}function Be(e){let{getApi:t}=e;return{get:async()=>t().request(m.ACCOUNT,{method:"GET"},"Get account")}}function ze(e){let{getApi:t}=e;return{create:async(n={})=>{let r=re(n.ttl),o=w(n.labels),i={};return r!==void 0&&(i.ttl=r),o!==void 0&&(i.labels=o),t().request(m.TOKENS,{method:"POST",headers:V,body:JSON.stringify(i)},"Create token")},list:async n=>t().request(`${m.TOKENS}${se(n)}`,{method:"GET"},"List tokens"),get:async n=>t().request(m.TOKEN(encodeURIComponent(n)),{method:"GET"},"Get token"),delete:async n=>t().request(m.TOKEN(encodeURIComponent(n)),{method:"DELETE"},"Delete token")}}var K=class{constructor(t={}){this.credential=null;if(t={...t,apiUrl:t.apiUrl||void 0,token:t.token||void 0,caller:t.caller||void 0},this.clientOptions=t,t.caller!==void 0&&Pe(t.caller),t.token&&t.session)throw a.config("Provide either `token` or `session`, not both.");typeof t.token=="string"?(ne(t.token),this.credential=t.token):t.token&&(this.credential=t.token),this.http=new G({...t,getAuthHeaders:()=>this.getAuthHeaders()});let n={getApi:()=>this.http};this.deployments=He({...n,processInput:async(r,o)=>this.processInput(r,o,await this.getLimits({signal:o.signal}))}),this.domains=Ge(n),this.account=Be(n),this.tokens=ze(n)}async ping(){return this.http.request(m.PING,{method:"GET"},"Ping")}async deploy(t,n){return this.deployments.upload(t,n)}async whoami(){return this.account.get()}async getLimits(t={}){return this.http.request(m.LIMITS,{method:"GET",signal:t.signal??null},"Get limits")}on(t,n){this.http.on(t,n)}off(t,n){this.http.off(t,n)}setHeaders(t){this.http.setGlobalHeaders(t)}clearHeaders(){this.http.setGlobalHeaders({})}setToken(t){if(this.clientOptions.session)throw a.config("Provide either `token` or `session`, not both.");if(typeof t=="string"){if(!t)throw a.business("Invalid token provided. Token must be a non-empty string.");ne(t),this.credential=t;return}if(typeof t!="function")throw a.business("Invalid token provided. Token must be a non-empty string or a provider function.");this.credential=t}async getAuthHeaders(){if(this.credential===null)return{};let t=typeof this.credential=="function"?await this.credential():this.credential;if(!t)throw a.authentication("Token provider returned no token.");if(typeof t!="string")throw a.authentication("Token provider returned a non-string value.");return{Authorization:`Bearer ${t}`}}};C();f();import{z as je}from"zod";import{z as Ve}from"zod";var Ke={apiUrl:Ve.string().url().optional(),token:Ve.string().min(1).optional()};C();var Vt=je.object(Ke).strict(),Kt={apiUrl:P.API_URL,token:P.TOKEN};function qe(){if(L()!=="node")return{};let e={apiUrl:process.env[P.API_URL]||void 0,token:process.env[P.TOKEN]||void 0};try{return Vt.parse(e)}catch(t){if(t instanceof je.ZodError){let n=t.issues[0],r=n.path[0],o=(r&&Kt[r])??"SHIP environment configuration";throw a.config(`Invalid ${o}: ${n.message}`)}throw a.config("Invalid environment configuration")}}f();f();pe();C();fe();he();z();ye();function Mr(e,t,n,r=!0){let o=e===1?t:n;return r?`${e} ${o}`:o}Ee();var ge=class extends K{constructor(t={}){if(L()!=="node")throw a.business("Node.js Ship class can only be used in Node.js environment.");let n=qe();super({...t,apiUrl:t.apiUrl||n.apiUrl,token:t.token||(t.session?void 0:n.token)})}async deploy(t,n){return super.deploy(t,n)}async processInput(t,n,r){let o=typeof t=="string"?[t]:t;if(!Array.isArray(o)||!o.every(l=>typeof l=="string"))throw a.business("Invalid input type for Node.js environment. Expected string or string[].");if(o.length===0)throw a.business("No files to deploy.");let{processFilesForNode:i}=await Promise.resolve().then(()=>(Ee(),ot));return i(o,n,r)}},tn=ge;export{En as ACCOUNT_HEADER,Ne as API_KEY,m as API_PATHS,hn as AUTH_BASE_PATH,cn as AccountPlan,pn as AccountRefusal,G as ApiHttp,J as AuthMethod,x as BUILD_SETTINGS,O as CALLER,oe as DEFAULT_API,S as DEPLOYMENT_CONFIG_FILENAME,E as DEPLOY_FIELDS,mn as DEPLOY_FILE_GRAMMAR,Le as DEPLOY_TOKEN,rn as DeploymentStatus,lt as DeploymentVia,on as DomainStatus,sn as DomainVerification,d as ErrorType,h as FILE_VALIDATION_STATUS,h as FileValidationStatus,N as IDEMPOTENCY_KEY_CONSTRAINTS,Wt as JUNK_DIRECTORIES,I as LABEL_CONSTRAINTS,Ce as LABEL_PATTERN,bn as MY_API_KEY_URL,be as OAUTH_TOKEN,Tn as OAuthScope,F as PASSWORD_CONSTRAINTS,On as PUBLIC_DEPLOYMENT_TTL_SECONDS,At as SECTIONS,an as SETUP_TROUBLESHOOTING_ANCHOR,P as SHIP_ENV,Ln as SHIP_VIA_ENV,yn as SIGN_IN_RETURN_PARAM,k as SPA_CHECK_CONSTRAINTS,Oe as SPA_DEFAULT_CONFIG,ge as Ship,a as ShipError,v as TTL_CONSTRAINTS,R as TokenKind,ee as UNBUILT_PROJECT_MARKERS,ht as UNSAFE_FILENAME_CHARS,Pn as USER_VISIBLE_EVENTS,fn as WEB_FILE_ACCEPT,ar as __setTestEnvironment,In as accountOfPath,br as allValidFilesReady,xe as assertShipJsonSyntax,Rn as billingReturnOf,B as calculateMD5,yt as classifyToken,Rt as consolePaths,Be as createAccountResource,He as createDeploymentResource,Ge as createDomainResource,ze as createTokenResource,tn as default,Mn as deserializeLabels,Dn as doors,Nn as errandOf,wn as extractSubdomain,We as filterJunk,Ot as formatDuration,_ as formatFileSize,xn as formatTimeRemaining,Cn as generateDeploymentUrl,vn as generateDomainUrl,L as getENV,Xt as getValidFiles,U as hasUnbuiltMarker,Ie as hasUnsafeChars,Re as isBlockedExtension,Nt as isClaimPath,_n as isCustomDomain,Sn as isDeployment,Lt as isInvitationPath,we as isPlatformDomain,M as isShipError,bt as isUpgradePath,ln as normalizeVia,Ye as optimizeDeployPaths,un as personName,dn as personShortName,Mr as pluralize,rt as processFilesForNode,gn as readBearerValue,Fn as serializeLabels,Et as validateApiKey,An as validateApiUrl,ve as validateBuildCommand,Pe as validateCaller,Ze as validateDeployCount,Qe as validateDeployFile,Je as validateDeployPath,gt as validateDeployToken,de as validateFileName,Lr as validateFiles,De as validateIdempotencyKey,Tt as validateOAuthToken,Fe as validateOutputDir,ie as validatePassword,ne as validateToken,re as validateTtl};
2
2
  //# sourceMappingURL=index.js.map