@sitepong/fastnode 0.3.0 → 0.3.1

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.
Files changed (64) hide show
  1. package/README.md +6 -0
  2. package/dist/actions/index.cjs +80 -0
  3. package/dist/actions/index.cjs.map +1 -1
  4. package/dist/actions/index.mjs +81 -1
  5. package/dist/actions/index.mjs.map +1 -1
  6. package/dist/cert/index.d.cts +3 -3
  7. package/dist/cert/index.d.ts +3 -3
  8. package/dist/{cert-RvXmdMke.d.ts → cert-ClacRx9y.d.ts} +1 -1
  9. package/dist/{cert-eOoxGMN1.d.cts → cert-DffLKURp.d.cts} +1 -1
  10. package/dist/cli/index.cjs +115 -28
  11. package/dist/cli/index.cjs.map +1 -1
  12. package/dist/cli/index.d.cts +1 -1
  13. package/dist/cli/index.d.ts +1 -1
  14. package/dist/cli/index.mjs +116 -29
  15. package/dist/cli/index.mjs.map +1 -1
  16. package/dist/client/index.cjs +76 -0
  17. package/dist/client/index.cjs.map +1 -1
  18. package/dist/client/index.d.cts +1 -1
  19. package/dist/client/index.d.ts +1 -1
  20. package/dist/client/index.mjs +71 -1
  21. package/dist/client/index.mjs.map +1 -1
  22. package/dist/deliver/index.d.cts +2 -2
  23. package/dist/deliver/index.d.ts +2 -2
  24. package/dist/{index-DGkgRnZp.d.cts → index-925_Ov7X.d.cts} +1 -1
  25. package/dist/{index-DfkIz7i0.d.cts → index-BbVQzSV1.d.cts} +1 -1
  26. package/dist/{index-BaNcf7jt.d.cts → index-BhGaVlK1.d.cts} +1 -1
  27. package/dist/{index-DjC_gmnL.d.ts → index-C-EEYXSE.d.ts} +1 -1
  28. package/dist/{index-D1GHEM3c.d.ts → index-C18cijCd.d.ts} +1 -1
  29. package/dist/{index-rTZOdMRE.d.ts → index-CBM5XZKC.d.ts} +1 -1
  30. package/dist/{index-lsuS2R1T.d.ts → index-CemR3UI9.d.ts} +32 -1
  31. package/dist/{index-laE3_wm9.d.cts → index-CmcFPn_G.d.cts} +1 -1
  32. package/dist/{index-DrmS802s.d.cts → index-CpGV1f0L.d.cts} +32 -1
  33. package/dist/{index-C01Rkrir.d.ts → index-D9YQQ3FM.d.ts} +1 -1
  34. package/dist/{index-C9mHBJED.d.ts → index-Dkf5sH1E.d.ts} +1 -1
  35. package/dist/{index-CAEiXVWd.d.ts → index-N6eV5yym.d.ts} +1 -1
  36. package/dist/{index-icIH5e5V.d.cts → index-O3EMrd5s.d.cts} +3 -3
  37. package/dist/{index-BvyZ4uiw.d.ts → index-Ol0RtbQA.d.ts} +3 -3
  38. package/dist/{index-DLJso7Vs.d.cts → index-_24DRp3a.d.cts} +1 -1
  39. package/dist/{index-DWOLZNlz.d.cts → index-isT08RuY.d.cts} +1 -1
  40. package/dist/{index-BE7bwNff.d.cts → index-on573dnO.d.cts} +1 -1
  41. package/dist/{index-CBf0-NUQ.d.ts → index-s2PigtDM.d.ts} +1 -1
  42. package/dist/index.cjs +118 -31
  43. package/dist/index.cjs.map +1 -1
  44. package/dist/index.d.cts +11 -11
  45. package/dist/index.d.ts +11 -11
  46. package/dist/index.mjs +118 -31
  47. package/dist/index.mjs.map +1 -1
  48. package/dist/lane/index.cjs +80 -0
  49. package/dist/lane/index.cjs.map +1 -1
  50. package/dist/lane/index.mjs +81 -1
  51. package/dist/lane/index.mjs.map +1 -1
  52. package/dist/match/index.d.cts +4 -4
  53. package/dist/match/index.d.ts +4 -4
  54. package/dist/pem/index.d.cts +2 -2
  55. package/dist/pem/index.d.ts +2 -2
  56. package/dist/pilot/index.d.cts +2 -2
  57. package/dist/pilot/index.d.ts +2 -2
  58. package/dist/precheck/index.d.cts +2 -2
  59. package/dist/precheck/index.d.ts +2 -2
  60. package/dist/produce/index.d.cts +2 -2
  61. package/dist/produce/index.d.ts +2 -2
  62. package/dist/sigh/index.d.cts +2 -2
  63. package/dist/sigh/index.d.ts +2 -2
  64. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import '../index-DrmS802s.cjs';
1
+ import '../index-CpGV1f0L.cjs';
2
2
  import '../enums-yXNVh3UI.cjs';
3
- export { A as ASSET_FOLDERS, D as DeliverOptions, a as DeliverResult, L as LocalizedMetadata, M as MetadataSet, P as PlaceAssetsResult, U as UploadedAsset, g as categoryFor, l as loadMetadata, f as readImageSize, r as resolveImageGroups, s as submitForReview, d as uploadAssetLibrary, e as uploadLibraryAsset, b as uploadMetadata, c as uploadScreenshots, u as uploadToAppStore } from '../index-BaNcf7jt.cjs';
3
+ export { A as ASSET_FOLDERS, D as DeliverOptions, a as DeliverResult, L as LocalizedMetadata, M as MetadataSet, P as PlaceAssetsResult, U as UploadedAsset, g as categoryFor, l as loadMetadata, f as readImageSize, r as resolveImageGroups, s as submitForReview, d as uploadAssetLibrary, e as uploadLibraryAsset, b as uploadMetadata, c as uploadScreenshots, u as uploadToAppStore } from '../index-BhGaVlK1.cjs';
4
4
  import '../apple-session-jUzBrql5.cjs';
