From b8062288c58421d708e0f99921224f40e87711b1 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Thu, 15 Feb 2024 12:39:26 -0800 Subject: [PATCH 1/6] moves lti-course-manager into monorepo. --- .eslintrc.js | 1 + .github/dependabot.yml | 96 +- .github/workflows/ci.yml | 5 +- .github/workflows/deploy-production.yml | 52 +- .github/workflows/deploy-staging.yml | 28 +- .watchmanconfig | 5 +- LICENSE.md | 9 + package.json | 2 + packages/lti-course-manager/.ember-cli | 15 + packages/lti-course-manager/.gitignore | 26 + .../app/adapters/application.js | 1 + packages/lti-course-manager/app/app.js | 17 + .../app/components/.gitkeep | 0 .../app/controllers/.gitkeep | 0 .../app/deprecation-workflow.js | 20 + .../lti-course-manager/app/helpers/.gitkeep | 0 .../app/helpers/page-title.js | 9 + packages/lti-course-manager/app/index.html | 25 + .../lti-course-manager/app/models/.gitkeep | 0 packages/lti-course-manager/app/router.js | 67 + .../lti-course-manager/app/routes/.gitkeep | 0 .../app/routes/application.js | 34 + .../app/routes/login-error.js | 3 + .../lti-course-manager/app/routes/login.js | 61 + .../app/services/server-variables.js | 19 + .../app/session-stores/application.js | 5 + .../lti-course-manager/app/styles/app.scss | 1 + .../app/templates/application.hbs | 4 + .../app/templates/login-error.hbs | 6 + .../app/templates/login.hbs | 1 + .../config/dependency-lint.js | 8 + packages/lti-course-manager/config/deploy.js | 39 + .../config/ember-cli-update.json | 21 + .../lti-course-manager/config/environment.js | 84 + .../config/optional-features.json | 6 + packages/lti-course-manager/config/targets.js | 16 + .../lti-course-manager/ember-cli-build.js | 29 + .../lib/ilios-error/index.js | 156 + .../lib/ilios-error/package.json | 6 + .../lib/ilios-loading/index.js | 91 + .../lib/ilios-loading/package.json | 9 + .../public/remove-loader-tests.js | 2 + .../lib/images/sunburst-icon.svg | 7 + .../lib/images/sunburst.svg | 6 + packages/lti-course-manager/mirage/config.js | 1 + packages/lti-course-manager/package.json | 78 + .../lti-course-manager/public/crossdomain.xml | 15 + .../lti-course-manager/public/favicon.ico | Bin 0 -> 9326 bytes .../public/fontawesome/brands.svg | 1460 ++++++ .../public/fontawesome/regular.svg | 497 ++ .../public/fontawesome/solid.svg | 4178 +++++++++++++++++ .../lti-course-manager/public/ilios-icon.png | Bin 0 -> 7053 bytes packages/lti-course-manager/public/robots.txt | 3 + packages/lti-course-manager/testem.js | 22 + .../lti-course-manager/tests/helpers/index.js | 42 + packages/lti-course-manager/tests/index.html | 39 + .../tests/integration/.gitkeep | 0 .../integration/helpers/page-title-test.js | 14 + .../lti-course-manager/tests/test-helper.js | 12 + .../lti-course-manager/tests/unit/.gitkeep | 0 .../tests/unit/adapters/application-test.js | 12 + .../tests/unit/routes/application-test.js | 11 + .../tests/unit/routes/login-error-test.js | 11 + .../tests/unit/routes/login-test.js | 11 + .../unit/services/server-variables-test.js | 12 + pnpm-lock.yaml | 132 + pnpm-workspace.yaml | 2 + 67 files changed, 7452 insertions(+), 92 deletions(-) create mode 100644 LICENSE.md create mode 100644 packages/lti-course-manager/.ember-cli create mode 100644 packages/lti-course-manager/.gitignore create mode 100644 packages/lti-course-manager/app/adapters/application.js create mode 100644 packages/lti-course-manager/app/app.js create mode 100644 packages/lti-course-manager/app/components/.gitkeep create mode 100644 packages/lti-course-manager/app/controllers/.gitkeep create mode 100644 packages/lti-course-manager/app/deprecation-workflow.js create mode 100644 packages/lti-course-manager/app/helpers/.gitkeep create mode 100644 packages/lti-course-manager/app/helpers/page-title.js create mode 100644 packages/lti-course-manager/app/index.html create mode 100644 packages/lti-course-manager/app/models/.gitkeep create mode 100644 packages/lti-course-manager/app/router.js create mode 100644 packages/lti-course-manager/app/routes/.gitkeep create mode 100644 packages/lti-course-manager/app/routes/application.js create mode 100644 packages/lti-course-manager/app/routes/login-error.js create mode 100644 packages/lti-course-manager/app/routes/login.js create mode 100644 packages/lti-course-manager/app/services/server-variables.js create mode 100644 packages/lti-course-manager/app/session-stores/application.js create mode 100644 packages/lti-course-manager/app/styles/app.scss create mode 100644 packages/lti-course-manager/app/templates/application.hbs create mode 100644 packages/lti-course-manager/app/templates/login-error.hbs create mode 100644 packages/lti-course-manager/app/templates/login.hbs create mode 100644 packages/lti-course-manager/config/dependency-lint.js create mode 100644 packages/lti-course-manager/config/deploy.js create mode 100644 packages/lti-course-manager/config/ember-cli-update.json create mode 100644 packages/lti-course-manager/config/environment.js create mode 100644 packages/lti-course-manager/config/optional-features.json create mode 100644 packages/lti-course-manager/config/targets.js create mode 100644 packages/lti-course-manager/ember-cli-build.js create mode 100644 packages/lti-course-manager/lib/ilios-error/index.js create mode 100644 packages/lti-course-manager/lib/ilios-error/package.json create mode 100644 packages/lti-course-manager/lib/ilios-loading/index.js create mode 100644 packages/lti-course-manager/lib/ilios-loading/package.json create mode 100644 packages/lti-course-manager/lib/ilios-loading/public/remove-loader-tests.js create mode 100644 packages/lti-course-manager/lib/images/sunburst-icon.svg create mode 100644 packages/lti-course-manager/lib/images/sunburst.svg create mode 100644 packages/lti-course-manager/mirage/config.js create mode 100644 packages/lti-course-manager/package.json create mode 100644 packages/lti-course-manager/public/crossdomain.xml create mode 100644 packages/lti-course-manager/public/favicon.ico create mode 100644 packages/lti-course-manager/public/fontawesome/brands.svg create mode 100644 packages/lti-course-manager/public/fontawesome/regular.svg create mode 100644 packages/lti-course-manager/public/fontawesome/solid.svg create mode 100644 packages/lti-course-manager/public/ilios-icon.png create mode 100644 packages/lti-course-manager/public/robots.txt create mode 100644 packages/lti-course-manager/testem.js create mode 100644 packages/lti-course-manager/tests/helpers/index.js create mode 100644 packages/lti-course-manager/tests/index.html create mode 100644 packages/lti-course-manager/tests/integration/.gitkeep create mode 100644 packages/lti-course-manager/tests/integration/helpers/page-title-test.js create mode 100644 packages/lti-course-manager/tests/test-helper.js create mode 100644 packages/lti-course-manager/tests/unit/.gitkeep create mode 100644 packages/lti-course-manager/tests/unit/adapters/application-test.js create mode 100644 packages/lti-course-manager/tests/unit/routes/application-test.js create mode 100644 packages/lti-course-manager/tests/unit/routes/login-error-test.js create mode 100644 packages/lti-course-manager/tests/unit/routes/login-test.js create mode 100644 packages/lti-course-manager/tests/unit/services/server-variables-test.js diff --git a/.eslintrc.js b/.eslintrc.js index 8121a7c64f..c9b1051c66 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -45,6 +45,7 @@ module.exports = { './packages/*/tests/dummy/config/**/*.js', './packages/frontend/lib/*/index.js', './packages/frontend/testem.browserstack.js', + './packages/lti-course-manager/lib/*/index.js', './packages/lti-dashboard/lib/*/index.js', './packages/test-app/testem.browserstack.js', ], diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 62215c3d9e..625eca0a83 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,51 +1,51 @@ version: 2 updates: -- package-ecosystem: github-actions - directory: "/" - schedule: - interval: daily + - package-ecosystem: github-actions + directory: "/" + schedule: + interval: daily -- package-ecosystem: npm - directory: "/" - schedule: - interval: daily - time: "02:30" - timezone: America/Los_Angeles - open-pull-requests-limit: 10 - groups: - embroider: - patterns: - - "@embroider/*" - ignore: - - dependency-name: "@babel/core" - - dependency-name: "@babel/eslint-parser" - - dependency-name: "@babel/plugin-proposal-decorators" - - dependency-name: "@ember/optional-features" - - dependency-name: "@ember/string" - - dependency-name: "@ember/test-helpers" - - dependency-name: "@glimmer/component" - - dependency-name: "@glimmer/tracking" - - dependency-name: broccoli-asset-rev - - dependency-name: ember-auto-import - - dependency-name: ember-cli - - dependency-name: ember-cli-app-version - - dependency-name: ember-cli-babel - - dependency-name: ember-cli-clean-css - - dependency-name: ember-cli-dependency-checker - - dependency-name: ember-cli-htmlbars - - dependency-name: ember-cli-inject-live-reload - - dependency-name: ember-cli-sri - - dependency-name: ember-cli-terser - - dependency-name: ember-data - - dependency-name: ember-fetch - - dependency-name: ember-load-initializers - - dependency-name: ember-modifier - - dependency-name: ember-page-title - - dependency-name: ember-qunit - - dependency-name: ember-resolver - - dependency-name: ember-source - - dependency-name: ember-welcome-page - - dependency-name: qunit - - dependency-name: qunit-dom - - dependency-name: tracked-built-ins - - dependency-name: webpack + - package-ecosystem: npm + directory: "/" + schedule: + interval: daily + time: "02:30" + timezone: America/Los_Angeles + open-pull-requests-limit: 10 + groups: + embroider: + patterns: + - "@embroider/*" + ignore: + - dependency-name: "@babel/core" + - dependency-name: "@babel/eslint-parser" + - dependency-name: "@babel/plugin-proposal-decorators" + - dependency-name: "@ember/optional-features" + - dependency-name: "@ember/string" + - dependency-name: "@ember/test-helpers" + - dependency-name: "@glimmer/component" + - dependency-name: "@glimmer/tracking" + - dependency-name: broccoli-asset-rev + - dependency-name: ember-auto-import + - dependency-name: ember-cli + - dependency-name: ember-cli-app-version + - dependency-name: ember-cli-babel + - dependency-name: ember-cli-clean-css + - dependency-name: ember-cli-dependency-checker + - dependency-name: ember-cli-htmlbars + - dependency-name: ember-cli-inject-live-reload + - dependency-name: ember-cli-sri + - dependency-name: ember-cli-terser + - dependency-name: ember-data + - dependency-name: ember-fetch + - dependency-name: ember-load-initializers + - dependency-name: ember-modifier + - dependency-name: ember-page-title + - dependency-name: ember-qunit + - dependency-name: ember-resolver + - dependency-name: ember-source + - dependency-name: ember-welcome-page + - dependency-name: qunit + - dependency-name: qunit-dom + - dependency-name: tracked-built-ins + - dependency-name: webpack diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 34afbde0b4..ec8f314ded 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,6 +47,7 @@ jobs: workspace: - frontend - test-app + - lti-course-manager - lti-dashboard steps: - uses: actions/checkout@v4 @@ -138,6 +139,7 @@ jobs: workspace: - frontend - test-app + - lti-course-manager - lti-dashboard firefox-version: [latest-esr] steps: @@ -197,6 +199,3 @@ jobs: run: pnpm install - name: Run Tests run: pnpm run --filter frontend build - - - diff --git a/.github/workflows/deploy-production.yml b/.github/workflows/deploy-production.yml index c8cbacbfea..08a997b93d 100644 --- a/.github/workflows/deploy-production.yml +++ b/.github/workflows/deploy-production.yml @@ -15,29 +15,29 @@ jobs: name: Deploy and Create Sentry Release runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - run: pnpm install - - name: Ember CLI Deploy - run: pnpm run --filter frontend deploy:production - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - - name: Install Sentry CLI - run: pnpm install -g @sentry/cli - - name: Create a Sentry.io release - run: | - # Create new Sentry release - export SENTRY_RELEASE=$(sentry-cli releases propose-version) - sentry-cli releases new $SENTRY_RELEASE - sentry-cli releases set-commits --auto $SENTRY_RELEASE - sentry-cli releases files $SENTRY_RELEASE upload-sourcemaps packages/frontend/tmp/deploy-dist/ - sentry-cli releases finalize $SENTRY_RELEASE - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install + - name: Ember CLI Deploy + run: pnpm run --filter frontend deploy:production + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + - name: Install Sentry CLI + run: pnpm install -g @sentry/cli + - name: Create a Sentry.io release + run: | + # Create new Sentry release + export SENTRY_RELEASE=$(sentry-cli releases propose-version) + sentry-cli releases new $SENTRY_RELEASE + sentry-cli releases set-commits --auto $SENTRY_RELEASE + sentry-cli releases files $SENTRY_RELEASE upload-sourcemaps packages/frontend/tmp/deploy-dist/ + sentry-cli releases finalize $SENTRY_RELEASE + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} diff --git a/.github/workflows/deploy-staging.yml b/.github/workflows/deploy-staging.yml index 97285fd4c1..c49563726c 100644 --- a/.github/workflows/deploy-staging.yml +++ b/.github/workflows/deploy-staging.yml @@ -13,17 +13,17 @@ jobs: name: Deploy runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - run: pnpm install - - name: Ember CLI Deploy - run: pnpm run --filter frontend deploy:staging - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install + - name: Ember CLI Deploy + run: pnpm run --filter frontend deploy:staging + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.watchmanconfig b/.watchmanconfig index 0790463325..c33d7f6fb5 100644 --- a/.watchmanconfig +++ b/.watchmanconfig @@ -1,3 +1,6 @@ { - "ignore_dirs": ["packages/lti-dashboard/dist"] + "ignore_dirs": [ + "packages/lti-course-manager/dist", + "packages/lti-dashboard/dist" + ] } diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000000..198f6dacf4 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,9 @@ +The MIT License (MIT) + +Copyright (c) 2018 + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/package.json b/package.json index 753019899b..7e3665c0dd 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,11 @@ "lint:js:fix": "eslint . --fix", "preinstall": "npx only-allow pnpm", "start": "pnpm --filter frontend exec ember serve", + "start:lti-course-manager": "pnpm --filter lti-course-manager exec ember serve", "start:lti-dashboard": "pnpm --filter lti-dashboard exec ember serve", "start:test-app": "pnpm --filter test-app exec ember serve", "test:frontend": "pnpm run --filter frontend test", + "test:lti-course-manager": "pnpm run --filter lti-course-manager test", "test:lti-dashboard": "pnpm run --filter lti-dashboard test", "test:test-app": "pnpm run --filter test-app test" }, diff --git a/packages/lti-course-manager/.ember-cli b/packages/lti-course-manager/.ember-cli new file mode 100644 index 0000000000..8c1812cff8 --- /dev/null +++ b/packages/lti-course-manager/.ember-cli @@ -0,0 +1,15 @@ +{ + /** + Ember CLI sends analytics information by default. The data is completely + anonymous, but there are times when you might want to disable this behavior. + + Setting `disableAnalytics` to true will prevent any data from being sent. + */ + "disableAnalytics": false, + + /** + Setting `isTypeScriptProject` to true will force the blueprint generators to generate TypeScript + rather than JavaScript by default, when a TypeScript version of a given blueprint is available. + */ + "isTypeScriptProject": false +} diff --git a/packages/lti-course-manager/.gitignore b/packages/lti-course-manager/.gitignore new file mode 100644 index 0000000000..d4a0516cd5 --- /dev/null +++ b/packages/lti-course-manager/.gitignore @@ -0,0 +1,26 @@ +# compiled output +/dist/ +/declarations/ + +# dependencies +/node_modules/ + +# misc +/.env* +/.sass-cache +/.pnp* +/.eslintcache +/coverage/ +/npm-debug.log* +/testem.log +/yarn-error.log + +# ember-try +/.node_modules.ember-try/ +/npm-shrinkwrap.json.ember-try +/package.json.ember-try +/package-lock.json.ember-try +/yarn.lock.ember-try + +# broccoli-debug +/DEBUG/ diff --git a/packages/lti-course-manager/app/adapters/application.js b/packages/lti-course-manager/app/adapters/application.js new file mode 100644 index 0000000000..0733b90371 --- /dev/null +++ b/packages/lti-course-manager/app/adapters/application.js @@ -0,0 +1 @@ +export { default } from 'ilios-common/adapters/ilios'; diff --git a/packages/lti-course-manager/app/app.js b/packages/lti-course-manager/app/app.js new file mode 100644 index 0000000000..70e196cb38 --- /dev/null +++ b/packages/lti-course-manager/app/app.js @@ -0,0 +1,17 @@ +import Application from '@ember/application'; +import Resolver from 'ember-resolver'; +import loadInitializers from 'ember-load-initializers'; +import config from 'lti-course-manager/config/environment'; +import { importSync, isDevelopingApp, macroCondition } from '@embroider/macros'; + +if (macroCondition(isDevelopingApp())) { + importSync('./deprecation-workflow'); +} + +export default class App extends Application { + modulePrefix = config.modulePrefix; + podModulePrefix = config.podModulePrefix; + Resolver = Resolver; +} + +loadInitializers(App, config.modulePrefix); diff --git a/packages/lti-course-manager/app/components/.gitkeep b/packages/lti-course-manager/app/components/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/lti-course-manager/app/controllers/.gitkeep b/packages/lti-course-manager/app/controllers/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/lti-course-manager/app/deprecation-workflow.js b/packages/lti-course-manager/app/deprecation-workflow.js new file mode 100644 index 0000000000..d9756a9c2e --- /dev/null +++ b/packages/lti-course-manager/app/deprecation-workflow.js @@ -0,0 +1,20 @@ +import { registerDeprecationHandler } from '@ember/debug'; +import config from './config/environment'; + +const SHOULD_THROW = config.environment !== 'production'; + +const SILENCED_DEPRECATIONS = [ + // Add ids of deprecations we temporarily want to silence here. + 'ember-data:deprecate-legacy-imports', + 'ember-data:deprecate-non-strict-types', +]; + +registerDeprecationHandler((message, options, next) => { + if (SILENCED_DEPRECATIONS.includes(options.id)) { + return; + } else if (SHOULD_THROW) { + throw new Error(message); + } + + next(message, options); +}); diff --git a/packages/lti-course-manager/app/helpers/.gitkeep b/packages/lti-course-manager/app/helpers/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/lti-course-manager/app/helpers/page-title.js b/packages/lti-course-manager/app/helpers/page-title.js new file mode 100644 index 0000000000..a4286a435e --- /dev/null +++ b/packages/lti-course-manager/app/helpers/page-title.js @@ -0,0 +1,9 @@ +import { helper } from '@ember/component/helper'; + +/* + * This is a noop helper because the LTI shouldn't mess with the page title, but + * common includes {{page-title}} references. + */ +export default helper(function pageTitle() { + return ''; +}); diff --git a/packages/lti-course-manager/app/index.html b/packages/lti-course-manager/app/index.html new file mode 100644 index 0000000000..b951ecb05d --- /dev/null +++ b/packages/lti-course-manager/app/index.html @@ -0,0 +1,25 @@ + + + + + + Ilios + + + + {{content-for "head"}} + + + + + {{content-for "head-footer"}} + + +{{content-for "body"}} + + + + +{{content-for "body-footer"}} + + diff --git a/packages/lti-course-manager/app/models/.gitkeep b/packages/lti-course-manager/app/models/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/lti-course-manager/app/router.js b/packages/lti-course-manager/app/router.js new file mode 100644 index 0000000000..ea4b2a84cb --- /dev/null +++ b/packages/lti-course-manager/app/router.js @@ -0,0 +1,67 @@ +import EmberRouter from '@ember/routing/router'; +import config from 'lti-course-manager/config/environment'; + +export default class Router extends EmberRouter { + location = config.locationType; + rootURL = config.rootURL; +} + +Router.map(function () { + this.route( + 'course', + { + path: 'courses/:course_id', + resetNamespace: true, + }, + function () { + this.route('publication_check', { path: '/publicationcheck' }); + this.route('publishall'); + this.route('rollover'); + this.route( + 'session', + { + path: '/sessions/:session_id', + resetNamespace: true, + }, + function () { + this.route('publication_check', { path: '/publicationcheck' }); + this.route('copy'); + }, + ); + }, + ); + this.route('print_course', { path: 'course/:course_id/print' }); + this.route('course-materials', { path: 'courses/:course_id/materials' }); + + this.route('course-rollover'); + this.route('course-visualizations', { + path: 'data/courses/:course_id', + }); + this.route('course-visualize-objectives', { + path: 'data/courses/:course_id/objectives', + }); + this.route('course-visualize-session-types', { + path: 'data/courses/:course_id/session-types', + }); + this.route('course-visualize-vocabularies', { + path: 'data/courses/:course_id/vocabularies', + }); + this.route('course-visualize-vocabulary', { + path: 'data/courses/:course_id/vocabularies/:vocabulary_id', + }); + this.route('course-visualize-term', { + path: 'data/courses/:course_id/terms/:term_id', + }); + /* eslint ember/routes-segments-snake-case: 0 */ + this.route('course-visualize-session-type', { + path: 'data/courses/:course_id/session-types/:session-type_id', + }); + this.route('course-visualize-instructors', { + path: 'data/courses/:course_id/instructors', + }); + this.route('course-visualize-instructor', { + path: 'data/courses/:course_id/instructors/:user_id', + }); + this.route('login', { path: 'login/:token' }); + this.route('login-error'); +}); diff --git a/packages/lti-course-manager/app/routes/.gitkeep b/packages/lti-course-manager/app/routes/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/lti-course-manager/app/routes/application.js b/packages/lti-course-manager/app/routes/application.js new file mode 100644 index 0000000000..3f2c81d6ae --- /dev/null +++ b/packages/lti-course-manager/app/routes/application.js @@ -0,0 +1,34 @@ +import Route from '@ember/routing/route'; +import { inject as service } from '@ember/service'; + +export default class ApplicationRoute extends Route { + @service intl; + @service moment; + @service currentUser; + @service session; + + async beforeModel() { + await this.session.setup(); + const intl = this.intl; + const moment = this.moment; + moment.setLocale(intl.locale[0]); + window.document.querySelector('html').setAttribute('lang', intl.locale); + } + + /** + * Preload the user model and the users roles + * This makes the initial page rendering (especially the navigation) much smoother + */ + async afterModel() { + const currentUser = this.currentUser; + const user = await currentUser.getModel(); + if (user) { + await user.roles; + } + } + + async activate() { + //remove our loading animation once the application is loaded + document.getElementById('ilios-loading-indicator')?.remove(); + } +} diff --git a/packages/lti-course-manager/app/routes/login-error.js b/packages/lti-course-manager/app/routes/login-error.js new file mode 100644 index 0000000000..fc7422a42c --- /dev/null +++ b/packages/lti-course-manager/app/routes/login-error.js @@ -0,0 +1,3 @@ +import Route from '@ember/routing/route'; + +export default class LoginErrorRoute extends Route {} diff --git a/packages/lti-course-manager/app/routes/login.js b/packages/lti-course-manager/app/routes/login.js new file mode 100644 index 0000000000..c1d0010a03 --- /dev/null +++ b/packages/lti-course-manager/app/routes/login.js @@ -0,0 +1,61 @@ +import Route from '@ember/routing/route'; +import { inject as service } from '@ember/service'; +import jwtDecode from '../utils/jwt-decode'; +import { set } from '@ember/object'; + +export default class ApplicationRoute extends Route { + @service serverVariables; + @service session; + @service router; + + async model({ token }) { + const tokenData = jwtDecode(token); + const audience = tokenData.aud; + const apiHost = tokenData.apiHost; + const apiNameSpace = tokenData.apiNameSpace; + + const queryParams = {}; + if (window.location.search.length > 1) { + window.location.search + .substr(1) + .split('&') + .forEach((str) => { + const arr = str.split('='); + queryParams[arr[0]] = arr[1]; + }); + } + + if (audience !== 'ilios-lti-app' || !apiHost || !apiNameSpace) { + /*eslint no-console: 0*/ + console.log('Unable to authenticate user'); + console.log(tokenData); + + this.router.transitionTo('login-error'); + return; + } + const jwt = await this.getNewToken(token, apiHost); + + const authenticator = 'authenticator:ilios-jwt'; + this.session.authenticate(authenticator, { jwt }); + set(this.session, 'data.apiHost', apiHost); + set(this.session, 'data.apiNameSpace', apiNameSpace); + + this.router.transitionTo(`/courses/${queryParams.course_id}`); + } + + async getNewToken(ltiToken, apiHost) { + const apiHostWithNoTrailingSlash = apiHost.replace(/\/+$/, ''); + const url = `${apiHostWithNoTrailingSlash}/auth/token`; + const response = await fetch(url, { + headers: { + 'X-JWT-Authorization': `Token ${ltiToken}`, + }, + }); + if (response.ok) { + const obj = await response.json(); + return obj.jwt; + } else { + throw new Error('Unable to extract token from refresh request'); + } + } +} diff --git a/packages/lti-course-manager/app/services/server-variables.js b/packages/lti-course-manager/app/services/server-variables.js new file mode 100644 index 0000000000..61e5ebe4ca --- /dev/null +++ b/packages/lti-course-manager/app/services/server-variables.js @@ -0,0 +1,19 @@ +import Service from '@ember/service'; +import { inject as service } from '@ember/service'; + +/** + * In the LTI app we pull server variables out of the session instead + * of the index.html where it is in the frontend. Instead of using ember-server-variables + * we can provide this proxy service instead + * They are needed in the ilios-config service + **/ +export default class ServerVariablesService extends Service { + @service session; + + get apiHost() { + return this.session.data.apiHost; + } + get apiNameSpace() { + return this.session.data.apiNameSpace; + } +} diff --git a/packages/lti-course-manager/app/session-stores/application.js b/packages/lti-course-manager/app/session-stores/application.js new file mode 100644 index 0000000000..d330dca09a --- /dev/null +++ b/packages/lti-course-manager/app/session-stores/application.js @@ -0,0 +1,5 @@ +import CookieStore from 'ember-simple-auth/session-stores/cookie'; + +export default class ApplicationSessionStore extends CookieStore { + cookieName = 'ilios-lti-course-manager-session'; +} diff --git a/packages/lti-course-manager/app/styles/app.scss b/packages/lti-course-manager/app/styles/app.scss new file mode 100644 index 0000000000..0ac6fc0ebe --- /dev/null +++ b/packages/lti-course-manager/app/styles/app.scss @@ -0,0 +1 @@ +@import "ilios-common/styles"; diff --git a/packages/lti-course-manager/app/templates/application.hbs b/packages/lti-course-manager/app/templates/application.hbs new file mode 100644 index 0000000000..fd49086dee --- /dev/null +++ b/packages/lti-course-manager/app/templates/application.hbs @@ -0,0 +1,4 @@ +
+ {{outlet}} +
+ diff --git a/packages/lti-course-manager/app/templates/login-error.hbs b/packages/lti-course-manager/app/templates/login-error.hbs new file mode 100644 index 0000000000..68a8f914f9 --- /dev/null +++ b/packages/lti-course-manager/app/templates/login-error.hbs @@ -0,0 +1,6 @@ +{{! template-lint-disable no-bare-strings }} +

