diff --git a/package.json b/package.json index 6953d3973..5b9e72030 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,8 @@ "resolutions": { "tslib": "^2.3.1", "core-js": "3.22.4", - "vue-cli-plugin-apollo/graphql": "^15" + "vue-cli-plugin-apollo/graphql": "^15", + "typescript": "^4.5.4" }, "config": { "commitizen": { diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 9cf5ae9f2..57931bb0d 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -68,6 +68,8 @@ "@mdi/font": "^5.8.55", "@rushstack/eslint-patch": "^1.1.3", "@types/lodash": "^4.14.180", + "@types/mixpanel-browser": "^2.38.0", + "@types/node": "^17.0.43", "@typescript-eslint/eslint-plugin": "^5.21.0", "@typescript-eslint/parser": "^5.21.0", "@vue/cli": "^4.5.17", diff --git a/packages/frontend/src/embed/EmbedViewer.vue b/packages/frontend/src/embed/EmbedViewer.vue index 9b0cdcaef..0c3ff1c90 100644 --- a/packages/frontend/src/embed/EmbedViewer.vue +++ b/packages/frontend/src/embed/EmbedViewer.vue @@ -1,138 +1,66 @@ - - - - - - - - Powered by Speckle - - - - - - - - mdi-menu - - - - - - mdi-open-in-new - - - - - - - - + + + - - - - - mdi-play + class="elevation-4 hover-tada" + @click="load()" + > + mdi-play + mdi-loading - - - - - - - - - - - + + - diff --git a/packages/frontend/src/embed/EmbedViewerCore.vue b/packages/frontend/src/embed/EmbedViewerCore.vue new file mode 100644 index 000000000..00c9a6430 --- /dev/null +++ b/packages/frontend/src/embed/EmbedViewerCore.vue @@ -0,0 +1,269 @@ + + + + + + + + + + Powered by Speckle + + + + + + + + mdi-menu + + + + + + mdi-open-in-new + + + + + + + + + + + + + + + + + + + mdi-close + + + + + + + + + + + + + + + + + + diff --git a/packages/frontend/src/embed/embedApp.js b/packages/frontend/src/embed/embedApp.js index 1cbb4b6b5..ca57af245 100644 --- a/packages/frontend/src/embed/embedApp.js +++ b/packages/frontend/src/embed/embedApp.js @@ -1,27 +1,13 @@ import Vue from 'vue' +import '@/vueBootstrapper' + import App from './EmbedApp.vue' import vuetify from './embedVuetify' import router from './embedRouter' -// process.env.NODE_ENV is injected by Webpack -// eslint-disable-next-line no-undef -Vue.config.productionTip = process.env.NODE_ENV === 'development' - -import VueMixpanel from 'vue-mixpanel' -Vue.use(VueMixpanel, { - token: 'acd87c5a50b56df91a795e999812a3a4', - config: { - // eslint-disable-next-line camelcase - api_host: 'https://analytics.speckle.systems' - } -}) - import '@/plugins/helpers' import store from '@/main/store' -import PortalVue from 'portal-vue' -Vue.use(PortalVue) - new Vue({ router, vuetify, diff --git a/packages/frontend/src/main/app.js b/packages/frontend/src/main/app.js index 440263007..d89bdef04 100644 --- a/packages/frontend/src/main/app.js +++ b/packages/frontend/src/main/app.js @@ -1,7 +1,5 @@ import Vue from 'vue' - -// Event hub -Vue.prototype.$eventHub = new Vue() +import '@/vueBootstrapper' import App from '@/main/App.vue' import store from '@/main/store' @@ -16,13 +14,6 @@ import { import router from '@/main/router/index' import vuetify from '@/plugins/vuetify' -// process.env.NODE_ENV is injected by Webpack -// eslint-disable-next-line no-undef -Vue.config.productionTip = process.env.NODE_ENV === 'development' - -import PortalVue from 'portal-vue' -Vue.use(PortalVue) - import VueTimeago from 'vue-timeago' Vue.use(VueTimeago, { locale: 'en' }) @@ -37,22 +28,6 @@ import 'vue2-perfect-scrollbar/dist/vue2-perfect-scrollbar.css' Vue.use(PerfectScrollbar) -import VTooltip from 'v-tooltip' -Vue.use(VTooltip, { - defaultDelay: 300, - defaultBoundariesElement: document.body, - defaultHtml: false -}) - -import VueMixpanel from 'vue-mixpanel' -Vue.use(VueMixpanel, { - token: 'acd87c5a50b56df91a795e999812a3a4', - config: { - // eslint-disable-next-line camelcase - api_host: 'https://analytics.speckle.systems' - } -}) - // Async HistogramSlider load Vue.component('HistogramSlider', async () => { await import( diff --git a/packages/frontend/src/type-augmentations/mixpanel.d.ts b/packages/frontend/src/type-augmentations/mixpanel.d.ts new file mode 100644 index 000000000..cdcd74920 --- /dev/null +++ b/packages/frontend/src/type-augmentations/mixpanel.d.ts @@ -0,0 +1,6 @@ +declare module 'vue-mixpanel' { + declare const test: string + declare const plugin: import('vue').PluginFunction + export default plugin + export { test } +} diff --git a/packages/frontend/src/type-augmentations/shims-tsx.d.ts b/packages/frontend/src/type-augmentations/shims-tsx.d.ts deleted file mode 100644 index 68ad8a3aa..000000000 --- a/packages/frontend/src/type-augmentations/shims-tsx.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* eslint-disable @typescript-eslint/no-empty-interface */ -import Vue, { VNode } from 'vue' - -declare global { - namespace JSX { - interface Element extends VNode {} - interface ElementClass extends Vue {} - interface IntrinsicElements { - [elem: string]: unknown - } - } -} diff --git a/packages/frontend/src/type-augmentations/vue.d.ts b/packages/frontend/src/type-augmentations/vue.d.ts new file mode 100644 index 000000000..e7d63c56c --- /dev/null +++ b/packages/frontend/src/type-augmentations/vue.d.ts @@ -0,0 +1,7 @@ +declare module 'vue/types/vue' { + export interface Vue { + $mixpanel: import('mixpanel-browser').OverridedMixpanel + } +} + +export {} diff --git a/packages/frontend/src/type-augmentations/window.d.ts b/packages/frontend/src/type-augmentations/window.d.ts new file mode 100644 index 000000000..73045cfe9 --- /dev/null +++ b/packages/frontend/src/type-augmentations/window.d.ts @@ -0,0 +1,10 @@ +export {} + +declare global { + interface Window { + /** + * Initialized in SpeckleViewer.vue + */ + __viewer?: import('@speckle/viewer').Viewer + } +} diff --git a/packages/frontend/src/vueBootstrapper.ts b/packages/frontend/src/vueBootstrapper.ts new file mode 100644 index 000000000..219c35e8d --- /dev/null +++ b/packages/frontend/src/vueBootstrapper.ts @@ -0,0 +1,30 @@ +import Vue from 'vue' +import VTooltip from 'v-tooltip' +import VueMixpanel from 'vue-mixpanel' +import PortalVue from 'portal-vue' + +/** + * Global Vue bootstrapping that is used in all of the frontend apps (main/embed) + */ + +// process.env.NODE_ENV is injected by Webpack +Vue.config.productionTip = process.env.NODE_ENV === 'development' + +Vue.use(VTooltip, { + defaultDelay: 300, + defaultBoundariesElement: document.body, + defaultHtml: false +}) + +Vue.use(VueMixpanel, { + token: 'acd87c5a50b56df91a795e999812a3a4', + config: { + // eslint-disable-next-line camelcase + api_host: 'https://analytics.speckle.systems' + } +}) + +Vue.use(PortalVue) + +// Event hub +Vue.prototype.$eventHub = new Vue() diff --git a/packages/frontend/tsconfig.json b/packages/frontend/tsconfig.json index 807d8e2de..efb413669 100644 --- a/packages/frontend/tsconfig.json +++ b/packages/frontend/tsconfig.json @@ -11,6 +11,7 @@ "allowSyntheticDefaultImports": true, "sourceMap": true, "allowJs": true, + "noEmit": true, "baseUrl": ".", "paths": { "@/*": ["src/*"] @@ -21,7 +22,10 @@ "vue-apollo-smart-ops", "vue-infinite-loading", "type-fest", - "vue" + "vue", + "@types/node", + "@types/mixpanel-browser", + "vuetify" ] }, "include": [ diff --git a/packages/preview-service/package.json b/packages/preview-service/package.json index 92dbb9414..47f854745 100644 --- a/packages/preview-service/package.json +++ b/packages/preview-service/package.json @@ -14,7 +14,7 @@ "node": ">=14.0.0 <17.0.0" }, "scripts": { - "dev": "PG_CONNECTION_STRING=postgresql://localhost:5432/speckle2_dev DEBUG='preview-service:*' nodemon --trace-deprecation ./bin/www", + "dev": "DEBUG='preview-service:*' nodemon --trace-deprecation ./bin/www", "build": "webpack --env dev --config webpack.config.render_page.js && webpack --env build --config webpack.config.render_page.js", "lint": "eslint . --ext .js,.ts" }, diff --git a/packages/viewer/.babelrc b/packages/viewer/.babelrc deleted file mode 100644 index fa85f7fcb..000000000 --- a/packages/viewer/.babelrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "presets": [ - [ - "@babel/preset-env", - { - "useBuiltIns": "entry", - "corejs": "3", - "targets": { - "node": "12" - } - } - ] - ], - "ignore": ["node_modules/**/*"] -} diff --git a/packages/viewer/.eslintrc.js b/packages/viewer/.eslintrc.js index ae7b546f7..63ad79723 100644 --- a/packages/viewer/.eslintrc.js +++ b/packages/viewer/.eslintrc.js @@ -1,3 +1,5 @@ +const path = require('path') + /** * Extends repo root config, only put changes here that are scoped to this specific package * (if you're already are - evaluate whether you really need package scoped linting rules) @@ -8,8 +10,12 @@ const config = { env: { browser: true }, + parser: '@babel/eslint-parser', parserOptions: { - sourceType: 'module' + sourceType: 'module', + babelOptions: { + configFile: path.resolve(__dirname, './babel.config.js') + } }, rules: { 'no-console': ['warn', { allow: ['warn', 'error'] }] diff --git a/packages/viewer/babel.config.js b/packages/viewer/babel.config.js new file mode 100644 index 000000000..4ede02137 --- /dev/null +++ b/packages/viewer/babel.config.js @@ -0,0 +1,15 @@ +module.exports = { + presets: [ + [ + '@babel/preset-env', + { + useBuiltIns: 'entry', + corejs: '3', + targets: { + node: '11' + } + } + ] + ], + ignore: ['node_modules/**/*'] +} diff --git a/packages/viewer/package.json b/packages/viewer/package.json index e4695a9e7..f1c419f71 100644 --- a/packages/viewer/package.json +++ b/packages/viewer/package.json @@ -49,6 +49,7 @@ }, "devDependencies": { "@babel/core": "^7.18.2", + "@babel/eslint-parser": "^7.18.2", "@rollup/plugin-babel": "^5.3.1", "@types/three": "^0.136.0", "@typescript-eslint/eslint-plugin": "^5.21.0", diff --git a/packages/viewer/src/modules/SceneObjectManager.js b/packages/viewer/src/modules/SceneObjectManager.js index 2ee16093a..a3e8e374c 100644 --- a/packages/viewer/src/modules/SceneObjectManager.js +++ b/packages/viewer/src/modules/SceneObjectManager.js @@ -13,10 +13,11 @@ import { getConversionFactor } from './converter/Units' * Manages objects and provides some convenience methods to focus on the entire scene, or one specific object. */ export default class SceneObjectManager { + views = [] + constructor(viewer, skipPostLoad = false) { this.viewer = viewer this.scene = viewer.scene - this.views = [] this.sceneObjects = new SceneObjects(viewer) diff --git a/packages/viewer/src/modules/Viewer.ts b/packages/viewer/src/modules/Viewer.ts index 4fa18bc9a..9d9a2b32d 100644 --- a/packages/viewer/src/modules/Viewer.ts +++ b/packages/viewer/src/modules/Viewer.ts @@ -270,11 +270,7 @@ export class Viewer extends EventEmitter implements IViewer { this.cameraHandler.toggleCameras() } - public async loadObject( - url: string, - token: string | undefined, - enableCaching = true - ) { + public async loadObject(url: string, token?: string, enableCaching = true) { try { if (++this.inProgressOperations === 1) (this as EventEmitter).emit('busy', true) diff --git a/yarn.lock b/yarn.lock index 4f5530508..04fd5d377 100644 --- a/yarn.lock +++ b/yarn.lock @@ -310,6 +310,20 @@ __metadata: languageName: node linkType: hard +"@babel/eslint-parser@npm:^7.18.2": + version: 7.18.2 + resolution: "@babel/eslint-parser@npm:7.18.2" + dependencies: + eslint-scope: ^5.1.1 + eslint-visitor-keys: ^2.1.0 + semver: ^6.3.0 + peerDependencies: + "@babel/core": ">=7.11.0" + eslint: ^7.5.0 || ^8.0.0 + checksum: dc9328cf3304b25c9029682e6b6196761e18d3ab80d66c3085a69c6f240fa2db91b824a61672e94139e73683b7ceeefe9ff58acac1ee89fe73274007b16e43d5 + languageName: node + linkType: hard + "@babel/generator@npm:7.17.10, @babel/generator@npm:^7.17.10": version: 7.17.10 resolution: "@babel/generator@npm:7.17.10" @@ -3906,6 +3920,8 @@ __metadata: "@tiptap/vue-2": ^2.0.0-beta.79 "@tryghost/content-api": ^1.5.12 "@types/lodash": ^4.14.180 + "@types/mixpanel-browser": ^2.38.0 + "@types/node": ^17.0.43 "@typescript-eslint/eslint-plugin": ^5.21.0 "@typescript-eslint/parser": ^5.21.0 "@vue/cli": ^4.5.17 @@ -4134,6 +4150,7 @@ __metadata: resolution: "@speckle/viewer@workspace:packages/viewer" dependencies: "@babel/core": ^7.18.2 + "@babel/eslint-parser": ^7.18.2 "@rollup/plugin-babel": ^5.3.1 "@speckle/objectloader": "workspace:^" "@types/three": ^0.136.0 @@ -4785,6 +4802,13 @@ __metadata: languageName: node linkType: hard +"@types/mixpanel-browser@npm:^2.38.0": + version: 2.38.0 + resolution: "@types/mixpanel-browser@npm:2.38.0" + checksum: 1ade271188446005644cf10b65af554a9a75bd2008b827db4cdcfb2eedf858e2426a4d3d21ccf5b0a25a8590f8c3095da25549cfb7765077002e03e64afa9f0a + languageName: node + linkType: hard + "@types/mocha@npm:^7.0.2": version: 7.0.2 resolution: "@types/mocha@npm:7.0.2" @@ -4823,6 +4847,13 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^17.0.43": + version: 17.0.43 + resolution: "@types/node@npm:17.0.43" + checksum: 7fd84b1e37dc406c1c73a1461ccd6a1a38a5a335563788dd25e0aa75476d6948f815d0e9e4c2201f785a36a72269e6aaf0d851ca75c1e44b92e3a9d504e04a1e + languageName: node + linkType: hard + "@types/normalize-package-data@npm:^2.4.0": version: 2.4.1 resolution: "@types/normalize-package-data@npm:2.4.1" @@ -12329,7 +12360,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^2.0.0": +"eslint-visitor-keys@npm:^2.0.0, eslint-visitor-keys@npm:^2.1.0": version: 2.1.0 resolution: "eslint-visitor-keys@npm:2.1.0" checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d @@ -25896,7 +25927,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^4.4.3, typescript@npm:^4.5.4": +"typescript@npm:^4.5.4": version: 4.6.4 resolution: "typescript@npm:4.6.4" bin: @@ -25906,27 +25937,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^4.4.4": - version: 4.7.3 - resolution: "typescript@npm:4.7.3" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: fd13a1ce53790a36bb8350e1f5e5e384b5f6cb9b0635114a6d01d49cb99916abdcfbc13c7521cdae2f2d3f6d8bc4a8ae7625edf645a04ee940588cd5e7597b2f - languageName: node - linkType: hard - -"typescript@npm:~4.1.5": - version: 4.1.6 - resolution: "typescript@npm:4.1.6" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 54aed909f94b16178c8a8d8911871b4e1c04454a3e6c82166715e28083e7ce6271e4d1df6f82c89544a4759b07aec780785032534e9c93b254e2107a18712c05 - languageName: node - linkType: hard - -"typescript@patch:typescript@^4.4.3#~builtin, typescript@patch:typescript@^4.5.4#~builtin": +"typescript@patch:typescript@npm%3A^4.5.4#~builtin": version: 4.6.4 resolution: "typescript@patch:typescript@npm%3A4.6.4#~builtin::version=4.6.4&hash=bda367" bin: @@ -25936,26 +25947,6 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@^4.4.4#~builtin": - version: 4.7.3 - resolution: "typescript@patch:typescript@npm%3A4.7.3#~builtin::version=4.7.3&hash=bda367" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 8257ce7ecbbf9416da60045a76a99d473698ca9e973fa0ddab7137cacb1587255431176cbbcc801a650938c4dc8109ab88355774829a714fabe56a53a2fe4524 - languageName: node - linkType: hard - -"typescript@patch:typescript@~4.1.5#~builtin": - version: 4.1.6 - resolution: "typescript@patch:typescript@npm%3A4.1.6#~builtin::version=4.1.6&hash=bda367" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 3bd9915f236817e4e2d32dd0d90e8902875929f014bb87a478000e32adda91d12f0425931ee6f9d6a2bc7d0c9242588fcee1050ac294497dfabf27d3d73b335c - languageName: node - linkType: hard - "typical@npm:^4.0.0": version: 4.0.0 resolution: "typical@npm:4.0.0"