@@ -1,4 +1,4 @@
1
- import '../index-lsuS2R1T.js';
1
+ import '../index-CemR3UI9.js';
2
2
  import '../enums-yXNVh3UI.js';
3
- export { A as ASSET_FOLDERS, D as DeliverOptions, a as DeliverResult, L as LocalizedMetadata, M as MetadataSet, P as PlaceAssetsResult, U as UploadedAsset, g as categoryFor, l as loadMetadata, f as readImageSize, r as resolveImageGroups, s as submitForReview, d as uploadAssetLibrary, e as uploadLibraryAsset, b as uploadMetadata, c as uploadScreenshots, u as uploadToAppStore } from '../index-CBf0-NUQ.js';
3
+ export { A as ASSET_FOLDERS, D as DeliverOptions, a as DeliverResult, L as LocalizedMetadata, M as MetadataSet, P as PlaceAssetsResult, U as UploadedAsset, g as categoryFor, l as loadMetadata, f as readImageSize, r as resolveImageGroups, s as submitForReview, d as uploadAssetLibrary, e as uploadLibraryAsset, b as uploadMetadata, c as uploadScreenshots, u as uploadToAppStore } from '../index-s2PigtDM.js';
4
4
  import '../apple-session-jUzBrql5.js';
@@ -1,4 +1,4 @@
1
- import { A as AppStoreConnectClient } from './index-DrmS802s.cjs';
1
+ import { A as AppStoreConnectClient } from './index-CpGV1f0L.cjs';
2
2
  import { C as CertificateType } from './enums-yXNVh3UI.cjs';
3
3
 
4
4
  type PushCertKind = "development" | "production" | "website" | "voip" | "passbook";
@@ -1,4 +1,4 @@
1
- import { A as AppStoreConnectClient, a8 as PortalClient, p as CapabilitySettingInput, B as BundleId, o as BundleIdCapability, i as App } from './index-DrmS802s.cjs';
1
+ import { A as AppStoreConnectClient, a8 as PortalClient, p as CapabilitySettingInput, B as BundleId, o as BundleIdCapability, i as App } from './index-CpGV1f0L.cjs';
2
2
  import { B as BundleIdPlatform, d as CapabilityType } from './enums-yXNVh3UI.cjs';
3
3
 
4
4
  interface ProduceOptions {
@@ -1,4 +1,4 @@
1
- import { A as AppStoreConnectClient, W as AppAssetLibraryRefDatumAttributes, X as AppAssetLibraryImageSpec } from './index-DrmS802s.cjs';
1
+ import { A as AppStoreConnectClient, W as AppAssetLibraryRefDatumAttributes, X as AppAssetLibraryImageSpec } from './index-CpGV1f0L.cjs';
2
2
  import { l as AppAssetLibraryPlacementType, j as AppAssetLibraryAssetCategory, m as AppAssetLibraryAssetState, o as AppAssetLibraryFeature, b as Platform, R as ReleaseType } from './enums-yXNVh3UI.cjs';
3
3
 
4
4
  interface LocalizedMetadata {
@@ -1,4 +1,4 @@
1
- import { A as AppStoreConnectClient, a8 as PortalClient, p as CapabilitySettingInput, B as BundleId, o as BundleIdCapability, i as App } from './index-lsuS2R1T.js';
1
+ import { A as AppStoreConnectClient, a8 as PortalClient, p as CapabilitySettingInput, B as BundleId, o as BundleIdCapability, i as App } from './index-CemR3UI9.js';
2
2
  import { B as BundleIdPlatform, d as CapabilityType } from './enums-yXNVh3UI.js';
3
3
 
4
4
  interface ProduceOptions {
@@ -1,4 +1,4 @@
1
- import { C as CertOptions, a as CertResult, c as createCertificate, d as downloadCertificate, f as findValidCertificates, r as revokeCertificate, b as revokeExpiredCertificates } from './cert-RvXmdMke.js';
1
+ import { C as CertOptions, a as CertResult, c as createCertificate, d as downloadCertificate, f as findValidCertificates, r as revokeCertificate, b as revokeExpiredCertificates } from './cert-ClacRx9y.js';
2
2
 
3
3
  /**
4
4
  * Generate EC P-256 CSR — used by App Store Connect API (JWT auth).
@@ -1,4 +1,4 @@
1
- import { A as AppStoreConnectClient } from './index-lsuS2R1T.js';
1
+ import { A as AppStoreConnectClient } from './index-CemR3UI9.js';
2
2
  import { C as CertificateType } from './enums-yXNVh3UI.js';
3
3
 
4
4
  type PushCertKind = "development" | "production" | "website" | "voip" | "passbook";
@@ -1600,6 +1600,37 @@ declare class AppAssetLibrariesResource {
1600
1600
  }): Promise<AppAssetLibraryRefDatumAttributes>;
1601
1601
  }
1602
1602
 
1603
+ /**
1604
+ * Keeps an Apple ID session between runs, like Spaceship's cookie in
1605
+ * ~/.fastlane/spaceship/<user>/cookie — one password + 2FA covers every
1606
+ * command (and every app on that Apple ID) until Apple expires the session.
1607
+ *
1608
+ * Files live in ~/.fastnode/sessions (or FASTNODE_SESSION_DIR), one per
1609
+ * Apple ID, directory 0700 and files 0600: they are as good as a signed-in
1610
+ * App Store Connect browser. A cached session is checked against olympus
1611
+ * before use, so an expired one just falls through to a fresh sign-in.
1612
+ */
1613
+
1614
+ declare function sessionDir(): string;
1615
+ declare function saveAppleSession(session: AppleSession): void;
1616
+ declare function clearAppleSession(email: string): void;
1617
+ /** The Apple ID the last session was saved for, so a re-run needs no prompt at all. */
1618
+ declare function lastAppleId(): string | null;
1619
+ /** A saved session for this Apple ID that Apple still accepts, or null. */
1620
+ declare function loadAppleSession(email: string, fetchImpl?: typeof fetch): Promise<AppleSession | null>;
1621
+ /**
1622
+ * Reuse the saved session for this Apple ID, or sign in (password + 2FA) and
1623
+ * save the new one. The password is only asked for when a sign-in is needed.
1624
+ */
1625
+ declare function signInWithAppleId(options: {
1626
+ email?: string | null;
1627
+ askEmail: () => Promise<string>;
1628
+ askPassword: (email: string) => Promise<string>;
1629
+ /** Ignore any saved session and sign in again. */
1630
+ fresh?: boolean;
1631
+ onLog?: (msg: string) => void;
1632
+ }): Promise<AppleSession>;
1633
+
1603
1634
  /**
1604
1635
  * Apple Developer Portal Client
1605
1636
  * 1:1 port of Fastlane Spaceship PortalClient
@@ -2097,4 +2128,4 @@ declare class AppStoreConnectClient {
2097
2128
  request<T>(path: string, options?: RequestOptions): Promise<T>;
2098
2129
  }
2099
2130
 
2100
- export { AppAssetLibraryVideosResource as $, AppStoreConnectClient as A, type BundleId as B, type Certificate as C, type Device as D, AppStoreVersionsResource as E, type AppStoreVersion as F, type AppStoreVersionLocalization as G, AppScreenshotsResource as H, type AppScreenshot as I, type JsonApiResource as J, type AppScreenshotSet as K, type ListParams as L, ReviewSubmissionsResource as M, type ReviewSubmission as N, type AppStoreVersionSubmission as O, type Profile as P, AppAssetLibrariesResource as Q, RequestClient as R, type AppAssetLibrary as S, TokenManager as T, type UploadOperation as U, type AppAssetLibraryRefDatum as V, type AppAssetLibraryRefDatumAttributes as W, type AppAssetLibraryImageSpec as X, type AppAssetLibraryVideoSpec as Y, type AppAssetLibraryDimensions as Z, AppAssetLibraryImagesResource as _, AppStoreConnectError as a, type AppAssetLibraryImage as a0, type AppAssetLibraryVideo as a1, type CreateAssetParams as a2, type UpdateAssetAttributes as a3, AppAssetLibraryPlacementsResource as a4, type AppAssetLibraryPlacement as a5, type PlacementTarget as a6, type PlacementTargetKind as a7, PortalClient as a8, IrisClient as a9, IrisAuthError as aa, type IrisApiKey as ab, type ApiKeyRole as ac, type JsonApiRelationship as ad, type JsonApiErrorResponse as ae, RateLimitError as b, type AppStoreConnectConfig as c, type TokenConfig as d, type RequestOptions as e, type JsonApiResponse as f, type JsonApiListResponse as g, type JsonApiError as h, type App as i, type Build as j, type BetaGroup as k, type BetaBuildLocalization as l, type BuildBetaDetail as m, type PreReleaseVersion$1 as n, type BundleIdCapability as o, type CapabilitySettingInput as p, type CapabilitySetting as q, type CapabilityOption as r, CertificatesResource as s, ProfilesResource as t, BundleIdsResource as u, DevicesResource as v, AppsResource as w, BuildsResource as x, BetaGroupsResource as y, CapabilitiesResource as z };
2131
+ export { AppAssetLibraryVideosResource as $, AppStoreConnectClient as A, type BundleId as B, type Certificate as C, type Device as D, AppStoreVersionsResource as E, type AppStoreVersion as F, type AppStoreVersionLocalization as G, AppScreenshotsResource as H, type AppScreenshot as I, type JsonApiResource as J, type AppScreenshotSet as K, type ListParams as L, ReviewSubmissionsResource as M, type ReviewSubmission as N, type AppStoreVersionSubmission as O, type Profile as P, AppAssetLibrariesResource as Q, RequestClient as R, type AppAssetLibrary as S, TokenManager as T, type UploadOperation as U, type AppAssetLibraryRefDatum as V, type AppAssetLibraryRefDatumAttributes as W, type AppAssetLibraryImageSpec as X, type AppAssetLibraryVideoSpec as Y, type AppAssetLibraryDimensions as Z, AppAssetLibraryImagesResource as _, AppStoreConnectError as a, type AppAssetLibraryImage as a0, type AppAssetLibraryVideo as a1, type CreateAssetParams as a2, type UpdateAssetAttributes as a3, AppAssetLibraryPlacementsResource as a4, type AppAssetLibraryPlacement as a5, type PlacementTarget as a6, type PlacementTargetKind as a7, PortalClient as a8, signInWithAppleId as a9, loadAppleSession as aa, saveAppleSession as ab, clearAppleSession as ac, lastAppleId as ad, sessionDir as ae, IrisClient as af, IrisAuthError as ag, type IrisApiKey as ah, type ApiKeyRole as ai, type JsonApiRelationship as aj, type JsonApiErrorResponse as ak, RateLimitError as b, type AppStoreConnectConfig as c, type TokenConfig as d, type RequestOptions as e, type JsonApiResponse as f, type JsonApiListResponse as g, type JsonApiError as h, type App as i, type Build as j, type BetaGroup as k, type BetaBuildLocalization as l, type BuildBetaDetail as m, type PreReleaseVersion$1 as n, type BundleIdCapability as o, type CapabilitySettingInput as p, type CapabilitySetting as q, type CapabilityOption as r, CertificatesResource as s, ProfilesResource as t, BundleIdsResource as u, DevicesResource as v, AppsResource as w, BuildsResource as x, BetaGroupsResource as y, CapabilitiesResource as z };
@@ -1,4 +1,4 @@
1
- import { A as AppStoreConnectClient, j as Build } from './index-DrmS802s.cjs';
1
+ import { A as AppStoreConnectClient, j as Build } from './index-CpGV1f0L.cjs';
2
2
 
3
3
  /**
4
4
  * Shared types for the pilot module's upload backends.
@@ -1600,6 +1600,37 @@ declare class AppAssetLibrariesResource {
1600
1600
  }): Promise<AppAssetLibraryRefDatumAttributes>;
1601
1601
  }
1602
1602
 
1603
+ /**
1604
+ * Keeps an Apple ID session between runs, like Spaceship's cookie in
1605
+ * ~/.fastlane/spaceship/<user>/cookie — one password + 2FA covers every
1606
+ * command (and every app on that Apple ID) until Apple expires the session.
1607
+ *
1608
+ * Files live in ~/.fastnode/sessions (or FASTNODE_SESSION_DIR), one per
1609
+ * Apple ID, directory 0700 and files 0600: they are as good as a signed-in
1610
+ * App Store Connect browser. A cached session is checked against olympus
1611
+ * before use, so an expired one just falls through to a fresh sign-in.
1612
+ */
1613
+
1614
+ declare function sessionDir(): string;
1615
+ declare function saveAppleSession(session: AppleSession): void;
1616
+ declare function clearAppleSession(email: string): void;
1617
+ /** The Apple ID the last session was saved for, so a re-run needs no prompt at all. */
1618
+ declare function lastAppleId(): string | null;
1619
+ /** A saved session for this Apple ID that Apple still accepts, or null. */
1620
+ declare function loadAppleSession(email: string, fetchImpl?: typeof fetch): Promise<AppleSession | null>;
1621
+ /**
1622
+ * Reuse the saved session for this Apple ID, or sign in (password + 2FA) and
1623
+ * save the new one. The password is only asked for when a sign-in is needed.
1624
+ */
1625
+ declare function signInWithAppleId(options: {
1626
+ email?: string | null;
1627
+ askEmail: () => Promise<string>;
1628
+ askPassword: (email: string) => Promise<string>;
1629
+ /** Ignore any saved session and sign in again. */
1630
+ fresh?: boolean;
1631
+ onLog?: (msg: string) => void;
1632
+ }): Promise<AppleSession>;
1633
+
1603
1634
  /**
1604
1635
  * Apple Developer Portal Client
1605
1636
  * 1:1 port of Fastlane Spaceship PortalClient
@@ -2097,4 +2128,4 @@ declare class AppStoreConnectClient {
2097
2128
  request<T>(path: string, options?: RequestOptions): Promise<T>;
2098
2129
  }
2099
2130
 
2100
- export { AppAssetLibraryVideosResource as $, AppStoreConnectClient as A, type BundleId as B, type Certificate as C, type Device as D, AppStoreVersionsResource as E, type AppStoreVersion as F, type AppStoreVersionLocalization as G, AppScreenshotsResource as H, type AppScreenshot as I, type JsonApiResource as J, type AppScreenshotSet as K, type ListParams as L, ReviewSubmissionsResource as M, type ReviewSubmission as N, type AppStoreVersionSubmission as O, type Profile as P, AppAssetLibrariesResource as Q, RequestClient as R, type AppAssetLibrary as S, TokenManager as T, type UploadOperation as U, type AppAssetLibraryRefDatum as V, type AppAssetLibraryRefDatumAttributes as W, type AppAssetLibraryImageSpec as X, type AppAssetLibraryVideoSpec as Y, type AppAssetLibraryDimensions as Z, AppAssetLibraryImagesResource as _, AppStoreConnectError as a, type AppAssetLibraryImage as a0, type AppAssetLibraryVideo as a1, type CreateAssetParams as a2, type UpdateAssetAttributes as a3, AppAssetLibraryPlacementsResource as a4, type AppAssetLibraryPlacement as a5, type PlacementTarget as a6, type PlacementTargetKind as a7, PortalClient as a8, IrisClient as a9, IrisAuthError as aa, type IrisApiKey as ab, type ApiKeyRole as ac, type JsonApiRelationship as ad, type JsonApiErrorResponse as ae, RateLimitError as b, type AppStoreConnectConfig as c, type TokenConfig as d, type RequestOptions as e, type JsonApiResponse as f, type JsonApiListResponse as g, type JsonApiError as h, type App as i, type Build as j, type BetaGroup as k, type BetaBuildLocalization as l, type BuildBetaDetail as m, type PreReleaseVersion$1 as n, type BundleIdCapability as o, type CapabilitySettingInput as p, type CapabilitySetting as q, type CapabilityOption as r, CertificatesResource as s, ProfilesResource as t, BundleIdsResource as u, DevicesResource as v, AppsResource as w, BuildsResource as x, BetaGroupsResource as y, CapabilitiesResource as z };
2131
+ export { AppAssetLibraryVideosResource as $, AppStoreConnectClient as A, type BundleId as B, type Certificate as C, type Device as D, AppStoreVersionsResource as E, type AppStoreVersion as F, type AppStoreVersionLocalization as G, AppScreenshotsResource as H, type AppScreenshot as I, type JsonApiResource as J, type AppScreenshotSet as K, type ListParams as L, ReviewSubmissionsResource as M, type ReviewSubmission as N, type AppStoreVersionSubmission as O, type Profile as P, AppAssetLibrariesResource as Q, RequestClient as R, type AppAssetLibrary as S, TokenManager as T, type UploadOperation as U, type AppAssetLibraryRefDatum as V, type AppAssetLibraryRefDatumAttributes as W, type AppAssetLibraryImageSpec as X, type AppAssetLibraryVideoSpec as Y, type AppAssetLibraryDimensions as Z, AppAssetLibraryImagesResource as _, AppStoreConnectError as a, type AppAssetLibraryImage as a0, type AppAssetLibraryVideo as a1, type CreateAssetParams as a2, type UpdateAssetAttributes as a3, AppAssetLibraryPlacementsResource as a4, type AppAssetLibraryPlacement as a5, type PlacementTarget as a6, type PlacementTargetKind as a7, PortalClient as a8, signInWithAppleId as a9, loadAppleSession as aa, saveAppleSession as ab, clearAppleSession as ac, lastAppleId as ad, sessionDir as ae, IrisClient as af, IrisAuthError as ag, type IrisApiKey as ah, type ApiKeyRole as ai, type JsonApiRelationship as aj, type JsonApiErrorResponse as ak, RateLimitError as b, type AppStoreConnectConfig as c, type TokenConfig as d, type RequestOptions as e, type JsonApiResponse as f, type JsonApiListResponse as g, type JsonApiError as h, type App as i, type Build as j, type BetaGroup as k, type BetaBuildLocalization as l, type BuildBetaDetail as m, type PreReleaseVersion$1 as n, type BundleIdCapability as o, type CapabilitySettingInput as p, type CapabilitySetting as q, type CapabilityOption as r, CertificatesResource as s, ProfilesResource as t, BundleIdsResource as u, DevicesResource as v, AppsResource as w, BuildsResource as x, BetaGroupsResource as y, CapabilitiesResource as z };
@@ -1,4 +1,4 @@
1
- import { A as AppStoreConnectClient, P as Profile } from './index-lsuS2R1T.js';
1
+ import { A as AppStoreConnectClient, P as Profile } from './index-CemR3UI9.js';
2
2
  import { P as ProfileType } from './enums-yXNVh3UI.js';
3
3
 
4
4
  interface SighOptions {
@@ -1,4 +1,4 @@
1
- import { A as AppStoreConnectClient } from './index-lsuS2R1T.js';
1
+ import { A as AppStoreConnectClient } from './index-CemR3UI9.js';
2
2
 
3
3
  interface RuleResult {
4
4
  passed: boolean;
@@ -1,4 +1,4 @@
1
- import { A as AppStoreConnectClient, j as Build } from './index-lsuS2R1T.js';
1
+ import { A as AppStoreConnectClient, j as Build } from './index-CemR3UI9.js';
2
2
 
3
3
  /**
4
4
  * Shared types for the pilot module's upload backends.
@@ -1,6 +1,6 @@
1
- import { A as AppStoreConnectClient } from './index-DrmS802s.cjs';
2
- import { a as CertResult } from './cert-eOoxGMN1.cjs';
3
- import { S as SighResult } from './index-DWOLZNlz.cjs';
1
+ import { A as AppStoreConnectClient } from './index-CpGV1f0L.cjs';
2
+ import { a as CertResult } from './cert-DffLKURp.cjs';
3
+ import { S as SighResult } from './index-isT08RuY.cjs';
4
4
 
5
5
  type StorageMode = "git" | "s3" | "local";
6
6
 
@@ -1,6 +1,6 @@
1
- import { A as AppStoreConnectClient } from './index-lsuS2R1T.js';
2
- import { a as CertResult } from './cert-RvXmdMke.js';
3
- import { S as SighResult } from './index-C01Rkrir.js';
1
+ import { A as AppStoreConnectClient } from './index-CemR3UI9.js';
2
+ import { a as CertResult } from './cert-ClacRx9y.js';
3
+ import { S as SighResult } from './index-D9YQQ3FM.js';
4
4
 
5
5
  type StorageMode = "git" | "s3" | "local";
6
6
 
@@ -1,4 +1,4 @@
1
- import { C as CertOptions, a as CertResult, c as createCertificate, d as downloadCertificate, f as findValidCertificates, r as revokeCertificate, b as revokeExpiredCertificates } from './cert-eOoxGMN1.cjs';
1
+ import { C as CertOptions, a as CertResult, c as createCertificate, d as downloadCertificate, f as findValidCertificates, r as revokeCertificate, b as revokeExpiredCertificates } from './cert-DffLKURp.cjs';
2
2
 
3
3
  /**
4
4
  * Generate EC P-256 CSR — used by App Store Connect API (JWT auth).
@@ -1,4 +1,4 @@
1
- import { A as AppStoreConnectClient, P as Profile } from './index-DrmS802s.cjs';
1
+ import { A as AppStoreConnectClient, P as Profile } from './index-CpGV1f0L.cjs';
2
2
  import { P as ProfileType } from './enums-yXNVh3UI.cjs';
3
3
 
4
4
  interface SighOptions {
@@ -1,4 +1,4 @@
1
- import { A as AppStoreConnectClient } from './index-DrmS802s.cjs';
1
+ import { A as AppStoreConnectClient } from './index-CpGV1f0L.cjs';
2
2
 
3
3
  interface RuleResult {
4
4
  passed: boolean;
@@ -1,4 +1,4 @@
1
- import { A as AppStoreConnectClient, W as AppAssetLibraryRefDatumAttributes, X as AppAssetLibraryImageSpec } from './index-lsuS2R1T.js';
1
+ import { A as AppStoreConnectClient, W as AppAssetLibraryRefDatumAttributes, X as AppAssetLibraryImageSpec } from './index-CemR3UI9.js';
2
2
  import { l as AppAssetLibraryPlacementType, j as AppAssetLibraryAssetCategory, m as AppAssetLibraryAssetState, o as AppAssetLibraryFeature, b as Platform, R as ReleaseType } from './enums-yXNVh3UI.js';
3
3
 
4
4
  interface LocalizedMetadata {
package/dist/index.cjs CHANGED
@@ -3,11 +3,11 @@
3
3
  var jose = require('jose');
4
4
  var crypto = require('crypto');
5
5
  var readline = require('readline');
6
- var x509 = require('@peculiar/x509');
7
- var child_process = require('child_process');
8
6
  var fs = require('fs');
9
- var path = require('path');
10
7
  var os = require('os');
8
+ var path = require('path');
9
+ var x509 = require('@peculiar/x509');
10
+ var child_process = require('child_process');
11
11
  var util = require('util');
12
12
  var promises = require('fs/promises');
13
13
  var emojiRegex = require('emoji-regex');
@@ -245,20 +245,6 @@ var init_srp = __esm({
245
245
  };
246
246
  }
247
247
  });
248
-
249
- // src/client/apple-session.ts
250
- var apple_session_exports = {};
251
- __export(apple_session_exports, {
252
- ProgramLicenseAgreementError: () => ProgramLicenseAgreementError,
253
- appleJson: () => appleJson,
254
- beginLogin: () => beginLogin,
255
- checkPortalResponse: () => checkPortalResponse,
256
- fetchServiceKey: () => fetchServiceKey,
257
- loginWithAppleId: () => loginWithAppleId,
258
- requestSmsCode: () => requestSmsCode,
259
- serviceKeyFromLocation: () => serviceKeyFromLocation,
260
- submitTwoFactorCode: () => submitTwoFactorCode
261
- });
262
248
  async function appleJson(res, what) {
263
249
  const text = await res.text();
264
250
  try {
@@ -2810,6 +2796,90 @@ var init_app_asset_library_placements = __esm({
2810
2796
  }
2811
2797
  });
2812
2798
 
2799
+ // src/client/session-store.ts
2800
+ var session_store_exports = {};
2801
+ __export(session_store_exports, {
2802
+ clearAppleSession: () => clearAppleSession,
2803
+ lastAppleId: () => lastAppleId,
2804
+ loadAppleSession: () => loadAppleSession,
2805
+ saveAppleSession: () => saveAppleSession,
2806
+ sessionDir: () => sessionDir,
2807
+ signInWithAppleId: () => signInWithAppleId
2808
+ });
2809
+ function sessionDir() {
2810
+ return process.env.FASTNODE_SESSION_DIR || path.join(os.homedir(), ".fastnode", "sessions");
2811
+ }
2812
+ function fileFor(email) {
2813
+ const key = crypto.createHash("sha256").update(email.trim().toLowerCase()).digest("hex").slice(0, 16);
2814
+ return path.join(sessionDir(), `${key}.json`);
2815
+ }
2816
+ function ensureDir() {
2817
+ const dir = sessionDir();
2818
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true, mode: 448 });
2819
+ fs.chmodSync(dir, 448);
2820
+ }
2821
+ function saveAppleSession(session) {
2822
+ ensureDir();
2823
+ const stored = { email: session.userEmail, savedAt: (/* @__PURE__ */ new Date()).toISOString(), session };
2824
+ const path$1 = fileFor(session.userEmail);
2825
+ fs.writeFileSync(path$1, JSON.stringify(stored), { mode: 384 });
2826
+ fs.chmodSync(path$1, 384);
2827
+ fs.writeFileSync(path.join(sessionDir(), "last-apple-id"), session.userEmail, { mode: 384 });
2828
+ }
2829
+ function clearAppleSession(email) {
2830
+ const path = fileFor(email);
2831
+ if (fs.existsSync(path)) fs.unlinkSync(path);
2832
+ }
2833
+ function lastAppleId() {
2834
+ try {
2835
+ return fs.readFileSync(path.join(sessionDir(), "last-apple-id"), "utf8").trim() || null;
2836
+ } catch {
2837
+ return null;
2838
+ }
2839
+ }
2840
+ async function loadAppleSession(email, fetchImpl = fetch) {
2841
+ const path = fileFor(email);
2842
+ if (!fs.existsSync(path)) return null;
2843
+ let stored;
2844
+ try {
2845
+ stored = JSON.parse(fs.readFileSync(path, "utf8"));
2846
+ } catch {
2847
+ return null;
2848
+ }
2849
+ const cookie = Object.entries(stored.session.cookies).map(([k, v]) => `${k}=${v}`).join("; ");
2850
+ try {
2851
+ const res = await fetchImpl(OLYMPUS_SESSION2, { headers: { Cookie: cookie, Accept: "application/json" } });
2852
+ if (!res.ok) {
2853
+ clearAppleSession(email);
2854
+ return null;
2855
+ }
2856
+ } catch {
2857
+ return null;
2858
+ }
2859
+ return stored.session;
2860
+ }
2861
+ async function signInWithAppleId(options) {
2862
+ const email = options.email || lastAppleId() || await options.askEmail();
2863
+ if (!options.fresh) {
2864
+ const saved = await loadAppleSession(email);
2865
+ if (saved) {
2866
+ options.onLog?.(`Using saved Apple ID session for ${email}`);
2867
+ return saved;
2868
+ }
2869
+ }
2870
+ const password = await options.askPassword(email);
2871
+ const session = await loginWithAppleId({ email, password, onLog: options.onLog });
2872
+ saveAppleSession(session);
2873
+ return session;
2874
+ }
2875
+ var OLYMPUS_SESSION2;
2876
+ var init_session_store = __esm({
2877
+ "src/client/session-store.ts"() {
2878
+ init_apple_session();
2879
+ OLYMPUS_SESSION2 = "https://appstoreconnect.apple.com/olympus/v1/session";
2880
+ }
2881
+ });
2882
+
2813
2883
  // src/client/portal.ts
