@serve.zone/appstore 32.27.0 → 33.0.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.
Files changed (125) hide show
  1. package/.smartconfig.json +4 -1
  2. package/changelog.md +57 -0
  3. package/dist_catalog/catalog.digest +1 -0
  4. package/dist_catalog/catalog.envelope.json +7440 -0
  5. package/{dist_ts_client/data.generated.js → dist_catalog/catalog.json} +6740 -6913
  6. package/dist_ts_client/catalog.d.ts +16 -0
  7. package/dist_ts_client/catalog.js +12 -0
  8. package/dist_ts_client/index.d.ts +3 -1
  9. package/dist_ts_client/index.js +4 -2
  10. package/dist_ts_client/loader.d.ts +69 -0
  11. package/dist_ts_client/loader.js +361 -0
  12. package/dist_ts_client/plugins.d.ts +5 -0
  13. package/dist_ts_client/plugins.js +8 -0
  14. package/dist_ts_client/projection.d.ts +59 -0
  15. package/dist_ts_client/projection.js +83 -0
  16. package/dist_ts_client/storage.d.ts +15 -9
  17. package/dist_ts_client/storage.js +81 -657
  18. package/dist_ts_client/types.d.ts +86 -41
  19. package/dist_ts_client/types.js +1 -1
  20. package/dist_ts_testing/fixtures.d.ts +83 -0
  21. package/dist_ts_testing/fixtures.js +146 -0
  22. package/dist_ts_testing/index.d.ts +1 -0
  23. package/dist_ts_testing/index.js +2 -0
  24. package/dist_ts_testing/plugins.d.ts +7 -0
  25. package/dist_ts_testing/plugins.js +11 -0
  26. package/package.json +15 -10
  27. package/readme.md +161 -92
  28. package/ts_client/catalog.ts +26 -0
  29. package/ts_client/index.ts +3 -1
  30. package/ts_client/loader.ts +414 -0
  31. package/ts_client/plugins.ts +10 -0
  32. package/ts_client/projection.ts +148 -0
  33. package/ts_client/readme.md +17 -27
  34. package/ts_client/storage.ts +93 -882
  35. package/ts_client/types.ts +102 -42
  36. package/ts_testing/fixtures.ts +230 -0
  37. package/ts_testing/index.ts +1 -0
  38. package/ts_testing/plugins.ts +15 -0
  39. package/ts_testing/tspublish.json +3 -0
  40. package/apps/adminer/app.json +0 -10
  41. package/apps/adminer/versions/1.0.0/config.json +0 -6
  42. package/apps/cloudly/app.json +0 -14
  43. package/apps/cloudly/versions/1.0.0/config.json +0 -120
  44. package/apps/cloudly/versions/1.1.0/config.json +0 -120
  45. package/apps/cloudly/versions/1.1.1/config.json +0 -120
  46. package/apps/cloudly/versions/1.1.10/config.json +0 -173
  47. package/apps/cloudly/versions/1.1.2/config.json +0 -130
  48. package/apps/cloudly/versions/1.1.3/config.json +0 -130
  49. package/apps/cloudly/versions/1.1.4/config.json +0 -130
  50. package/apps/cloudly/versions/1.1.5/config.json +0 -149
  51. package/apps/cloudly/versions/1.1.6/config.json +0 -149
  52. package/apps/cloudly/versions/1.1.7/config.json +0 -149
  53. package/apps/cloudly/versions/1.1.8/config.json +0 -173
  54. package/apps/cloudly/versions/1.1.9/config.json +0 -173
  55. package/apps/cloudly/versions/1.10.0/config.json +0 -173
  56. package/apps/cloudly/versions/1.11.0/config.json +0 -173
  57. package/apps/cloudly/versions/1.12.0/config.json +0 -173
  58. package/apps/cloudly/versions/1.13.0/config.json +0 -173
  59. package/apps/cloudly/versions/1.14.0/config.json +0 -173
  60. package/apps/cloudly/versions/1.15.0/config.json +0 -173
  61. package/apps/cloudly/versions/1.16.0/config.json +0 -173
  62. package/apps/cloudly/versions/1.17.0/config.json +0 -173
  63. package/apps/cloudly/versions/1.18.0/config.json +0 -173
  64. package/apps/cloudly/versions/1.19.0/config.json +0 -173
  65. package/apps/cloudly/versions/1.2.0/config.json +0 -173
  66. package/apps/cloudly/versions/1.2.1/config.json +0 -173
  67. package/apps/cloudly/versions/1.20.0/config.json +0 -173
  68. package/apps/cloudly/versions/1.21.0/config.json +0 -173
  69. package/apps/cloudly/versions/1.22.0/config.json +0 -173
  70. package/apps/cloudly/versions/1.23.0/config.json +0 -173
  71. package/apps/cloudly/versions/1.24.0/config.json +0 -173
  72. package/apps/cloudly/versions/1.25.0/config.json +0 -173
  73. package/apps/cloudly/versions/1.26.0/config.json +0 -173
  74. package/apps/cloudly/versions/1.27.0/config.json +0 -173
  75. package/apps/cloudly/versions/1.3.0/config.json +0 -173
  76. package/apps/cloudly/versions/1.4.0/config.json +0 -173
  77. package/apps/cloudly/versions/1.5.0/config.json +0 -173
  78. package/apps/cloudly/versions/1.6.0/config.json +0 -173
  79. package/apps/cloudly/versions/1.7.0/config.json +0 -173
  80. package/apps/cloudly/versions/1.8.0/config.json +0 -173
  81. package/apps/cloudly/versions/1.9.0/config.json +0 -173
  82. package/apps/ghost/app.json +0 -10
  83. package/apps/ghost/versions/1.0.0/config.json +0 -18
  84. package/apps/gitea/app.json +0 -10
  85. package/apps/gitea/versions/1.0.0/config.json +0 -16
  86. package/apps/gitops/app.json +0 -14
  87. package/apps/gitops/versions/1.0.0/config.json +0 -28
  88. package/apps/grafana/app.json +0 -10
  89. package/apps/grafana/versions/1.0.0/config.json +0 -9
  90. package/apps/mariadb/app.json +0 -10
  91. package/apps/mariadb/versions/1.0.0/config.json +0 -9
  92. package/apps/mattermost/app.json +0 -10
  93. package/apps/mattermost/versions/1.0.0/config.json +0 -6
  94. package/apps/n8n/app.json +0 -10
  95. package/apps/n8n/versions/1.0.0/config.json +0 -6
  96. package/apps/nextcloud/app.json +0 -10
  97. package/apps/nextcloud/versions/1.0.0/config.json +0 -16
  98. package/apps/nginx/app.json +0 -10
  99. package/apps/nginx/versions/1.0.0/config.json +0 -6
  100. package/apps/openbao/app.json +0 -16
  101. package/apps/openbao/versions/1.0.0/config.json +0 -52
  102. package/apps/plausible/app.json +0 -10
  103. package/apps/plausible/versions/1.0.0/config.json +0 -9
  104. package/apps/portainer/app.json +0 -10
  105. package/apps/portainer/versions/1.0.0/config.json +0 -6
  106. package/apps/postgres/app.json +0 -10
  107. package/apps/postgres/versions/1.0.0/config.json +0 -11
  108. package/apps/rustdesk-server/app.json +0 -14
  109. package/apps/rustdesk-server/versions/1.0.0/config.json +0 -19
  110. package/apps/siprouter/app.json +0 -14
  111. package/apps/siprouter/versions/1.0.0/config.json +0 -84
  112. package/apps/uptime-kuma/app.json +0 -10
  113. package/apps/uptime-kuma/versions/1.0.0/config.json +0 -6
  114. package/apps/valkey/app.json +0 -10
  115. package/apps/valkey/versions/1.0.0/config.json +0 -6
  116. package/apps/vaultwarden/app.json +0 -10
  117. package/apps/vaultwarden/versions/1.0.0/config.json +0 -6
  118. package/apps/wordpress/app.json +0 -10
  119. package/apps/wordpress/versions/1.0.0/config.json +0 -15
  120. package/appstore.json +0 -194
  121. package/dist_ts_client/classes.appstoreresolver.d.ts +0 -59
  122. package/dist_ts_client/classes.appstoreresolver.js +0 -736
  123. package/dist_ts_client/data.generated.d.ts +0 -2
  124. package/ts_client/classes.appstoreresolver.ts +0 -896
  125. package/ts_client/data.generated.ts +0 -7606
