From 9613969ffcf9979d1c2d3719317f8cf73de994b9 Mon Sep 17 00:00:00 2001 From: Evan You Date: Sun, 28 Mar 2021 23:36:36 -0400 Subject: [PATCH] workflow(sfc-playground): share and download buttons --- packages/global.d.ts | 7 ++- packages/sfc-playground/package.json | 4 ++ packages/sfc-playground/src/App.vue | 14 ++++- packages/sfc-playground/src/Header.vue | 62 +++++++++++++++++++ .../sfc-playground/src/download/download.ts | 31 ++++++++++ .../src/download/template/README.md | 14 +++++ .../src/download/template/index.html | 13 ++++ .../src/download/template/main.js | 4 ++ .../src/download/template/package.json | 17 +++++ .../src/download/template/vite.config.js | 7 +++ .../src/editor/FileSelector.vue | 5 -- packages/sfc-playground/src/output/Output.vue | 5 -- .../sfc-playground/src/output/srcdoc.html | 3 +- packages/sfc-playground/src/store.ts | 34 +++++++--- yarn.lock | 37 +++++++++++ 15 files changed, 232 insertions(+), 25 deletions(-) create mode 100644 packages/sfc-playground/src/download/download.ts create mode 100644 packages/sfc-playground/src/download/template/README.md create mode 100644 packages/sfc-playground/src/download/template/index.html create mode 100644 packages/sfc-playground/src/download/template/main.js create mode 100644 packages/sfc-playground/src/download/template/package.json create mode 100644 packages/sfc-playground/src/download/template/vite.config.js diff --git a/packages/global.d.ts b/packages/global.d.ts index e6239ffd0..8c6c57d8b 100644 --- a/packages/global.d.ts +++ b/packages/global.d.ts @@ -27,5 +27,10 @@ declare module '*.vue' { } declare module '*?raw' { - + const content: string + export default content +} + +declare module 'file-saver' { + export function saveAs(blob: any, name: any): void } diff --git a/packages/sfc-playground/package.json b/packages/sfc-playground/package.json index 5d3fed8f9..84e7f7d5b 100644 --- a/packages/sfc-playground/package.json +++ b/packages/sfc-playground/package.json @@ -19,5 +19,9 @@ "@vitejs/plugin-vue": "^1.2.0", "codemirror": "^5.60.0", "vite": "^2.1.3" + }, + "dependencies": { + "file-saver": "^2.0.5", + "jszip": "^3.6.0" } } diff --git a/packages/sfc-playground/src/App.vue b/packages/sfc-playground/src/App.vue index f39ec3ab1..d2f169321 100644 --- a/packages/sfc-playground/src/App.vue +++ b/packages/sfc-playground/src/App.vue @@ -22,8 +22,8 @@ import Output from './output/Output.vue' \ No newline at end of file + +button { + border: none; + outline: none; + cursor: pointer; + margin: 0; + background-color: transparent; +} + diff --git a/packages/sfc-playground/src/Header.vue b/packages/sfc-playground/src/Header.vue index 1a1ecc8f4..bdcc02a36 100644 --- a/packages/sfc-playground/src/Header.vue +++ b/packages/sfc-playground/src/Header.vue @@ -1,9 +1,59 @@ + + diff --git a/packages/sfc-playground/src/download/download.ts b/packages/sfc-playground/src/download/download.ts new file mode 100644 index 000000000..91cdfd00f --- /dev/null +++ b/packages/sfc-playground/src/download/download.ts @@ -0,0 +1,31 @@ +import { exportFiles } from '../store' +import { saveAs } from 'file-saver' + +import index from './template/index.html?raw' +import main from './template/main.js?raw' +import pkg from './template/package.json?raw' +import config from './template/vite.config.js?raw' +import readme from './template/README.md?raw' + +export async function downloadProject() { + const { default: JSZip } = await import('jszip') + const zip = new JSZip() + + // basic structure + zip.file('index.html', index) + zip.file('package.json', pkg) + zip.file('vite.config.js', config) + zip.file('README.md', readme) + + // project src + const src = zip.folder('src')! + src.file('main.js', main) + + const files = exportFiles() + for (const file in files) { + src.file(file, files[file]) + } + + const blob = await zip.generateAsync({ type: 'blob' }) + saveAs(blob, 'vue-project.zip') +} diff --git a/packages/sfc-playground/src/download/template/README.md b/packages/sfc-playground/src/download/template/README.md new file mode 100644 index 000000000..39c47d255 --- /dev/null +++ b/packages/sfc-playground/src/download/template/README.md @@ -0,0 +1,14 @@ +# Vite Vue Starter + +This is a project template using [Vite](https://vitejs.dev/). It requires [Node.js](https://nodejs.org) v12+. + +To start: + +```sh +npm install +npm run dev + +# if using yarn: +yarn +yarn dev +``` diff --git a/packages/sfc-playground/src/download/template/index.html b/packages/sfc-playground/src/download/template/index.html new file mode 100644 index 000000000..030a6ff51 --- /dev/null +++ b/packages/sfc-playground/src/download/template/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite App + + +
+ + + diff --git a/packages/sfc-playground/src/download/template/main.js b/packages/sfc-playground/src/download/template/main.js new file mode 100644 index 000000000..01433bca2 --- /dev/null +++ b/packages/sfc-playground/src/download/template/main.js @@ -0,0 +1,4 @@ +import { createApp } from 'vue' +import App from './App.vue' + +createApp(App).mount('#app') diff --git a/packages/sfc-playground/src/download/template/package.json b/packages/sfc-playground/src/download/template/package.json new file mode 100644 index 000000000..6bede6ce6 --- /dev/null +++ b/packages/sfc-playground/src/download/template/package.json @@ -0,0 +1,17 @@ +{ + "name": "vite-vue-starter", + "version": "0.0.0", + "scripts": { + "dev": "vite", + "build": "vite build", + "serve": "vite preview" + }, + "dependencies": { + "vue": "^3.0.9" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^1.1.5", + "@vue/compiler-sfc": "^3.0.9", + "vite": "^2.1.3" + } +} \ No newline at end of file diff --git a/packages/sfc-playground/src/download/template/vite.config.js b/packages/sfc-playground/src/download/template/vite.config.js new file mode 100644 index 000000000..315212d69 --- /dev/null +++ b/packages/sfc-playground/src/download/template/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue()] +}) diff --git a/packages/sfc-playground/src/editor/FileSelector.vue b/packages/sfc-playground/src/editor/FileSelector.vue index 23c6d4f36..639b0ec18 100644 --- a/packages/sfc-playground/src/editor/FileSelector.vue +++ b/packages/sfc-playground/src/editor/FileSelector.vue @@ -101,14 +101,9 @@ function doneAddFile() { padding-left: 0; } .add { - margin: 0; font-size: 20px; font-family: var(--font-code); color: #999; - border: none; - outline: none; - background-color: transparent; - cursor: pointer; vertical-align: middle; margin-left: 6px; } diff --git a/packages/sfc-playground/src/output/Output.vue b/packages/sfc-playground/src/output/Output.vue index 0027cdaed..87b189094 100644 --- a/packages/sfc-playground/src/output/Output.vue +++ b/packages/sfc-playground/src/output/Output.vue @@ -38,15 +38,10 @@ const mode = ref('preview') background-color: white; } .tab-buttons button { - margin: 0; font-size: 13px; font-family: var(--font-code); - border: none; - outline: none; - background-color: transparent; padding: 8px 16px 6px; text-transform: uppercase; - cursor: pointer; color: #999; box-sizing: border-box; } diff --git a/packages/sfc-playground/src/output/srcdoc.html b/packages/sfc-playground/src/output/srcdoc.html index 063a522d4..e389e39aa 100644 --- a/packages/sfc-playground/src/output/srcdoc.html +++ b/packages/sfc-playground/src/output/srcdoc.html @@ -97,7 +97,8 @@ ['clear', 'log', 'info', 'dir', 'warn', 'error', 'table'].forEach((level) => { const original = console[level]; console[level] = (...args) => { - if (String(args[0]).includes('You are running a development build of Vue')) { + const msg = String(args[0]) + if (msg.includes('You are running a development build of Vue')) { return } const stringifiedArgs = stringify(args); diff --git a/packages/sfc-playground/src/store.ts b/packages/sfc-playground/src/store.ts index 0eb121b10..2328d52af 100644 --- a/packages/sfc-playground/src/store.ts +++ b/packages/sfc-playground/src/store.ts @@ -7,8 +7,6 @@ import { rewriteDefault } from '@vue/compiler-sfc' -const STORAGE_KEY = 'vue-sfc-playground' - const welcomeCode = `