Clean up some backend
This commit is contained in:
		
							parent
							
								
									2197ee02e9
								
							
						
					
					
						commit
						f711b2df8b
					
				| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
module RendersBlob
 | 
					module RendersBlob
 | 
				
			||||||
  extend ActiveSupport::Concern
 | 
					  extend ActiveSupport::Concern
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def render_blob_json(blob)
 | 
					  def blob_json(blob)
 | 
				
			||||||
    viewer =
 | 
					    viewer =
 | 
				
			||||||
      case params[:viewer]
 | 
					      case params[:viewer]
 | 
				
			||||||
      when 'rich'
 | 
					      when 'rich'
 | 
				
			||||||
| 
						 | 
					@ -12,26 +12,18 @@ module RendersBlob
 | 
				
			||||||
        blob.simple_viewer
 | 
					        blob.simple_viewer
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return render_404 unless viewer
 | 
					    return unless viewer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if blob.binary?
 | 
					    {
 | 
				
			||||||
      render json: {
 | 
					      html: view_to_html_string("projects/blob/_viewer", viewer: viewer, load_async: false)
 | 
				
			||||||
        binary: true,
 | 
					 | 
				
			||||||
        mime_type: blob.mime_type,
 | 
					 | 
				
			||||||
        name: blob.name,
 | 
					 | 
				
			||||||
        extension: blob.extension,
 | 
					 | 
				
			||||||
        size: blob.raw_size
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      render json: {
 | 
					 | 
				
			||||||
        html: view_to_html_string("projects/blob/_viewer", viewer: viewer, load_async: false),
 | 
					 | 
				
			||||||
        plain: blob.data,
 | 
					 | 
				
			||||||
        name: blob.name,
 | 
					 | 
				
			||||||
        extension: blob.extension,
 | 
					 | 
				
			||||||
        size: blob.raw_size,
 | 
					 | 
				
			||||||
        mime_type: blob.mime_type
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def render_blob_json(blob)
 | 
				
			||||||
 | 
					    json = blob_json(blob)
 | 
				
			||||||
 | 
					    return render_404 unless json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    render json: json
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def conditionally_expand_blob(blob)
 | 
					  def conditionally_expand_blob(blob)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,6 @@ class Projects::BlobController < Projects::ApplicationController
 | 
				
			||||||
  include CreatesCommit
 | 
					  include CreatesCommit
 | 
				
			||||||
  include RendersBlob
 | 
					  include RendersBlob
 | 
				
			||||||
  include ActionView::Helpers::SanitizeHelper
 | 
					  include ActionView::Helpers::SanitizeHelper
 | 
				
			||||||
  include ApplicationHelper
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Raised when given an invalid file path
 | 
					  # Raised when given an invalid file path
 | 
				
			||||||
  InvalidPathError = Class.new(StandardError)
 | 
					  InvalidPathError = Class.new(StandardError)
 | 
				
			||||||
| 
						 | 
					@ -38,17 +37,32 @@ class Projects::BlobController < Projects::ApplicationController
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    respond_to do |format|
 | 
					    respond_to do |format|
 | 
				
			||||||
      format.html do
 | 
					      format.html do
 | 
				
			||||||
        assign_ref_vars
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        environment_params = @repository.branch_exists?(@ref) ? { ref: @ref } : { commit: @commit }
 | 
					        environment_params = @repository.branch_exists?(@ref) ? { ref: @ref } : { commit: @commit }
 | 
				
			||||||
        @environment = EnvironmentsFinder.new(@project, current_user, environment_params).execute.last
 | 
					        @environment = EnvironmentsFinder.new(@project, current_user, environment_params).execute.last
 | 
				
			||||||
        @last_commit = @repository.last_commit_for_path(@commit.id, tree.path) || @commit
 | 
					        @last_commit = @repository.last_commit_for_path(@commit.id, @blob.path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        show_new_repo? ? render('projects/tree/show') : render('show')
 | 
					        render 'show'
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      format.json do
 | 
					      format.json do
 | 
				
			||||||
        render_blob_json(@blob)
 | 
					        json = blob_json(@blob)
 | 
				
			||||||
 | 
					        return render_404 unless json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        render json: json.merge(
 | 
				
			||||||
 | 
					          path: blob.path,
 | 
				
			||||||
 | 
					          name: blob.name,
 | 
				
			||||||
 | 
					          extension: blob.extension,
 | 
				
			||||||
 | 
					          size: blob.raw_size,
 | 
				
			||||||
 | 
					          mime_type: blob.mime_type,
 | 
				
			||||||
 | 
					          binary: blob.raw_binary?,
 | 
				
			||||||
 | 
					          simple_viewer: blob.simple_viewer&.class&.partial_name,
 | 
				
			||||||
 | 
					          rich_viewer: blob.rich_viewer&.class&.partial_name,
 | 
				
			||||||
 | 
					          show_viewer_switcher: !!blob.show_viewer_switcher?,
 | 
				
			||||||
 | 
					          raw_path: project_raw_path(project, @id),
 | 
				
			||||||
 | 
					          blame_path: project_blame_path(project, @id),
 | 
				
			||||||
 | 
					          commits_path: project_commits_path(project, @id),
 | 
				
			||||||
 | 
					          permalink: project_blob_path(project, File.join(@commit.id, @path)),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -118,7 +118,7 @@ module BlobHelper
 | 
				
			||||||
    icon("#{file_type_icon_class('file', mode, name)} fw")
 | 
					    icon("#{file_type_icon_class('file', mode, name)} fw")
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def blob_raw_url
 | 
					  def blob_raw_path
 | 
				
			||||||
    if @build && @entry
 | 
					    if @build && @entry
 | 
				
			||||||
      raw_project_job_artifacts_path(@project, @build, path: @entry.path)
 | 
					      raw_project_job_artifacts_path(@project, @build, path: @entry.path)
 | 
				
			||||||
    elsif @snippet
 | 
					    elsif @snippet
 | 
				
			||||||
| 
						 | 
					@ -235,7 +235,7 @@ module BlobHelper
 | 
				
			||||||
      title = 'Open raw'
 | 
					      title = 'Open raw'
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    link_to icon, blob_raw_url, class: 'btn btn-sm has-tooltip', target: '_blank', rel: 'noopener noreferrer', title: title, data: { container: 'body' }
 | 
					    link_to icon, blob_raw_path, class: 'btn btn-sm has-tooltip', target: '_blank', rel: 'noopener noreferrer', title: title, data: { container: 'body' }
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def blob_render_error_reason(viewer)
 | 
					  def blob_render_error_reason(viewer)
 | 
				
			||||||
| 
						 | 
					@ -270,7 +270,7 @@ module BlobHelper
 | 
				
			||||||
      options << link_to('view the source', '#', class: 'js-blob-viewer-switch-btn', data: { viewer: 'simple' })
 | 
					      options << link_to('view the source', '#', class: 'js-blob-viewer-switch-btn', data: { viewer: 'simple' })
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    options << link_to('download it', blob_raw_url, target: '_blank', rel: 'noopener noreferrer')
 | 
					    options << link_to('download it', blob_raw_path, target: '_blank', rel: 'noopener noreferrer')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    options
 | 
					    options
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -82,7 +82,7 @@ module BlobViewer
 | 
				
			||||||
    # format of the blob.
 | 
					    # format of the blob.
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
    # Prefer to implement a client-side viewer, where the JS component loads the
 | 
					    # Prefer to implement a client-side viewer, where the JS component loads the
 | 
				
			||||||
    # binary from `blob_raw_url` and does its own format validation and error
 | 
					    # binary from `blob_raw_path` and does its own format validation and error
 | 
				
			||||||
    # rendering, especially for potentially large binary formats.
 | 
					    # rendering, especially for potentially large binary formats.
 | 
				
			||||||
    def render_error
 | 
					    def render_error
 | 
				
			||||||
      if too_large?
 | 
					      if too_large?
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@ module BlobViewer
 | 
				
			||||||
      # build artifacts, can only be rendered using a client-side viewer,
 | 
					      # build artifacts, can only be rendered using a client-side viewer,
 | 
				
			||||||
      # since we do not want to read large amounts of data into memory on the
 | 
					      # since we do not want to read large amounts of data into memory on the
 | 
				
			||||||
      # server side. Client-side viewers use JS and can fetch the file from
 | 
					      # server side. Client-side viewers use JS and can fetch the file from
 | 
				
			||||||
      # `blob_raw_url` using AJAX.
 | 
					      # `blob_raw_path` using AJAX.
 | 
				
			||||||
      return :server_side_but_stored_externally if blob.stored_externally?
 | 
					      return :server_side_but_stored_externally if blob.stored_externally?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      super
 | 
					      super
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
- commit = local_assigns.fetch(:commit) { @repository.commit }
 | 
					- commit = local_assigns.fetch(:commit) { @repository.commit }
 | 
				
			||||||
- ref = local_assigns.fetch(:ref) { current_ref }
 | 
					- ref = local_assigns.fetch(:ref) { current_ref }
 | 
				
			||||||
- project = local_assigns.fetch(:project) { @project }
 | 
					- project = local_assigns.fetch(:project) { @project }
 | 
				
			||||||
 | 
					- content_url = local_assigns.fetch(:content_url) { @tree.readme ? project_blob_path(@project, tree_join(@ref, @tree.readme.path)) : project_tree_path(@project, @ref) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#tree-holder.tree-holder.clearfix
 | 
					#tree-holder.tree-holder.clearfix
 | 
				
			||||||
  .nav-block
 | 
					  .nav-block
 | 
				
			||||||
| 
						 | 
					@ -9,4 +10,4 @@
 | 
				
			||||||
  - if !show_new_repo? && commit
 | 
					  - if !show_new_repo? && commit
 | 
				
			||||||
    = render 'shared/commit_well', commit: commit, ref: ref, project: project
 | 
					    = render 'shared/commit_well', commit: commit, ref: ref, project: project
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  = render 'projects/tree/tree_content', tree: @tree
 | 
					  = render 'projects/tree/tree_content', tree: @tree, content_url: content_url
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@
 | 
				
			||||||
  = render "projects/blob/auxiliary_viewer", blob: blob
 | 
					  = render "projects/blob/auxiliary_viewer", blob: blob
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#blob-content-holder.blob-content-holder
 | 
					#blob-content-holder.blob-content-holder
 | 
				
			||||||
  - if !show_new_repo?
 | 
					  - unless show_new_repo?
 | 
				
			||||||
    %article.file-holder
 | 
					    %article.file-holder
 | 
				
			||||||
      = render 'projects/blob/header', blob: blob
 | 
					      = render 'projects/blob/header', blob: blob
 | 
				
			||||||
      = render 'projects/blob/content', blob: blob
 | 
					      = render 'projects/blob/content', blob: blob
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,11 +6,17 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- content_for :page_specific_javascripts do
 | 
					- content_for :page_specific_javascripts do
 | 
				
			||||||
  = webpack_bundle_tag 'blob'
 | 
					  = webpack_bundle_tag 'blob'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - if show_new_repo?
 | 
				
			||||||
    = webpack_bundle_tag 'common_vue'
 | 
					    = webpack_bundle_tag 'common_vue'
 | 
				
			||||||
 | 
					    = webpack_bundle_tag 'repo'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
= render 'projects/last_push'
 | 
					= render 'projects/last_push'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%div{ class: container_class }
 | 
					%div{ class: container_class }
 | 
				
			||||||
 | 
					  - if show_new_repo?
 | 
				
			||||||
 | 
					    = render 'projects/files', commit: @last_commit, project: @project, ref: @ref, content_url: project_blob_path(@project, @id)
 | 
				
			||||||
 | 
					  - else
 | 
				
			||||||
    #tree-holder.tree-holder
 | 
					    #tree-holder.tree-holder
 | 
				
			||||||
      = render 'blob', blob: @blob
 | 
					      = render 'blob', blob: @blob
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
- content_for :page_specific_javascripts do
 | 
					- content_for :page_specific_javascripts do
 | 
				
			||||||
  = page_specific_javascript_bundle_tag('balsamiq_viewer')
 | 
					  = page_specific_javascript_bundle_tag('balsamiq_viewer')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.file-content.balsamiq-viewer#js-balsamiq-viewer{ data: { endpoint: blob_raw_url } }
 | 
					.file-content.balsamiq-viewer#js-balsamiq-viewer{ data: { endpoint: blob_raw_path } }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
.file-content.blob_file.blob-no-preview
 | 
					.file-content.blob_file.blob-no-preview
 | 
				
			||||||
  .center
 | 
					  .center
 | 
				
			||||||
    = link_to blob_raw_url do
 | 
					    = link_to blob_raw_path do
 | 
				
			||||||
      %h1.light
 | 
					      %h1.light
 | 
				
			||||||
        = icon('download')
 | 
					        = icon('download')
 | 
				
			||||||
      %h4
 | 
					      %h4
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,2 +1,2 @@
 | 
				
			||||||
.file-content.image_file
 | 
					.file-content.image_file
 | 
				
			||||||
  = image_tag(blob_raw_url, alt: viewer.blob.name)
 | 
					  = image_tag(blob_raw_path, alt: viewer.blob.name)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,4 +2,4 @@
 | 
				
			||||||
  = page_specific_javascript_bundle_tag('common_vue')
 | 
					  = page_specific_javascript_bundle_tag('common_vue')
 | 
				
			||||||
  = page_specific_javascript_bundle_tag('notebook_viewer')
 | 
					  = page_specific_javascript_bundle_tag('notebook_viewer')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.file-content#js-notebook-viewer{ data: { endpoint: blob_raw_url } }
 | 
					.file-content#js-notebook-viewer{ data: { endpoint: blob_raw_path } }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,4 +2,4 @@
 | 
				
			||||||
  = page_specific_javascript_bundle_tag('common_vue')
 | 
					  = page_specific_javascript_bundle_tag('common_vue')
 | 
				
			||||||
  = page_specific_javascript_bundle_tag('pdf_viewer')
 | 
					  = page_specific_javascript_bundle_tag('pdf_viewer')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.file-content#js-pdf-viewer{ data: { endpoint: blob_raw_url } }
 | 
					.file-content#js-pdf-viewer{ data: { endpoint: blob_raw_path } }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,6 @@
 | 
				
			||||||
  = page_specific_javascript_bundle_tag('common_vue')
 | 
					  = page_specific_javascript_bundle_tag('common_vue')
 | 
				
			||||||
  = page_specific_javascript_bundle_tag('sketch_viewer')
 | 
					  = page_specific_javascript_bundle_tag('sketch_viewer')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.file-content#js-sketch-viewer{ data: { endpoint: blob_raw_url } }
 | 
					.file-content#js-sketch-viewer{ data: { endpoint: blob_raw_path } }
 | 
				
			||||||
  .js-loading-icon.text-center.prepend-top-default.append-bottom-default.js-loading-icon{ 'aria-label' => 'Loading Sketch preview' }
 | 
					  .js-loading-icon.text-center.prepend-top-default.append-bottom-default.js-loading-icon{ 'aria-label' => 'Loading Sketch preview' }
 | 
				
			||||||
    = icon('spinner spin 2x', 'aria-hidden' => 'true');
 | 
					    = icon('spinner spin 2x', 'aria-hidden' => 'true');
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
  = page_specific_javascript_bundle_tag('stl_viewer')
 | 
					  = page_specific_javascript_bundle_tag('stl_viewer')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.file-content.is-stl-loading
 | 
					.file-content.is-stl-loading
 | 
				
			||||||
  .text-center#js-stl-viewer{ data: { endpoint: blob_raw_url } }
 | 
					  .text-center#js-stl-viewer{ data: { endpoint: blob_raw_path } }
 | 
				
			||||||
    = icon('spinner spin 2x', class: 'prepend-top-default append-bottom-default', 'aria-hidden' => 'true', 'aria-label' => 'Loading')
 | 
					    = icon('spinner spin 2x', class: 'prepend-top-default append-bottom-default', 'aria-hidden' => 'true', 'aria-label' => 'Loading')
 | 
				
			||||||
  .text-center.prepend-top-default.append-bottom-default.stl-controls
 | 
					  .text-center.prepend-top-default.append-bottom-default.stl-controls
 | 
				
			||||||
    .btn-group
 | 
					    .btn-group
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,2 +1,2 @@
 | 
				
			||||||
.file-content.video
 | 
					.file-content.video
 | 
				
			||||||
  %video{ src: blob_raw_url, controls: true, data: { setup: '{}' } }
 | 
					  %video{ src: blob_raw_path, controls: true, data: { setup: '{}' } }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,5 @@
 | 
				
			||||||
 | 
					- content_url = local_assigns.fetch(:content_url, nil)
 | 
				
			||||||
- if show_new_repo?
 | 
					- if show_new_repo?
 | 
				
			||||||
  = render 'shared/repo/repo', project: @project
 | 
					  = render 'shared/repo/repo', project: @project, content_url: content_url
 | 
				
			||||||
- else
 | 
					- else
 | 
				
			||||||
  = render 'projects/tree/old_tree_content', tree: tree
 | 
					  = render 'projects/tree/old_tree_content', tree: tree
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@
 | 
				
			||||||
      = icon('long-arrow-right', title: 'to target branch')
 | 
					      = icon('long-arrow-right', title: 'to target branch')
 | 
				
			||||||
      = render 'shared/target_switcher', destination: 'tree', path: @path
 | 
					      = render 'shared/target_switcher', destination: 'tree', path: @path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  - if !show_new_repo?
 | 
					  - unless show_new_repo?
 | 
				
			||||||
    = render 'projects/tree/old_tree_header'
 | 
					    = render 'projects/tree/old_tree_header'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.tree-controls
 | 
					.tree-controls
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,4 +15,4 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%div{ class: [container_class, ("limit-container-width" unless fluid_layout)] }
 | 
					%div{ class: [container_class, ("limit-container-width" unless fluid_layout)] }
 | 
				
			||||||
  = render 'projects/last_push'
 | 
					  = render 'projects/last_push'
 | 
				
			||||||
  = render 'projects/files', commit: @last_commit, project: @project, ref: @ref
 | 
					  = render 'projects/files', commit: @last_commit, project: @project, ref: @ref, content_url: project_tree_path(@project, @id)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
#repo{ data: { url: repo_url(project), project_name: project.name, refs_url: refs_project_path(project, format: :json), project_url: project_path(project), project_id: project.id } }
 | 
					#repo{ data: { url: content_url, project_name: project.name, refs_url: refs_project_path(project, format: :json), project_url: project_path(project), project_id: project.id } }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2616,7 +2616,7 @@ got@^7.0.0:
 | 
				
			||||||
    url-parse-lax "^1.0.0"
 | 
					    url-parse-lax "^1.0.0"
 | 
				
			||||||
    url-to-options "^1.0.1"
 | 
					    url-to-options "^1.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
graceful-fs@^4.1.11, graceful-fs@^4.1.2:
 | 
					graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
 | 
				
			||||||
  version "4.1.11"
 | 
					  version "4.1.11"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
 | 
					  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue