From 7427639be05c32b78b84c62e385ad76523d554be Mon Sep 17 00:00:00 2001 From: confused-Techie Date: Tue, 3 Jan 2023 02:42:52 -0800 Subject: [PATCH] Bundle `archive-view` --- package.json | 4 +- packages/archive-view/README.md | 20 ++ .../archive-view/keymaps/archive-view.cson | 3 + .../archive-view/lib/archive-editor-view.js | 208 +++++++++++++ packages/archive-view/lib/archive-editor.js | 74 +++++ .../archive-view/lib/default-file-icons.js | 36 +++ packages/archive-view/lib/directory-view.js | 132 +++++++++ packages/archive-view/lib/file-view.js | 112 +++++++ .../archive-view/lib/get-icon-services.js | 72 +++++ packages/archive-view/package.json | 47 +++ packages/archive-view/resources/preview.png | Bin 0 -> 137011 bytes .../archive-view/spec/archive-editor-spec.js | 46 +++ .../spec/archive-editor-view-spec.js | 276 ++++++++++++++++++ .../archive-view/spec/async-spec-helpers.js | 103 +++++++ .../archive-view/spec/fixtures/file-icons.zip | Bin 0 -> 824 bytes .../archive-view/spec/fixtures/invalid.zip | 1 + .../spec/fixtures/multiple-entries.zip | Bin 0 -> 704 bytes .../archive-view/spec/fixtures/nested.tar | Bin 0 -> 6144 bytes .../archive-view/styles/archive-view.less | 24 ++ yarn.lock | 13 +- 20 files changed, 1161 insertions(+), 10 deletions(-) create mode 100644 packages/archive-view/README.md create mode 100644 packages/archive-view/keymaps/archive-view.cson create mode 100644 packages/archive-view/lib/archive-editor-view.js create mode 100644 packages/archive-view/lib/archive-editor.js create mode 100644 packages/archive-view/lib/default-file-icons.js create mode 100644 packages/archive-view/lib/directory-view.js create mode 100644 packages/archive-view/lib/file-view.js create mode 100644 packages/archive-view/lib/get-icon-services.js create mode 100644 packages/archive-view/package.json create mode 100644 packages/archive-view/resources/preview.png create mode 100644 packages/archive-view/spec/archive-editor-spec.js create mode 100644 packages/archive-view/spec/archive-editor-view-spec.js create mode 100644 packages/archive-view/spec/async-spec-helpers.js create mode 100644 packages/archive-view/spec/fixtures/file-icons.zip create mode 100644 packages/archive-view/spec/fixtures/invalid.zip create mode 100644 packages/archive-view/spec/fixtures/multiple-entries.zip create mode 100644 packages/archive-view/spec/fixtures/nested.tar create mode 100644 packages/archive-view/styles/archive-view.less diff --git a/package.json b/package.json index d302f2ef4..c501ea84d 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@atom/source-map-support": "^0.3.4", "@babel/core": "7.18.6", "about": "file:packages/about", - "archive-view": "https://codeload.github.com/atom/archive-view/legacy.tar.gz/refs/tags/v0.66.0", + "archive-view": "file:packages/archive-view", "async": "3.2.4", "atom-dark-syntax": "file:packages/atom-dark-syntax", "atom-dark-ui": "file:packages/atom-dark-ui", @@ -187,7 +187,7 @@ "solarized-dark-syntax": "file:./packages/solarized-dark-syntax", "solarized-light-syntax": "file:./packages/solarized-light-syntax", "about": "file:./packages/about", - "archive-view": "0.66.0", + "archive-view": "file:./packages/archive-view", "autocomplete-atom-api": "0.10.7", "autocomplete-css": "file:./packages/autocomplete-css", "autocomplete-html": "file:./packages/autocomplete-html", diff --git a/packages/archive-view/README.md b/packages/archive-view/README.md new file mode 100644 index 000000000..f2c53c338 --- /dev/null +++ b/packages/archive-view/README.md @@ -0,0 +1,20 @@ +# Archive view package + +Adds support for browsing archive files in Pulsar with the following extensions: + +* `.egg` +* `.epub` +* `.jar` +* `.love` +* `.nupkg` +* `.tar` +* `.tar.gz` +* `.tgz` +* `.war` +* `.whl` +* `.xpi` +* `.zip` + +Select a file to extract it to a temp file and open it in a new editor. + +![](./resources/preview.png) diff --git a/packages/archive-view/keymaps/archive-view.cson b/packages/archive-view/keymaps/archive-view.cson new file mode 100644 index 000000000..cd17eea1b --- /dev/null +++ b/packages/archive-view/keymaps/archive-view.cson @@ -0,0 +1,3 @@ +'.archive-editor': + 'k': 'core:move-up' + 'j': 'core:move-down' diff --git a/packages/archive-view/lib/archive-editor-view.js b/packages/archive-view/lib/archive-editor-view.js new file mode 100644 index 000000000..6e49ab5a0 --- /dev/null +++ b/packages/archive-view/lib/archive-editor-view.js @@ -0,0 +1,208 @@ +/** @babel */ +/** @jsx etch.dom */ + +import fs from 'fs' +import humanize from 'humanize-plus' +import archive from 'ls-archive' +import {CompositeDisposable, Disposable, Emitter, File} from 'atom' +import etch from 'etch' + +import FileView from './file-view' +import DirectoryView from './directory-view' + +export default class ArchiveEditorView { + constructor (archivePath) { + this.disposables = new CompositeDisposable() + this.emitter = new Emitter() + this.path = archivePath + this.file = new File(this.path) + this.entries = [] + etch.initialize(this) + + this.refresh() + + this.disposables.add(this.file.onDidChange(() => this.refresh())) + this.disposables.add(this.file.onDidRename(() => this.refresh())) + this.disposables.add(this.file.onDidDelete(() => this.destroy())) + + const focusHandler = () => this.focusSelectedFile() + + this.element.addEventListener('focus', focusHandler) + this.disposables.add(new Disposable(() => this.element.removeEventListener('focus', focusHandler))) + } + + update () {} + + render () { + return ( +
+
+
{`Loading archive\u2026`}
+
+
+
+
    +
