@pulse-compute/provider-fastly 0.0.0 → 1.0.0-beta.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 (63) hide show
  1. package/README.md +52 -1
  2. package/dist/config-schema.json +73 -0
  3. package/dist/index.d.ts +61 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +59 -0
  6. package/dist/index.js.map +1 -0
  7. package/package.json +87 -5
  8. package/src/build/canonical-target.js +436 -0
  9. package/src/build/entities-native.js +564 -0
  10. package/src/build/fixed-memory-runtime.as.ts +148 -0
  11. package/src/build/native-http-effects.js +871 -0
  12. package/src/build/native-http-shell.js +703 -0
  13. package/src/build/native-platform-capabilities.js +2109 -0
  14. package/src/compiler/assets-package-out-parity-proof.js +338 -0
  15. package/src/compiler/assets-provider-proof.js +499 -0
  16. package/src/compiler/config-provider-resolution.js +573 -0
  17. package/src/compiler/fastly-adapter.js +564 -0
  18. package/src/compiler/fastly-command-entry.js +390 -0
  19. package/src/compiler/fastly-config-secret-serve.js +323 -0
  20. package/src/compiler/fastly-hostcall-binding.js +598 -0
  21. package/src/compiler/fastly-readiness.js +477 -0
  22. package/src/compiler/index.js +40 -0
  23. package/src/compiler/lifecycle-parity-contract.js +70 -0
  24. package/src/compiler/lifecycle-parity-proof.js +260 -0
  25. package/src/compiler/route-handler-effect-proof.js +255 -0
  26. package/src/compiler/runtime-provider-kv.js +237 -0
  27. package/src/compiler/runtime-provider-shape.js +109 -0
  28. package/src/config-api.js +63 -0
  29. package/src/config-schema.d.ts +13 -0
  30. package/src/config-schema.js +27 -0
  31. package/src/config-schema.json +73 -0
  32. package/src/index.js +3 -0
  33. package/src/index.ts +118 -0
  34. package/src/javascript/assets-adapter.js +122 -0
  35. package/src/javascript/bindings-adapter.js +237 -0
  36. package/src/javascript/errors.js +26 -0
  37. package/src/javascript/fetch-adapter.js +93 -0
  38. package/src/javascript/grip-broadcast.js +261 -0
  39. package/src/javascript/jwt-verifier.js +137 -0
  40. package/src/javascript/lifecycle.js +55 -0
  41. package/src/javascript/local-loader.js +138 -0
  42. package/src/javascript/logging.js +26 -0
  43. package/src/javascript/package-effects.js +68 -0
  44. package/src/javascript/runtime-host.js +108 -0
  45. package/src/javascript/sha256.js +128 -0
  46. package/src/javascript/source-package.js +776 -0
  47. package/src/javascript/support.js +142 -0
  48. package/src/javascript/target-support-policy.js +260 -0
  49. package/src/javascript/target.js +73 -0
  50. package/src/javascript/test-runtime.js +407 -0
  51. package/src/provider-contract.js +72 -0
  52. package/src/runtime/assets-provider.js +464 -0
  53. package/src/runtime/canonical-api-runtime.js +597 -0
  54. package/src/runtime/index.js +28 -0
  55. package/src/runtime/provider-primitives-contract.js +272 -0
  56. package/src/runtime/provider-primitives.js +82 -0
  57. package/src/runtime/route-handler-effects.js +507 -0
  58. package/src/testing/fastly-cli.js +538 -0
  59. package/src/testing/native-http-effects-host.js +390 -0
  60. package/src/testing/native-http-shell-host.js +190 -0
  61. package/src/testing/native-platform-capabilities-host.js +599 -0
  62. package/src/toolchain/config.js +128 -0
  63. package/src/toolchain/index.js +343 -0
