diff --git a/.gitignore b/.gitignore index 186d286..a8b6570 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,9 @@ # production /build +# node version manager +/.nvmrc + # misc .DS_Store .env.local @@ -24,6 +27,3 @@ npm-debug.log* yarn-debug.log* yarn-error.log* - -# plugin-zip -/plugin-zip diff --git a/.nvmrc.dist b/.nvmrc.dist new file mode 100644 index 0000000..4a41167 --- /dev/null +++ b/.nvmrc.dist @@ -0,0 +1 @@ +12.20.0 diff --git a/package.json b/package.json index f2d8cf0..3f1dbbc 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,12 @@ "react-select": "^3.1.0", "reactstrap": "^8.4.1" }, + "engines": { + "node": "12.20.0", + "npm": "6.14.8" + }, "scripts": { - "clean": "rm -rf plugin-zip && mkdir plugin-zip", + "clean": "git clean -fdxq -- ./plugin-zip/", "start": "npm run fix && node scripts/start.js", "build": "export CI=\"${CI-true}\" && npm run fix && CI=true npm run test && node scripts/build.js", "fix": "npm run translate && npm exec -- eslint --fix src/locale/lang", @@ -27,7 +31,7 @@ "translate": "node scripts/translate.js", "push-translate": "tx push -s", "pull-translate": "tx pull -a -f && npm run translate", - "build-plugin": "export GENERATE_SOURCEMAP=false && npm run clean && npm run build && node scripts/build-plugin.js" + "build-plugin": "export GENERATE_SOURCEMAP=false && npm run build && node scripts/build-plugin.js" }, "browserslist": { "production": [ diff --git a/plugin-zip/.gitignore b/plugin-zip/.gitignore new file mode 100644 index 0000000..1fee094 --- /dev/null +++ b/plugin-zip/.gitignore @@ -0,0 +1,12 @@ +# plugin-zip (build artefact folder) +# +# build output directory for the plugin zip archives +# +!/.gitignore + +# zips +/*.zip + +# zip backups +/*.zip~ +/*.zip.~?*~ diff --git a/scripts/build-plugin.js b/scripts/build-plugin.js index 34e663b..e5079c9 100644 --- a/scripts/build-plugin.js +++ b/scripts/build-plugin.js @@ -8,6 +8,13 @@ const config = { dir: paths.appBuild + '/static/' }; +// verify zip output path against the file-system +const zipPathFromZipFile = (file) => path.join(paths.zipPath, file); +if (!fs.existsSync(zipPathFromZipFile('.'))) { + console.error(`fatal: paths.zipPath: '${paths.zipPath}' does not exists`); + process.exit(1); +} + const zip = new JSZip(); // build file @@ -49,7 +56,19 @@ zip.file('task/info.json', JSON.stringify(jsonFileContent, null, ' ')); zip.generateAsync({type: 'nodebuffer'}).then(function(content) { let zip = `${pluginInfoContent.name}-${pluginInfoContent.version}.zip`; - fs.writeFile(paths.zipPath + '/' + zip, content, function(err) { + { /* do backups similar to cp(1) --backup=numbered */ + const zipPath = zipPathFromZipFile(zip); + let number = 1; + let bakFile = zipPath + `.~${number}~`; + if (fs.existsSync(zipPath)) { + while (fs.existsSync(bakFile)) { + bakFile = zipPath + `.~${number++}~`; + } + console.log(`overwriting '${zip}' (backup: '${bakFile.replace(/^.*\/([^/]+)$/, '$1')}')`); + fs.renameSync(zipPath , bakFile); + } + } + fs.writeFile(zipPathFromZipFile(zip), content, function(err) { if (err) { console.log(zip + ' failed'); console.log(err); diff --git a/src/index.js b/src/index.js index eebcd94..8bfc164 100644 --- a/src/index.js +++ b/src/index.js @@ -5,3 +5,12 @@ import './setting'; ReactDOM.render(, document.getElementById('root')); +/** + * plugin development window.app shim (dtable-ui) + * + * @link https://docs.seatable.io/published/dtable-sdk/dtable-ui.md + */ +window.app = window.app ? window.app : {}; +window.app.expandRow = window.app.expandRow || ((row, rowTable) => { + console.log('dtable-ui shim: app.expandRow', [row, rowTable]); +});