@@ -1,17 +1,4 @@
1
- import type * as interfaces from '@serve.zone/interfaces';
2
- export type TAppStoreFetch = typeof fetch;
3
- export type TAppStoreSourceMode = 'package' | 'remote';
4
- export type TAppStoreIndex = interfaces.appstore.IAppStoreIndex;
5
- export type TAppStoreApp = interfaces.appstore.IAppStoreApp;
6
- export type TAppStoreAppMeta = interfaces.appstore.IAppStoreAppMeta;
7
- export type TAppStoreVersionConfig = interfaces.appstore.IAppStoreVersionConfig;
8
- export type TAppStoreDockerImageSource = interfaces.appstore.IAppStoreDockerImageSource;
9
- export type TAppStoreRepoManifestSource = interfaces.appstore.IAppStoreRepoManifestSource;
10
- export type TAppStoreResolvedSource = interfaces.appstore.IAppStoreResolvedSource;
11
- export type TServezoneAppStoreManifest = interfaces.appstore.IServezoneAppStoreManifest;
12
- export type TAppStoreStorageRequest = interfaces.appstore.TAppStoreStorageRequest;
13
- export type TAppStoreStorageClass = interfaces.appstore.IAppStoreStorageClass;
14
- export type TAppStoreStorageFeatureId = interfaces.appstore.TAppStoreStorageFeatureId;
1
+ import type * as plugins from './plugins.js';
15
2
  export type TAppStoreStorageRequestOrigin = 'explicit' | 'legacyVolume' | 'legacyS3';
