@spacefast/common 0.0.6 → 0.0.8

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 (65) hide show
  1. package/brand-assets/spacefast-favicon.svg +16 -0
  2. package/brand-assets/spacefast-sf-full-bleed.svg +13 -0
  3. package/brand-assets/spacefast-wordmark.svg +5 -0
  4. package/dist/agents/connect-targets.d.ts +6 -1
  5. package/dist/agents/connect-targets.js +19 -0
  6. package/dist/brand-assets-build.d.ts +26 -0
  7. package/dist/brand-assets-build.js +81 -0
  8. package/dist/brand-assets.d.ts +42 -0
  9. package/dist/brand-assets.js +30 -0
  10. package/dist/contracts/access.d.ts +143 -0
  11. package/dist/contracts/access.js +33 -0
  12. package/dist/contracts/api-keys.d.ts +123 -0
  13. package/dist/contracts/api-keys.js +65 -0
  14. package/dist/contracts/builds.d.ts +40 -0
  15. package/dist/contracts/builds.js +17 -0
  16. package/dist/contracts/enums.js +5 -4
  17. package/dist/contracts/error-code-meta.d.ts +116 -4
  18. package/dist/contracts/error-code-meta.js +29 -1
  19. package/dist/contracts/error-codes.d.ts +1 -1
  20. package/dist/contracts/error-codes.js +28 -0
  21. package/dist/contracts/feature-lifecycle-core.d.ts +36 -0
  22. package/dist/contracts/feature-lifecycle-core.js +220 -0
  23. package/dist/contracts/feature-lifecycle.d.ts +7 -0
  24. package/dist/contracts/feature-lifecycle.js +31 -0
  25. package/dist/contracts/generated-feature-launch-entries.d.ts +2 -0
  26. package/dist/contracts/generated-feature-launch-entries.js +518 -0
  27. package/dist/contracts/ids.d.ts +4 -0
  28. package/dist/contracts/ids.js +8 -0
  29. package/dist/contracts/operations.d.ts +161 -1
  30. package/dist/contracts/operations.js +49 -1
  31. package/dist/contracts/platform.d.ts +6 -0
  32. package/dist/contracts/platform.js +6 -0
  33. package/dist/contracts/publishes.d.ts +130 -0
  34. package/dist/contracts/publishes.js +145 -0
  35. package/dist/contracts/repository-connections.d.ts +3 -0
  36. package/dist/contracts/repository-connections.js +13 -0
  37. package/dist/contracts/resources.d.ts +2 -0
  38. package/dist/contracts/resources.js +10 -2
  39. package/dist/contracts/runtime-api.d.ts +2 -0
  40. package/dist/contracts/runtime-api.js +1 -0
  41. package/dist/contracts/sf-config-v1.d.ts +75 -0
  42. package/dist/contracts/sf-config-v1.js +6 -0
  43. package/dist/contracts/spaces.d.ts +12 -3
  44. package/dist/contracts/spaces.js +22 -2
  45. package/dist/contracts/superadmin-spaces.d.ts +2 -0
  46. package/dist/contracts/superadmin-tenants.d.ts +6 -6
  47. package/dist/contracts/superadmin-tenants.js +6 -11
  48. package/dist/contracts/teams.d.ts +8 -11
  49. package/dist/contracts/teams.js +11 -16
  50. package/dist/docs/agent-setup.d.ts +51 -0
  51. package/dist/docs/agent-setup.js +168 -3
  52. package/dist/docs/error-docs.js +113 -1
  53. package/dist/slug-policy/blocklist.d.ts +4 -0
  54. package/dist/slug-policy/blocklist.js +122 -0
  55. package/dist/slug-policy/index.d.ts +17 -0
  56. package/dist/slug-policy/index.js +86 -0
  57. package/dist/utils/concurrency.d.ts +1 -0
  58. package/dist/utils/concurrency.js +22 -0
  59. package/dist/utils/email.d.ts +1 -0
  60. package/dist/utils/email.js +3 -0
  61. package/dist/utils/query-keys.d.ts +1 -0
  62. package/dist/utils/query-keys.js +4 -0
  63. package/dist/utils/sf-config-v1.d.ts +2 -0
  64. package/dist/utils/sf-config-v1.js +542 -0
  65. package/package.json +20 -1
