diff --git a/apps/cli/commands/site/create.ts b/apps/cli/commands/site/create.ts index ab977d7563..315142d919 100644 --- a/apps/cli/commands/site/create.ts +++ b/apps/cli/commands/site/create.ts @@ -503,7 +503,7 @@ function static_site_importer_studio_record_failure( $result, string $fallback, 'continuation' => false, 'failed' => true, 'failure' => $projection, - 'import_receipt' => $result, + 'import_receipt' => static_site_importer_studio_result_projection( $result ), ) ); throw new RuntimeException( static_site_importer_studio_failure_message( $result, $fallback ) ); @@ -633,7 +633,7 @@ $studio_result = array( 'status' => (string) ( $import_result['url_batch_run']['status'] ?? $import_result['status'] ?? 'completed' ), 'completed_routes' => (int) ( $import_result['url_batch_run']['completed_routes'] ?? count( $canonical_documents ) ), 'total_routes' => (int) ( $import_result['url_batch_run']['total_routes'] ?? count( $canonical_documents ) ), - 'import_receipt' => $result, + 'import_receipt' => static_site_importer_studio_result_projection( $result ), ); static_site_importer_studio_write_result( $studio_result ); ?>` diff --git a/apps/cli/commands/site/tests/create.test.ts b/apps/cli/commands/site/tests/create.test.ts index e0610dbc5f..e78e1b0579 100644 --- a/apps/cli/commands/site/tests/create.test.ts +++ b/apps/cli/commands/site/tests/create.test.ts @@ -821,7 +821,28 @@ describe( 'CLI: studio create', () => { "$projection['diagnostics'] = static_site_importer_studio_bounded_value( $result['diagnostics'] );" ); expect( blueprint.staticSiteImport.code ).toContain( "'failure' => $projection" ); - expect( blueprint.staticSiteImport.code ).toContain( "'import_receipt' => $result" ); + expect( blueprint.staticSiteImport.code ).toContain( + "'import_receipt' => static_site_importer_studio_result_projection( $result )" + ); + expect( blueprint.staticSiteImport.code ).not.toContain( "'import_receipt' => $result" ); + } ); + + it( 'should bound the stored import receipt so oversized importer responses cannot break the handoff', () => { + const sourceDir = fs.mkdtempSync( path.join( '/tmp', 'studio-source-test-' ) ); + fs.writeFileSync( path.join( sourceDir, 'index.html' ), '
' ); + + const blueprint = buildCreateFromSourceBlueprint( + sourceDir, + 'Imported Directory', + 'https://example.com/static-site-importer.zip' + ); + + expect( blueprint.staticSiteImport.code ).toContain( + "'import_receipt' => static_site_importer_studio_result_projection( $result )" + ); + expect( blueprint.staticSiteImport.code ).not.toContain( + "'import_receipt' => $result" + ); } ); it( 'should atomically write a bounded receipt for generic failed imports', () => { @@ -959,7 +980,7 @@ describe( 'CLI: studio create', () => { 'static_site_importer_studio_write_result( $studio_result )' ); expect( blueprint.staticSiteImport.code ).toContain( - "'import_receipt' => $result" + "'import_receipt' => static_site_importer_studio_result_projection( $result )" ); expect( blueprint.staticSiteImport.code ).toContain( "'completed_routes' => (int) ( $import_result['url_batch_run']['completed_routes'] ?? count( $canonical_documents ) )"