16
3
  export interface IAppStoreStorageLegacyCompatibility {
17
4
  /**
@@ -25,11 +12,12 @@ export interface IAppStoreStorageLegacyCompatibility {
25
12
  environmentOwnership: 'bindingOverridesTemplate';
26
13
  };
27
14
  }
15
+ /** The canonical storage handoff a fulfillment adapter receives for one version config. */
28
16
  export interface INormalizedAppStoreStorageConfig {
29
- storageClasses: Record<string, TAppStoreStorageClass>;
30
- storageRequests: TAppStoreStorageRequest[];
17
+ storageClasses: Record<string, plugins.servezoneInterfaces.appstore.IAppStoreStorageClass>;
18
+ storageRequests: plugins.servezoneInterfaces.appstore.TAppStoreStorageRequest[];
31
19
  requestOrigins: Record<string, TAppStoreStorageRequestOrigin>;
32
- requiredFeatureIds: TAppStoreStorageFeatureId[];
20
+ requiredFeatureIds: plugins.servezoneInterfaces.appstore.TAppStoreStorageFeatureId[];
33
21
  legacyCompatibility?: IAppStoreStorageLegacyCompatibility;
34
22
  }
35
23
  export interface IAppStoreStorageNormalizationOptions {
@@ -39,33 +27,90 @@ export interface IAppStoreStorageNormalizationOptions {
39
27
  */
40
28
  supportedFeatures: Iterable<string>;
41
29
  }
42
- export interface IAppStoreResolverOptions {
43
- source?: TAppStoreSourceMode;
44
- baseUrl?: string;
45
- fetch?: TAppStoreFetch;
46
- resolveDockerDigests?: boolean;
47
- requestTimeoutMs?: number;
30
+ export interface IAppStoreCatalogLoaderOptions {
31
+ /** The catalog signing keys this consumer trusts, shipped with its release, never fetched. */
32
+ trustedKeys: readonly plugins.servezoneInterfaces.appstore.IAppStoreCatalogTrustedKey[];
33
+ /** The feature ids this consumer fulfils (`requiresFeatures`), e.g. `appStoreStorageFeatureIds` values. */
34
+ supportedFeatureIds: Iterable<string>;
35
+ /**
36
+ * npm registries asked for the catalog package, in order, as
37
+ * `appstore.validateAppStoreCatalogRegistries` (`@serve.zone/interfaces`) admits them. Absent or
38
+ * empty means `appstore.appStoreCatalogDefaultRegistries` (npmjs).
39
+ */
40
+ registries?: readonly string[];
41
+ /** Defaults to the global `fetch`. */
42
+ fetch?: typeof fetch;
43
+ /** Defaults to the system clock. */
48
44
  now?: () => Date;
45
+ /** Bound of each registry request, response body included. Defaults to 30 000 ms. */
46
+ requestTimeoutMs?: number;
47
+ /** Largest package tarball the loader downloads. Defaults to 32 MiB. */
48
+ maximumTarballBytes?: number;
49
+ /** Largest size the loader decompresses a package tarball to. Defaults to 256 MiB. */
50
+ maximumUnpackedBytes?: number;
49
51
  }
50
- export interface IAppStorePackageData {
51
- generatedAt: string;
52
- jsonFiles: Record<string, unknown>;
53
- textFiles: Record<string, string>;
54
- }
55
- export interface IAppStoreSourceInfo {
56
- source: TAppStoreSourceMode;
57
- packageName: string;
58
- packageVersion: string;
59
- baseUrl?: string;
52
+ /** Options of one load. */
53
+ export interface IAppStoreCatalogLoadOptions {
54
+ /**
55
+ * Aborting it (the consumer stopping) ends the load at once, in-flight requests included, and
56
+ * rejects it with the signal's reason.
57
+ */
58
+ signal?: AbortSignal;
60
59
  }
61
- export interface IResolvedAppStoreApp {
62
- appStoreApp: TAppStoreApp;
63
- appMeta: TAppStoreAppMeta;
64
- configsByVersion: Map<string, TAppStoreVersionConfig>;
60
+ /** What a consumer stored with its last-known-good envelope text, to restore it at start. */
61
+ export interface IAppStoreCatalogStoredRecord {
62
+ origin: plugins.servezoneInterfaces.appstore.TAppStoreCatalogOrigin;
63
+ /** When the consumer first activated it. */
64
+ loadedAt: string;
65
65
  }
66
- export interface IParsedDockerImageReference {
66
+ /** What one registry answered during a load. */
67
+ export interface IAppStoreCatalogRegistryReport {
67
68
  registry: string;
68
- repository: string;
69
- tag: string;
70
- digest?: string;
69
+ outcome: plugins.servezoneInterfaces.appstore.TAppStoreCatalogAttemptOutcome;
70
+ /** The package version the registry's `latest` dist-tag named, once read. */
71
+ packageVersion?: string;
72
+ /** Why a `refused` or `failed` answer ended. */
73
+ message?: string;
74
+ }
75
+ interface IAppStoreCatalogJudgementBase {
76
+ /** The attempt as a consumer records it in its catalog status (`lastAttempt`). */
77
+ attempt: plugins.servezoneInterfaces.appstore.IAppStoreCatalogAttempt;
78
+ }
79
+ /** A verified catalog that succeeds the active one; the consumer stores it as last-known-good. */
80
+ export interface IAppStoreCatalogActivation extends IAppStoreCatalogJudgementBase {
81
+ outcome: 'activated';
82
+ envelope: plugins.servezoneInterfaces.appstore.IAppStoreCatalogEnvelope;
83
+ /** The status `active` member for the activated catalog. */
84
+ active: plugins.servezoneInterfaces.appstore.IAppStoreCatalogActiveState;
85
+ }
86
+ /** The candidate is the active catalog. */
87
+ export interface IAppStoreCatalogUnchanged extends IAppStoreCatalogJudgementBase {
88
+ outcome: 'unchanged';
89
+ }
90
+ /** The candidate was read and refused; the active catalog stays in place. */
91
+ export interface IAppStoreCatalogRefused extends IAppStoreCatalogJudgementBase {
92
+ outcome: 'refused';
93
+ /** The status `refused` member. */
94
+ refused: plugins.servezoneInterfaces.appstore.IAppStoreCatalogRefusalRecord;
95
+ }
96
+ /** No candidate could be read: transport, integrity or packaging failed. */
97
+ export interface IAppStoreCatalogFailure extends IAppStoreCatalogJudgementBase {
98
+ outcome: 'failed';
99
+ message: string;
100
+ }
101
+ /** The judgement of one candidate envelope against the active catalog. */
102
+ export type TAppStoreCatalogJudgement = IAppStoreCatalogActivation | IAppStoreCatalogUnchanged | IAppStoreCatalogRefused;
103
+ /** The result of one registry load: the judgement of the best answer and every registry's answer. */
104
+ export type TAppStoreCatalogLoadResult = (TAppStoreCatalogJudgement | IAppStoreCatalogFailure) & {
105
+ registries: IAppStoreCatalogRegistryReport[];
106
+ };
107
+ /** A stored catalog that verifies today: the consumer activates it at start. */
108
+ export interface IAppStoreCatalogRestored {
109
+ outcome: 'restored';
110
+ envelope: plugins.servezoneInterfaces.appstore.IAppStoreCatalogEnvelope;
111
+ /** The status `active` member: `origin` and `loadedAt` as stored, `keyId` as verified now. */
112
+ active: plugins.servezoneInterfaces.appstore.IAppStoreCatalogActiveState;
71
113
  }
114
+ /** The result of restoring a stored catalog: restored, or refused and left inactive. */
115
+ export type TAppStoreCatalogRestoreResult = IAppStoreCatalogRestored | IAppStoreCatalogRefused;
116
+ export {};
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19jbGllbnQvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19jbGllbnQvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Test fixtures for App Store catalog consumers (`@serve.zone/appstore/testing`), never part of the
3
+ * runtime entry: a throwaway signing key, a catalog, its signed envelope, the npm package tarball
4
+ * carrying it, a registry stub and a `fetch` serving it. A consumer's tests drive
5
+ * `AppStoreCatalogLoader` against these exactly as against a registry.
6
+ */
7
+ import * as plugins from './plugins.js';
8
+ type TCatalog = plugins.servezoneInterfaces.appstore.IAppStoreCatalog;
9
+ type TEnvelope = plugins.servezoneInterfaces.appstore.IAppStoreCatalogEnvelope;
10
+ type TVersionConfig = plugins.servezoneInterfaces.appstore.TAppStoreCatalogVersionConfig;
11
+ type TSigningKey = plugins.servezoneInterfacesRuntime.IAppStoreCatalogSigningKey;
12
+ type TTrustedKey = plugins.servezoneInterfaces.appstore.IAppStoreCatalogTrustedKey;
13
+ /** A throwaway catalog signing key and the trusted-key record a consumer under test is given. */
14
+ export interface IAppStoreTestSigningKey {
15
+ signingKey: TSigningKey;
16
+ trustedKey: TTrustedKey;
17
+ }
18
+ export interface IAppStoreTestVersion {
19
+ version: string;
20
+ config: TVersionConfig;
21
+ withdrawn?: plugins.servezoneInterfaces.appstore.IAppStoreCatalogWithdrawal;
22
+ }
23
+ export interface IAppStoreTestApp {
24
+ info: plugins.servezoneInterfaces.appstore.IServezoneAppStoreAppInfo;
25
+ /** Defaults to the highest version that is not withdrawn (the highest one when all are). */
26
+ latestVersion?: string;
27
+ upgradeStrategy?: plugins.servezoneInterfaces.appstore.TAppStoreCatalogUpgradeStrategy;
28
+ versions: IAppStoreTestVersion[];
29
+ }
30
+ export interface IAppStoreTestCatalogOptions {
31
+ revision: number;
32
+ /** Defaults to `2026-10-08T12:00:00.000Z`. */
33
+ publishedAt?: string;
34
+ /** Defaults to 40 times `c`. */
35
+ sourceRevision?: string;
36
+ apps: IAppStoreTestApp[];
37
+ }
38
+ /** One registry origin's answers: the `latest` version manifest and the tarball it names. */
39
+ export interface IAppStoreTestRegistryStub {
40
+ /** The `latest` version manifest body; `null` answers 404. */
41
+ manifest: unknown;
42
+ tarball?: Uint8Array<ArrayBuffer>;
43
+ /** Never answers until the request is aborted. */
44
+ hang?: boolean;
45
+ /** Answers every request with this HTTP status. */
46
+ status?: number;
47
+ }
48
+ /** A fresh throwaway key; nothing about it is ever stored. */
49
+ export declare const createAppStoreTestSigningKey: () => Promise<IAppStoreTestSigningKey>;
50
+ /** A version config the contract accepts: a digest-pinned `example/<name>` image and one web port. */
51
+ export declare const createAppStoreTestVersionConfig: (nameArg: string, imageDigitArg: string, overridesArg?: Partial<TVersionConfig>) => TVersionConfig;
52
+ /** A catalog the contract accepts, apps in id order, each version with its config digest; throws otherwise. */
53
+ export declare const createAppStoreTestCatalog: (optionsArg: IAppStoreTestCatalogOptions) => Promise<TCatalog>;
54
+ /** The signed envelope of a test catalog, as the publisher would ship it. */
55
+ export declare const signAppStoreTestCatalog: (catalogArg: TCatalog, keyArg: IAppStoreTestSigningKey) => Promise<TEnvelope>;
56
+ export interface IAppStoreTestTarballOptions {
57
+ /** Defaults to `33.0.0`. */
58
+ packageVersion?: string;
59
+ /** Bytes of a filler `dist_catalog/catalog.json` entry ahead of the envelope; defaults to 0. */
60
+ fillerBytes?: number;
61
+ }
62
+ /**
63
+ * The gzip-compressed npm package tarball (`package/…`) of `@serve.zone/appstore`, carrying
64
+ * `envelopeTextArg` at the envelope's package path, or no envelope for `null`.
65
+ */
66
+ export declare const createAppStoreTestPackageTarball: (envelopeTextArg: string | null, optionsArg?: IAppStoreTestTarballOptions) => Promise<Uint8Array<ArrayBuffer>>;
67
+ /** The npm `dist.integrity` of a tarball. */
68
+ export declare const computeAppStoreTestIntegrity: (bytesArg: Uint8Array) => string;
69
+ export interface IAppStoreTestRegistryOptions {
70
+ /** Defaults to the tarball's true integrity. */
71
+ integrity?: string;
72
+ /** Defaults to `33.0.0`. */
73
+ packageVersion?: string;
74
+ }
75
+ /** A registry stub at `originArg` whose `latest` names `tarballArg`. */
76
+ export declare const createAppStoreTestRegistry: (originArg: string, tarballArg: Uint8Array<ArrayBuffer>, optionsArg?: IAppStoreTestRegistryOptions) => IAppStoreTestRegistryStub;
77
+ /**
78
+ * A `fetch` serving one stub per registry origin: the `latest` manifest of
79
+ * `@serve.zone/appstore` and its tarball. An origin without a stub fails like an unreachable host;
80
+ * a hanging stub rejects once the request's signal aborts.
81
+ */
82
+ export declare const createAppStoreTestFetch: (registriesArg: Record<string, IAppStoreTestRegistryStub>) => typeof fetch;
83
+ export {};
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Test fixtures for App Store catalog consumers (`@serve.zone/appstore/testing`), never part of the
3
+ * runtime entry: a throwaway signing key, a catalog, its signed envelope, the npm package tarball
4
+ * carrying it, a registry stub and a `fetch` serving it. A consumer's tests drive
5
+ * `AppStoreCatalogLoader` against these exactly as against a registry.
6
+ */
7
+ import * as plugins from './plugins.js';
8
+ import { appStoreCatalogEnvelopePackagePath, appStoreCatalogPackageName } from '../dist_ts_client/catalog.js';
9
+ const tarballPath = '/tarball.tgz';
10
+ /** A fresh throwaway key; nothing about it is ever stored. */
11
+ export const createAppStoreTestSigningKey = async () => {
12
+ const signingKey = await plugins.servezoneInterfacesRuntime.createAppStoreCatalogSigningKey();
13
+ return { signingKey, trustedKey: plugins.servezoneInterfacesRuntime.getAppStoreCatalogTrustedKey(signingKey) };
14
+ };
15
+ /** A version config the contract accepts: a digest-pinned `example/<name>` image and one web port. */
16
+ export const createAppStoreTestVersionConfig = (nameArg, imageDigitArg, overridesArg = {}) => ({
17
+ image: `example/${nameArg}@sha256:${imageDigitArg.repeat(64)}`,
18
+ targetPorts: [{ name: 'web', port: 8080, protocol: 'http', default: true }],
19
+ ...overridesArg,
20
+ });
21
+ const compareVersions = (leftArg, rightArg) => {
22
+ const { data } = plugins.servezoneInterfaces;
23
+ const left = data.parseReleaseVersion(leftArg);
24
+ const right = data.parseReleaseVersion(rightArg);
25
+ if (left === null || right === null)
26
+ throw new Error(`test catalog versions must be MAJOR.MINOR.PATCH: ${leftArg}, ${rightArg}`);
27
+ return data.compareReleaseVersions(left, right);
28
+ };
29
+ const defaultLatestVersion = (appArg) => {
30
+ const available = appArg.versions.filter((versionArg) => versionArg.withdrawn === undefined);
31
+ const candidates = (available.length > 0 ? available : appArg.versions).map((versionArg) => versionArg.version);
32
+ const [latest] = [...candidates].sort((leftArg, rightArg) => compareVersions(rightArg, leftArg));
33
+ if (latest === undefined)
34
+ throw new Error(`test catalog app '${appArg.info.id}' lists no version`);
35
+ return latest;
36
+ };
37
+ /** Every feature id the catalog's version configs name. */
38
+ const usedFeatureIds = (catalogArg) => [...new Set(catalogArg.apps.flatMap((appArg) => appArg.versions.flatMap((versionArg) => versionArg.config.requiresFeatures ?? [])))].sort();
39
+ /** A catalog the contract accepts, apps in id order, each version with its config digest; throws otherwise. */
40
+ export const createAppStoreTestCatalog = async (optionsArg) => {
41
+ const { appstore } = plugins.servezoneInterfaces;
42
+ const apps = [];
43
+ const sorted = [...optionsArg.apps].sort((leftArg, rightArg) => leftArg.info.id < rightArg.info.id ? -1 : leftArg.info.id > rightArg.info.id ? 1 : 0);
44
+ for (const app of sorted) {
45
+ const versions = [];
46
+ for (const version of app.versions) {
47
+ const config = structuredClone(version.config);
48
+ versions.push({
49
+ version: version.version,
50
+ config,
51
+ configDigest: await appstore.computeAppStoreCatalogConfigDigest(config),
52
+ ...(version.withdrawn === undefined ? {} : { withdrawn: { ...version.withdrawn } }),
53
+ });
54
+ }
55
+ apps.push({
56
+ info: structuredClone(app.info),
57
+ latestVersion: app.latestVersion ?? defaultLatestVersion(app),
58
+ ...(app.upgradeStrategy === undefined ? {} : { upgradeStrategy: app.upgradeStrategy }),
59
+ versions,
60
+ });
61
+ }
62
+ const contract = appstore.appStoreCatalogContract;
63
+ const catalog = {
64
+ contract: { id: contract.id, major: contract.major, minor: contract.minor },
65
+ revision: optionsArg.revision,
66
+ publishedAt: optionsArg.publishedAt ?? '2026-10-08T12:00:00.000Z',
67
+ sourceRevision: optionsArg.sourceRevision ?? 'c'.repeat(40),
68
+ apps,
69
+ };
70
+ const errors = appstore.validateAppStoreCatalog(catalog, { supportedFeatureIds: usedFeatureIds(catalog) });
71
+ if (errors.length > 0)
72
+ throw new Error(`test catalog refused by the contract: ${errors.join('; ')}`);
73
+ return catalog;
74
+ };
75
+ /** The signed envelope of a test catalog, as the publisher would ship it. */
76
+ export const signAppStoreTestCatalog = async (catalogArg, keyArg) => await plugins.servezoneInterfacesRuntime.signAppStoreCatalog(catalogArg, [keyArg.signingKey], {
77
+ supportedFeatureIds: usedFeatureIds(catalogArg),
78
+ });
79
+ const gzip = async (bytesArg) => new Uint8Array(await new Response(new Blob([bytesArg]).stream().pipeThrough(new CompressionStream('gzip'))).arrayBuffer());
80
+ /**
81
+ * The gzip-compressed npm package tarball (`package/…`) of `@serve.zone/appstore`, carrying
82
+ * `envelopeTextArg` at the envelope's package path, or no envelope for `null`.
83
+ */
84
+ export const createAppStoreTestPackageTarball = async (envelopeTextArg, optionsArg = {}) => {
85
+ const encoder = new TextEncoder();
86
+ const packageJson = encoder.encode(JSON.stringify({
87
+ name: appStoreCatalogPackageName,
88
+ version: optionsArg.packageVersion ?? '33.0.0',
89
+ }));
90
+ const filler = new Uint8Array(optionsArg.fillerBytes ?? 0).fill(0x20);
91
+ const entries = [
92
+ { header: { name: 'package/package.json', size: packageJson.byteLength }, body: packageJson },
93
+ { header: { name: 'package/dist_catalog/catalog.json', size: filler.byteLength }, body: filler },
94
+ ];
95
+ if (envelopeTextArg !== null) {
96
+ const envelope = encoder.encode(envelopeTextArg);
97
+ entries.push({
98
+ header: { name: `package/${appStoreCatalogEnvelopePackagePath}`, size: envelope.byteLength },
99
+ body: envelope,
100
+ });
101
+ }
102
+ return await gzip(await plugins.modernTar.packTar(entries));
103
+ };
104
+ /** The npm `dist.integrity` of a tarball. */
105
+ export const computeAppStoreTestIntegrity = (bytesArg) => `sha512-${plugins.crypto.createHash('sha512').update(bytesArg).digest('base64')}`;
106
+ /** A registry stub at `originArg` whose `latest` names `tarballArg`. */
107
+ export const createAppStoreTestRegistry = (originArg, tarballArg, optionsArg = {}) => ({
108
+ manifest: {
109
+ name: appStoreCatalogPackageName,
110
+ version: optionsArg.packageVersion ?? '33.0.0',
111
+ dist: { tarball: `${originArg}${tarballPath}`, integrity: optionsArg.integrity ?? computeAppStoreTestIntegrity(tarballArg) },
112
+ },
113
+ tarball: tarballArg,
114
+ });
115
+ /**
116
+ * A `fetch` serving one stub per registry origin: the `latest` manifest of
117
+ * `@serve.zone/appstore` and its tarball. An origin without a stub fails like an unreachable host;
118
+ * a hanging stub rejects once the request's signal aborts.
119
+ */
120
+ export const createAppStoreTestFetch = (registriesArg) => async (inputArg, initArg) => {
121
+ const url = new URL(inputArg instanceof Request ? inputArg.url : inputArg);
122
+ const stub = registriesArg[url.origin];
123
+ if (stub === undefined)
124
+ throw new TypeError(`fetch failed: no registry at ${url.origin}`);
125
+ const signal = initArg?.signal ?? null;
126
+ if (stub.hang === true) {
127
+ return await new Promise((_resolveArg, rejectArg) => {
128
+ const abort = () => rejectArg(signal?.reason ?? new Error('aborted'));
129
+ if (signal?.aborted === true)
130
+ abort();
131
+ signal?.addEventListener('abort', abort, { once: true });
132
+ });
133
+ }
134
+ if (stub.status !== undefined)
135
+ return new Response('unavailable', { status: stub.status });
136
+ if (url.pathname === `/${appStoreCatalogPackageName.replace('/', '%2f')}/latest`) {
137
+ return stub.manifest === null
138
+ ? new Response('not found', { status: 404 })
139
+ : new Response(JSON.stringify(stub.manifest), { headers: { 'content-type': 'application/json' } });
140
+ }
141
+ if (url.pathname === tarballPath && stub.tarball !== undefined) {
142
+ return new Response(new Blob([stub.tarball]));
143
+ }
144
+ return new Response('not found', { status: 404 });
145
+ };
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c190ZXN0aW5nL2ZpeHR1cmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBQ0gsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLDBCQUEwQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFnRHpHLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQztBQUVuQyw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsS0FBSyxJQUFzQyxFQUFFO0lBQ3ZGLE1BQU0sVUFBVSxHQUFHLE1BQU0sT0FBTyxDQUFDLDBCQUEwQixDQUFDLCtCQUErQixFQUFFLENBQUM7SUFDOUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLDBCQUEwQixDQUFDLDRCQUE0QixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7QUFDakgsQ0FBQyxDQUFDO0FBRUYsc0dBQXNHO0FBQ3RHLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLENBQzdDLE9BQWUsRUFDZixhQUFxQixFQUNyQixZQUFZLEdBQTRCLEVBQUUsRUFDMUIsRUFBRSxDQUFDLENBQUM7SUFDcEIsS0FBSyxFQUFFLFdBQVcsT0FBTyxXQUFXLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDOUQsV0FBVyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDM0UsR0FBRyxZQUFZO0NBQ2hCLENBQUMsQ0FBQztBQUVILE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBZSxFQUFFLFFBQWdCLEVBQVUsRUFBRTtJQUNwRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLG1C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
@@ -0,0 +1 @@
1
+ export * from './fixtures.js';
@@ -0,0 +1,2 @@
1
+ export * from './fixtures.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c190ZXN0aW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZUFBZSxDQUFDIn0=
@@ -0,0 +1,7 @@
1
+ import * as crypto from 'node:crypto';
2
+ export { crypto };
3
+ import * as servezoneInterfaces from '@serve.zone/interfaces';
4
+ import * as servezoneInterfacesRuntime from '@serve.zone/interfaces/runtime';
5
+ export { servezoneInterfaces, servezoneInterfacesRuntime };
6
+ import * as modernTar from 'modern-tar';
7
+ export { modernTar };
@@ -0,0 +1,11 @@
1
+ // node native
2
+ import * as crypto from 'node:crypto';
3
+ export { crypto };
4
+ // @serve.zone scope
5
+ import * as servezoneInterfaces from '@serve.zone/interfaces';
6
+ import * as servezoneInterfacesRuntime from '@serve.zone/interfaces/runtime';
7
+ export { servezoneInterfaces, servezoneInterfacesRuntime };
8
+ // third party
9
+ import * as modernTar from 'modern-tar';
10
+ export { modernTar };
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3Rlc3RpbmcvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjO0FBQ2QsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBRWxCLG9CQUFvQjtBQUNwQixPQUFPLEtBQUssbUJBQW1CLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxLQUFLLDBCQUEwQixNQUFNLGdDQUFnQyxDQUFDO0FBRTdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSwwQkFBMEIsRUFBRSxDQUFDO0FBRTNELGNBQWM7QUFDZCxPQUFPLEtBQUssU0FBUyxNQUFNLFlBQVksQ0FBQztBQUV4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMifQ==
package/package.json CHANGED
@@ -1,17 +1,19 @@
1
1
  {
2
2
  "name": "@serve.zone/appstore",
3
- "version": "32.27.0",
3
+ "version": "33.0.0",
4
4
  "private": false,
5
- "description": "serve.zone App Store metadata, parser, and resolver client.",
5
+ "description": "serve.zone App Store: the signed runtime catalog and its consumer loader.",
6
6
  "type": "module",
7
7
  "exports": {
8
- ".": "./dist_ts_client/index.js"
8
+ ".": "./dist_ts_client/index.js",
9
+ "./catalog.envelope.json": "./dist_catalog/catalog.envelope.json",
10
+ "./testing": "./dist_ts_testing/index.js"
9
11
  },
10
12
  "author": "Task Venture Capital GmbH",
11
13
  "license": "MIT",
12
14
  "dependencies": {
13
- "@push.rocks/smartversion": "^3.1.0",
14
- "@serve.zone/interfaces": "32.42.0"
15
+ "@serve.zone/interfaces": "32.53.0",
16
+ "modern-tar": "0.8.5"
15
17
  },
16
18
  "devDependencies": {
17
19
  "@git.zone/tsbuild": "^6.0.0",
@@ -20,11 +22,11 @@
20
22
  "@types/node": "26.6.3"
21
23
  },
22
24
  "files": [
23
- "apps/**/*",
24
- "appstore.json",
25
- "appstore.resolved.json",
26
25
  "ts_client/**/*",
27
26
  "dist_ts_client/**/*",
27
+ "ts_testing/**/*",
28
+ "dist_ts_testing/**/*",
29
+ "dist_catalog/**/*",
28
30
  ".smartconfig.json",
29
31
  "readme.md",
30
32
  "changelog.md",
@@ -46,8 +48,11 @@
46
48
  "cloudly"
47
49
  ],
48
50
  "scripts": {
49
- "test": "node scripts/generate-data-module.mjs && tstest test/ --verbose --logfile --timeout 60",
50
- "build": "node scripts/generate-data-module.mjs && tsbuild tsfolders",
51
+ "test": "tstest test/ --verbose --logfile --timeout 60",
52
+ "build": "tsbuild tsfolders && node dist_ts_publisher/cli.js build",
53
+ "build:release": "tsbuild tsfolders && node dist_ts_publisher/cli.js build --release",
54
+ "catalog:lock": "tsbuild tsfolders && node dist_ts_publisher/cli.js lock",
55
+ "catalog:trustedkey": "tsbuild tsfolders && node dist_ts_publisher/cli.js trusted-key",
51
56
  "buildDocs": "tsdoc"
52
57
  }
53
58
  }