2814
2884
  function pickUniqueKeyName(base, taken) {
2815
2885
  if (!taken.has(base)) return base;
@@ -3887,8 +3957,14 @@ __export(client_exports, {
3887
3957
  TokenManager: () => exports.TokenManager,
3888
3958
  beginLogin: () => beginLogin,
3889
3959
  checkPortalResponse: () => checkPortalResponse,
3960
+ clearAppleSession: () => clearAppleSession,
3961
+ lastAppleId: () => lastAppleId,
3962
+ loadAppleSession: () => loadAppleSession,
3890
3963
  loginWithAppleId: () => loginWithAppleId,
3891
3964
  requestSmsCode: () => requestSmsCode,
3965
+ saveAppleSession: () => saveAppleSession,
3966
+ sessionDir: () => sessionDir,
3967
+ signInWithAppleId: () => signInWithAppleId,
3892
3968
  submitTwoFactorCode: () => submitTwoFactorCode
3893
3969
  });
3894
3970
  exports.AppStoreConnectClient = void 0;
@@ -3936,6 +4012,7 @@ var init_client = __esm({
3936
4012
  init_auth();
3937
4013
  init_request();
3938
4014
  init_apple_session();
4015
+ init_session_store();
3939
4016
  init_portal();
3940
4017
  init_iris();
3941
4018
  exports.AppStoreConnectClient = class {
@@ -25814,12 +25891,12 @@ function fail(what, r) {
25814
25891
  async function selectProviderForApp(session, appId, onLog) {
25815
25892
  const owns = async () => (await iris(session, "GET", `/apps/${appId}?fields[apps]=name`)).status === 200;
25816
25893
  if (await owns()) return;
25817
- const res = await fetch(OLYMPUS_SESSION2, { headers: { Cookie: cookieHeader(session), Accept: "application/json" } });
25894
+ const res = await fetch(OLYMPUS_SESSION3, { headers: { Cookie: cookieHeader(session), Accept: "application/json" } });
25818
25895
  absorbCookies(session, res);
25819
25896
  const info = await res.json().catch(() => null);
25820
25897
  const providers = info?.availableProviders ?? [];
25821
25898
  for (const p of providers) {
25822
- const sw = await fetch(OLYMPUS_SESSION2, {
25899
+ const sw = await fetch(OLYMPUS_SESSION3, {
25823
25900
  method: "POST",
25824
25901
  headers: { Cookie: cookieHeader(session), "Content-Type": "application/json", Accept: "application/json" },
25825
25902
  body: JSON.stringify({ provider: { providerId: p.providerId } })
@@ -25918,11 +25995,11 @@ function validateUsages(usages) {
25918
25995
  if (linked && unlinked) throw new Error(`${u.category} cannot be both linked and not linked to the user.`);
25919
25996
  }
25920
25997
  }
25921
- var IRIS_BASE2, OLYMPUS_SESSION2, DATA_USAGE_CATEGORIES, DATA_USAGE_PURPOSES, DATA_PROTECTIONS;
25998
+ var IRIS_BASE2, OLYMPUS_SESSION3, DATA_USAGE_CATEGORIES, DATA_USAGE_PURPOSES, DATA_PROTECTIONS;
25922
25999
  var init_privacy = __esm({
25923
26000
  "src/privacy/index.ts"() {
25924
26001
  IRIS_BASE2 = "https://appstoreconnect.apple.com/iris/v1";
25925
- OLYMPUS_SESSION2 = "https://appstoreconnect.apple.com/olympus/v1/session";
26002
+ OLYMPUS_SESSION3 = "https://appstoreconnect.apple.com/olympus/v1/session";
25926
26003
  DATA_USAGE_CATEGORIES = [
25927
26004
  "PAYMENT_INFORMATION",
25928
26005
  "CREDIT_AND_FRAUD",
@@ -29856,14 +29933,18 @@ function createLanesCommand() {
29856
29933
  });
29857
29934
  }
29858
29935
  function createPrivacyCommand() {
29859
- return new commander.Command("privacy").description("Upload App Privacy details (nutrition labels) to App Store Connect").requiredOption("--app-id <id>", "App Store Connect app id (numeric Apple ID)").requiredOption("-j, --json-path <path>", "Fastlane-format app_privacy_details.json").option("-u, --username <email>", "Apple ID", process.env.FASTNODE_USER ?? process.env.FASTLANE_USER).option("--skip-publish", "Save the answers without publishing them", false).action(async (opts) => {
29860
- const { loginWithAppleId: loginWithAppleId2 } = await Promise.resolve().then(() => (init_apple_session(), apple_session_exports));
29936
+ return new commander.Command("privacy").description("Upload App Privacy details (nutrition labels) to App Store Connect").requiredOption("--app-id <id>", "App Store Connect app id (numeric Apple ID)").requiredOption("-j, --json-path <path>", "Fastlane-format app_privacy_details.json").option("-u, --username <email>", "Apple ID (defaults to the last one signed in)", process.env.FASTNODE_USER ?? process.env.FASTLANE_USER).option("--fresh-login", "Ignore the saved Apple ID session and sign in again", false).option("--skip-publish", "Save the answers without publishing them", false).action(async (opts) => {
29937
+ const { signInWithAppleId: signInWithAppleId2, saveAppleSession: saveAppleSession2 } = await Promise.resolve().then(() => (init_session_store(), session_store_exports));
29861
29938
  const { uploadAppPrivacyDetails: uploadAppPrivacyDetails2, validateUsages: validateUsages2 } = await Promise.resolve().then(() => (init_privacy(), privacy_exports));
29862
29939
  const usages = JSON.parse(fs.readFileSync(opts.jsonPath, "utf8"));
29863
29940
  validateUsages2(usages);
29864
- const email = opts.username || await ask("Apple ID: ");
29865
- const password = process.env.FASTNODE_PASSWORD ?? process.env.FASTLANE_PASSWORD ?? await ask(`Password for ${email}: `, true);
29866
- const session = await loginWithAppleId2({ email, password, onLog: (m) => console.log(m) });
29941
+ const session = await signInWithAppleId2({
29942
+ email: opts.username,
29943
+ askEmail: () => ask("Apple ID: "),
29944
+ askPassword: async (email) => process.env.FASTNODE_PASSWORD ?? process.env.FASTLANE_PASSWORD ?? await ask(`Password for ${email}: `, true),
29945
+ fresh: opts.freshLogin,
29946
+ onLog: (m) => console.log(m)
29947
+ });
29867
29948
  const result = await uploadAppPrivacyDetails2({
29868
29949
  session,
29869
29950
  appId: opts.appId,
@@ -29871,6 +29952,7 @@ function createPrivacyCommand() {
29871
29952
  skipPublish: opts.skipPublish,
29872
29953
  onLog: (m) => console.log(m)
29873
29954
  });
29955
+ saveAppleSession2(session);
29874
29956
  console.log(`Done: ${result.created} answers${result.published ? ", published" : ""}.`);
29875
29957
  });
29876
29958
  }
@@ -29893,12 +29975,16 @@ function ask(question, secret = false) {
29893
29975
  });
29894
29976
  }
29895
29977
  function createRejectionsCommand() {
29896
- return new commander.Command("rejections").description("Show App Review's Resolution Center messages and rejection reasons").requiredOption("--app-id <ids...>", "App Store Connect app id(s) (numeric Apple ID)").option("-u, --username <email>", "Apple ID", process.env.FASTNODE_USER ?? process.env.FASTLANE_USER).option("--all", "Include resolved submissions, not just ones awaiting you", false).option("--json", "Print JSON instead of text", false).action(async (opts) => {
29897
- const { loginWithAppleId: loginWithAppleId2 } = await Promise.resolve().then(() => (init_apple_session(), apple_session_exports));
29978
+ return new commander.Command("rejections").description("Show App Review's Resolution Center messages and rejection reasons").requiredOption("--app-id <ids...>", "App Store Connect app id(s) (numeric Apple ID)").option("-u, --username <email>", "Apple ID (defaults to the last one signed in)", process.env.FASTNODE_USER ?? process.env.FASTLANE_USER).option("--fresh-login", "Ignore the saved Apple ID session and sign in again", false).option("--all", "Include resolved submissions, not just ones awaiting you", false).option("--json", "Print JSON instead of text", false).action(async (opts) => {
29979
+ const { signInWithAppleId: signInWithAppleId2, saveAppleSession: saveAppleSession2 } = await Promise.resolve().then(() => (init_session_store(), session_store_exports));
29898
29980
  const { getReviewFeedback: getReviewFeedback2 } = await Promise.resolve().then(() => (init_review(), review_exports));
29899
- const email = opts.username || await ask2("Apple ID: ");
29900
- const password = process.env.FASTNODE_PASSWORD ?? process.env.FASTLANE_PASSWORD ?? await ask2(`Password for ${email}: `, true);
29901
- const session = await loginWithAppleId2({ email, password, onLog: (m) => console.error(m) });
29981
+ const session = await signInWithAppleId2({
29982
+ email: opts.username,
29983
+ askEmail: () => ask2("Apple ID: "),
29984
+ askPassword: async (email) => process.env.FASTNODE_PASSWORD ?? process.env.FASTLANE_PASSWORD ?? await ask2(`Password for ${email}: `, true),
29985
+ fresh: opts.freshLogin,
29986
+ onLog: (m) => console.error(m)
29987
+ });
29902
29988
  const all = {};
29903
29989
  for (const appId of opts.appId) {
29904
29990
  const feedback = await getReviewFeedback2(session, appId, { onlyOpen: !opts.all, onLog: (m) => console.error(m) });
@@ -29921,6 +30007,7 @@ Submission ${s.submissionId} \u2014 ${s.state} (submitted ${s.submittedDate ?? "
29921
30007
  }
29922
30008
  }
29923
30009
  }
30010
+ saveAppleSession2(session);
29924
30011
  if (opts.json) console.log(JSON.stringify(all, null, 2));
29925
30012
  });
29926
30013
  }