@@ -0,0 +1,338 @@
1
+ 'use strict';
2
+
3
+ function loadAssetsContracts() {
4
+ try {
5
+ return require('@pulse-compute/wasm-contracts/assets/contracts');
6
+ } catch (error) {
7
+ if (error && error.code === 'MODULE_NOT_FOUND' && String(error.message).includes('@pulse-compute/wasm-contracts')) {
8
+ return require('../../../../wasm/packages/contracts/src/assets/contracts.js');
9
+ }
10
+ throw error;
11
+ }
12
+ }
13
+
14
+ function loadDiagnostics() {
15
+ try {
16
+ return require('@pulse-compute/wasm-contracts/diagnostics');
17
+ } catch (error) {
18
+ if (error && error.code === 'MODULE_NOT_FOUND' && String(error.message).includes('@pulse-compute/wasm-contracts')) {
19
+ return require('../../../../wasm/packages/contracts/src/diagnostics.js');
20
+ }
21
+ throw error;
22
+ }
23
+ }
24
+
25
+ const assetsContracts = loadAssetsContracts();
26
+ const { PACKAGE_VERSION, normalizeArtifact, normalizeDiagnostic } = loadDiagnostics();
27
+ const { buildFastlyAssetsProviderProof } = require('./assets-provider-proof.js');
28
+ const { buildFastlyAssetsProviderConfig } = require('../runtime/assets-provider.js');
29
+
30
+ const phaseName = 'fastly-assets-package-out-parity-proof';
31
+
32
+ function clone(value) {
33
+ if (Array.isArray(value)) return value.map(clone);
34
+ if (value && typeof value === 'object') return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, clone(entry)]));
35
+ return value;
36
+ }
37
+
38
+ function normalize(input) {
39
+ return input && input.artifact && typeof input.artifact === 'object' ? input.artifact : input;
40
+ }
41
+
42
+ function makeDiagnostic(code, message, severity = 'error', details) {
43
+ return normalizeDiagnostic({
44
+ phase: phaseName,
45
+ severity,
46
+ code,
47
+ message,
48
+ hint: details && details.hint,
49
+ details,
50
+ loc: { file: '<fastly-assets-package-out-parity-proof>' }
51
+ });
52
+ }
53
+
54
+ function check(name, passed, details, failures, diagnostics) {
55
+ const entry = { name, status: passed ? 'ok' : 'error', details: details || {} };
56
+ if (!passed) {
57
+ failures.push(entry);
58
+ diagnostics.push(makeDiagnostic(
59
+ assetsContracts.ASSETS_DIAGNOSTIC_CODES.FASTLY_PACKAGE_OUT_PARITY_SMOKE_FAILED,
60
+ `Fastly assets package-out parity check failed: ${name}.`,
61
+ 'error',
62
+ { check: name, details: entry.details }
63
+ ));
64
+ }
65
+ return entry;
66
+ }
67
+
68
+ function checkByName(proof, needle) {
69
+ const checks = proof && proof.smoke && Array.isArray(proof.smoke.checks) ? proof.smoke.checks : [];
70
+ return checks.some((entry) => entry && String(entry.name || '').includes(needle) && entry.status === 'ok');
71
+ }
72
+
73
+ function summaryFlag(proof, name) {
74
+ return Boolean(proof && proof.summary && proof.summary[name] === true);
75
+ }
76
+
77
+ function packageOutDiscovered(packageOutProof) {
78
+ return Boolean(packageOutProof && (
79
+ packageOutProof.discoveredFromNodeModules === true ||
80
+ (packageOutProof.discovery && packageOutProof.discovery.discoveredFromNodeModules === true) ||
81
+ (packageOutProof.summary && packageOutProof.summary.discoveredFromNodeModules === true)
82
+ ));
83
+ }
84
+
85
+ function builderLoadedFromPackageOut(packageOutProof) {
86
+ const compilerBuilder = packageOutProof && packageOutProof.discovery && packageOutProof.discovery.compilerBuilder;
87
+ return Boolean(compilerBuilder &&
88
+ compilerBuilder.builderOwner === '@pulse-compute/assets' &&
89
+ String(compilerBuilder.entry || '').includes('node_modules/@pulse-compute/assets/pulsewasm.compiler.cjs'));
90
+ }
91
+
92
+ function packageOwnedLowerer(plan) {
93
+ const policy = plan && plan.policy || {};
94
+ return Boolean(plan &&
95
+ plan.npmPackage === '@pulse-compute/assets' &&
96
+ plan.lowerableSubpath === '@pulse-compute/assets' &&
97
+ policy.builderOwner === '@pulse-compute/assets' &&
98
+ policy.compilerOwnsPackageMapping === false);
99
+ }
100
+
101
+ function providerProofOrBuild(options, plan, diagnostics) {
102
+ const provided = normalize(options.fastlyAssetsProviderProof || options.providerProof);
103
+ if (provided) return { artifact: provided, diagnostics: [] };
104
+ if (!plan) return undefined;
105
+ const proof = buildFastlyAssetsProviderProof({
106
+ cwd: options.cwd,
107
+ generatedBy: options.generatedBy || PACKAGE_VERSION,
108
+ assetsLoweringPlan: plan,
109
+ resolvedConfig: options.resolvedConfig,
110
+ fastlyHostcallBinding: options.fastlyHostcallBinding,
111
+ fastlyAdapter: options.fastlyAdapter,
112
+ requestResultHeaders: options.requestResultHeaders,
113
+ streamingPassthrough: options.streamingPassthrough,
114
+ wasmHostAbi: options.wasmHostAbi
115
+ });
116
+ diagnostics.push(...(proof.diagnostics || []));
117
+ return proof;
118
+ }
119
+
120
+ function buildFastlyAssetsPackageOutParityProof(options = {}) {
121
+ const cwd = options.cwd || process.cwd();
122
+ const generatedBy = options.generatedBy || PACKAGE_VERSION;
123
+ const plan = normalize(options.assetsLoweringPlan || options.plan);
124
+ const sidecarPlan = normalize(options.assetsCompiledWasmSidecarPlan || options.sidecarPlan);
125
+ const packageOutProof = normalize(options.assetsPackageOutDiscoveryProof || options.packageOutDiscoveryProof || options.packageOutProof);
126
+ const nodeCompiledProof = normalize(options.nodeCompiledWasmAssetsLifecycleProof || options.nodeProof);
127
+ const diagnostics = [];
128
+ const failures = [];
129
+ const checks = [];
130
+
131
+ if (!plan) {
132
+ diagnostics.push(makeDiagnostic(
133
+ assetsContracts.ASSETS_DIAGNOSTIC_CODES.FASTLY_PACKAGE_OUT_PARITY_PLAN_REQUIRED,
134
+ 'Fastly assets package-out parity proof requires assets-lowering-plan.json.',
135
+ 'error',
136
+ { sourceArtifact: assetsContracts.ASSETS_LOWERING_PLAN_VERSION }
137
+ ));
138
+ }
139
+ if (!sidecarPlan) {
140
+ diagnostics.push(makeDiagnostic(
141
+ assetsContracts.ASSETS_DIAGNOSTIC_CODES.SIDECAR_FILE_MISSING,
142
+ 'Fastly assets package-out parity proof requires assets-compiled-wasm-sidecar-plan.json so compiled-Wasm readiness can be classified honestly.',
143
+ 'error',
144
+ { sourceArtifact: assetsContracts.ASSETS_COMPILED_WASM_SIDECAR_PLAN_ARTIFACT }
145
+ ));
146
+ }
147
+ const sidecarPackageOut = sidecarPlan && sidecarPlan.packageOut ? sidecarPlan.packageOut : undefined;
148
+ if (!packageOutProof && !(sidecarPackageOut && sidecarPackageOut.discoveredFromNodeModules === true && sidecarPackageOut.builderLoadedFromNodeModules === true)) {
149
+ diagnostics.push(makeDiagnostic(
150
+ assetsContracts.ASSETS_DIAGNOSTIC_CODES.FASTLY_PACKAGE_OUT_PARITY_PLAN_REQUIRED,
151
+ 'Fastly assets package-out parity proof requires assets-package-out-discovery-proof.json or sidecar package-out evidence to prove packaged @pulse-compute/assets discovery.',
152
+ 'error',
153
+ { sourceArtifact: assetsContracts.ASSETS_PACKAGE_OUT_DISCOVERY_PROOF_ARTIFACT }
154
+ ));
155
+ }
156
+
157
+ const fastlyProviderProof = providerProofOrBuild(options, plan, diagnostics);
158
+ const providerProofArtifact = fastlyProviderProof && normalize(fastlyProviderProof);
159
+ const providerConfig = options.providerConfig || (providerProofArtifact && providerProofArtifact.providerConfig) || buildFastlyAssetsProviderConfig({ plan, resolvedConfig: options.resolvedConfig });
160
+
161
+ const packageOwnedLoweringConsumed = packageOwnedLowerer(plan);
162
+ const discoveredFromPackagedAssets = packageOutDiscovered(packageOutProof) || Boolean(sidecarPackageOut && sidecarPackageOut.discoveredFromNodeModules === true);
163
+ const packageBuilderLoaded = builderLoadedFromPackageOut(packageOutProof) || Boolean(sidecarPackageOut && sidecarPackageOut.builderLoadedFromNodeModules === true);
164
+ const symbolicStoreConfigValidated = Boolean(providerConfig && providerConfig.provider === 'fastly' && providerConfig.symbolicRefsOnly === true && Array.isArray(providerConfig.stores) && providerConfig.stores.length > 0 && providerConfig.stores.every((store) => String(store.endpointRef || '').startsWith('$config:') && String(store.bucketRef || '').startsWith('$config:') && String(store.keyRef || '').startsWith('$secret:')));
165
+ const getMappingValidated = summaryFlag(providerProofArtifact, 'getTextValidated');
166
+ const headMappingValidated = summaryFlag(providerProofArtifact, 'headValidated');
167
+ const headersValidated = checkByName(providerProofArtifact, 'headers/status pass through') || Boolean(providerProofArtifact && providerProofArtifact.payloadModes && providerProofArtifact.payloadModes.headerPassThrough && providerProofArtifact.payloadModes.headerPassThrough.status === 'implemented-now');
168
+ const cacheControlValidated = checkByName(providerProofArtifact, 'cache-control policy is preserved');
169
+ const notFoundPolicyValidated = summaryFlag(providerProofArtifact, 'notFoundValidated');
170
+ const binaryBodyReserved = summaryFlag(providerProofArtifact, 'binaryReservedValidated') || Boolean(providerProofArtifact && providerProofArtifact.payloadModes && providerProofArtifact.payloadModes.binaryBodyBufferResponse && providerProofArtifact.payloadModes.binaryBodyBufferResponse.status === 'reserved-with-diagnostic');
171
+ const streamProviderProofImplemented = Boolean(providerProofArtifact && providerProofArtifact.payloadModes && providerProofArtifact.payloadModes.streamPassThroughResponse && providerProofArtifact.payloadModes.streamPassThroughResponse.status === 'implemented-fastly-proof');
172
+ const terminalSidecarPlanned = Boolean(sidecarPlan && sidecarPlan.summary && sidecarPlan.summary.terminalAssetResponseEffectPlanned === true);
173
+ const sidecarPackaged = Boolean((sidecarPlan && sidecarPlan.summary && sidecarPlan.summary.packageOutSidecarValidated === true) || (sidecarPackageOut && sidecarPackageOut.discoveredFromNodeModules === true && sidecarPackageOut.sidecarFile));
174
+ const nodeCompiledReferenceImplemented = Boolean(nodeCompiledProof && nodeCompiledProof.compiledWasmLowering === true && nodeCompiledProof.compiledWasmRuntimeBehaviorImplemented === true);
175
+
176
+ checks.push(check('package_owned_lowering_consumed', packageOwnedLoweringConsumed, { package: plan && plan.npmPackage, lowerableSubpath: plan && plan.lowerableSubpath, policy: plan && plan.policy }, failures, diagnostics));
177
+ checks.push(check('packaged_assets_discovered_from_node_modules', discoveredFromPackagedAssets && packageBuilderLoaded, { discoveredFromNodeModules: discoveredFromPackagedAssets, packageBuilderLoaded, compilerBuilder: packageOutProof && packageOutProof.discovery && packageOutProof.discovery.compilerBuilder }, failures, diagnostics));
178
+ checks.push(check('symbolic_fastly_store_config_validated', symbolicStoreConfigValidated, { providerConfig }, failures, diagnostics));
179
+ checks.push(check('get_mapping_validated', getMappingValidated, { summary: providerProofArtifact && providerProofArtifact.summary }, failures, diagnostics));
180
+ checks.push(check('head_mapping_validated', headMappingValidated, { summary: providerProofArtifact && providerProofArtifact.summary }, failures, diagnostics));
181
+ checks.push(check('headers_validated', headersValidated, { headerPassThrough: providerProofArtifact && providerProofArtifact.payloadModes && providerProofArtifact.payloadModes.headerPassThrough }, failures, diagnostics));
182
+ checks.push(check('cache_control_validated', cacheControlValidated, { checks: providerProofArtifact && providerProofArtifact.smoke && providerProofArtifact.smoke.checks }, failures, diagnostics));
183
+ checks.push(check('not_found_policy_validated', notFoundPolicyValidated, { summary: providerProofArtifact && providerProofArtifact.summary }, failures, diagnostics));
184
+ checks.push(check('sidecar_readiness_classified', terminalSidecarPlanned && sidecarPackaged, { terminalAssetResponseEffectPlanned: terminalSidecarPlanned, packageOutSidecarValidated: sidecarPackaged, summary: sidecarPlan && sidecarPlan.summary }, failures, diagnostics));
185
+ checks.push(check('binary_body_reserved', binaryBodyReserved, { binaryBodyBufferResponse: providerProofArtifact && providerProofArtifact.payloadModes && providerProofArtifact.payloadModes.binaryBodyBufferResponse }, failures, diagnostics));
186
+ checks.push(check('no_external_fastly_service_required', Boolean(providerProofArtifact && providerProofArtifact.scope && providerProofArtifact.scope.configSecretRefs === 'symbolic-only') && providerProofArtifact.proofMode === 'direct-fastly-provider-smoke-connected-to-lowering-plan', { proofMode: providerProofArtifact && providerProofArtifact.proofMode, scope: providerProofArtifact && providerProofArtifact.scope }, failures, diagnostics));
187
+
188
+ diagnostics.push(makeDiagnostic(
189
+ assetsContracts.ASSETS_DIAGNOSTIC_CODES.FASTLY_ASSETS_COMPILED_WASM_PLAN_ONLY,
190
+ 'Fastly compiled-Wasm assets terminal response execution is explicitly plan-only until a provider-owned compiled-Wasm Fastly bridge is wired.',
191
+ 'warning',
192
+ { compiledWasmAssetsReadiness: 'plan-only', nodeReferenceCompiledLifecycleImplemented: nodeCompiledReferenceImplemented }
193
+ ));
194
+
195
+ const errorDiagnostics = diagnostics.filter((entry) => (entry.severity || 'error') === 'error');
196
+ const artifact = normalizeArtifact({
197
+ version: assetsContracts.ASSETS_FASTLY_PACKAGE_OUT_PARITY_PROOF_VERSION,
198
+ generatedBy,
199
+ phase: '50',
200
+ artifact: assetsContracts.ASSETS_FASTLY_PACKAGE_OUT_PARITY_PROOF_ARTIFACT,
201
+ contractId: assetsContracts.ASSETS_CONTRACT_ID,
202
+ status: errorDiagnostics.length === 0 ? 'ok' : 'error',
203
+ provider: 'fastly',
204
+ providerPackage: '@pulse-compute/provider-fastly',
205
+ package: '@pulse-compute/assets',
206
+ lowerableSubpath: plan && plan.lowerableSubpath || '@pulse-compute/assets',
207
+ sourceAssetsLoweringPlanVersion: plan && plan.version,
208
+ sourceAssetsCompiledWasmSidecarPlanVersion: sidecarPlan && sidecarPlan.version,
209
+ sourcePackageOutDiscoveryProofVersion: packageOutProof && packageOutProof.version,
210
+ sourceFastlyAssetsProviderProofVersion: providerProofArtifact && providerProofArtifact.version,
211
+ sourceNodeCompiledWasmAssetsLifecycleProofVersion: nodeCompiledProof && nodeCompiledProof.version,
212
+ packageOwnedLoweringConsumed,
213
+ discoveredFromPackagedAssets,
214
+ symbolicStoreConfigValidated,
215
+ getMappingValidated,
216
+ headMappingValidated,
217
+ headersValidated,
218
+ cacheControlValidated,
219
+ notFoundPolicyValidated,
220
+ compiledWasmAssetsReadiness: 'plan-only',
221
+ compiledWasmPlanOnlyDiagnostic: assetsContracts.ASSETS_DIAGNOSTIC_CODES.FASTLY_ASSETS_COMPILED_WASM_PLAN_ONLY,
222
+ binaryBodyReserved,
223
+ streamBodyReadiness: streamProviderProofImplemented ? 'provider-proof-implemented-compiled-wasm-plan-only' : 'plan-only',
224
+ noExternalFastlyServiceRequired: true,
225
+ actualNetworkFetch: false,
226
+ policy: {
227
+ compilerOrchestratesOnly: true,
228
+ packageOwnsLoweringSurface: true,
229
+ packageOwnedLowererConsumed: packageOwnedLoweringConsumed,
230
+ providerOwnsFastlyBehavior: true,
231
+ noExternalFastlyServiceRequired: true,
232
+ packageOutFixtureRequired: true,
233
+ monorepoAssetsSourcePathRequired: false,
234
+ compiledWasmAssetsReadiness: 'plan-only',
235
+ directProviderProofFallback: false,
236
+ symbolicStoreConfigOnly: true,
237
+ objectStoreMutationApis: false,
238
+ uploads: false,
239
+ invalidation: false,
240
+ binaryBody: false,
241
+ streamProviderProofImplemented,
242
+ streamCompiledWasmReadiness: 'plan-only'
243
+ },
244
+ packageOut: {
245
+ packagePacked: Boolean(packageOutProof && packageOutProof.checks && packageOutProof.checks.packagePacked),
246
+ discoveredFromNodeModules: discoveredFromPackagedAssets,
247
+ compilerBuilderLoadedFromNodeModules: packageBuilderLoaded,
248
+ packageTarballIncludesManifest: Boolean(packageOutProof && packageOutProof.checks && packageOutProof.checks.packageTarballIncludesManifest),
249
+ packageTarballIncludesCompilerBuilder: Boolean(packageOutProof && packageOutProof.checks && packageOutProof.checks.packageTarballIncludesCompilerBuilder),
250
+ packageTarballIncludesPulseWasmFacade: Boolean(packageOutProof && packageOutProof.checks && packageOutProof.checks.packageTarballIncludesPulseWasmFacade),
251
+ packageTarballIncludesSidecar: Boolean(packageOutProof && packageOutProof.checks && packageOutProof.checks.packageTarballIncludesSidecar),
252
+ monorepoSourcePathRequired: false,
253
+ npmRegistryRequired: false
254
+ },
255
+ fastly: {
256
+ providerConfig: clone(providerConfig),
257
+ providerProof: providerProofArtifact ? {
258
+ version: providerProofArtifact.version,
259
+ status: providerProofArtifact.status,
260
+ proofMode: providerProofArtifact.proofMode,
261
+ summary: clone(providerProofArtifact.summary),
262
+ payloadModes: clone(providerProofArtifact.payloadModes)
263
+ } : undefined,
264
+ symbolicStoreConfig: {
265
+ validated: symbolicStoreConfigValidated,
266
+ configStore: providerConfig && providerConfig.configStore,
267
+ secretStore: providerConfig && providerConfig.secretStore,
268
+ stores: providerConfig && providerConfig.stores
269
+ },
270
+ mapping: {
271
+ get: getMappingValidated,
272
+ head: headMappingValidated,
273
+ headers: headersValidated,
274
+ cacheControl: cacheControlValidated,
275
+ notFound: notFoundPolicyValidated
276
+ }
277
+ },
278
+ compiledWasm: {
279
+ sidecarDeclared: Boolean(sidecarPlan && sidecarPlan.summary && sidecarPlan.summary.sidecarDeclared),
280
+ sidecarFileExists: Boolean(sidecarPlan && sidecarPlan.summary && sidecarPlan.summary.sidecarFileExists),
281
+ sidecarSymbolsValidated: Boolean(sidecarPlan && sidecarPlan.summary && sidecarPlan.summary.sidecarSymbolsValidated),
282
+ terminalAssetResponseEffectPlanned: terminalSidecarPlanned,
283
+ nodeReferenceImplemented: nodeCompiledReferenceImplemented,
284
+ fastlyReadiness: 'plan-only',
285
+ diagnostic: assetsContracts.ASSETS_DIAGNOSTIC_CODES.FASTLY_ASSETS_COMPILED_WASM_PLAN_ONLY,
286
+ asyncAwait: false,
287
+ promises: false,
288
+ asyncify: false
289
+ },
290
+ unsupported: {
291
+ binaryBodyReserved,
292
+ streamBodyReadiness: streamProviderProofImplemented ? 'provider-proof-implemented-compiled-wasm-plan-only' : 'plan-only',
293
+ uploads: false,
294
+ mutationApis: false,
295
+ invalidation: false,
296
+ externalFastlyService: false
297
+ },
298
+ smoke: {
299
+ checks,
300
+ failedChecks: failures
301
+ },
302
+ diagnostics,
303
+ summary: {
304
+ packageOwnedLoweringConsumed,
305
+ discoveredFromPackagedAssets,
306
+ symbolicStoreConfigValidated,
307
+ getMappingValidated,
308
+ headMappingValidated,
309
+ headersValidated,
310
+ cacheControlValidated,
311
+ notFoundPolicyValidated,
312
+ compiledWasmAssetsReadiness: 'plan-only',
313
+ compiledWasmPlanOnlyDiagnostic: assetsContracts.ASSETS_DIAGNOSTIC_CODES.FASTLY_ASSETS_COMPILED_WASM_PLAN_ONLY,
314
+ binaryBodyReserved,
315
+ streamBodyReadiness: streamProviderProofImplemented ? 'provider-proof-implemented-compiled-wasm-plan-only' : 'plan-only',
316
+ noExternalFastlyServiceRequired: true,
317
+ actualNetworkFetch: false,
318
+ checks: checks.length,
319
+ failedChecks: failures.length,
320
+ diagnostics: diagnostics.length,
321
+ warnings: diagnostics.filter((entry) => (entry.severity || 'error') === 'warning').length,
322
+ errors: errorDiagnostics.length
323
+ }
324
+ }, cwd);
325
+
326
+ return {
327
+ artifact,
328
+ diagnostics,
329
+ providerProof: fastlyProviderProof,
330
+ failures,
331
+ hasErrors: errorDiagnostics.length > 0
332
+ };
333
+ }
334
+
335
+ module.exports = {
336
+ phaseName,
337
+ buildFastlyAssetsPackageOutParityProof
338
+ };