+
+
+ ) + } + + copy () { + return new ArchiveEditorView(this.path) + } + + destroy () { + while (this.entries.length > 0) { + this.entries.pop().destroy() + } + this.disposables.dispose() + this.emitter.emit('did-destroy') + etch.destroy(this) + } + + onDidDestroy (callback) { + return this.emitter.on('did-destroy', callback) + } + + onDidChangeTitle (callback) { + return this.emitter.on('did-change-title', callback) + } + + serialize () { + return { + deserializer: this.constructor.name, + path: this.path + } + } + + getPath () { + return this.file.getPath() + } + + getTitle () { + return this.path ? this.file.getBaseName() : 'untitled' + } + + getURI () { + return this.path + } + + refresh () { + this.refs.summary.style.display = 'none' + this.refs.tree.style.display = 'none' + this.refs.loadingMessage.style.display = '' + this.refs.errorMessage.style.display = 'none' + + if (this.path !== this.getPath()) { + this.path = this.getPath() + this.emitter.emit('did-change-title') + } + + const originalPath = this.path + archive.list(this.path, {tree: true}, (error, entries) => { + if (originalPath !== this.path) { + return + } + + if (error != null) { + let message = 'Reading the archive file failed' + if (error.message) { + message += `: ${error.message}` + } + this.refs.errorMessage.style.display = '' + this.refs.errorMessage.textContent = message + } else { + this.createTreeEntries(entries) + this.updateSummary() + } + + // We hide the loading message _after_ creating the archive tree + // to avoid forced reflows. + this.refs.loadingMessage.style.display = 'none' + }) + } + + createTreeEntries (entries) { + while (this.entries.length > 0) { + this.entries.pop().destroy() + } + + let index = 0 + for (const entry of entries) { + if (entry.isDirectory()) { + const entryView = new DirectoryView(this, index, this.path, entry) + this.entries.push(entryView) + } else { + const entryView = new FileView(this, index, this.path, entry) + this.entries.push(entryView) + } + index++ + } + + this.selectFileAfterIndex(-1) + + // Wait until selecting (focusing) the first file before appending the entries + // to avoid a double-forced reflow when focusing. + for (const entry of this.entries) { + this.refs.tree.appendChild(entry.element) + } + + this.refs.tree.style.display = '' + } + + updateSummary () { + const fileCount = this.entries.filter((entry) => entry instanceof FileView).length + const fileLabel = fileCount === 1 ? '1 file' : `${humanize.intComma(fileCount)} files` + + const directoryCount = this.entries.filter((entry) => entry instanceof DirectoryView).length + const directoryLabel = directoryCount === 1 ? '1 folder' : `${humanize.intComma(directoryCount)} folders` + + this.refs.summary.style.display = '' + let fileSize + try { + fileSize = fs.statSync(this.path)?.size; + } catch (e) {} + if (fileSize == null) fileSize = -1 + this.refs.summary.textContent = `${humanize.fileSize(fileSize)} with ${fileLabel} and ${directoryLabel}` + } + + focusSelectedFile () { + const selectedFile = this.refs.tree.querySelector('.selected') + if (selectedFile) { + selectedFile.focus() + } + } + + selectFileBeforeIndex (index) { + for (let i = index - 1; i >= 0; i--) { + const previousEntry = this.entries[i] + if (previousEntry instanceof FileView) { + previousEntry.select() + break + } else { + if (previousEntry.selectLastFile()) { + break + } + } + } + } + + selectFileAfterIndex (index) { + for (let i = index + 1; i < this.entries.length; i++) { + const nextEntry = this.entries[i] + if (nextEntry instanceof FileView) { + nextEntry.select() + break + } else { + if (nextEntry.selectFirstFile()) { + break + } + } + } + } + + focus () { + this.focusSelectedFile() + } +} diff --git a/packages/archive-view/lib/archive-editor.js b/packages/archive-view/lib/archive-editor.js new file mode 100644 index 000000000..3ca0a2074 --- /dev/null +++ b/packages/archive-view/lib/archive-editor.js @@ -0,0 +1,74 @@ +const fs = require('fs') +const path = require('path') +const {Disposable} = require('atom') + +const getIconServices = require('./get-icon-services') +const ArchiveEditorView = require('./archive-editor-view') + +module.exports = { + activate () { + this.disposable = atom.workspace.addOpener((filePath = '') => { + // Check that filePath exists before opening, in case a remote URI was given + if (!isPathSupported(filePath)) return; + let isFile = false + try { + isFile = fs.statSync(filePath)?.isFile() + } catch (e) {} + if (isFile) { + return new ArchiveEditorView(filePath) + } + }) + }, + + deactivate () { + this.disposable.dispose() + for (const item of atom.workspace.getPaneItems()) { + if (item instanceof ArchiveEditorView) { + item.destroy() + } + } + }, + + consumeElementIcons (service) { + getIconServices().setElementIcons(service) + return new Disposable(() => getIconServices().resetElementIcons()) + }, + + consumeFileIcons (service) { + getIconServices().setFileIcons(service) + return new Disposable(() => getIconServices().resetFileIcons()) + }, + + deserialize (params = {}) { + let isFile = false + try { + isFile = fs.statSync(params.path)?.isFile() + } catch (e) {} + if (isFile) { + return new ArchiveEditorView(params.path) + } else { + console.warn(`Can't build ArchiveEditorView for path "${params.path}"; file no longer exists`) + } + } +} + +function isPathSupported (filePath) { + switch (path.extname(filePath)) { + case '.egg': + case '.epub': + case '.jar': + case '.love': + case '.nupkg': + case '.tar': + case '.tgz': + case '.war': + case '.whl': + case '.xpi': + case '.zip': + return true + case '.gz': + return path.extname(path.basename(filePath, '.gz')) === '.tar' + default: + return false + } +} diff --git a/packages/archive-view/lib/default-file-icons.js b/packages/archive-view/lib/default-file-icons.js new file mode 100644 index 000000000..418270493 --- /dev/null +++ b/packages/archive-view/lib/default-file-icons.js @@ -0,0 +1,36 @@ +const fs = require('fs') +const path = require('path') + +class DefaultFileIcons { + iconClassForPath (filePath) { + const extension = path.extname(filePath).toLowerCase() + const base = path.basename(filePath, extension).toLowerCase(); + + let isSymbolicLinkSync = false + try { + fs.lstatSync(filePath)?.isSymbolicLink(); + } catch (e) {} + if (isSymbolicLinkSync) return 'icon-file-symlink-file' + + if (base === 'readme' && ['','.markdown','.md','.mdown','.mkd','.mkdown','.rmd','.ron'].includes(extension)) { + return 'icon-book' + } + + if (['.bz2','.egg','.epub','.gem','.gz','.jar','.lz','.lzma','.lzo','.rar','.tar','.tgz','.war','.whl','.xpi','.xz','.z','.zip'].includes(extension)) { + return 'icon-file-zip' + } + + if (['.gif','.ico','.jpeg','.jpg','.png','.tif','.tiff','.webp'].includes(extension)) { + return 'icon-file-media' + } + + if (extension === ".pdf") return 'icon-file-pdf' + + if (['.ds_store','.a','.exe','.o','.pyc','.pyo','.so','.woff'].includes(extension)) { + return 'icon-file-binary' + } + return 'icon-file-text' + } +} + +module.exports = new DefaultFileIcons() diff --git a/packages/archive-view/lib/directory-view.js b/packages/archive-view/lib/directory-view.js new file mode 100644 index 000000000..df25c1844 --- /dev/null +++ b/packages/archive-view/lib/directory-view.js @@ -0,0 +1,132 @@ +/** @babel */ + +import {CompositeDisposable, Disposable} from 'atom' + +import FileView from './file-view' +import getIconServices from './get-icon-services' + +export default class DirectoryView { + constructor (parentView, indexInParentView, archivePath, entry) { + this.disposables = new CompositeDisposable() + this.entries = [] + this.parentView = parentView + this.indexInParentView = indexInParentView + this.element = document.createElement('li') + this.element.classList.add('list-nested-item', 'entry') + + const listItem = document.createElement('span') + listItem.classList.add('list-item') + + const clickHandler = (event) => { + event.stopPropagation() + event.preventDefault() + this.element.classList.toggle('collapsed') + } + listItem.addEventListener('click', clickHandler) + this.disposables.add(new Disposable(() => { listItem.removeEventListener('click', clickHandler) })) + + const entrySpan = document.createElement('span') + entrySpan.textContent = entry.getName() + listItem.appendChild(entrySpan) + this.element.appendChild(listItem) + + this.entry = entry + this.entrySpan = entrySpan + getIconServices().updateDirectoryIcon(this) + + this.entriesTree = document.createElement('ol') + this.entriesTree.classList.add('list-tree') + let index = 0 + for (const child of entry.children) { + if (child.isDirectory()) { + const entryView = new DirectoryView(this, index, archivePath, child) + this.entries.push(entryView) + this.entriesTree.appendChild(entryView.element) + } else { + const entryView = new FileView(this, index, archivePath, child) + this.entries.push(entryView) + this.entriesTree.appendChild(entryView.element) + } + + index++ + } + this.element.appendChild(this.entriesTree) + } + + destroy () { + if (this.iconDisposable) { + this.iconDisposable.dispose() + this.iconDisposable = null + } + + while (this.entries.length > 0) { + this.entries.pop().destroy() + } + + this.disposables.dispose() + this.element.remove() + } + + selectFileBeforeIndex (index) { + for (let i = index - 1; i >= 0; i--) { + const previousEntry = this.entries[i] + if (previousEntry instanceof FileView) { + previousEntry.select() + return + } else { + if (previousEntry.selectLastFile()) { + return + } + } + } + + this.parentView.selectFileBeforeIndex(this.indexInParentView) + } + + selectFileAfterIndex (index) { + for (let i = index + 1; i < this.entries.length; i++) { + const nextEntry = this.entries[i] + if (nextEntry instanceof FileView) { + nextEntry.select() + return + } else { + if (nextEntry.selectFirstFile()) { + return + } + } + } + + this.parentView.selectFileAfterIndex(this.indexInParentView) + } + + selectFirstFile () { + for (const entry of this.entries) { + if (entry instanceof FileView) { + entry.select() + return true + } else { + if (entry.selectFirstFile()) { + return true + } + } + } + + return false + } + + selectLastFile () { + for (var i = this.entries.length - 1; i >= 0; i--) { + const entry = this.entries[i] + if (entry instanceof FileView) { + entry.select() + return true + } else { + if (entry.selectLastFile()) { + return true + } + } + } + + return false + } +} diff --git a/packages/archive-view/lib/file-view.js b/packages/archive-view/lib/file-view.js new file mode 100644 index 000000000..5465148d3 --- /dev/null +++ b/packages/archive-view/lib/file-view.js @@ -0,0 +1,112 @@ +/** @babel */ + +import {CompositeDisposable, Disposable} from 'atom' +import path from 'path' +import fs from 'fs' +import temp from 'temp' +import archive from 'ls-archive' + +import getIconServices from './get-icon-services' + +export default class FileView { + constructor (parentView, indexInParentView, archivePath, entry) { + this.disposables = new CompositeDisposable() + this.parentView = parentView + this.indexInParentView = indexInParentView + this.archivePath = archivePath + this.entry = entry + + this.element = document.createElement('li') + this.element.classList.add('list-item', 'entry') + this.element.tabIndex = -1 + + this.name = document.createElement('span') + getIconServices().updateFileIcon(this) + this.name.textContent = this.entry.getName() + this.element.appendChild(this.name) + + const clickHandler = () => { + this.select() + this.openFile() + } + this.element.addEventListener('click', clickHandler) + this.disposables.add(new Disposable(() => { this.element.removeEventListener('click', clickHandler) })) + + this.disposables.add(atom.commands.add(this.element, { + 'core:confirm': () => { + if (this.isSelected()) { + this.openFile() + } + }, + + 'core:move-down': () => { + if (this.isSelected()) { + this.parentView.selectFileAfterIndex(this.indexInParentView) + } + }, + + 'core:move-up': () => { + if (this.isSelected()) { + this.parentView.selectFileBeforeIndex(this.indexInParentView) + } + } + })) + } + + destroy () { + this.disposables.dispose() + this.element.remove() + } + + isSelected () { + return this.element.classList.contains('selected') + } + + logError (message, error) { + console.error(message, error.stack != null ? error.stack : error) + } + + openFile () { + archive.readFile(this.archivePath, this.entry.getPath(), (error, contents) => { + if (error != null) { + this.logError(`Error reading: ${this.entry.getPath()} from ${this.archivePath}`, error) + } else { + temp.mkdir('atom-', (error, tempDirPath) => { + if (error != null) { + this.logError(`Error creating temp directory: ${tempDirPath}`, error) + } else { + const tempArchiveDirPath = path.join(tempDirPath, path.basename(this.archivePath)) + fs.mkdir(tempArchiveDirPath, {recursive:true}, error => { + if (error != null) { + this.logError(`Error creating archive directory ${tempArchiveDirPath}`, error) + } else { + const tempFilePath = path.join(tempArchiveDirPath, this.entry.getName()) + fs.writeFile(tempFilePath, contents, error => { + if (error != null) { + this.logError(`Error writing to ${tempFilePath}`, error) + } else { + atom.workspace.open(tempFilePath) + } + }) + } + }) + } + }) + } + }) + } + + select () { + this.element.focus() + + const archiveEditorElement = this.element.closest('.archive-editor') + // On initial tree creation, it is not possible for any entries to be selected + // (The entries also haven't been added to the DOM yet) + if (archiveEditorElement) { + for (const selected of archiveEditorElement.querySelectorAll('.selected')) { + selected.classList.remove('selected') + } + } + this.element.classList.add('selected') + } +} diff --git a/packages/archive-view/lib/get-icon-services.js b/packages/archive-view/lib/get-icon-services.js new file mode 100644 index 000000000..3e7bff010 --- /dev/null +++ b/packages/archive-view/lib/get-icon-services.js @@ -0,0 +1,72 @@ +const DefaultFileIcons = require('./default-file-icons') +const {Emitter, CompositeDisposable} = require('atom') +const path = require('path') + +let iconServices +module.exports = function getIconServices () { + if (!iconServices) iconServices = new IconServices() + return iconServices +} + +class IconServices { + constructor () { + this.emitter = new Emitter() + this.elementIcons = null + this.elementIconDisposables = new CompositeDisposable() + this.fileIcons = DefaultFileIcons + } + + onDidChange (callback) { + return this.emitter.on('did-change', callback) + } + + resetElementIcons () { + this.setElementIcons(null) + } + + resetFileIcons () { + this.setFileIcons(DefaultFileIcons) + } + + setElementIcons (service) { + if (service !== this.elementIcons) { + if (this.elementIconDisposables != null) { + this.elementIconDisposables.dispose() + } + if (service) { this.elementIconDisposables = new CompositeDisposable() } + this.elementIcons = service + return this.emitter.emit('did-change') + } + } + + setFileIcons (service) { + if (service !== this.fileIcons) { + this.fileIcons = service + return this.emitter.emit('did-change') + } + } + + updateDirectoryIcon (view) { + view.entrySpan.classList.add('directory', 'icon', 'icon-file-directory') + if (this.elementIcons) { + view.iconDisposable = this.elementIcons(view.entrySpan, view.entry.path, {isDirectory: true}) + } + } + + updateFileIcon (view) { + const nameClasses = ['file', 'icon'] + if (this.elementIcons) { + const fullPath = path.join(view.archivePath, view.entry.path) + const disposable = this.elementIcons(view.name, fullPath) + view.disposables.add(disposable) + this.elementIconDisposables.add(disposable) + } else { + let typeClass = this.fileIcons.iconClassForPath(view.entry.path, 'archive-view') || [] + if (!Array.isArray(typeClass) && typeClass) { + typeClass = typeClass.toString().split(/\s+/g) + } + nameClasses.push(...typeClass) + } + view.name.classList.add(...nameClasses) + } +} diff --git a/packages/archive-view/package.json b/packages/archive-view/package.json new file mode 100644 index 000000000..b0b19e792 --- /dev/null +++ b/packages/archive-view/package.json @@ -0,0 +1,47 @@ +{ + "name": "archive-view", + "version": "0.66.0", + "description": "View the files and folders inside archive files", + "main": "./lib/archive-editor", + "dependencies": { + "etch": "0.9.0", + "humanize-plus": "~1.8.2", + "ls-archive": "https://github.com/pulsar-edit/node-ls-archive/archive/refs/tags/v1.3.1.tar.gz", + "temp": "~0.8.1" + }, + "devDependencies": { + "standard": "^11.0.1" + }, + "standard": { + "env": { + "atomtest": true, + "browser": true, + "jasmine": true, + "node": true + }, + "globals": [ + "atom" + ] + }, + "repository": "https://github.com/pulsar-edit/pulsar", + "license": "MIT", + "engines": { + "atom": "*" + }, + "deserializers": { + "ArchiveEditor": "deserialize", + "ArchiveEditorView": "deserialize" + }, + "consumedServices": { + "atom.file-icons": { + "versions": { + "1.0.0": "consumeFileIcons" + } + }, + "file-icons.element-icons": { + "versions": { + "1.0.0": "consumeElementIcons" + } + } + } +} diff --git a/packages/archive-view/resources/preview.png b/packages/archive-view/resources/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbbdad95dc5b17f77de5ea4f9d173d29badc7c2 GIT binary patch literal 137011 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

$=xUfaW*PFVbhdsaKJAuW#^kCkvM} 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 literal 0 HcmV?d00001 diff --git a/packages/archive-view/spec/archive-editor-spec.js b/packages/archive-view/spec/archive-editor-spec.js new file mode 100644 index 000000000..7b0bea958 --- /dev/null +++ b/packages/archive-view/spec/archive-editor-spec.js @@ -0,0 +1,46 @@ +const {it, fit, ffit, fffit, beforeEach, afterEach, conditionPromise} = require('./async-spec-helpers') // eslint-disable-line no-unused-vars + +const path = require('path') +const ArchiveEditor = require('../lib/archive-editor') +const ArchiveEditorView = require('../lib/archive-editor-view') + +describe('ArchiveEditor', () => { + const tarPath = path.join(__dirname, 'fixtures', 'nested.tar') + + // Don't log during specs + beforeEach(() => spyOn(console, 'warn')) + + describe('.deserialize', () => { + it('returns undefined if no file exists at the given path', () => { + const editor1 = new ArchiveEditorView(tarPath) + const state = editor1.serialize() + editor1.destroy() + + const editor2 = ArchiveEditor.deserialize(state) + expect(editor2).toBeDefined() + editor2.destroy() + + state.path = 'bogus' + expect(ArchiveEditor.deserialize(state)).toBeUndefined() + }) + }) + + describe('.deactivate()', () => { + it('removes all ArchiveEditorViews from the workspace and does not open any new ones', async () => { + const getArchiveEditorViews = () => { + return atom.workspace.getPaneItems().filter(item => item instanceof ArchiveEditorView) + } + await atom.packages.activatePackage('archive-view') + await atom.workspace.open(path.join(__dirname, 'fixtures', 'nested.tar')) + await atom.workspace.open(path.join(__dirname, 'fixtures', 'invalid.zip')) + await atom.workspace.open() + expect(getArchiveEditorViews().length).toBe(2) + + await atom.packages.deactivatePackage('archive-view') + expect(getArchiveEditorViews().length).toBe(0) + + await atom.workspace.open(path.join(__dirname, 'fixtures', 'nested.tar')) + expect(getArchiveEditorViews().length).toBe(0) + }) + }) +}) diff --git a/packages/archive-view/spec/archive-editor-view-spec.js b/packages/archive-view/spec/archive-editor-view-spec.js new file mode 100644 index 000000000..4ded3e5a8 --- /dev/null +++ b/packages/archive-view/spec/archive-editor-view-spec.js @@ -0,0 +1,276 @@ +const {Disposable, File} = require('atom') +const getIconServices = require('../lib/get-icon-services') +const {it, fit, ffit, fffit, beforeEach, afterEach, conditionPromise} = require('./async-spec-helpers') // eslint-disable-line no-unused-vars + +async function condition (handler) { + if (jasmine.isSpy(window.setTimeout)) { + jasmine.useRealClock() + } + return conditionPromise(handler) +} + +describe('ArchiveEditorView', () => { + let archiveEditorView, onDidChangeCallback, onDidRenameCallback, onDidDeleteCallback + + beforeEach(async () => { + spyOn(File.prototype, 'onDidChange').andCallFake(function (callback) { + if (/\.tar$/.test(this.getPath())) { + onDidChangeCallback = callback + } + return new Disposable() + }) + + spyOn(File.prototype, 'onDidRename').andCallFake(function (callback) { + if (/\.tar$/.test(this.getPath())) { + onDidRenameCallback = callback + } + return new Disposable() + }) + + spyOn(File.prototype, 'onDidDelete').andCallFake(function (callback) { + if (/\.tar$/.test(this.getPath())) { + onDidDeleteCallback = callback + } + return new Disposable() + }) + + await atom.packages.activatePackage('archive-view') + archiveEditorView = await atom.workspace.open('nested.tar') + }) + + describe('.constructor()', () => { + it('displays the files and folders in the archive file', async () => { + expect(archiveEditorView.element).toExist() + await condition(() => archiveEditorView.element.querySelectorAll('.entry').length > 0) + + const directoryElements = archiveEditorView.element.querySelectorAll('.directory') + expect(directoryElements.length).toBe(6) + expect(directoryElements[0].textContent).toBe('d1') + expect(directoryElements[1].textContent).toBe('d2') + expect(directoryElements[2].textContent).toBe('d3') + expect(directoryElements[3].textContent).toBe('d4') + expect(directoryElements[4].textContent).toBe('da') + expect(directoryElements[5].textContent).toBe('db') + + const fileElements = archiveEditorView.element.querySelectorAll('.file') + expect(fileElements.length).toBe(3) + expect(fileElements[0].textContent).toBe('f1.txt') + expect(fileElements[1].textContent).toBe('f2.txt') + expect(fileElements[2].textContent).toBe('fa.txt') + }) + + it('selects the first file', async () => { + await condition(() => archiveEditorView.element.querySelectorAll('.entry').length > 0) + expect(archiveEditorView.element.querySelector('.selected').textContent).toBe('f1.txt') + }) + }) + + describe('.copy()', () => { + it('returns a new ArchiveEditorView for the same file', () => { + const newArchiveView = archiveEditorView.copy() + expect(newArchiveView.getPath()).toBe(archiveEditorView.getPath()) + }) + }) + + describe('archive summary', () => { + beforeEach(async () => { + await atom.workspace.open('multiple-entries.zip') + archiveEditorView = atom.workspace.getActivePaneItem() + jasmine.attachToDOM(atom.views.getView(atom.workspace)) + }) + + it('shows correct statistics', async () => { + await condition(() => archiveEditorView.element.querySelectorAll('.entry').length > 0) + const heading = archiveEditorView.element.querySelector('.inset-panel .panel-heading') + expect(heading).not.toBe(null) + expect(heading.textContent).toBe('704 bytes with 4 files and 1 folder') + }) + }) + + describe('when core:move-up/core:move-down is triggered', () => { + let selectedEntry + const dispatch = (command) => { + atom.commands.dispatch(archiveEditorView.element.querySelector('.selected'), command) + selectedEntry = archiveEditorView.element.querySelector('.selected').textContent + return true + } + + it('selects the next/previous file', async () => { + await condition(() => archiveEditorView.element.querySelectorAll('.entry').length > 0) + expect(archiveEditorView.element).toBeDefined() + dispatch('core:move-up') && expect(selectedEntry).toBe('f1.txt') + dispatch('core:move-down') && expect(selectedEntry).toBe('f2.txt') + dispatch('core:move-down') && expect(selectedEntry).toBe('fa.txt') + dispatch('core:move-down') && expect(selectedEntry).toBe('fa.txt') + dispatch('core:move-up') && expect(selectedEntry).toBe('f2.txt') + dispatch('core:move-up') && expect(selectedEntry).toBe('f1.txt') + }) + }) + + describe('when a file is clicked', () => { + it('copies the contents to a temp file and opens it in a new editor', async () => { + await condition(() => archiveEditorView.element.querySelectorAll('.entry').length > 0) + archiveEditorView.element.querySelectorAll('.file')[2].click() + await condition(() => atom.workspace.getActivePane().getItems().length > 1) + expect(atom.workspace.getActivePaneItem().getText()).toBe('hey there\n') + expect(atom.workspace.getActivePaneItem().getTitle()).toBe('fa.txt') + }) + }) + + describe('when a directory is clicked', () => { + it('collapses/expands itself', async () => { + await condition(() => archiveEditorView.element.querySelectorAll('.entry').length > 0) + let directory = archiveEditorView.element.querySelectorAll('.list-nested-item.entry')[0] + expect(directory.classList.contains('collapsed')).toBeFalsy() + directory.querySelector('.list-item').click() + expect(directory.classList.contains('collapsed')).toBeTruthy() + directory.querySelector('.list-item').click() + expect(directory.classList.contains('collapsed')).toBeFalsy() + }) + }) + + describe('when core:confirm is triggered', () => { + it('copies the contents to a temp file and opens it in a new editor', async () => { + await condition(() => archiveEditorView.element.querySelectorAll('.entry').length > 0) + atom.commands.dispatch(archiveEditorView.element.querySelector('.file'), 'core:confirm') + await condition(() => atom.workspace.getActivePane().getItems().length > 1) + expect(atom.workspace.getActivePaneItem().getText()).toBe('') + expect(atom.workspace.getActivePaneItem().getTitle()).toBe('f1.txt') + }) + }) + + describe('when the file is modified', () => { + it('refreshes the view', async () => { + await condition(() => archiveEditorView.element.querySelectorAll('.entry').length > 0) + spyOn(archiveEditorView, 'refresh') + onDidChangeCallback() + expect(archiveEditorView.refresh).toHaveBeenCalled() + }) + }) + + describe('when the file is renamed', () => { + it('refreshes the view and updates the title', async () => { + spyOn(File.prototype, 'getPath').andReturn('nested-renamed.tar') + await condition(() => archiveEditorView.element.querySelectorAll('.entry').length > 0) + spyOn(archiveEditorView, 'refresh').andCallThrough() + spyOn(archiveEditorView, 'getTitle') + onDidRenameCallback() + expect(archiveEditorView.refresh).toHaveBeenCalled() + expect(archiveEditorView.getTitle).toHaveBeenCalled() + }) + }) + + describe('when the file is removed', () => { + it('destroys the view', async () => { + await condition(() => archiveEditorView.element.querySelectorAll('.entry').length > 0) + expect(atom.workspace.getActivePane().getItems().length).toBe(1) + onDidDeleteCallback() + expect(atom.workspace.getActivePaneItem()).toBeUndefined() + }) + }) + + describe('when the file is invalid', () => { + beforeEach(async () => { + await atom.workspace.open('invalid.zip') + archiveEditorView = atom.workspace.getActivePaneItem() + jasmine.attachToDOM(atom.views.getView(atom.workspace)) + }) + + it('shows the error', async () => { + await condition(() => archiveEditorView.refs.errorMessage.offsetHeight > 0) + expect(archiveEditorView.refs.errorMessage.textContent.length).toBeGreaterThan(0) + }) + }) + + describe('FileIcons', () => { + async function openFile () { + await atom.workspace.open('file-icons.zip') + archiveEditorView = atom.workspace.getActivePaneItem() + jasmine.attachToDOM(atom.views.getView(atom.workspace)) + } + + describe('Icon service', () => { + const service = { iconClassForPath () {} } + beforeEach(() => openFile()) + + it('provides a default service', () => { + expect(getIconServices().fileIcons).toBeDefined() + expect(getIconServices().fileIcons).not.toBeNull() + }) + + it('allows the default to be overridden', () => { + getIconServices().setFileIcons(service) + expect(getIconServices().fileIcons).toBe(service) + }) + + it('allows service to be reset without hassle', () => { + getIconServices().setFileIcons(service) + getIconServices().resetFileIcons() + expect(getIconServices().fileIcons).not.toBe(service) + }) + }) + + describe('Class handling', () => { + function findEntryContainingText (text) { + for (const entry of archiveEditorView.element.querySelectorAll('.list-item.entry')) { + if (entry.textContent.includes(text)) { return entry } + } + return null + } + + function checkMultiClass () { + expect(findEntryContainingText('adobe.pdf').querySelector('.file.icon').className).toBe('file icon text pdf-icon document') + expect(findEntryContainingText('spacer.gif').querySelector('.file.icon').className).toBe('file icon binary gif-icon image') + expect(findEntryContainingText('font.ttf').querySelector('.file.icon').className).toBe('file icon binary ttf-icon font') + } + + it('displays default file-icons', async () => { + await openFile() + await condition(() => archiveEditorView.element.querySelectorAll('.entry').length > 0) + expect(findEntryContainingText('adobe.pdf').querySelector('.file.icon.icon-file-pdf').length).not.toBe(0) + expect(findEntryContainingText('spacer.gif').querySelector('.file.icon.icon-file-media').length).not.toBe(0) + expect(findEntryContainingText('sunn.o').querySelector('.file.icon.icon-file-binary').length).not.toBe(0) + }) + + it('allows multiple classes to be passed', async () => { + getIconServices().setFileIcons({ + iconClassForPath: (path) => { + switch (path.match(/\w*$/)[0]) { + case 'pdf': return 'text pdf-icon document' + case 'ttf': return 'binary ttf-icon font' + case 'gif': return 'binary gif-icon image' + } + } + }) + await openFile() + await condition(() => archiveEditorView.element.querySelectorAll('.entry').length > 0) + checkMultiClass() + }) + + it('allows an array of classes to be passed', async () => { + getIconServices().setFileIcons({ + iconClassForPath: (path) => { + switch (path.match(/\w*$/)[0]) { + case 'pdf': return ['text', 'pdf-icon', 'document'] + case 'ttf': return ['binary', 'ttf-icon', 'font'] + case 'gif': return ['binary', 'gif-icon', 'image'] + } + } + }) + await openFile() + await condition(() => archiveEditorView.element.querySelectorAll('.entry').length > 0) + checkMultiClass() + }) + + it('identifies context to icon-service providers', async () => { + getIconServices().setFileIcons({ + iconClassForPath: (path, context) => `icon-${context}` + }) + await openFile() + await condition(() => archiveEditorView.element.querySelectorAll('.entry').length > 0) + const icons = findEntryContainingText('adobe.pdf').querySelectorAll('.file.icon-archive-view') + expect(icons.length).not.toBe(0) + }) + }) + }) +}) diff --git a/packages/archive-view/spec/async-spec-helpers.js b/packages/archive-view/spec/async-spec-helpers.js new file mode 100644 index 000000000..73002c049 --- /dev/null +++ b/packages/archive-view/spec/async-spec-helpers.js @@ -0,0 +1,103 @@ +/** @babel */ + +export function beforeEach (fn) { + global.beforeEach(function () { + const result = fn() + if (result instanceof Promise) { + waitsForPromise(() => result) + } + }) +} + +export function afterEach (fn) { + global.afterEach(function () { + const result = fn() + if (result instanceof Promise) { + waitsForPromise(() => result) + } + }) +} + +['it', 'fit', 'ffit', 'fffit'].forEach(function (name) { + module.exports[name] = function (description, fn) { + if (fn === undefined) { + global[name](description) + return + } + + global[name](description, function () { + const result = fn() + if (result instanceof Promise) { + waitsForPromise(() => result) + } + }) + } +}) + +export async function conditionPromise (condition, description = 'anonymous condition') { + const startTime = Date.now() + + while (true) { + await timeoutPromise(100) + + if (await condition()) { + return + } + + if (Date.now() - startTime > 5000) { + throw new Error('Timed out waiting on ' + description) + } + } +} + +export function timeoutPromise (timeout) { + return new Promise(function (resolve) { + global.setTimeout(resolve, timeout) + }) +} + +function waitsForPromise (fn) { + const promise = fn() + global.waitsFor('spec promise to resolve', function (done) { + promise.then(done, function (error) { + jasmine.getEnv().currentSpec.fail(error) + done() + }) + }) +} + +export function emitterEventPromise (emitter, event, timeout = 15000) { + return new Promise((resolve, reject) => { + const timeoutHandle = setTimeout(() => { + reject(new Error(`Timed out waiting for '${event}' event`)) + }, timeout) + emitter.once(event, () => { + clearTimeout(timeoutHandle) + resolve() + }) + }) +} + +export function promisify (original) { + return function (...args) { + return new Promise((resolve, reject) => { + args.push((err, ...results) => { + if (err) { + reject(err) + } else { + resolve(...results) + } + }) + + return original(...args) + }) + } +} + +export function promisifySome (obj, fnNames) { + const result = {} + for (const fnName of fnNames) { + result[fnName] = promisify(obj[fnName]) + } + return result +} diff --git a/packages/archive-view/spec/fixtures/file-icons.zip b/packages/archive-view/spec/fixtures/file-icons.zip new file mode 100644 index 0000000000000000000000000000000000000000..e16c663f6c0c5865ce7107bfff30f147c36c0544 GIT binary patch literal 824 zcmWIWW@h1H0D*&ScRauhD8a@c!;qGllUl4F8p6rI%w<;?t_sAZ72FJrEMFNJ7+6Gr zDg)s9{TNa8^TYKgrsOB3>J_AO6(COwhy~#06c;2Wrxxj@XF^Om!{hCif$5^+?j@@&~i-gidxJ`cjS(!4yqe6Zj50&M|d3^y|}$uZ-K z1__|sK|p}vts{trMG7k60BiXfn&SR)6w1Nj(`4ef**iij+H z4#gE!2s8gTUWA*89C1KXK@o??`sd@z|X#qfGB4CNbT}Qo;m9YakY56%RsYUuA zMG&(N_Mw`^0alb(qE}J^HVUF@McW3m=1zrmT0mJ428k9IBqpa8>7{3;xqG@|NpP}lZBB1D4+x4gJc+(7=0M55%xNx`GF0nuDCQWPcJ{fn~}*LYy&o* zs(=gxf(9^&<7cMgLFh4S8y>|&tLyX21IxwRJfaa(JF*K}@ z4c0m3BFzpo5S>PLGiHdw3~m4#>H{_y628bLGbF0-YX&-5HxS}v7>#T)W-K6^Tm&>3 z5ho~S=cV)>oPL}!{usn;7>#T;W_%!kYXJ!pGsh$ofS5UTAz5!s?f-mF!&SC+9)C}l6^F8{)|L7HbLb(Z zg_V`NnkslGWPAlA9xNc>Qk)`(j)0uY;xdi>IghFEyXO r{}V?R;tT!}^!?}c-vX1_;5gpHbR4hahnWjE>=Ez?cmzBGJB+{|;se6v literal 0 HcmV?d00001 diff --git a/packages/archive-view/styles/archive-view.less b/packages/archive-view/styles/archive-view.less new file mode 100644 index 000000000..f15783e1c --- /dev/null +++ b/packages/archive-view/styles/archive-view.less @@ -0,0 +1,24 @@ +@import "ui-variables"; + +.archive-editor { + background-color: @inset-panel-background-color; + overflow: auto; + contain: strict; + + .archive-container { + height: 100%; + width: 100%; + + .inset-panel { + border-width: 0; + + .panel-heading { + border-radius: 0; + } + + .archive-tree { + padding: 5px; + } + } + } +} diff --git a/yarn.lock b/yarn.lock index a7b1f2e8e..4b03e8d78 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2036,14 +2036,12 @@ aproba@^1.0.3: resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== -"archive-view@https://codeload.github.com/atom/archive-view/legacy.tar.gz/refs/tags/v0.66.0": +"archive-view@file:packages/archive-view": version "0.66.0" - resolved "https://codeload.github.com/atom/archive-view/legacy.tar.gz/refs/tags/v0.66.0#e4563bf7cf4d6916eee4a949ca260315e8b2fe06" dependencies: etch "0.9.0" - fs-plus "^3.0.0" humanize-plus "~1.8.2" - ls-archive "1.3.4" + ls-archive "https://github.com/pulsar-edit/node-ls-archive/archive/refs/tags/v1.3.1.tar.gz" temp "~0.8.1" archiver-utils@^2.1.0: @@ -6269,10 +6267,9 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -ls-archive@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ls-archive/-/ls-archive-1.3.4.tgz#52150919dab1acb094cdcef9dde9c66934a4650f" - integrity sha512-7GmjZOckV+gzm4PM1/LcWIsZIRsSkAVmIchoEf5xjquNKU0Ti5KUvGQ3dl/7VsbZIduMOPwRDXrvpo3LVJ0Pmg== +"ls-archive@https://github.com/pulsar-edit/node-ls-archive/archive/refs/tags/v1.3.1.tar.gz": + version "1.3.1" + resolved "https://github.com/pulsar-edit/node-ls-archive/archive/refs/tags/v1.3.1.tar.gz#43baa626a66f9c904548741b5bdf2f8095fbc7d9" dependencies: async "~0.2.9" colors "~0.6.2"