@@ -25,6 +25,7 @@ export const ERROR_CODES = [
25
25
  "anonymous_pool_unavailable",
26
26
  "anonymous_publish_rate_limited",
27
27
  "anonymous_space_limit_reached",
28
+ "api_key_scope_underivable",
28
29
  "archive_body_required",
29
30
  "archive_too_large",
30
31
  "auth_code_required",
@@ -119,6 +120,7 @@ export const ERROR_CODES = [
119
120
  "domain_wildcard_not_enabled",
120
121
  "download_required",
121
122
  "duplicate_version_path",
123
+ "enforcement_policy_overlap",
122
124
  "event_payload_too_large",
123
125
  "event_rate_limited",
124
126
  "expired_token",
@@ -207,6 +209,7 @@ export const ERROR_CODES = [
207
209
  "publish_archive_expanded_size_exceeded",
208
210
  "publish_archive_file_count_exceeded",
209
211
  "publish_archive_too_large",
212
+ "publish_base_changed",
210
213
  "publish_config_unsupported",
211
214
  "publish_failed",
212
215
  "publish_file_missing",
@@ -247,12 +250,16 @@ export const ERROR_CODES = [
247
250
  "site_required",
248
251
  "site_suspended",
249
252
  "slow_down",
253
+ "slug_invalid",
254
+ "slug_reserved",
255
+ "slug_unavailable",
250
256
  "space_already_claimed",
251
257
  "space_claim_unavailable",
252
258
  "space_claimed_credential_available",
253
259
  "space_disabled",
254
260
  "space_expired",
255
261
  "space_has_active_version",
262
+ "space_hostname_identity_missing",
256
263
  "space_import_archive_invalid",
257
264
  "space_import_archive_too_large",
258
265
  "space_import_config_only_archive",
@@ -340,11 +347,14 @@ export const ERROR_CODES = [
340
347
  "wp_cloud_team_shared_site_exists",
341
348
  "wp_cloud_webhook_secret_not_configured",
342
349
  "zero_activating",
350
+ "zero_ai_unavailable",
343
351
  "zero_artifact_abi_mismatch",
344
352
  "zero_artifact_invalid",
345
353
  "zero_artifact_malformed",
354
+ "zero_artifact_missing",
346
355
  "zero_artifact_path_invalid",
347
356
  "zero_artifact_unreadable",
357
+ "zero_artifact_untrusted",
348
358
  "zero_auth_unavailable",
349
359
  "zero_blob_key_invalid",
350
360
  "zero_blob_store_full",
@@ -355,6 +365,7 @@ export const ERROR_CODES = [
355
365
  "zero_bytecode_invalid",
356
366
  "zero_bytecode_path_invalid",
357
367
  "zero_bytecode_unreadable",
368
+ "zero_capabilities_encode_failed",
358
369
  "zero_client_bundle_not_loaded",
359
370
  "zero_db_connect_failed",
360
371
  "zero_db_execute_failed",
@@ -373,12 +384,19 @@ export const ERROR_CODES = [
373
384
  "zero_db_url_missing",
374
385
  "zero_dev_endpoint_failed",
375
386
  "zero_dump_query_invalid",
387
+ "zero_endpoint_compile_failed",
388
+ "zero_endpoint_conflict",
389
+ "zero_endpoint_duplicate",
390
+ "zero_endpoint_id_duplicate",
376
391
  "zero_endpoint_index_invalid",
377
392
  "zero_endpoint_index_malformed",
378
393
  "zero_endpoint_index_path_invalid",
379
394
  "zero_endpoint_index_unreadable",
395
+ "zero_endpoint_invalid",
380
396
  "zero_endpoint_mismatch",
381
397
  "zero_endpoint_not_found",
398
+ "zero_endpoints_invalid",
399
+ "zero_endpoints_too_many",
382
400
  "zero_envelope_encode_failed",
383
401
  "zero_js_context_init_failed",
384
402
  "zero_js_execution_failed",
@@ -387,7 +405,9 @@ export const ERROR_CODES = [
387
405
  "zero_js_response_malformed",
388
406
  "zero_js_runtime_init_failed",
389
407
  "zero_log_query_invalid",
408
+ "zero_lookup_invalid",
390
409
  "zero_method_not_allowed",
410
+ "zero_migration_failed",
391
411
  "zero_query_name_missing",
392
412
  "zero_realtime_forbidden",
393
413
  "zero_realtime_message_invalid",
@@ -402,6 +422,10 @@ export const ERROR_CODES = [
402
422
  "zero_request_body_too_large",
403
423
  "zero_requires_dedicated_plan",
404
424
  "zero_response_too_large",
425
+ "zero_routes_invalid",
426
+ "zero_run_compile_failed",
427
+ "zero_run_duplicate",
428
+ "zero_run_invalid",
405
429
  "zero_run_operation_unsupported",
406
430
  "zero_runner_envelope_invalid",
407
431
  "zero_runner_failed",
@@ -413,6 +437,10 @@ export const ERROR_CODES = [
413
437
  "zero_runner_stdin_invalid",
414
438
  "zero_runner_stdin_too_large",
415
439
  "zero_runner_unavailable",
440
+ "zero_runs_invalid",
441
+ "zero_runs_require_runtime_compiler",
442
+ "zero_runs_too_many",
443
+ "zero_shopify_unavailable",
416
444
  "zero_source_compile_failed",
417
445
  "zero_source_hash_mismatch",
418
446
  "zero_source_invalid",
@@ -0,0 +1,36 @@
1
+ export declare const FEATURE_STAGES: readonly ["internal", "private_beta", "ga"];
2
+ export type FeatureStage = (typeof FEATURE_STAGES)[number];
3
+ export declare const FEATURE_ASSIGNMENT_SCOPES: readonly ["user", "team", "global"];
4
+ export type FeatureAssignmentScope = (typeof FEATURE_ASSIGNMENT_SCOPES)[number];
5
+ export declare const FEATURE_EXECUTION_ACTOR_POLICIES: readonly ["request_actor", "persisted_request_actor", "resource_team", "global_policy"];
6
+ export type FeatureExecutionActorPolicy = (typeof FEATURE_EXECUTION_ACTOR_POLICIES)[number];
7
+ export declare const FEATURE_OWNER_IDS: readonly ["team:access", "team:build-platform", "team:collaboration", "team:commerce", "team:domains", "team:publishing", "team:runtime", "team:spaces", "team:tag-manager", "team:zero"];
8
+ export type FeatureOwnerId = (typeof FEATURE_OWNER_IDS)[number];
9
+ export type FeatureRegistryEntry<K extends string = string, DependencyKey extends string = K> = {
10
+ readonly cohort: "launch";
11
+ readonly key: K;
12
+ readonly name: string;
13
+ readonly description: string;
14
+ readonly stage: FeatureStage;
15
+ readonly surface: boolean;
16
+ readonly defaultEnabled: boolean;
17
+ readonly assignmentScopes: readonly FeatureAssignmentScope[];
18
+ readonly docs: {
19
+ readonly channel: "public" | "handbook";
20
+ readonly slug: string;
21
+ readonly feedbackUrl: string | null;
22
+ } | null;
23
+ readonly owner: FeatureOwnerId;
24
+ readonly requires: readonly DependencyKey[];
25
+ readonly lifecycleAdoptedAt: string;
26
+ readonly reviewAfter: string | null;
27
+ readonly removeAfter: string | null;
28
+ readonly gaAt: string | null;
29
+ readonly allowedActorPolicies: readonly FeatureExecutionActorPolicy[];
30
+ readonly downRamp: {
31
+ readonly code: string;
32
+ readonly summary: string;
33
+ };
34
+ };
35
+ export declare function freezeFeatureRegistryEntry<K extends string, DependencyKey extends string>(definition: FeatureRegistryEntry<K, DependencyKey>): FeatureRegistryEntry<K, DependencyKey>;
36
+ export declare function validateFeatureLifecycleRegistry(registry: readonly FeatureRegistryEntry[]): readonly string[];
@@ -0,0 +1,220 @@
1
+ export const FEATURE_STAGES = ["internal", "private_beta", "ga"];
2
+ export const FEATURE_ASSIGNMENT_SCOPES = ["user", "team", "global"];
3
+ export const FEATURE_EXECUTION_ACTOR_POLICIES = [
4
+ "request_actor",
5
+ "persisted_request_actor",
6
+ "resource_team",
7
+ "global_policy",
8
+ ];
9
+ export const FEATURE_OWNER_IDS = [
10
+ "team:access",
11
+ "team:build-platform",
12
+ "team:collaboration",
13
+ "team:commerce",
14
+ "team:domains",
15
+ "team:publishing",
16
+ "team:runtime",
17
+ "team:spaces",
18
+ "team:tag-manager",
19
+ "team:zero",
20
+ ];
21
+ export function freezeFeatureRegistryEntry(definition) {
22
+ return Object.freeze({
23
+ ...definition,
24
+ assignmentScopes: Object.freeze([...definition.assignmentScopes]),
25
+ docs: definition.docs === null ? null : Object.freeze({ ...definition.docs }),
26
+ requires: Object.freeze([...definition.requires]),
27
+ allowedActorPolicies: Object.freeze([...definition.allowedActorPolicies]),
28
+ downRamp: Object.freeze({ ...definition.downRamp }),
29
+ });
30
+ }
31
+ function isStrictLifecycleDate(value) {
32
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(value))
33
+ return false;
34
+ const date = new Date(`${value}T00:00:00.000Z`);
35
+ return !Number.isNaN(date.getTime()) && date.toISOString().slice(0, 10) === value;
36
+ }
37
+ function hasCanonicalDocsSlug(channel, slug) {
38
+ const prefix = channel === "public" ? "/docs/" : "/features/";
39
+ return (slug.startsWith(prefix) &&
40
+ slug
41
+ .slice(prefix.length)
42
+ .split("/")
43
+ .every((segment) => /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(segment)));
44
+ }
45
+ function hasRequiredMetadata(value) {
46
+ const normalized = value.trim();
47
+ return normalized.length > 0 && normalized.toUpperCase() !== "TBD";
48
+ }
49
+ function duplicateValues(values) {
50
+ const seen = new Set();
51
+ const duplicates = new Set();
52
+ for (const value of values) {
53
+ if (seen.has(value))
54
+ duplicates.add(value);
55
+ seen.add(value);
56
+ }
57
+ return [...duplicates].toSorted();
58
+ }
59
+ function isValidUrl(value) {
60
+ try {
61
+ const url = new URL(value);
62
+ return url.protocol === "https:" || url.protocol === "http:";
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ }
68
+ export function validateFeatureLifecycleRegistry(registry) {
69
+ const errors = [];
70
+ const keys = new Set(registry.map(({ key }) => key));
71
+ const downRampCodes = new Set(registry.map(({ downRamp }) => downRamp.code));
72
+ if (keys.size !== registry.length)
73
+ errors.push("registry: duplicate feature key");
74
+ if (downRampCodes.size !== registry.length)
75
+ errors.push("registry: duplicate down-ramp code");
76
+ const byKey = new Map(registry.map((definition) => [definition.key, definition]));
77
+ for (const [index, definition] of registry.entries()) {
78
+ const lifecycleAdoptedAtValid = isStrictLifecycleDate(definition.lifecycleAdoptedAt);
79
+ const reviewAfterValid = definition.reviewAfter === null || isStrictLifecycleDate(definition.reviewAfter);
80
+ const removeAfterValid = definition.removeAfter === null || isStrictLifecycleDate(definition.removeAfter);
81
+ const gaAtValid = definition.gaAt === null || isStrictLifecycleDate(definition.gaAt);
82
+ if (!lifecycleAdoptedAtValid)
83
+ errors.push(`${definition.key}: lifecycleAdoptedAt must be a real YYYY-MM-DD date`);
84
+ if (!reviewAfterValid)
85
+ errors.push(`${definition.key}: reviewAfter must be a real YYYY-MM-DD date`);
86
+ if (!removeAfterValid)
87
+ errors.push(`${definition.key}: removeAfter must be a real YYYY-MM-DD date`);
88
+ if (!gaAtValid)
89
+ errors.push(`${definition.key}: gaAt must be a real YYYY-MM-DD date`);
90
+ if (!hasRequiredMetadata(definition.name))
91
+ errors.push(`${definition.key}: name must not be blank or TBD`);
92
+ if (!hasRequiredMetadata(definition.description))
93
+ errors.push(`${definition.key}: description must not be blank or TBD`);
94
+ if (!hasRequiredMetadata(definition.owner))
95
+ errors.push(`${definition.key}: owner must not be blank or TBD`);
96
+ if (!hasRequiredMetadata(definition.downRamp.code))
97
+ errors.push(`${definition.key}: downRamp.code must not be blank or TBD`);
98
+ if (!hasRequiredMetadata(definition.downRamp.summary))
99
+ errors.push(`${definition.key}: downRamp.summary must not be blank or TBD`);
100
+ if (!hasRequiredMetadata(definition.key))
101
+ errors.push(`registry[${index}]: feature key must not be blank or TBD`);
102
+ else if (!/^[a-z][a-z0-9]*(?:[._][a-z][a-z0-9]*)*$/.test(definition.key))
103
+ errors.push(`${definition.key}: feature key must use canonical lowercase segments`);
104
+ if (hasRequiredMetadata(definition.downRamp.code) &&
105
+ !/^[a-z][a-z0-9]*(?:_[a-z][a-z0-9]*)*$/.test(definition.downRamp.code))
106
+ errors.push(`${definition.key}: downRamp.code must use canonical snake_case`);
107
+ if (definition.assignmentScopes.length === 0 || !definition.assignmentScopes.includes("global"))
108
+ errors.push(`${definition.key}: assignmentScopes must include global`);
109
+ if (definition.allowedActorPolicies.length === 0)
110
+ errors.push(`${definition.key}: allowedActorPolicies must not be empty`);
111
+ for (const [field, values] of [
112
+ ["assignmentScopes", definition.assignmentScopes],
113
+ ["allowedActorPolicies", definition.allowedActorPolicies],
114
+ ["requires", definition.requires],
115
+ ]) {
116
+ for (const duplicate of duplicateValues(values))
117
+ errors.push(`${definition.key}: ${field} contains duplicate ${duplicate}`);
118
+ }
119
+ if (definition.allowedActorPolicies.includes("global_policy") &&
120
+ (definition.assignmentScopes.length !== 1 || definition.assignmentScopes[0] !== "global"))
121
+ errors.push(`${definition.key}: global policy requires exactly global assignment scope`);
122
+ if (definition.stage !== "ga" && definition.surface && definition.defaultEnabled)
123
+ errors.push(`${definition.key}: non-GA features default off`);
124
+ if (definition.stage === "ga" && definition.surface && !definition.defaultEnabled)
125
+ errors.push(`${definition.key}: GA surface features default on`);
126
+ if (!definition.surface && definition.docs !== null)
127
+ errors.push(`${definition.key}: non-surface features must not have docs`);
128
+ if (definition.docs !== null &&
129
+ !hasCanonicalDocsSlug(definition.docs.channel, definition.docs.slug))
130
+ errors.push(`${definition.key}: docs slug must be a canonical ${definition.docs.channel} path`);
131
+ if (definition.docs !== null &&
132
+ definition.docs.feedbackUrl !== null &&
133
+ !isValidUrl(definition.docs.feedbackUrl))
134
+ errors.push(`${definition.key}: docs feedbackUrl must be a valid URL`);
135
+ if (definition.stage === "internal" && definition.docs?.channel === "public")
136
+ errors.push(`${definition.key}: internal features must not have public docs`);
137
+ if (definition.stage === "private_beta" && definition.docs?.channel !== "public")
138
+ errors.push(`${definition.key}: private beta requires public docs`);
139
+ if (definition.stage === "ga" && definition.surface && definition.docs?.channel !== "public")
140
+ errors.push(`${definition.key}: GA surface features require public docs`);
141
+ if (definition.stage !== "ga" && definition.surface && definition.reviewAfter === null)
142
+ errors.push(`${definition.key}: non-GA surface features require reviewAfter`);
143
+ if (definition.surface && definition.removeAfter === null)
144
+ errors.push(`${definition.key}: surface features require removeAfter`);
145
+ if (lifecycleAdoptedAtValid &&
146
+ reviewAfterValid &&
147
+ definition.reviewAfter !== null &&
148
+ definition.lifecycleAdoptedAt > definition.reviewAfter)
149
+ errors.push(`${definition.key}: lifecycleAdoptedAt must not follow reviewAfter`);
150
+ if (reviewAfterValid &&
151
+ removeAfterValid &&
152
+ definition.reviewAfter !== null &&
153
+ definition.removeAfter !== null &&
154
+ definition.reviewAfter > definition.removeAfter)
155
+ errors.push(`${definition.key}: reviewAfter must not follow removeAfter`);
156
+ if (lifecycleAdoptedAtValid &&
157
+ removeAfterValid &&
158
+ definition.removeAfter !== null &&
159
+ definition.lifecycleAdoptedAt > definition.removeAfter)
160
+ errors.push(`${definition.key}: lifecycleAdoptedAt must not follow removeAfter`);
161
+ if (definition.gaAt !== null && definition.stage !== "ga")
162
+ errors.push(`${definition.key}: only GA features may set gaAt`);
163
+ if (definition.stage === "ga" && definition.gaAt === null)
164
+ errors.push(`${definition.key}: GA features require gaAt`);
165
+ if (lifecycleAdoptedAtValid &&
166
+ gaAtValid &&
167
+ definition.gaAt !== null &&
168
+ definition.gaAt < definition.lifecycleAdoptedAt)
169
+ errors.push(`${definition.key}: gaAt must not precede lifecycleAdoptedAt`);
170
+ if (gaAtValid &&
171
+ removeAfterValid &&
172
+ definition.gaAt !== null &&
173
+ definition.removeAfter !== null &&
174
+ definition.gaAt > definition.removeAfter)
175
+ errors.push(`${definition.key}: gaAt must not follow removeAfter`);
176
+ if (definition.assignmentScopes.includes("user") &&
177
+ !definition.allowedActorPolicies.some((policy) => policy === "request_actor" || policy === "persisted_request_actor"))
178
+ errors.push(`${definition.key}: user scope requires an actor-aware policy`);
179
+ for (const dependency of definition.requires) {
180
+ const dependencyDefinition = byKey.get(dependency);
181
+ if (!dependencyDefinition) {
182
+ errors.push(`${definition.key}: unknown dependency ${dependency}`);
183
+ continue;
184
+ }
185
+ if (definition.allowedActorPolicies.some((policy) => !dependencyDefinition.allowedActorPolicies.includes(policy)))
186
+ errors.push(`${definition.key}: actor policies must be allowed by dependency ${dependency}`);
187
+ if (definition.assignmentScopes.some((scope) => !dependencyDefinition.assignmentScopes.includes(scope)))
188
+ errors.push(`${definition.key}: assignment scopes must be supported by dependency ${dependency}`);
189
+ if (FEATURE_STAGES.indexOf(dependencyDefinition.stage) <
190
+ FEATURE_STAGES.indexOf(definition.stage))
191
+ errors.push(`${definition.key}: dependency ${dependency} must be at least as mature as its dependent`);
192
+ if (definition.defaultEnabled && !dependencyDefinition.defaultEnabled)
193
+ errors.push(`${definition.key}: default-enabled feature requires default-enabled dependency ${dependency}`);
194
+ if (removeAfterValid &&
195
+ dependencyDefinition.removeAfter !== null &&
196
+ isStrictLifecycleDate(dependencyDefinition.removeAfter) &&
197
+ (definition.removeAfter === null ||
198
+ dependencyDefinition.removeAfter < definition.removeAfter))
199
+ errors.push(`${definition.key}: dependency ${dependency} retires before its dependent`);
200
+ }
201
+ }
202
+ const visiting = new Set();
203
+ const visited = new Set();
204
+ const visit = (key) => {
205
+ if (visiting.has(key)) {
206
+ errors.push(`${key}: dependency cycle`);
207
+ return;
208
+ }
209
+ if (visited.has(key))
210
+ return;
211
+ visiting.add(key);
212
+ for (const dependency of byKey.get(key)?.requires ?? [])
213
+ visit(dependency);
214
+ visiting.delete(key);
215
+ visited.add(key);
216
+ };
217
+ for (const key of keys)
218
+ visit(key);
219
+ return errors;
220
+ }
@@ -0,0 +1,7 @@
1
+ import type { FeatureRegistryEntry } from "./feature-lifecycle-core.js";
2
+ import { launchEntries as compiledLaunchEntries } from "./generated-feature-launch-entries.js";
3
+ export { FEATURE_ASSIGNMENT_SCOPES, FEATURE_EXECUTION_ACTOR_POLICIES, FEATURE_OWNER_IDS, FEATURE_STAGES, freezeFeatureRegistryEntry, validateFeatureLifecycleRegistry, } from "./feature-lifecycle-core.js";
4
+ export type { FeatureAssignmentScope, FeatureExecutionActorPolicy, FeatureOwnerId, FeatureRegistryEntry, FeatureStage, } from "./feature-lifecycle-core.js";
5
+ export type LifecycleFeatureKey = (typeof compiledLaunchEntries)[number]["key"];
6
+ export declare const FEATURE_LIFECYCLE_REGISTRY: readonly FeatureRegistryEntry<LifecycleFeatureKey>[];
7
+ export declare const FEATURE_LIFECYCLE_BY_KEY: ReadonlyMap<LifecycleFeatureKey, FeatureRegistryEntry<LifecycleFeatureKey>>;
@@ -0,0 +1,31 @@
1
+ import { launchEntries as compiledLaunchEntries } from "./generated-feature-launch-entries.js";
2
+ export { FEATURE_ASSIGNMENT_SCOPES, FEATURE_EXECUTION_ACTOR_POLICIES, FEATURE_OWNER_IDS, FEATURE_STAGES, freezeFeatureRegistryEntry, validateFeatureLifecycleRegistry, } from "./feature-lifecycle-core.js";
3
+ export const FEATURE_LIFECYCLE_REGISTRY = compiledLaunchEntries;
4
+ const featureLifecycleByKey = new Map(FEATURE_LIFECYCLE_REGISTRY.map((definition) => [definition.key, definition]));
5
+ export const FEATURE_LIFECYCLE_BY_KEY = Object.freeze({
6
+ get size() {
7
+ return featureLifecycleByKey.size;
8
+ },
9
+ get(key) {
10
+ return featureLifecycleByKey.get(key);
11
+ },
12
+ has(key) {
13
+ return featureLifecycleByKey.has(key);
14
+ },
15
+ entries() {
16
+ return featureLifecycleByKey.entries();
17
+ },
18
+ keys() {
19
+ return featureLifecycleByKey.keys();
20
+ },
21
+ values() {
22
+ return featureLifecycleByKey.values();
23
+ },
24
+ forEach(callback, thisArg) {
25
+ for (const [key, value] of featureLifecycleByKey)
26
+ callback.call(thisArg, value, key, this);
27
+ },
28
+ [Symbol.iterator]() {
29
+ return featureLifecycleByKey[Symbol.iterator]();
30
+ },
31
+ });
@@ -0,0 +1,2 @@
1
+ export declare const launchEntries: readonly import("./feature-lifecycle-core.js").FeatureRegistryEntry<"zero" | "plans.paid.available" | "anonymous.publishing" | "domains.registration" | "domains.dns_management" | "domains.wpcom_dns" | "domains.domain_connect" | "domains.proxy_bindings" | "annotations.preview_loader" | "annotations.comments" | "annotations.notices" | "annotations.published_comments" | "sites.dedicated_runtime" | "tags" | "access.invites" | "access.sso_connections" | "access.byo_issuers" | "domains.catalog" | "build.content_pipeline" | "spaces.slug_rename", "annotations.comments" | "sites.dedicated_runtime">[];
2
+ export declare const registryHash = "sha256:bb171bdc1b4815eae685a2c97c5ab5042faf5b1fa0a99ad9ac4406d14210381d";