Unable to authenticate

+

+ There was an error logging you in, please report this to + support@iliosproject.org. +

diff --git a/packages/lti-course-manager/app/templates/login.hbs b/packages/lti-course-manager/app/templates/login.hbs new file mode 100644 index 0000000000..c24cd68950 --- /dev/null +++ b/packages/lti-course-manager/app/templates/login.hbs @@ -0,0 +1 @@ +{{outlet}} diff --git a/packages/lti-course-manager/config/dependency-lint.js b/packages/lti-course-manager/config/dependency-lint.js new file mode 100644 index 0000000000..d6beeb35c6 --- /dev/null +++ b/packages/lti-course-manager/config/dependency-lint.js @@ -0,0 +1,8 @@ +/* eslint-env node */ +'use strict'; + +module.exports = { + allowedVersions: { + 'ember-get-config': '^1.0.4 || ^2.0.0', + }, +}; diff --git a/packages/lti-course-manager/config/deploy.js b/packages/lti-course-manager/config/deploy.js new file mode 100644 index 0000000000..deb1201093 --- /dev/null +++ b/packages/lti-course-manager/config/deploy.js @@ -0,0 +1,39 @@ +/* eslint-env node */ +'use strict'; + +module.exports = function (deployTarget) { + const ENV = { + build: {}, + pipeline: { + // This setting runs the ember-cli-deploy activation hooks on every deploy + // which is necessary in order to run ember-cli-deploy-cloudfront. + // To disable CloudFront invalidation, remove this setting or change it to `false`. + // To disable ember-cli-deploy-cloudfront for only a particular environment, add + // `ENV.pipeline.activateOnDeploy = false` to an environment conditional below. + activateOnDeploy: true, + }, + s3: { + acl: 'public-read', + filePattern: '*', + region: 'us-west-2', + }, + cloudfront: {}, + }; + + if (deployTarget === 'staging') { + ENV.build.environment = 'production'; + ENV.s3.bucket = 'ilios-lti-course-manager-app-dev'; + ENV.cloudfront.distribution = 'E1PYN6FF9VZBIJ'; + } + + if (deployTarget === 'production') { + ENV.build.environment = 'production'; + ENV.s3.bucket = 'ilios-lti-course-manager-app-prod'; + ENV.cloudfront.distribution = 'E196RJPG6UDWJ1'; + } + + // Note: if you need to build some configuration asynchronously, you can return + // a promise that resolves with the ENV object instead of returning the + // ENV object synchronously. + return ENV; +}; diff --git a/packages/lti-course-manager/config/ember-cli-update.json b/packages/lti-course-manager/config/ember-cli-update.json new file mode 100644 index 0000000000..25cf7faf66 --- /dev/null +++ b/packages/lti-course-manager/config/ember-cli-update.json @@ -0,0 +1,21 @@ +{ + "schemaVersion": "1.0.0", + "packages": [ + { + "name": "ember-cli", + "version": "5.3.0", + "blueprints": [ + { + "name": "app", + "outputRepo": "https://github.com/ember-cli/ember-new-output", + "codemodsSource": "ember-app-codemods-manifest@1", + "isBaseBlueprint": true, + "options": [ + "--no-welcome", + "--pnpm" + ] + } + ] + } + ] +} diff --git a/packages/lti-course-manager/config/environment.js b/packages/lti-course-manager/config/environment.js new file mode 100644 index 0000000000..f61a098564 --- /dev/null +++ b/packages/lti-course-manager/config/environment.js @@ -0,0 +1,84 @@ +'use strict'; + +module.exports = function (environment) { + const ENV = { + modulePrefix: 'lti-course-manager', + environment, + rootURL: '/', + locationType: 'history', + 'ember-simple-auth': { + authorizer: 'authorizer:token', + authenticationRoute: 'login-error', + useSessionSetupMethod: true, //can be removed in ESA v5.x + }, + 'ember-simple-auth-token': { + serverTokenEndpoint: '/auth/login', + serverTokenRefreshEndpoint: '/auth/token', + tokenPropertyName: 'jwt', + authorizationHeaderName: 'X-JWT-Authorization', + authorizationPrefix: 'Token ', + refreshLeeway: 300, + }, + i18n: { + defaultLocale: 'en', + }, + 'ember-a11y-testing': { + componentOptions: { + turnAuditOff: process.env.SKIP_A11Y || false, + visualNoiseLevel: 1, + }, + }, + fontawesome: { + enableExperimentalBuildTimeTransform: false, + defaultPrefix: 'fas', + }, + + EmberENV: { + FEATURES: { + // Here you can enable experimental features on an ember canary build + // e.g. 'with-controller': true + }, + EXTEND_PROTOTYPES: { + String: false, + Array: true, + Function: false, + Date: false, + }, + }, + + APP: { + // Here you can pass flags/options to your application instance + // when it is created + }, + }; + + if (environment === 'development') { + // ENV.APP.LOG_RESOLVER = true; + // ENV.APP.LOG_ACTIVE_GENERATION = true; + // ENV.APP.LOG_TRANSITIONS = true; + // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; + // ENV.APP.LOG_VIEW_LOOKUPS = true; + //Remove mirage in development, we only use it in testing + ENV['ember-cli-mirage'] = { + enabled: false, + }; + } + + if (environment === 'test') { + // Testem prefers this... + ENV.locationType = 'none'; + + // keep test console output quieter + ENV.APP.LOG_ACTIVE_GENERATION = false; + ENV.APP.LOG_VIEW_LOOKUPS = false; + + ENV.APP.rootElement = '#ember-testing'; + ENV.APP.autoboot = false; + } + + if (environment === 'production') { + // here you can enable a production-specific feature + } + + return ENV; +}; diff --git a/packages/lti-course-manager/config/optional-features.json b/packages/lti-course-manager/config/optional-features.json new file mode 100644 index 0000000000..b26286e2ec --- /dev/null +++ b/packages/lti-course-manager/config/optional-features.json @@ -0,0 +1,6 @@ +{ + "application-template-wrapper": false, + "default-async-observers": true, + "jquery-integration": false, + "template-only-glimmer-components": true +} diff --git a/packages/lti-course-manager/config/targets.js b/packages/lti-course-manager/config/targets.js new file mode 100644 index 0000000000..3a33ae836c --- /dev/null +++ b/packages/lti-course-manager/config/targets.js @@ -0,0 +1,16 @@ +'use strict'; + +const browsers = ['last 1 Chrome versions', 'last 1 Firefox versions', 'last 1 Safari versions']; + +const isCI = !!process.env.CI; +const isProduction = process.env.EMBER_ENV === 'production'; + +if (isCI || isProduction) { + browsers.push('last 1 edge versions'); + browsers.push('firefox esr'); //sometimes points to the last 2 ESR releases when they overlap + browsers.push('last 3 safari versions'); +} + +module.exports = { + browsers, +}; diff --git a/packages/lti-course-manager/ember-cli-build.js b/packages/lti-course-manager/ember-cli-build.js new file mode 100644 index 0000000000..c2221ca3b9 --- /dev/null +++ b/packages/lti-course-manager/ember-cli-build.js @@ -0,0 +1,29 @@ +'use strict'; + +const EmberApp = require('ember-cli/lib/broccoli/ember-app'); +const broccoliAssetRevDefaults = require('broccoli-asset-rev/lib/default-options'); + +module.exports = function (defaults) { + const env = EmberApp.env() || 'development'; + const isTestBuild = env === 'test'; + + const app = new EmberApp(defaults, { + fingerprint: { + extensions: broccoliAssetRevDefaults.extensions.concat(['webmanifest', 'svg']), + exclude: ['ilios-icon.png'], + }, + sourcemaps: { + enabled: true, + }, + + hinting: isTestBuild, + babel: { + plugins: [require('ember-auto-import/babel-plugin')], + }, + autoImport: { + publicAssetURL: '/assets', + }, + }); + + return app.toTree(); +}; diff --git a/packages/lti-course-manager/lib/ilios-error/index.js b/packages/lti-course-manager/lib/ilios-error/index.js new file mode 100644 index 0000000000..f3c7f2b6db --- /dev/null +++ b/packages/lti-course-manager/lib/ilios-error/index.js @@ -0,0 +1,156 @@ +/* eslint-env node */ +/* eslint n/no-extraneous-require: 0 */ +'use strict'; + +const browserslist = require('browserslist'); +const caniuse = require('caniuse-db/data.json').agents; + +const MergeTrees = require('broccoli-merge-trees'); +const WriteFile = require('broccoli-file-creator'); + +module.exports = { + name: 'ilios-error', + + contentFor: function (type, config) { + if (type === 'body') { + return ` + + `; + } + }, + + treeForPublic() { + const defaultTree = this._super.treeForPublic.apply(this, arguments); + const supportedBrowsers = this.getSupportedBrowsers().join(''); + const scriptContent = ` + // if there is an uncaught runtime error show the error message + window.addEventListener('error', function () { + var loadingIndicator = document.getElementById('ilios-loading-indicator'); + if (loadingIndicator) { + loadingIndicator.parentNode.removeChild(loadingIndicator); + } + + if (!document.getElementById('ilios-loading-error')) { + var link = document.createElement( "link" ); + link.href = 'ilios-error/style.css'; + link.type = "text/css"; + link.rel = "stylesheet"; + link.media = "screen"; + + document.getElementsByTagName( "head" )[0].appendChild( link ); + var errorContainer = document.createElement('dev'); + errorContainer.classList.add('ember-load-indicator'); + errorContainer.id = 'ilios-loading-error'; + errorContainer.innerHTML = '' + + '

' + + 'It is possible that your browser is not supported by Ilios. ' + + 'Please refresh this page or try a different browser.' + + '

' + + '
' + + '

Supported Browsers

' + + '' + + '
'; + document.body.appendChild(errorContainer); + } + }); + `; + + const styleContent = ` + #ilios-loading-error { + padding: 2em; + } + #ilios-loading-error h1, + #ilios-loading-error h2 { + text-align: center; + } + #ilios-loading-error .supported-browsers { + border: 1px solid blue; + margin-top: 1rem; + padding: 1rem 2rem; + } + #ilios-loading-error ul { + display: flex; + flex-wrap: wrap; + justify-content: space-around; + list-style-type: none; + } + #ilios-loading-error.hidden { + display: none; + } + `; + const scriptTree = WriteFile('ilios-error/script.js', scriptContent); + const styleTree = WriteFile('ilios-error/style.css', styleContent); + const trees = [scriptTree, styleTree]; + if (defaultTree) { + trees.unshift(defaultTree); + } + return MergeTrees(trees); + }, + + getBrowserLogo(id) { + if (id === 'ios_saf') { + id = 'safari-ios'; + } + if (id === 'samsung') { + id = 'samsung-internet'; + } + if (id === 'op_mini') { + id = 'opera-mini'; + } + + const same = [ + 'chrome', + 'firefox', + 'edge', + 'safari', + 'safari-ios', + 'samsung-internet', + 'opera-mini', + ]; + if (same.includes(id)) { + return `https://cdnjs.cloudflare.com/ajax/libs/browser-logos/44.0.0/${id}/${id}_16x16.png`; + } + + if (id === 'ie') { + return `https://cdnjs.cloudflare.com/ajax/libs/browser-logos/44.0.0/archive/internet-explorer_9-11/internet-explorer_9-11_16x16.png`; + } + + if (id === 'and_chr') { + return `https://cdnjs.cloudflare.com/ajax/libs/browser-logos/44.0.0/archive/android/android_16x16.png`; + } + + if (id === 'and_uc') { + return `https://cdnjs.cloudflare.com/ajax/libs/browser-logos/44.0.0/archive/uc/uc_16x16.png`; + } + }, + + getSupportedBrowsers() { + const targets = this.project.targets && this.project.targets.browsers; + const query = targets.join(', '); + const list = browserslist(query); + + const mappedList = list.map((browser) => { + const arr = browser.split(' '); + const id = arr[0]; + const version = arr[1]; + + const db = caniuse[id]; + + return { + version: version, + id: id, + name: db.browser, + logo: this.getBrowserLogo(id), + }; + }); + + mappedList.sort((a, b) => a.name.localeCompare(b.name)); + + return mappedList.map((obj) => { + const logo = obj.logo + ? `` + : ''; + return `
  • ${logo} ${obj.name} ${obj.version}
  • `; + }); + }, +}; diff --git a/packages/lti-course-manager/lib/ilios-error/package.json b/packages/lti-course-manager/lib/ilios-error/package.json new file mode 100644 index 0000000000..77c684d0c2 --- /dev/null +++ b/packages/lti-course-manager/lib/ilios-error/package.json @@ -0,0 +1,6 @@ +{ + "name": "ilios-error", + "keywords": [ + "ember-addon" + ] +} diff --git a/packages/lti-course-manager/lib/ilios-loading/index.js b/packages/lti-course-manager/lib/ilios-loading/index.js new file mode 100644 index 0000000000..6fe3c48970 --- /dev/null +++ b/packages/lti-course-manager/lib/ilios-loading/index.js @@ -0,0 +1,91 @@ +/* eslint-env node */ +'use strict'; + +module.exports = { + name: 'ilios-loading', + contentFor: function (type, config) { + if (type === 'head') { + //inline this CSS so it is parsed the fastest + return ` + + `; + } + if (type === 'test-body-footer') { + return ``; + } + + if (type === 'body') { + return `
    +

    + +

    +
    `; + } + }, +}; diff --git a/packages/lti-course-manager/lib/ilios-loading/package.json b/packages/lti-course-manager/lib/ilios-loading/package.json new file mode 100644 index 0000000000..cab5ef3542 --- /dev/null +++ b/packages/lti-course-manager/lib/ilios-loading/package.json @@ -0,0 +1,9 @@ +{ + "name": "ilios-loading", + "keywords": [ + "ember-addon" + ], + "ember-addon": { + "before": "ilios-error" + } +} diff --git a/packages/lti-course-manager/lib/ilios-loading/public/remove-loader-tests.js b/packages/lti-course-manager/lib/ilios-loading/public/remove-loader-tests.js new file mode 100644 index 0000000000..3f5d600ac9 --- /dev/null +++ b/packages/lti-course-manager/lib/ilios-loading/public/remove-loader-tests.js @@ -0,0 +1,2 @@ +// Remove the loader when testing +document.getElementById('ilios-loading-indicator').remove(); diff --git a/packages/lti-course-manager/lib/images/sunburst-icon.svg b/packages/lti-course-manager/lib/images/sunburst-icon.svg new file mode 100644 index 0000000000..e0041b7926 --- /dev/null +++ b/packages/lti-course-manager/lib/images/sunburst-icon.svg @@ -0,0 +1,7 @@ + + + + Ilios Sunburst Icon + + + diff --git a/packages/lti-course-manager/lib/images/sunburst.svg b/packages/lti-course-manager/lib/images/sunburst.svg new file mode 100644 index 0000000000..be67c97ee3 --- /dev/null +++ b/packages/lti-course-manager/lib/images/sunburst.svg @@ -0,0 +1,6 @@ + + + + Ilios Sunburst + + diff --git a/packages/lti-course-manager/mirage/config.js b/packages/lti-course-manager/mirage/config.js new file mode 100644 index 0000000000..ea9b101e1c --- /dev/null +++ b/packages/lti-course-manager/mirage/config.js @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/lti-course-manager/package.json b/packages/lti-course-manager/package.json new file mode 100644 index 0000000000..2b8f2c06f5 --- /dev/null +++ b/packages/lti-course-manager/package.json @@ -0,0 +1,78 @@ +{ + "name": "lti-course-manager", + "version": "0.0.0", + "description": "Ilios LTI Course Manager app", + "license": "MIT", + "author": "The Ilios team ", + "directories": { + "doc": "doc", + "test": "tests" + }, + "repository": "https://github.com/ilios/lti-course-manager", + "scripts": { + "build": "ember build --environment=production", + "deploy:production": "ember deploy production --activate", + "deploy:staging": "ember deploy staging --activate", + "preinstall": "npx only-allow pnpm" + }, + "devDependencies": { + "@babel/core": "^7.22.20", + "@babel/plugin-proposal-decorators": "^7.22.15", + "@ember/edition-utils": "^1.2.0", + "@ember/optional-features": "^2.0.0", + "@ember/string": "^3.1.1", + "@ember/test-helpers": "^3.2.0", + "@embroider/macros": "^1.13.5", + "@glimmer/component": "^1.1.2", + "@glimmer/tracking": "^1.1.2", + "broccoli-asset-rev": "^3.0.0", + "broccoli-file-creator": "^2.1.1", + "broccoli-merge-trees": "^4.2.0", + "browserslist": "^4.22.3", + "caniuse-db": "^1.0.30001587", + "ember-auto-import": "^2.6.3", + "ember-cli": "~5.3.0", + "ember-cli-app-version": "^6.0.1", + "ember-cli-babel": "^8.0.0", + "ember-cli-clean-css": "^3.0.0", + "ember-cli-dependency-checker": "^3.3.2", + "ember-cli-dependency-lint": "2.0.1", + "ember-cli-deploy": "^2.0.0", + "ember-cli-deploy-aws-pack": "^3.0.0", + "ember-cli-htmlbars": "^6.3.0", + "ember-cli-inject-live-reload": "^2.1.0", + "ember-cli-sass": "^11.0.1", + "ember-cli-sri": "^2.1.1", + "ember-cli-terser": "^4.0.2", + "ember-load-initializers": "^2.1.2", + "ember-modifier": "^4.1.0", + "ember-page-title": "^8.0.0", + "ember-qunit": "^8.0.1", + "ember-resolver": "^11.0.1", + "ember-source": "~5.3.0", + "ember-web-app": "^5.0.0", + "ilios-common": "^87.0.1", + "loader.js": "^4.7.0", + "prettier": "^3.0.3", + "qunit": "^2.19.4", + "qunit-dom": "^2.0.0", + "sass": "^1.70.0", + "tracked-built-ins": "^3.2.0", + "webpack": "^5.88.2" + }, + "engines": { + "node": ">= 18", + "yarn": "use pnpm", + "npm": "use pnpm" + }, + "ember": { + "edition": "octane" + }, + "ember-addon": { + "paths": [ + "lib/ilios-error", + "lib/ilios-loading" + ] + }, + "private": true +} diff --git a/packages/lti-course-manager/public/crossdomain.xml b/packages/lti-course-manager/public/crossdomain.xml new file mode 100644 index 0000000000..0c16a7a07b --- /dev/null +++ b/packages/lti-course-manager/public/crossdomain.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/packages/lti-course-manager/public/favicon.ico b/packages/lti-course-manager/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bb219c633ca22a82383e0549c5ff06f8c8bccbe4 GIT binary patch literal 9326 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/lti-course-manager/public/fontawesome/regular.svg b/packages/lti-course-manager/public/fontawesome/regular.svg new file mode 100644 index 0000000000..27da41c555 --- /dev/null +++ b/packages/lti-course-manager/public/fontawesome/regular.svg @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/lti-course-manager/public/fontawesome/solid.svg b/packages/lti-course-manager/public/fontawesome/solid.svg new file mode 100644 index 0000000000..706bdbee87 --- /dev/null +++ b/packages/lti-course-manager/public/fontawesome/solid.svg @@ -0,0 +1,4178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/lti-course-manager/public/ilios-icon.png b/packages/lti-course-manager/public/ilios-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5e6dec863ba6a88cfafa1825c63448f5db502e31 GIT binary patch literal 7053 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 + + + + Ilios LTI Course Manager Tests + + + + {{content-for "head"}} + {{content-for "test-head"}} + + + + + + {{content-for "head-footer"}} + {{content-for "test-head-footer"}} + + + {{content-for "body"}} + {{content-for "test-body"}} + +
    +
    +
    +
    +
    +
    + + + + + + + + {{content-for "body-footer"}} + {{content-for "test-body-footer"}} + + diff --git a/packages/lti-course-manager/tests/integration/.gitkeep b/packages/lti-course-manager/tests/integration/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/lti-course-manager/tests/integration/helpers/page-title-test.js b/packages/lti-course-manager/tests/integration/helpers/page-title-test.js new file mode 100644 index 0000000000..494c89c9e1 --- /dev/null +++ b/packages/lti-course-manager/tests/integration/helpers/page-title-test.js @@ -0,0 +1,14 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import { hbs } from 'ember-cli-htmlbars'; + +module('Integration | Helper | page-title', function (hooks) { + setupRenderingTest(hooks); + + test('page title does nothing', async function (assert) { + this.set('title', 'Jayden Rules!'); + await render(hbs`{{page-title this.title}}`); + assert.dom().hasText(''); + }); +}); diff --git a/packages/lti-course-manager/tests/test-helper.js b/packages/lti-course-manager/tests/test-helper.js new file mode 100644 index 0000000000..640bfbce0f --- /dev/null +++ b/packages/lti-course-manager/tests/test-helper.js @@ -0,0 +1,12 @@ +import Application from 'lti-course-manager/app'; +import config from 'lti-course-manager/config/environment'; +import * as QUnit from 'qunit'; +import { setApplication } from '@ember/test-helpers'; +import { setup } from 'qunit-dom'; +import { start } from 'ember-qunit'; + +setApplication(Application.create(config.APP)); + +setup(QUnit.assert); + +start(); diff --git a/packages/lti-course-manager/tests/unit/.gitkeep b/packages/lti-course-manager/tests/unit/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/lti-course-manager/tests/unit/adapters/application-test.js b/packages/lti-course-manager/tests/unit/adapters/application-test.js new file mode 100644 index 0000000000..023a495a6c --- /dev/null +++ b/packages/lti-course-manager/tests/unit/adapters/application-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('ApplicationAdapter', function (hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function (assert) { + const adapter = this.owner.lookup('adapter:application'); + assert.ok(adapter); + }); +}); diff --git a/packages/lti-course-manager/tests/unit/routes/application-test.js b/packages/lti-course-manager/tests/unit/routes/application-test.js new file mode 100644 index 0000000000..9cf5aefd42 --- /dev/null +++ b/packages/lti-course-manager/tests/unit/routes/application-test.js @@ -0,0 +1,11 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Route | application', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + const route = this.owner.lookup('route:application'); + assert.ok(route); + }); +}); diff --git a/packages/lti-course-manager/tests/unit/routes/login-error-test.js b/packages/lti-course-manager/tests/unit/routes/login-error-test.js new file mode 100644 index 0000000000..2aba77421b --- /dev/null +++ b/packages/lti-course-manager/tests/unit/routes/login-error-test.js @@ -0,0 +1,11 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Route | login-error', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + const route = this.owner.lookup('route:login-error'); + assert.ok(route); + }); +}); diff --git a/packages/lti-course-manager/tests/unit/routes/login-test.js b/packages/lti-course-manager/tests/unit/routes/login-test.js new file mode 100644 index 0000000000..164126f6bc --- /dev/null +++ b/packages/lti-course-manager/tests/unit/routes/login-test.js @@ -0,0 +1,11 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Route | login', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + const route = this.owner.lookup('route:login'); + assert.ok(route); + }); +}); diff --git a/packages/lti-course-manager/tests/unit/services/server-variables-test.js b/packages/lti-course-manager/tests/unit/services/server-variables-test.js new file mode 100644 index 0000000000..ff017f920c --- /dev/null +++ b/packages/lti-course-manager/tests/unit/services/server-variables-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Service | server-variables', function (hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function (assert) { + const service = this.owner.lookup('service:server-variables'); + assert.ok(service); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a7bbf95a1e..2ce767036e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -581,6 +581,138 @@ importers: specifier: ^5.89.0 version: 5.90.2 + packages/lti-course-manager: + devDependencies: + '@babel/core': + specifier: ^7.22.20 + version: 7.23.9(supports-color@8.1.1) + '@babel/plugin-proposal-decorators': + specifier: ^7.22.15 + version: 7.23.9(@babel/core@7.23.9) + '@ember/edition-utils': + specifier: ^1.2.0 + version: 1.2.0 + '@ember/optional-features': + specifier: ^2.0.0 + version: 2.0.0 + '@ember/string': + specifier: ^3.1.1 + version: 3.1.1 + '@ember/test-helpers': + specifier: ^3.2.0 + version: 3.3.0(ember-source@5.3.0)(webpack@5.90.2) + '@embroider/macros': + specifier: ^1.13.5 + version: 1.13.5(@glint/template@1.3.0) + '@glimmer/component': + specifier: ^1.1.2 + version: 1.1.2(@babel/core@7.23.9) + '@glimmer/tracking': + specifier: ^1.1.2 + version: 1.1.2 + broccoli-asset-rev: + specifier: ^3.0.0 + version: 3.0.0 + broccoli-file-creator: + specifier: ^2.1.1 + version: 2.1.1 + broccoli-merge-trees: + specifier: ^4.2.0 + version: 4.2.0 + browserslist: + specifier: ^4.22.3 + version: 4.23.0 + caniuse-db: + specifier: ^1.0.30001587 + version: 1.0.30001587 + ember-auto-import: + specifier: ^2.6.3 + version: 2.7.2(@glint/template@1.3.0)(webpack@5.90.2) + ember-cli: + specifier: ~5.3.0 + version: 5.3.0 + ember-cli-app-version: + specifier: ^6.0.1 + version: 6.0.1(ember-source@5.3.0) + ember-cli-babel: + specifier: ^8.0.0 + version: 8.2.0(@babel/core@7.23.9) + ember-cli-clean-css: + specifier: ^3.0.0 + version: 3.0.0 + ember-cli-dependency-checker: + specifier: ^3.3.2 + version: 3.3.2(ember-cli@5.3.0) + ember-cli-dependency-lint: + specifier: 2.0.1 + version: 2.0.1 + ember-cli-deploy: + specifier: ^2.0.0 + version: 2.0.0 + ember-cli-deploy-aws-pack: + specifier: ^3.0.0 + version: 3.0.0 + ember-cli-htmlbars: + specifier: ^6.3.0 + version: 6.3.0 + ember-cli-inject-live-reload: + specifier: ^2.1.0 + version: 2.1.0 + ember-cli-sass: + specifier: ^11.0.1 + version: 11.0.1 + ember-cli-sri: + specifier: ^2.1.1 + version: 2.1.1 + ember-cli-terser: + specifier: ^4.0.2 + version: 4.0.2 + ember-load-initializers: + specifier: ^2.1.2 + version: 2.1.2(@babel/core@7.23.9) + ember-modifier: + specifier: ^4.1.0 + version: 4.1.0(ember-source@5.3.0) + ember-page-title: + specifier: ^8.0.0 + version: 8.2.2(ember-source@5.3.0) + ember-qunit: + specifier: ^8.0.1 + version: 8.0.2(@ember/test-helpers@3.3.0)(ember-source@5.3.0)(qunit@2.20.0) + ember-resolver: + specifier: ^11.0.1 + version: 11.0.1(ember-source@5.3.0) + ember-source: + specifier: ~5.3.0 + version: 5.3.0(@babel/core@7.23.9)(@glimmer/component@1.1.2)(rsvp@4.8.5)(webpack@5.90.2) + ember-web-app: + specifier: ^5.0.0 + version: 5.0.1 + ilios-common: + specifier: ^87.0.1 + version: link:../ilios-common + loader.js: + specifier: ^4.7.0 + version: 4.7.0 + prettier: + specifier: ^3.0.3 + version: 3.2.5 + qunit: + specifier: ^2.19.4 + version: 2.20.0 + qunit-dom: + specifier: ^2.0.0 + version: 2.0.0 + sass: + specifier: ^1.70.0 + version: 1.70.0 + tracked-built-ins: + specifier: ^3.2.0 + version: 3.3.0 + webpack: + specifier: ^5.88.2 + version: 5.90.2 + packages/lti-dashboard: devDependencies: '@babel/core': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1d79172aef..db357992d7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,7 @@ packages: - "packages/frontend" - "packages/ilios-common" + - "packages/lti-course-manager" - "packages/lti-dashboard" - "packages/test-app" + From e747bc8a6f15fbcdfd02e261df12fca0b4aa8488 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Thu, 15 Feb 2024 12:41:50 -0800 Subject: [PATCH 2/6] copies LTI course manager specific workflows from its original repo. updated workflow names to prevent naming collisions with other workflows. --- .../lti-course-manager-deploy-production.yml | 26 +++++++++++++++++++ .../lti-course-manager-deploy-staging.yml | 26 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 .github/workflows/lti-course-manager-deploy-production.yml create mode 100644 .github/workflows/lti-course-manager-deploy-staging.yml diff --git a/.github/workflows/lti-course-manager-deploy-production.yml b/.github/workflows/lti-course-manager-deploy-production.yml new file mode 100644 index 0000000000..b050c8f96e --- /dev/null +++ b/.github/workflows/lti-course-manager-deploy-production.yml @@ -0,0 +1,26 @@ +name: LTI Course Manager Deploy Production Build + +on: + push: + tags: + - '*' + +jobs: + deploy: + name: Deploy to AWS + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install + - name: Ember CLI Deploy + run: pnpm run --filter lti-course-manager deploy:production + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/lti-course-manager-deploy-staging.yml b/.github/workflows/lti-course-manager-deploy-staging.yml new file mode 100644 index 0000000000..dc283d4cbb --- /dev/null +++ b/.github/workflows/lti-course-manager-deploy-staging.yml @@ -0,0 +1,26 @@ +name: LTI Course Manager Deploy Staging Build + +on: + push: + branches: + - master + +jobs: + deploy: + name: Deploy to AWS + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install + - name: Ember CLI Deploy + run: pnpm run --filter lti-course-manager deploy:staging + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} From 199b5bfb9f116c062752188d2de4212ae8557bfd Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Thu, 15 Feb 2024 12:55:23 -0800 Subject: [PATCH 3/6] updates LTI course manager specific READMe. --- packages/lti-course-manager/README.md | 61 +++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 packages/lti-course-manager/README.md diff --git a/packages/lti-course-manager/README.md b/packages/lti-course-manager/README.md new file mode 100644 index 0000000000..7986ce8f8a --- /dev/null +++ b/packages/lti-course-manager/README.md @@ -0,0 +1,61 @@ +# LTI Course Manager + +Learning Tools Interoperability (LTI) application for the Ilios course manager. + +## Directions for developers working with this ember-cli app + +### Prerequisites + +You will need the following things properly installed on your computer. + +* [Git](https://git-scm.com/) +* [Node.js](https://nodejs.org/) +* [PNPM](https://pnpm.io) +* [Ember CLI](https://cli.emberjs.com/release/) +* [Google Chrome](https://google.com/chrome/) + +### Installation + +* `git clone git@github.com:ilios/frontend.git` +* `cd frontend` +* `pnpm install` + +### Running / Development + +* `ILIOS_FRONTEND_API_HOST=https://ilios3-demo.ucsf.edu pnpm start:lti-course-manager` +* Visit your app at [http://localhost:4200](http://localhost:4200). +* Visit your tests at [http://localhost:4200/tests](http://localhost:4200/tests). + +#### Code Generators + +Make use of the many generators for code, try `ember help generate` for more details + +### Running Tests + +* `pnpm test:lti-course-manager` +* `pnpm test:lti-course-manager --server` + +### Linting + +* `pnpm run lint:hbs` +* `pnpm run lint:css` +* `pnpm run lint:js` +* `pnpm run lint:js --fix` + +### Building + +* `pnpm --filter lti-course-manager exec ember build` (development) +* `pnpm --filter lti-course-manager exec ember build --environment production` (production) + + +### Deploying + +Specify what it takes to deploy your app. + +### Further Reading / Useful Links + +* [ember.js](https://emberjs.com/) +* [ember-cli](https://cli.emberjs.com/release/) +* Development Browser Extensions + * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi) + * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/) From c1dcb02552b51d97f788035e4b148dda44581fe7 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Thu, 15 Feb 2024 12:57:05 -0800 Subject: [PATCH 4/6] adds FF profile to lti-course-manager testem config. --- packages/lti-course-manager/testem.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/lti-course-manager/testem.js b/packages/lti-course-manager/testem.js index 8fc880cb35..bc499298bc 100644 --- a/packages/lti-course-manager/testem.js +++ b/packages/lti-course-manager/testem.js @@ -1,4 +1,6 @@ /* eslint camelcase: 0 */ +'use strict'; + module.exports = { test_page: 'tests/index.html?hidepassed', disable_watching: true, @@ -18,5 +20,8 @@ module.exports = { '--window-size=1440,900', ].filter(Boolean), }, + Firefox: { + ci: ['--headless', '--window-size=1440,900'].filter(Boolean), + }, }, }; From 1b0cbdfe61d9b0cab0b341ef9ff9119868207385 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Thu, 15 Feb 2024 12:57:51 -0800 Subject: [PATCH 5/6] rm duplicate license file that the lti-course-manager merger brought over. --- LICENSE.md | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 198f6dacf4..0000000000 --- a/LICENSE.md +++ /dev/null @@ -1,9 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From 352f2986cab02fef14a3c8810db8533d286f77fc Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Thu, 15 Feb 2024 14:33:24 -0800 Subject: [PATCH 6/6] un-munge yaml files. it's all about list indentation. yaml, what a garbage format... *grumbles --- .github/dependabot.yml | 96 +++++----- .github/workflows/auto-merge.yml | 24 +-- .github/workflows/ci.yml | 172 +++++++++--------- .github/workflows/deploy-pr.yml | 20 +- .github/workflows/deploy-production.yml | 54 +++--- .github/workflows/deploy-staging.yml | 30 +-- .../lti-course-manager-deploy-production.yml | 30 +-- .../lti-course-manager-deploy-staging.yml | 30 +-- .../lti-dashboard-deploy-production.yml | 30 +-- .../lti-dashboard-deploy-staging.yml | 30 +-- .github/workflows/percy-test-pr.yml | 30 +-- .github/workflows/percy.yml | 38 ++-- .../update-transitive-dependencies.yaml | 2 +- 13 files changed, 293 insertions(+), 293 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 625eca0a83..62215c3d9e 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,51 +1,51 @@ version: 2 updates: - - package-ecosystem: github-actions - directory: "/" - schedule: - interval: daily +- package-ecosystem: github-actions + directory: "/" + schedule: + interval: daily - - package-ecosystem: npm - directory: "/" - schedule: - interval: daily - time: "02:30" - timezone: America/Los_Angeles - open-pull-requests-limit: 10 - groups: - embroider: - patterns: - - "@embroider/*" - ignore: - - dependency-name: "@babel/core" - - dependency-name: "@babel/eslint-parser" - - dependency-name: "@babel/plugin-proposal-decorators" - - dependency-name: "@ember/optional-features" - - dependency-name: "@ember/string" - - dependency-name: "@ember/test-helpers" - - dependency-name: "@glimmer/component" - - dependency-name: "@glimmer/tracking" - - dependency-name: broccoli-asset-rev - - dependency-name: ember-auto-import - - dependency-name: ember-cli - - dependency-name: ember-cli-app-version - - dependency-name: ember-cli-babel - - dependency-name: ember-cli-clean-css - - dependency-name: ember-cli-dependency-checker - - dependency-name: ember-cli-htmlbars - - dependency-name: ember-cli-inject-live-reload - - dependency-name: ember-cli-sri - - dependency-name: ember-cli-terser - - dependency-name: ember-data - - dependency-name: ember-fetch - - dependency-name: ember-load-initializers - - dependency-name: ember-modifier - - dependency-name: ember-page-title - - dependency-name: ember-qunit - - dependency-name: ember-resolver - - dependency-name: ember-source - - dependency-name: ember-welcome-page - - dependency-name: qunit - - dependency-name: qunit-dom - - dependency-name: tracked-built-ins - - dependency-name: webpack +- package-ecosystem: npm + directory: "/" + schedule: + interval: daily + time: "02:30" + timezone: America/Los_Angeles + open-pull-requests-limit: 10 + groups: + embroider: + patterns: + - "@embroider/*" + ignore: + - dependency-name: "@babel/core" + - dependency-name: "@babel/eslint-parser" + - dependency-name: "@babel/plugin-proposal-decorators" + - dependency-name: "@ember/optional-features" + - dependency-name: "@ember/string" + - dependency-name: "@ember/test-helpers" + - dependency-name: "@glimmer/component" + - dependency-name: "@glimmer/tracking" + - dependency-name: broccoli-asset-rev + - dependency-name: ember-auto-import + - dependency-name: ember-cli + - dependency-name: ember-cli-app-version + - dependency-name: ember-cli-babel + - dependency-name: ember-cli-clean-css + - dependency-name: ember-cli-dependency-checker + - dependency-name: ember-cli-htmlbars + - dependency-name: ember-cli-inject-live-reload + - dependency-name: ember-cli-sri + - dependency-name: ember-cli-terser + - dependency-name: ember-data + - dependency-name: ember-fetch + - dependency-name: ember-load-initializers + - dependency-name: ember-modifier + - dependency-name: ember-page-title + - dependency-name: ember-qunit + - dependency-name: ember-resolver + - dependency-name: ember-source + - dependency-name: ember-welcome-page + - dependency-name: qunit + - dependency-name: qunit-dom + - dependency-name: tracked-built-ins + - dependency-name: webpack diff --git a/.github/workflows/auto-merge.yml b/.github/workflows/auto-merge.yml index 9e15ea5d20..898f8d9e57 100644 --- a/.github/workflows/auto-merge.yml +++ b/.github/workflows/auto-merge.yml @@ -37,15 +37,15 @@ jobs: - "stylelint-scss" if: ${{ github.actor == 'dependabot[bot]' }} steps: - - name: Dependabot metadata - id: metadata - uses: dependabot/fetch-metadata@v1.6.0 - with: - github-token: "${{ secrets.GITHUB_TOKEN }}" - - uses: actions/checkout@v4 - if: ${{contains(steps.metadata.outputs.dependency-names, matrix.safe-dependency) && (steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.update-type == 'version-update:semver-patch') }} - - name: Enable auto-merge for Dependabot PRs - if: ${{contains(steps.metadata.outputs.dependency-names, matrix.safe-dependency) && (steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.update-type == 'version-update:semver-patch') }} - run: gh pr merge --merge --auto ${{ github.event.number }} - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Dependabot metadata + id: metadata + uses: dependabot/fetch-metadata@v1.6.0 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + - uses: actions/checkout@v4 + if: ${{contains(steps.metadata.outputs.dependency-names, matrix.safe-dependency) && (steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.update-type == 'version-update:semver-patch') }} + - name: Enable auto-merge for Dependabot PRs + if: ${{contains(steps.metadata.outputs.dependency-names, matrix.safe-dependency) && (steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.update-type == 'version-update:semver-patch') }} + run: gh pr merge --merge --auto ${{ github.event.number }} + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec8f314ded..e6cc863ae3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,18 +23,18 @@ jobs: timeout-minutes: 10 steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - name: Install Dependencies - run: pnpm install - - name: Lint - run: pnpm run lint + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - name: Install Dependencies + run: pnpm install + - name: Lint + run: pnpm run lint test: name: ${{matrix.workspace}} Test (${{ matrix.node-version }}) @@ -45,23 +45,23 @@ jobs: matrix: node-version: [20] workspace: - - frontend - - test-app - - lti-course-manager - - lti-dashboard + - frontend + - test-app + - lti-course-manager + - lti-dashboard steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - cache: pnpm - - name: Install Dependencies - run: pnpm install - - name: Run Tests - run: pnpm --filter ${{matrix.workspace}} exec ember test + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: pnpm + - name: Install Dependencies + run: pnpm install + - name: Run Tests + run: pnpm --filter ${{matrix.workspace}} exec ember test build: name: Build (${{ matrix.node-version }}) @@ -71,20 +71,20 @@ jobs: matrix: node-version: [20] steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - cache: pnpm - - name: install dependencies - run: pnpm install - - name: test frontend build - run: pnpm run --filter frontend build - - name: test lti-dashboard build - run: pnpm run --filter lti-dashboard build + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: pnpm + - name: install dependencies + run: pnpm install + - name: test frontend build + run: pnpm run --filter frontend build + - name: test lti-dashboard build + run: pnpm run --filter lti-dashboard build # browserstack-test: # name: Browserstack ${{matrix.workspace}} ${{ matrix.launcher }} @@ -137,28 +137,28 @@ jobs: fail-fast: false matrix: workspace: - - frontend - - test-app - - lti-course-manager - - lti-dashboard + - frontend + - test-app + - lti-course-manager + - lti-dashboard firefox-version: [latest-esr] steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - run: pnpm install - - name: Setup firefox - uses: browser-actions/setup-firefox@latest - with: - firefox-version: ${{ matrix.firefox-version }} - - run: firefox --version - - name: test - run: pnpm --filter ${{matrix.workspace}} exec ember test --launch=Firefox + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install + - name: Setup firefox + uses: browser-actions/setup-firefox@latest + with: + firefox-version: ${{ matrix.firefox-version }} + - run: firefox --version + - name: test + run: pnpm --filter ${{matrix.workspace}} exec ember test --launch=Firefox test-with-embroider: name: Test With Embroider @@ -167,18 +167,18 @@ jobs: env: BUILD_WITH_EMBROIDER: true steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - name: Install Dependencies - run: pnpm install - - name: Run Tests - run: pnpm --filter frontend exec ember test + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - name: Install Dependencies + run: pnpm install + - name: Run Tests + run: pnpm --filter frontend exec ember test build-with-embroider: name: Build With Embroider @@ -187,15 +187,15 @@ jobs: env: BUILD_WITH_EMBROIDER: true steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - name: Install Dependencies - run: pnpm install - - name: Run Tests - run: pnpm run --filter frontend build + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - name: Install Dependencies + run: pnpm install + - name: Run Tests + run: pnpm run --filter frontend build diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml index a9e64b61b6..c927b89231 100644 --- a/.github/workflows/deploy-pr.yml +++ b/.github/workflows/deploy-pr.yml @@ -34,13 +34,13 @@ jobs: runs-on: ubuntu-latest needs: deploy steps: - - uses: actions/github-script@v7 - with: - github-token: ${{secrets.GITHUB_TOKEN}} - script: | - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: "Staging build deployed! It can be accessed with `bin/console ilios:update-frontend --staging-build --at-version=pr_preview-${{ github.event.number }}`" - }) + - uses: actions/github-script@v7 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: "Staging build deployed! It can be accessed with `bin/console ilios:update-frontend --staging-build --at-version=pr_preview-${{ github.event.number }}`" + }) diff --git a/.github/workflows/deploy-production.yml b/.github/workflows/deploy-production.yml index 08a997b93d..d784dadea0 100644 --- a/.github/workflows/deploy-production.yml +++ b/.github/workflows/deploy-production.yml @@ -3,7 +3,7 @@ name: Deploy Production Build on: push: tags: - - '*' + - '*' env: COVERAGE: false @@ -15,29 +15,29 @@ jobs: name: Deploy and Create Sentry Release runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - run: pnpm install - - name: Ember CLI Deploy - run: pnpm run --filter frontend deploy:production - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - - name: Install Sentry CLI - run: pnpm install -g @sentry/cli - - name: Create a Sentry.io release - run: | - # Create new Sentry release - export SENTRY_RELEASE=$(sentry-cli releases propose-version) - sentry-cli releases new $SENTRY_RELEASE - sentry-cli releases set-commits --auto $SENTRY_RELEASE - sentry-cli releases files $SENTRY_RELEASE upload-sourcemaps packages/frontend/tmp/deploy-dist/ - sentry-cli releases finalize $SENTRY_RELEASE - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install + - name: Ember CLI Deploy + run: pnpm run --filter frontend deploy:production + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + - name: Install Sentry CLI + run: pnpm install -g @sentry/cli + - name: Create a Sentry.io release + run: | + # Create new Sentry release + export SENTRY_RELEASE=$(sentry-cli releases propose-version) + sentry-cli releases new $SENTRY_RELEASE + sentry-cli releases set-commits --auto $SENTRY_RELEASE + sentry-cli releases files $SENTRY_RELEASE upload-sourcemaps packages/frontend/tmp/deploy-dist/ + sentry-cli releases finalize $SENTRY_RELEASE + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} diff --git a/.github/workflows/deploy-staging.yml b/.github/workflows/deploy-staging.yml index c49563726c..6e36914c0f 100644 --- a/.github/workflows/deploy-staging.yml +++ b/.github/workflows/deploy-staging.yml @@ -3,7 +3,7 @@ name: Deploy Staging Build on: push: branches: - - master + - master env: COVERAGE: false @@ -13,17 +13,17 @@ jobs: name: Deploy runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - run: pnpm install - - name: Ember CLI Deploy - run: pnpm run --filter frontend deploy:staging - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install + - name: Ember CLI Deploy + run: pnpm run --filter frontend deploy:staging + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/lti-course-manager-deploy-production.yml b/.github/workflows/lti-course-manager-deploy-production.yml index b050c8f96e..bf2f8147e0 100644 --- a/.github/workflows/lti-course-manager-deploy-production.yml +++ b/.github/workflows/lti-course-manager-deploy-production.yml @@ -3,24 +3,24 @@ name: LTI Course Manager Deploy Production Build on: push: tags: - - '*' + - '*' jobs: deploy: name: Deploy to AWS runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - run: pnpm install - - name: Ember CLI Deploy - run: pnpm run --filter lti-course-manager deploy:production - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install + - name: Ember CLI Deploy + run: pnpm run --filter lti-course-manager deploy:production + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/lti-course-manager-deploy-staging.yml b/.github/workflows/lti-course-manager-deploy-staging.yml index dc283d4cbb..dbe99fa372 100644 --- a/.github/workflows/lti-course-manager-deploy-staging.yml +++ b/.github/workflows/lti-course-manager-deploy-staging.yml @@ -3,24 +3,24 @@ name: LTI Course Manager Deploy Staging Build on: push: branches: - - master + - master jobs: deploy: name: Deploy to AWS runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - run: pnpm install - - name: Ember CLI Deploy - run: pnpm run --filter lti-course-manager deploy:staging - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install + - name: Ember CLI Deploy + run: pnpm run --filter lti-course-manager deploy:staging + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/lti-dashboard-deploy-production.yml b/.github/workflows/lti-dashboard-deploy-production.yml index e5fd6105f5..7746636bb0 100644 --- a/.github/workflows/lti-dashboard-deploy-production.yml +++ b/.github/workflows/lti-dashboard-deploy-production.yml @@ -3,24 +3,24 @@ name: LTI Dashboard Deploy Production Build on: push: tags: - - '*' + - '*' jobs: deploy: name: Deploy to AWS runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - run: pnpm install - - name: Ember CLI Deploy - run: pnpm run --filter lti-dashboard deploy:production - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install + - name: Ember CLI Deploy + run: pnpm run --filter lti-dashboard deploy:production + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/lti-dashboard-deploy-staging.yml b/.github/workflows/lti-dashboard-deploy-staging.yml index f673481452..da29571e4f 100644 --- a/.github/workflows/lti-dashboard-deploy-staging.yml +++ b/.github/workflows/lti-dashboard-deploy-staging.yml @@ -3,24 +3,24 @@ name: LTI Dashboard Deploy Staging Build on: push: branches: - - master + - master jobs: deploy: name: Deploy to AWS runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - run: pnpm install - - name: Ember CLI Deploy - run: pnpm run --filter lti-dashboard deploy:staging - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install + - name: Ember CLI Deploy + run: pnpm run --filter lti-dashboard deploy:staging + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/percy-test-pr.yml b/.github/workflows/percy-test-pr.yml index 772afc141d..5a3795fd36 100644 --- a/.github/workflows/percy-test-pr.yml +++ b/.github/workflows/percy-test-pr.yml @@ -24,19 +24,19 @@ jobs: fail-fast: false matrix: workspace: - - frontend - - test-app + - frontend + - test-app steps: - - uses: actions/checkout@v4 - with: - ref: "${{ github.event.pull_request.merge_commit_sha }}" - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - run: pnpm install - - name: Run Percy Tests - run: pnpm --filter ${{matrix.workspace}} exec percy exec -- ember test + - uses: actions/checkout@v4 + with: + ref: "${{ github.event.pull_request.merge_commit_sha }}" + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install + - name: Run Percy Tests + run: pnpm --filter ${{matrix.workspace}} exec percy exec -- ember test diff --git a/.github/workflows/percy.yml b/.github/workflows/percy.yml index 7673b61995..e463d5be13 100644 --- a/.github/workflows/percy.yml +++ b/.github/workflows/percy.yml @@ -2,7 +2,7 @@ name: Percy Visual Tests on: schedule: - - cron: "15 23 * * 2,4" # T,Th in the afternoon (UTC) + - cron: "15 23 * * 2,4" # T,Th in the afternoon (UTC) workflow_dispatch: concurrency: @@ -24,22 +24,22 @@ jobs: fail-fast: false matrix: workspace: - - frontend - - test-app + - frontend + - test-app steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 - with: - version: 8 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - run: pnpm install - - name: Run Percy Tests - run: pnpm --filter ${{matrix.workspace}} exec percy exec -- ember test - - uses: act10ns/slack@v2 - if: failure() - with: - status: ${{ job.status }} - message: Percy Run Failed {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }} + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install + - name: Run Percy Tests + run: pnpm --filter ${{matrix.workspace}} exec percy exec -- ember test + - uses: act10ns/slack@v2 + if: failure() + with: + status: ${{ job.status }} + message: Percy Run Failed {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/actions/runs/{{ env.GITHUB_RUN_ID }} diff --git a/.github/workflows/update-transitive-dependencies.yaml b/.github/workflows/update-transitive-dependencies.yaml index 3b44895a42..8463874370 100644 --- a/.github/workflows/update-transitive-dependencies.yaml +++ b/.github/workflows/update-transitive-dependencies.yaml @@ -2,7 +2,7 @@ name: Update Transitive Dependencies on: schedule: - - cron: '15 11 * * 0' # weekly, on Sunday morning (UTC) + - cron: '15 11 * * 0' # weekly, on Sunday morning (UTC) workflow_dispatch: jobs: