2011-11-11 00:31:45 +08:00
|
|
|
{
|
|
|
|
"name": "canvas-lms",
|
2015-07-16 12:24:49 +08:00
|
|
|
"license": "AGPL-3.0",
|
2011-11-11 00:31:45 +08:00
|
|
|
"version": "0.0.0",
|
2015-07-16 12:24:49 +08:00
|
|
|
"engines": {
|
2023-10-07 00:18:37 +08:00
|
|
|
"node": ">=18.0.0",
|
2020-12-12 01:32:26 +08:00
|
|
|
"yarn": "^1.19.1"
|
2015-07-16 12:24:49 +08:00
|
|
|
},
|
2018-05-25 00:09:03 +08:00
|
|
|
"private": true,
|
|
|
|
"workspaces": {
|
|
|
|
"packages": [
|
2018-07-20 03:42:35 +08:00
|
|
|
"gems/plugins/*",
|
2022-06-17 13:31:09 +08:00
|
|
|
"packages/*",
|
2022-06-22 07:49:54 +08:00
|
|
|
"ui/engine",
|
2022-06-17 13:31:09 +08:00
|
|
|
"ui/shared/*"
|
2018-05-25 00:09:03 +08:00
|
|
|
]
|
|
|
|
},
|
2014-02-11 02:29:11 +08:00
|
|
|
"dependencies": {
|
2021-11-04 00:38:26 +08:00
|
|
|
"@apollo/client": "^3.4.16",
|
2021-07-01 01:51:10 +08:00
|
|
|
"@instructure/brandable_css": "^3",
|
2023-08-31 00:16:52 +08:00
|
|
|
"@instructure/canvas-media": "*",
|
|
|
|
"@instructure/debounce": "^8",
|
|
|
|
"@instructure/emotion": "^8",
|
2023-09-13 22:48:32 +08:00
|
|
|
"@instructure/media-capture": "^9.0.0",
|
2024-03-20 22:19:20 +08:00
|
|
|
"@instructure/media-capture-new": "npm:@instructure/media-capture@9.1.2-rc.38",
|
2024-01-06 05:02:00 +08:00
|
|
|
"@instructure/outcomes-ui": "^3",
|
2018-11-27 02:20:33 +08:00
|
|
|
"@instructure/react-crop": "^5.0.1",
|
2020-12-03 07:53:26 +08:00
|
|
|
"@instructure/reactour": "https://github.com/instructure/reactour#b908434fe544703e26bc67c67c4111252c401f92",
|
2022-01-18 01:00:41 +08:00
|
|
|
"@instructure/ready": "*",
|
2023-08-31 00:16:52 +08:00
|
|
|
"@instructure/ui-a11y-content": "^8",
|
|
|
|
"@instructure/ui-a11y-utils": "^8",
|
|
|
|
"@instructure/ui-alerts": "^8",
|
|
|
|
"@instructure/ui-avatar": "^8",
|
|
|
|
"@instructure/ui-badge": "^8",
|
|
|
|
"@instructure/ui-billboard": "^8",
|
|
|
|
"@instructure/ui-breadcrumb": "^8",
|
|
|
|
"@instructure/ui-buttons": "^8",
|
|
|
|
"@instructure/ui-calendar": "^8",
|
|
|
|
"@instructure/ui-checkbox": "^8",
|
|
|
|
"@instructure/ui-date-input": "^8",
|
2023-10-06 22:00:35 +08:00
|
|
|
"@instructure/ui-date-time-input": "^8",
|
2023-08-31 00:16:52 +08:00
|
|
|
"@instructure/ui-decorator": "^8",
|
2023-10-24 05:17:54 +08:00
|
|
|
"@instructure/ui-dialog": "^8",
|
2023-08-31 00:16:52 +08:00
|
|
|
"@instructure/ui-drawer-layout": "8",
|
|
|
|
"@instructure/ui-editable": "^8",
|
|
|
|
"@instructure/ui-file-drop": "^8",
|
|
|
|
"@instructure/ui-flex": "^8",
|
|
|
|
"@instructure/ui-focusable": "^8",
|
|
|
|
"@instructure/ui-form-field": "^8",
|
|
|
|
"@instructure/ui-grid": "^8",
|
|
|
|
"@instructure/ui-heading": "^8",
|
|
|
|
"@instructure/ui-i18n": "^8",
|
|
|
|
"@instructure/ui-icons": "^8",
|
|
|
|
"@instructure/ui-img": "^8",
|
|
|
|
"@instructure/ui-link": "^8",
|
|
|
|
"@instructure/ui-list": "^8",
|
2023-09-13 22:48:32 +08:00
|
|
|
"@instructure/ui-media-player": "^9.0.0",
|
2023-08-31 00:16:52 +08:00
|
|
|
"@instructure/ui-menu": "^8",
|
|
|
|
"@instructure/ui-metric": "^8",
|
|
|
|
"@instructure/ui-modal": "^8",
|
|
|
|
"@instructure/ui-motion": "^8",
|
|
|
|
"@instructure/ui-navigation": "^8",
|
|
|
|
"@instructure/ui-number-input": "^8",
|
|
|
|
"@instructure/ui-overlays": "^8",
|
|
|
|
"@instructure/ui-pagination": "^8",
|
|
|
|
"@instructure/ui-pill": "^8",
|
|
|
|
"@instructure/ui-portal": "^8",
|
|
|
|
"@instructure/ui-progress": "^8",
|
|
|
|
"@instructure/ui-radio-input": "^8",
|
|
|
|
"@instructure/ui-rating": "^8",
|
|
|
|
"@instructure/ui-react-utils": "^8",
|
|
|
|
"@instructure/ui-responsive": "^8",
|
|
|
|
"@instructure/ui-select": "^8",
|
|
|
|
"@instructure/ui-simple-select": "^8",
|
|
|
|
"@instructure/ui-spinner": "^8",
|
|
|
|
"@instructure/ui-svg-images": "^8",
|
|
|
|
"@instructure/ui-table": "^8",
|
|
|
|
"@instructure/ui-tabs": "^8",
|
|
|
|
"@instructure/ui-tag": "^8",
|
|
|
|
"@instructure/ui-text": "^8",
|
|
|
|
"@instructure/ui-text-area": "^8",
|
|
|
|
"@instructure/ui-text-input": "^8",
|
|
|
|
"@instructure/ui-themes": "^8",
|
|
|
|
"@instructure/ui-time-select": "^8",
|
|
|
|
"@instructure/ui-toggle-details": "^8",
|
|
|
|
"@instructure/ui-tooltip": "^8",
|
2023-11-28 03:59:57 +08:00
|
|
|
"@instructure/ui-top-nav-bar": "^8",
|
2023-08-31 00:16:52 +08:00
|
|
|
"@instructure/ui-tray": "^8",
|
|
|
|
"@instructure/ui-tree-browser": "^8",
|
|
|
|
"@instructure/ui-view": "^8",
|
|
|
|
"@instructure/uid": "^8",
|
2022-07-21 06:04:38 +08:00
|
|
|
"@instructure/updown": "^1.3",
|
2020-08-25 00:57:49 +08:00
|
|
|
"@microsoft/immersive-reader-sdk": "^1.1.0",
|
2023-06-02 04:04:12 +08:00
|
|
|
"@peculiar/asn1-schema": "^2.3.6",
|
2023-04-13 12:19:01 +08:00
|
|
|
"@peculiar/x509": "^1.9.3",
|
2021-07-12 09:26:47 +08:00
|
|
|
"@popperjs/core": "^2.9.2",
|
2024-02-01 04:19:23 +08:00
|
|
|
"@rspack/cli": "^0.5.4",
|
|
|
|
"@rspack/core": "^0.5.4",
|
|
|
|
"@rspack/plugin-react-refresh": "^0.5.4",
|
2023-11-21 03:00:15 +08:00
|
|
|
"@sentry/cli": "^2.21.5",
|
|
|
|
"@sentry/react": "^7.81.0",
|
2024-02-01 04:19:23 +08:00
|
|
|
"@swc/cli": "^0.3.9",
|
|
|
|
"@swc/core": "1.3.105",
|
|
|
|
"@swc/helpers": "^0.5.6",
|
|
|
|
"@swc/jest": "^0.2.36",
|
2023-10-25 00:45:10 +08:00
|
|
|
"@tanstack/query-sync-storage-persister": "^4.36.1",
|
|
|
|
"@tanstack/react-query": "^4.36.1",
|
|
|
|
"@tanstack/react-query-persist-client": "^4.36.1",
|
2024-01-08 09:23:15 +08:00
|
|
|
"@types/b-spline": "^2.0.4",
|
|
|
|
"@types/dagre": "^0.7.52",
|
2023-01-06 02:43:53 +08:00
|
|
|
"@types/jquery.cookie": "^1.4.32",
|
2022-03-01 05:52:52 +08:00
|
|
|
"@types/react-dnd": "2.0.36",
|
2022-08-18 23:44:07 +08:00
|
|
|
"@types/twitter-text": "^3.1.2",
|
2023-01-13 05:31:29 +08:00
|
|
|
"@types/uuid": "^9.0.0",
|
2023-12-10 22:47:24 +08:00
|
|
|
"@vitest/coverage-v8": "^1.0.4",
|
2023-09-26 03:20:00 +08:00
|
|
|
"apollo-cache": "^1.3.2",
|
2021-05-26 01:22:32 +08:00
|
|
|
"apollo-cache-inmemory": "^1.6.3",
|
2021-09-01 01:15:20 +08:00
|
|
|
"apollo-cache-persist": "^0.1.1",
|
2019-08-22 00:54:59 +08:00
|
|
|
"apollo-client": "^2.6.4",
|
2023-09-26 03:20:00 +08:00
|
|
|
"apollo-link": "^1.2.3",
|
2018-11-20 04:17:17 +08:00
|
|
|
"apollo-link-error": "^1.1.1",
|
|
|
|
"apollo-link-http": "^1.5.5",
|
2018-12-11 03:56:24 +08:00
|
|
|
"apollo-link-state": "^0.4.2",
|
2019-08-28 04:10:29 +08:00
|
|
|
"apollo-utilities": "^1.3.2",
|
2023-09-21 04:59:21 +08:00
|
|
|
"axios": "^0.21.1",
|
2023-09-26 03:20:00 +08:00
|
|
|
"axios-cache-adapter": "^2.7.0",
|
2024-01-08 09:23:15 +08:00
|
|
|
"b-spline": "^2.0.2",
|
2017-10-04 01:05:04 +08:00
|
|
|
"backbone": "1.1.1",
|
2018-05-02 04:54:56 +08:00
|
|
|
"big.js": "^5.0.3",
|
2024-01-17 05:27:20 +08:00
|
|
|
"browserslist": "^4.22.2",
|
2017-08-09 03:40:06 +08:00
|
|
|
"canvas_offline_course_viewer": "https://github.com/instructure/canvas_offline_course_viewer.git#1.2.0",
|
2023-08-31 00:16:52 +08:00
|
|
|
"chart.js": "^3.9.1",
|
|
|
|
"chartjs-adapter-moment": "^1.0.0",
|
2017-10-04 01:05:04 +08:00
|
|
|
"classnames": "^2.2.5",
|
|
|
|
"color-slicer": "0.8.0",
|
2022-02-24 05:18:06 +08:00
|
|
|
"coverage-istanbul-loader": "^3.0.5",
|
2018-09-12 13:29:44 +08:00
|
|
|
"create-react-class": "^15.6.3",
|
2024-01-08 09:23:15 +08:00
|
|
|
"cross-fetch": "^4.0.0",
|
2021-09-21 05:11:21 +08:00
|
|
|
"crypto-js": "^4.1.1",
|
2017-12-04 23:24:41 +08:00
|
|
|
"d3": "3.5.17",
|
2024-01-08 09:23:15 +08:00
|
|
|
"dagre": "^0.8.5",
|
2022-03-02 08:06:40 +08:00
|
|
|
"emoji-mart": "^3.0.1",
|
Add page for managing internal settings
This adds a new page where Site Admin users can manage `Setting`s (aka,
"Internal Settings"). This can be done on the Site Admin settings page,
on the "Internal Settings" tab. Only Site Admin users see and may access
this tab.
The table displayed renders each setting and its value, and offers the
ability to edit or delete each setting. New settings may also be added.
Settings denoted internally as `secret` will be displayed, but their
values obscured. These settings may not be edited or deleted from the UI.
There is also a "Download as..." button that allows all internal settings
(except for secret ones) to be downloaded in JSON or CSV format.
closes DE-1136
flag=none
test plan:
- confirm that, as a site admin, you can add, edit, and delete internal
settings from the "Internal Settings" tab
(note: you can edit a setting by clicking on its value)
- confirm the table is sortable by clicking on the column headers
- confirm the table is downloadable by choosing either the JSON or CSV
options
- confirm that your changes are reflected in the database, and in
`Settings.get` once settings have been reloaded
- confirm that, as a non-site admin user, you can not see the Internal
Settings tab
Change-Id: Ia143bf40e85b43a1db2f6fcc2791718179c351c4
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/290906
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
QA-Review: Jeremy Stanley <jeremy@instructure.com>
Product-Review: Isaac Moore <isaac.moore@instructure.com>
2022-05-02 22:45:52 +08:00
|
|
|
"export-from-json": "^1.6.0",
|
2021-03-26 00:11:03 +08:00
|
|
|
"final-form": "^4.20.2",
|
2018-03-02 07:12:40 +08:00
|
|
|
"formdata-polyfill": "^3.0.9",
|
2024-02-28 10:48:45 +08:00
|
|
|
"fullcalendar": "3.10.5",
|
2024-04-17 01:09:52 +08:00
|
|
|
"graphiql": "1.7.2",
|
2023-09-26 03:20:00 +08:00
|
|
|
"graphiql-explorer": "^0.4.2",
|
2024-04-17 01:45:51 +08:00
|
|
|
"graphql": "^15",
|
2023-11-01 01:12:17 +08:00
|
|
|
"graphql-request": "^6.1.0",
|
2023-09-26 03:20:00 +08:00
|
|
|
"graphql-tag": "^2.8.0",
|
2018-03-14 04:10:14 +08:00
|
|
|
"i18n-js": "^3",
|
2017-10-04 01:05:04 +08:00
|
|
|
"ic-ajax": "~2.0.1",
|
|
|
|
"ic-tabs": "0.1.3",
|
2019-08-20 08:55:20 +08:00
|
|
|
"immer": "^3",
|
|
|
|
"immutability-helper": "^3",
|
Configurable proficiency ratings page
closes OUT-1856, OUT-1858, OUT-2239, OUT-2148
This adds configurable proficiency ratings on the account rubrics page.
Persisting these changes will occur in a future patchset (2252).
Validating order will be in a separate patchset (2240).
test plan:
- with the "non-scoring rubrics" feature flag off, the account rubrics
page should appear without the proficiency ratings tab
- with the "non-scoring rubrics" feature flag on, the accounts rubrics
page should appear with the proficiency tab, if visiting with an
account with "manage_outcomes" permission (e.g. account admin)
- create an account role that has "Create and edit assessing rubrics"
permission enabled but "Manage learning outcomes" disabled by going
to the account page, click on the "Permissions" link in the left menu,
then select the "Account Roles" tab to then be able create the role
and enable the permission above.
- create an account user by going to the account page and then click
on the "People" link in the left menu to then be able to
click on "+ New User". you'll use the email address entered in
the next step.
- make that user an account admin by going to the account page,
click on the "Settings" link in the left menu, then select the
"Admins" tab, then click on "+ Account Admins". select the new
role from the drop down menu and enter the email address you used
in the preivous step
- confirm with the feature flag enabled, that visiting the account
rubrics page does not appear with the proficiency tab, if visiting
with an account without "manage_outcomes" permission (e.g. masquerade
as the user created above)
- on the proficiency tab, test error handling:
* description is required
* points is required, should be a valid number
* when saving changes, all fields with errors should be labelled
with an error text, with the first field receiving focus
Change-Id: Ic52ef9fe9c58cfb215216b3a505ef1fb4b851c68
Reviewed-on: https://gerrit.instructure.com/150841
Reviewed-by: Michael Brewer-Davis <mbd@instructure.com>
Reviewed-by: Frank Murphy <fmurphy@instructure.com>
Tested-by: Jenkins
QA-Review: Dariusz Dzien <ddzien@instructure.com>
Product-Review: Sidharth Oberoi <soberoi@instructure.com>
2018-04-10 09:20:00 +08:00
|
|
|
"immutable": "^3.8.2",
|
2023-12-23 07:04:13 +08:00
|
|
|
"invariant": "^2.2.2",
|
2019-08-14 13:36:39 +08:00
|
|
|
"is-valid-domain": "^0.0.11",
|
2024-02-28 10:48:45 +08:00
|
|
|
"jquery-migrate": "3.4.1",
|
2017-10-04 01:05:04 +08:00
|
|
|
"jquery-ui-touch-punch": "^0.2.3",
|
|
|
|
"jquery.cookie": "^1.4.1",
|
2018-01-03 06:24:44 +08:00
|
|
|
"jquery.elastic": "1.0.0",
|
2024-01-23 07:00:30 +08:00
|
|
|
"jquery3": "npm:jquery@^3.7.1",
|
2021-09-21 05:11:21 +08:00
|
|
|
"localforage": "^1.10.0",
|
2017-12-09 08:32:58 +08:00
|
|
|
"location-origin": "^1.1.4",
|
2021-05-26 01:22:32 +08:00
|
|
|
"lodash": "^4.17.21",
|
2017-10-04 01:05:04 +08:00
|
|
|
"md5": "^2.2.1",
|
2018-03-07 00:03:37 +08:00
|
|
|
"mediaelement": "https://github.com/instructure/mediaelement.git#master",
|
2023-12-28 23:30:36 +08:00
|
|
|
"mime": "^4.0.1",
|
2023-12-30 07:08:03 +08:00
|
|
|
"minimatch": "~3.0.4",
|
2023-12-10 22:40:44 +08:00
|
|
|
"moment": "^2.29.4",
|
2024-04-02 07:14:18 +08:00
|
|
|
"moment-timezone": "^0.5.45",
|
2020-06-30 02:23:26 +08:00
|
|
|
"nanoid": "^3.1.10",
|
2019-08-06 06:43:39 +08:00
|
|
|
"newless": "^0.3.0",
|
2019-08-14 13:36:39 +08:00
|
|
|
"normalize-scroll-left": "^0.2",
|
2019-10-11 22:32:01 +08:00
|
|
|
"page": "^1.11",
|
2018-01-17 00:52:42 +08:00
|
|
|
"parse-decimal-number": "1.0.0",
|
2018-05-31 02:03:31 +08:00
|
|
|
"parse-link-header": "^1",
|
2018-02-23 03:58:38 +08:00
|
|
|
"prop-types": "^15",
|
2019-03-07 00:43:35 +08:00
|
|
|
"qs": "^6.6.0",
|
2023-09-26 03:20:00 +08:00
|
|
|
"react": "^16.13.1",
|
2021-05-26 01:22:32 +08:00
|
|
|
"react-apollo": "~3.0.1",
|
2024-02-27 09:04:10 +08:00
|
|
|
"react-beautiful-dnd": "^13.1.1",
|
2023-09-09 00:29:10 +08:00
|
|
|
"react-dnd": "6.0",
|
2023-09-26 03:20:00 +08:00
|
|
|
"react-dnd-html5-backend": "6.0",
|
2021-05-26 01:22:32 +08:00
|
|
|
"react-dom": "^16.13.1",
|
2021-03-26 00:11:03 +08:00
|
|
|
"react-final-form": "^6.5.3",
|
2021-12-03 05:07:31 +08:00
|
|
|
"react-identicons": "^1.2.5",
|
2018-06-01 05:13:10 +08:00
|
|
|
"react-immutable-proptypes": "^2.1.0",
|
2023-03-29 08:40:46 +08:00
|
|
|
"react-lazy-load": "^4.0.1",
|
2018-09-13 03:05:43 +08:00
|
|
|
"react-modal": "^3",
|
2021-07-12 09:26:47 +08:00
|
|
|
"react-popper": "^2.2.5",
|
2018-11-30 08:54:31 +08:00
|
|
|
"react-redux": "^5.1.1",
|
2023-09-27 04:30:51 +08:00
|
|
|
"react-router-dom": "^6.16.0",
|
upgrade react-token-input so it supports react 16
closes: CORE-1885
Test plan:
* make sure the token input that appears when you edit assignment
due date Overrides on the assignment overrides page still works
Like it did before. Here’s it’s original test plan:
new due dates selection UI
- on assignments, quizzes & discussions pages
- with DA on and off
- assign various due dates/(un)lock dates
to source sections, individuals, and everybody
- these should create overrides that properly take
students/sections and dates
- validations should work for all dates as normal
and not let empty overrides get created (with no
students or sections)
- the names of overrides should properly update as
students change
- as more overrides get created, saving assignments
should not slow down significantly
- the student/section selector should be intuitive
* the “new grading period set” form should work as it did before.
Here’s it’s original test plan:
A new button "+ Add Grading Period Set" is on the
Grading Period Sets page. This allows a new set to
be named and associated with as many terms as needed.
To begin, visit the Grading page for an account
(e.g. /accounts/1/grading_standards) and click "+ Set of
Grading Period" and within this form ensure the following:
1. Given no name in the "Set name" field, when clicking
the "Create" button a flash message is displayed and the
set is not saved
2. Given no enrollment terms in the "Attach terms", when
clicking the "Create" button a flash message is displayed
and the set is not saved
3. Given a name and at least one attached enrollment term,
when clicking the "Create" button an AJAX call successfully
persists to the database and the new set is displayed on
the page along with a successful flash message
4. When the form is open, the "+ Set of Grading Periods"
button is disabled
5. When the form is in the process of creating a new set,
the "Create" and "Cancel" button is disabled
6. Clicking close at any other time closes the form and
re-enables the "+ Set of Grading Periods" button and
all data in the form is cleared
Change-Id: Ibb0290202b5dcf00ec42a4bb6d1c3d2e3d7a3b2b
Reviewed-on: https://gerrit.instructure.com/164492
Reviewed-by: Clay Diffrient <cdiffrient@instructure.com>
Tested-by: Jenkins
Product-Review: Ryan Shaw <ryan@instructure.com>
QA-Review: Ryan Shaw <ryan@instructure.com>
2018-09-14 23:20:08 +08:00
|
|
|
"react-tokeninput": "^2.5.0",
|
2018-11-27 02:20:33 +08:00
|
|
|
"react-transition-group": "^1",
|
Add option to embed K5 subject view in a hybrid manner
This change adds an `embed` param to the K5 subject `show` action that,
when set to `true`, hides global nav, the K5 Hero header, and the K5
tab bar. Navigation between tabs is still possible by changing the hash
fragment at the end of the URL.
closes LS-2590
flag=none
test plan:
- browse to a k5 subject
- append `?embed=true` to the URL
- verify that the global nav and subject tabs disappear
- navigate between different subject tabs by modifying the hash fragment
at the end of the URL (#home, #grades, #modules, #resources, #groups,
#schedule)
- verify that the content changes appropriately
- remove `embed=true`, and click between the subject tabs
- verify that navigation in non-embed mode still works correctly
Change-Id: I9a3bbdf4e5d4fd4da5e98bd8c85133ff2498cefb
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/273352
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Nate Armstrong <narmstrong@instructure.com>
QA-Review: Nate Armstrong <narmstrong@instructure.com>
Product-Review: Isaac Moore <isaac.moore@instructure.com>
2021-09-28 03:46:18 +08:00
|
|
|
"react-use": "^17.3.1",
|
2023-09-26 03:20:00 +08:00
|
|
|
"redux": "^4.0.1",
|
2018-11-30 08:57:55 +08:00
|
|
|
"redux-actions": "^2.6.4",
|
2023-07-29 01:57:25 +08:00
|
|
|
"redux-promise": "^0.6",
|
|
|
|
"redux-saga": "^0.16.0",
|
2023-12-26 20:07:15 +08:00
|
|
|
"redux-thunk": "^3.1.0",
|
Initial pace plans import
This change brings in the basic pace plans frontend with
styled-components and several other smaller libraries replaced with
InstUI 7 components. It also adds the 'reselect' library as a direct
dependency (which we already had through @instructure/outcomes-ui) and
'tsc-files' for type-checking of staged TS files on commit. There were
also some tweaks to typescript and eslint configs, mostly to get both
up to speed with the typescript code.
Finally, this also adds a `pace_plans` endpoint to
`courses_controller` to bootstrap the frontend-- this will get moved
to `pace_plans_controller` once it has been merged.
It's also worth noting that no frontend tests are included with this
change-- the existing tests were written with enzyme and are heavily
snapshot-based, so we will be replacing those with
@testing-library/react tests in later updates (in keeping with current
testing best practices at Instructure).
closes LS-2431, LS-2432, LS-2433, LS-2434, LS-2452
flag = pace_plans
Test plan:
- Set up a course with at least one module and several module items
- Turn on the pace_plans feature flag in the account associated with
that course
- Turn on the "Enable pace plans" setting in course settings
- Create a pace plan for the course via the Rails console:
c = Course.find<id>
pp = c.pace_plans.create! workflow_state: 'active'
c.context_module_tags.each_with_index do |t, i|
pp.pace_plan_module_items.create! module_item: t, duration: i*2
end
- Go to the course as a teacher or admin
- Expect to see a "Pace Plans" link in the course navigation
- Click it, expect the pace plan you created earlier to load and
render
- Expect to be able to pick dates, change durations, and toggle
checkboxes (although saves will fail, since there is no API yet).
- Expect to not see the "Pace Plans" course nav link when the feature
flag or course setting is off
- Expect /courses/<id>/pace_plans to return a 404 when the feature
flag or course setting is off
- Expect to not see the "Pace Plans" course nav link as a student
- Expect /courses/<id>/pace_plans to display an "Unauthorized" page
as a student
Change-Id: If4dc5d17f2c6a2109d4b4cb652c9e9ef00d7cc33
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/271650
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Ed Schiebel <eschiebel@instructure.com>
QA-Review: Ed Schiebel <eschiebel@instructure.com>
Product-Review: Jeff Largent <jeff.largent@instructure.com>
2021-08-18 05:14:24 +08:00
|
|
|
"reselect": "^4.0.0",
|
2024-02-01 04:19:23 +08:00
|
|
|
"rspack-manifest-plugin": "^5.0.0-alpha0",
|
2019-08-21 07:12:19 +08:00
|
|
|
"shallow-equal": "^1.2.0",
|
2017-10-04 01:05:04 +08:00
|
|
|
"spin.js": "2.3.2",
|
2024-01-09 12:16:28 +08:00
|
|
|
"swc-loader": "^0.2.3",
|
2024-01-11 06:43:31 +08:00
|
|
|
"swc-plugin-coverage-instrument": "^0.0.20",
|
2017-10-04 01:05:04 +08:00
|
|
|
"swfobject": "^2.2.1",
|
|
|
|
"tablesorter": "^2.28.5",
|
2024-04-02 07:50:33 +08:00
|
|
|
"timezone": "npm:@instructure/timezone@1.0.29",
|
2017-10-04 01:05:04 +08:00
|
|
|
"tinycolor2": "1.4.1",
|
2022-08-18 23:44:07 +08:00
|
|
|
"twitter-text": "^3.1.0",
|
2024-01-09 03:13:14 +08:00
|
|
|
"underscore": "^1.13.6",
|
2019-08-16 04:39:59 +08:00
|
|
|
"use-debounce": "^3",
|
2020-04-30 23:40:56 +08:00
|
|
|
"use-media-set": "^1.1",
|
2021-10-16 00:46:44 +08:00
|
|
|
"uuid": "^3.2.1",
|
2023-07-29 01:57:25 +08:00
|
|
|
"velocity-animate": "^1.5.0",
|
2023-02-25 02:33:43 +08:00
|
|
|
"webpack-retry-chunk-load-plugin": "^3.1.1",
|
2022-01-28 02:10:56 +08:00
|
|
|
"yarn-deduplicate": "^3.0.1",
|
2024-01-11 02:50:03 +08:00
|
|
|
"zod": "^3.22.4",
|
2024-01-08 09:23:15 +08:00
|
|
|
"zustand": "3.7.2"
|
2014-02-11 02:29:11 +08:00
|
|
|
},
|
2011-11-11 00:31:45 +08:00
|
|
|
"devDependencies": {
|
2021-05-26 01:22:32 +08:00
|
|
|
"@apollo/react-common": "~3.0.1",
|
|
|
|
"@apollo/react-components": "~3.0.1",
|
|
|
|
"@apollo/react-hoc": "~3.0.1",
|
|
|
|
"@apollo/react-hooks": "~3.0.1",
|
|
|
|
"@apollo/react-ssr": "~3.0.1",
|
2021-07-12 09:26:47 +08:00
|
|
|
"@apollo/react-testing": "~3.0.1",
|
2019-03-06 05:20:27 +08:00
|
|
|
"@babel/cli": "^7.0.0",
|
|
|
|
"@babel/core": "^7.0.0",
|
2019-08-16 05:46:07 +08:00
|
|
|
"@babel/parser": "^7",
|
2022-01-22 09:14:14 +08:00
|
|
|
"@babel/plugin-proposal-class-properties": "^7",
|
2022-01-25 23:25:15 +08:00
|
|
|
"@babel/plugin-proposal-optional-chaining": "^7",
|
2022-01-22 09:14:14 +08:00
|
|
|
"@babel/plugin-transform-modules-commonjs": "^7",
|
2022-07-16 01:11:46 +08:00
|
|
|
"@babel/plugin-transform-react-constant-elements": "^7",
|
|
|
|
"@babel/plugin-transform-react-inline-elements": "^7",
|
|
|
|
"@babel/plugin-transform-runtime": "^7",
|
|
|
|
"@babel/preset-env": "^7",
|
|
|
|
"@babel/preset-react": "^7",
|
|
|
|
"@babel/preset-typescript": "^7",
|
2024-04-17 07:46:44 +08:00
|
|
|
"@graphql-tools/mock": "^7",
|
|
|
|
"@graphql-tools/schema": "^7",
|
2019-08-08 03:10:17 +08:00
|
|
|
"@instructure/browserslist-config-canvas-lms": ">=2",
|
2022-06-19 18:52:13 +08:00
|
|
|
"@instructure/i18nliner": "^3",
|
2023-12-26 19:23:15 +08:00
|
|
|
"@instructure/i18nliner-canvas": "^1.3",
|
2022-06-19 18:52:13 +08:00
|
|
|
"@instructure/i18nliner-handlebars": "^2",
|
2022-08-11 01:49:43 +08:00
|
|
|
"@instructure/i18nliner-runtime": "^1.0.2",
|
2021-02-05 02:32:55 +08:00
|
|
|
"@prettier/plugin-ruby": "^1.5.2",
|
2019-01-15 01:33:05 +08:00
|
|
|
"@sheerun/mutationobserver-shim": "0.3.2",
|
2022-07-13 05:54:21 +08:00
|
|
|
"@testing-library/dom": "^8",
|
2021-02-18 02:07:07 +08:00
|
|
|
"@testing-library/jest-dom": "^5",
|
2022-07-13 05:54:21 +08:00
|
|
|
"@testing-library/react": "^12",
|
2021-02-18 02:07:07 +08:00
|
|
|
"@testing-library/react-hooks": "^5",
|
2024-02-17 03:06:46 +08:00
|
|
|
"@testing-library/user-event": "^14",
|
2023-11-17 20:54:42 +08:00
|
|
|
"@types/enzyme": "^3.10.16",
|
|
|
|
"@types/enzyme-adapter-react-16": "^1.0.9",
|
2021-09-16 04:53:42 +08:00
|
|
|
"@types/jquery": "^3.5.6",
|
2022-02-03 10:49:28 +08:00
|
|
|
"@types/jqueryui": "^1.12.16",
|
2021-09-03 00:08:08 +08:00
|
|
|
"@types/lodash": "^4.14.72",
|
2021-09-16 04:53:42 +08:00
|
|
|
"@types/parse-link-header": "^1.0.0",
|
2023-09-09 03:11:48 +08:00
|
|
|
"@types/qs": "^6.9.8",
|
Initial pace plans import
This change brings in the basic pace plans frontend with
styled-components and several other smaller libraries replaced with
InstUI 7 components. It also adds the 'reselect' library as a direct
dependency (which we already had through @instructure/outcomes-ui) and
'tsc-files' for type-checking of staged TS files on commit. There were
also some tweaks to typescript and eslint configs, mostly to get both
up to speed with the typescript code.
Finally, this also adds a `pace_plans` endpoint to
`courses_controller` to bootstrap the frontend-- this will get moved
to `pace_plans_controller` once it has been merged.
It's also worth noting that no frontend tests are included with this
change-- the existing tests were written with enzyme and are heavily
snapshot-based, so we will be replacing those with
@testing-library/react tests in later updates (in keeping with current
testing best practices at Instructure).
closes LS-2431, LS-2432, LS-2433, LS-2434, LS-2452
flag = pace_plans
Test plan:
- Set up a course with at least one module and several module items
- Turn on the pace_plans feature flag in the account associated with
that course
- Turn on the "Enable pace plans" setting in course settings
- Create a pace plan for the course via the Rails console:
c = Course.find<id>
pp = c.pace_plans.create! workflow_state: 'active'
c.context_module_tags.each_with_index do |t, i|
pp.pace_plan_module_items.create! module_item: t, duration: i*2
end
- Go to the course as a teacher or admin
- Expect to see a "Pace Plans" link in the course navigation
- Click it, expect the pace plan you created earlier to load and
render
- Expect to be able to pick dates, change durations, and toggle
checkboxes (although saves will fail, since there is no API yet).
- Expect to not see the "Pace Plans" course nav link when the feature
flag or course setting is off
- Expect /courses/<id>/pace_plans to return a 404 when the feature
flag or course setting is off
- Expect to not see the "Pace Plans" course nav link as a student
- Expect /courses/<id>/pace_plans to display an "Unauthorized" page
as a student
Change-Id: If4dc5d17f2c6a2109d4b4cb652c9e9ef00d7cc33
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/271650
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Ed Schiebel <eschiebel@instructure.com>
QA-Review: Ed Schiebel <eschiebel@instructure.com>
Product-Review: Jeff Largent <jeff.largent@instructure.com>
2021-08-18 05:14:24 +08:00
|
|
|
"@types/react": "^17.0.19",
|
2024-02-27 09:04:10 +08:00
|
|
|
"@types/react-beautiful-dnd": "^13.1.8",
|
Initial pace plans import
This change brings in the basic pace plans frontend with
styled-components and several other smaller libraries replaced with
InstUI 7 components. It also adds the 'reselect' library as a direct
dependency (which we already had through @instructure/outcomes-ui) and
'tsc-files' for type-checking of staged TS files on commit. There were
also some tweaks to typescript and eslint configs, mostly to get both
up to speed with the typescript code.
Finally, this also adds a `pace_plans` endpoint to
`courses_controller` to bootstrap the frontend-- this will get moved
to `pace_plans_controller` once it has been merged.
It's also worth noting that no frontend tests are included with this
change-- the existing tests were written with enzyme and are heavily
snapshot-based, so we will be replacing those with
@testing-library/react tests in later updates (in keeping with current
testing best practices at Instructure).
closes LS-2431, LS-2432, LS-2433, LS-2434, LS-2452
flag = pace_plans
Test plan:
- Set up a course with at least one module and several module items
- Turn on the pace_plans feature flag in the account associated with
that course
- Turn on the "Enable pace plans" setting in course settings
- Create a pace plan for the course via the Rails console:
c = Course.find<id>
pp = c.pace_plans.create! workflow_state: 'active'
c.context_module_tags.each_with_index do |t, i|
pp.pace_plan_module_items.create! module_item: t, duration: i*2
end
- Go to the course as a teacher or admin
- Expect to see a "Pace Plans" link in the course navigation
- Click it, expect the pace plan you created earlier to load and
render
- Expect to be able to pick dates, change durations, and toggle
checkboxes (although saves will fail, since there is no API yet).
- Expect to not see the "Pace Plans" course nav link when the feature
flag or course setting is off
- Expect /courses/<id>/pace_plans to return a 404 when the feature
flag or course setting is off
- Expect to not see the "Pace Plans" course nav link as a student
- Expect /courses/<id>/pace_plans to display an "Unauthorized" page
as a student
Change-Id: If4dc5d17f2c6a2109d4b4cb652c9e9ef00d7cc33
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/271650
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Ed Schiebel <eschiebel@instructure.com>
QA-Review: Ed Schiebel <eschiebel@instructure.com>
Product-Review: Jeff Largent <jeff.largent@instructure.com>
2021-08-18 05:14:24 +08:00
|
|
|
"@types/react-dom": "^17.0.9",
|
2024-01-06 03:25:13 +08:00
|
|
|
"@typescript-eslint/eslint-plugin": "^6.17.0",
|
|
|
|
"@typescript-eslint/parser": "^5.62.0",
|
2024-01-08 09:23:15 +08:00
|
|
|
"@vitest/ui": "^1.0.4",
|
2018-08-11 00:22:49 +08:00
|
|
|
"@yarnpkg/lockfile": "^1.0.2",
|
2020-04-07 06:07:18 +08:00
|
|
|
"array-flat-polyfill": "^1.0.1",
|
2018-02-23 03:58:38 +08:00
|
|
|
"axe-core": "~2.1.7",
|
2019-03-06 02:30:44 +08:00
|
|
|
"babel-eslint": "^10",
|
2022-07-19 06:07:53 +08:00
|
|
|
"babel-jest": "^28",
|
2023-12-10 22:37:48 +08:00
|
|
|
"babel-loader": "^9.1.3",
|
2018-02-23 03:58:38 +08:00
|
|
|
"babel-plugin-transform-react-remove-prop-types": "^0.4",
|
2023-11-22 22:36:48 +08:00
|
|
|
"babel-plugin-typescript-to-proptypes": "^2.1.0",
|
2021-01-02 07:58:12 +08:00
|
|
|
"chai-assert-change": "^2.0.0",
|
2023-07-29 01:57:25 +08:00
|
|
|
"change-case": "3.0.1",
|
2018-09-18 07:08:57 +08:00
|
|
|
"concurrently": "^4",
|
2022-01-19 06:25:07 +08:00
|
|
|
"core-js": "^3.20.3",
|
2019-08-14 13:36:39 +08:00
|
|
|
"core-js-builder": "^3",
|
|
|
|
"css-loader": "^3",
|
2015-10-01 11:16:11 +08:00
|
|
|
"ember-template-compiler": "^1.8.0",
|
2017-12-09 01:29:42 +08:00
|
|
|
"enzyme": "^3",
|
2023-11-17 20:54:42 +08:00
|
|
|
"enzyme-adapter-react-16": "^1.15.7",
|
2018-10-10 03:36:49 +08:00
|
|
|
"enzyme-to-json": "^3.3.4",
|
2021-05-21 00:54:30 +08:00
|
|
|
"eslint": "^7",
|
2019-08-14 09:31:44 +08:00
|
|
|
"eslint-config-airbnb": "^18",
|
|
|
|
"eslint-config-prettier": "^6",
|
2020-05-01 21:34:22 +08:00
|
|
|
"eslint-plugin-babel": "^5",
|
2018-11-03 01:48:59 +08:00
|
|
|
"eslint-plugin-eslint-comments": "^3.0.1",
|
2018-02-23 03:58:38 +08:00
|
|
|
"eslint-plugin-import": "^2",
|
2019-03-06 05:20:27 +08:00
|
|
|
"eslint-plugin-jest": "^22",
|
2018-02-23 03:58:38 +08:00
|
|
|
"eslint-plugin-jsx-a11y": "^6",
|
2019-08-14 09:31:44 +08:00
|
|
|
"eslint-plugin-lodash": "^6",
|
|
|
|
"eslint-plugin-notice": "^0.8",
|
2018-10-04 07:01:30 +08:00
|
|
|
"eslint-plugin-prettier": "^3",
|
|
|
|
"eslint-plugin-promise": "^4",
|
|
|
|
"eslint-plugin-qunit": "^4",
|
2023-05-11 03:36:39 +08:00
|
|
|
"eslint-plugin-react": "^7.32.2",
|
2019-06-26 05:24:47 +08:00
|
|
|
"eslint-plugin-react-hooks": "^1",
|
2018-02-23 03:58:38 +08:00
|
|
|
"exports-loader": "^0.7",
|
2021-01-15 05:29:41 +08:00
|
|
|
"fast-glob": "^3.2.4",
|
2024-01-07 23:29:44 +08:00
|
|
|
"fetch-mock": "^9",
|
2019-08-14 13:36:39 +08:00
|
|
|
"file-loader": "^4",
|
catch and report on rogue imports
fixes FOO-2422
this patch codifies the access rules between modules in the new UI file
structure:
packages/ can be accessed by everyone
ui/shared/ can only be accessed by Canvas packages and features
ui/features/ can only be accessed by boot
ui/boot/ can only be accessed by entrypoint
ui/index.js can only be accessed by Rails
additionally, the specifiers used for importing may no longer be
arbitrary; generally, every enapsulated folder must use relative
specifiers for intra-imports, and bare specifiers for inter-imports
ui/features/a/a.js => ui/features/a/b.js [via] ./b.js
ui/features/a/a.js => ui/shared/a/a.js [via] @canvas/a/a
ui/features/a/a.js => packages/a/a.js [via] a/a
the rules are defined in the webpack config file, there are currently 37
violations that we have to address, for now I added a plugin to ignore
them (see frontend_build/existingEncapsulationErrors.json)
violations are reported with a detailed description of what exactly
caused the violation, what is being violated, along with a suggestion
on how to address it
- see https://github.com/instructure/esmac for the tool that applies
the rules
- see https://github.com/instructure/webpack-encapsulation-plugin for
the webpack implementation of that tool
~ test plan ~
~~~^ ^~~~
\m/
edit frontend_build/existingEncapsulationErrors.json and remove
entries from there, or alternatively just disable the IgnoreErrors
plugin to get all the errors displayed, then rerun webpack against the
offending source file to view the error report - for example:
npx webpack --entry=$PWD/packages/backbone-identity-map/index.js
# or, if u chose to disable the plugin
npx webpack
the messages should be clear and helpful; there are currently 4
scenarios for access violation, and 4 scenarios for specifier
mismatche
Change-Id: Ibae4245122e2c015ccbd47d73ac8689e0a386d86
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/275200
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Charley Kline <ckline@instructure.com>
QA-Review: Charley Kline <ckline@instructure.com>
Product-Review: Charley Kline <ckline@instructure.com>
2021-10-02 07:28:20 +08:00
|
|
|
"find-up": "^5.0.0",
|
2016-08-09 07:39:19 +08:00
|
|
|
"gglobby": "0.0.3",
|
2018-02-23 03:58:38 +08:00
|
|
|
"glob": "^7",
|
2020-10-15 04:59:13 +08:00
|
|
|
"gulp": "^4",
|
2018-02-23 03:58:38 +08:00
|
|
|
"gulp-file": "^0.4",
|
2020-10-15 04:59:13 +08:00
|
|
|
"gulp-filter": "^6",
|
2018-02-23 03:58:38 +08:00
|
|
|
"gulp-insert": "^0.5",
|
2020-10-15 04:59:13 +08:00
|
|
|
"gulp-load-plugins": "^2",
|
|
|
|
"gulp-rename": "^2",
|
|
|
|
"gulp-rev": "^9",
|
2018-02-23 03:58:38 +08:00
|
|
|
"gulp-sourcemaps": "^2",
|
|
|
|
"gulp-uglify": "^3",
|
2017-02-15 05:54:51 +08:00
|
|
|
"handlebars": "1.3.0",
|
2023-11-17 20:54:42 +08:00
|
|
|
"happy-dom": "^12.10.3",
|
2018-02-23 03:58:38 +08:00
|
|
|
"imports-loader": "^0.8",
|
2018-04-06 05:27:42 +08:00
|
|
|
"istanbul-merge": "^1.1.1",
|
2023-11-21 04:28:13 +08:00
|
|
|
"jest": "^29.7.0",
|
2019-08-14 13:36:39 +08:00
|
|
|
"jest-canvas-mock": "^2",
|
2022-07-19 06:07:53 +08:00
|
|
|
"jest-config": "^28",
|
2023-11-21 04:28:13 +08:00
|
|
|
"jest-environment-jsdom": "^29.7.0",
|
2020-03-23 11:42:21 +08:00
|
|
|
"jest-fetch-mock": "^3.0.3",
|
2019-08-14 13:36:39 +08:00
|
|
|
"jest-junit": "^7",
|
2018-02-23 03:58:38 +08:00
|
|
|
"jest-localstorage-mock": "^2",
|
2018-12-04 23:19:46 +08:00
|
|
|
"jest-moxios-utils": "^1",
|
2021-06-22 03:07:58 +08:00
|
|
|
"jsdom-global": "^3.0.2",
|
2018-02-23 03:58:38 +08:00
|
|
|
"json-loader": "^0.5.7",
|
2023-12-12 03:58:36 +08:00
|
|
|
"karma": "^6.4.2",
|
2018-02-23 03:58:38 +08:00
|
|
|
"karma-chrome-launcher": "^2",
|
2018-10-04 07:01:30 +08:00
|
|
|
"karma-coverage-istanbul-reporter": "^2",
|
2018-02-23 03:58:38 +08:00
|
|
|
"karma-junit-reporter": "^1",
|
2017-07-26 01:29:52 +08:00
|
|
|
"karma-qunit": "~1.2.1",
|
2022-08-11 02:15:25 +08:00
|
|
|
"karma-selenium-grid-launcher": "^0.3.0",
|
2018-02-23 03:58:38 +08:00
|
|
|
"karma-sourcemap-loader": "^0.3",
|
2017-12-18 23:21:42 +08:00
|
|
|
"karma-spec-reporter": "^0.0.32",
|
2017-07-26 01:29:52 +08:00
|
|
|
"karma-verbose-reporter": "^0.0.6",
|
2022-06-17 13:54:48 +08:00
|
|
|
"karma-webpack": "^5",
|
2019-08-14 13:36:39 +08:00
|
|
|
"lint-staged": "^9",
|
rework handlebars dependency on brandable_css
refs FOO-1116
right now in order to build the javascript, we must run brandable_css
first for the specific purpose of injecting into handlebars templates
their corresponding stylesheet file with the checksum as reported by
brandable_css
this patch moves things around such that Rails provides this mapping of
"handlebars template" to "CSS variant file checksums" in a global
variable (Rails is privy to this information already), webpack then at
build time injects only a reference to that mapping into the template,
then our runtime brandable-css JS helper will resolve that reference
from the mapping and request the correct file based on the current
user's variant
[1] rails assigns window.BRANDABLE_CSS_HANDLEBARS_INDEX with content
like this:
[
[ "new_styles_normal_contrast", "new_styles_high_contrast", ... ],
{
"0c": ["0f4f01ab86", 0, 0, "e3e7211701", 3, ... ],
...
}
]
the structure of the mapping is explained in brandable_css[1], it is
a bit overtuned to reduce the size as much as possible since this is
included for ALL pages even though the templates in question may never
be rendered (right now it's ~1.5kB and should never grow)
[2] webpack asks @canvas/brandable-css to loadStylesheetForJST using the
contrived id for that file (frontend_build/i18nLinerHandlebars.js:92)
[3] brandable-css/index.js will decode that structure to arrive at the
exact URL for the stylesheet for that template for the current user
variant
with this , we should be able to optimize "rake canvas:compile_assets"
to run both brandable_css and webpack in parallel, which will greatly
mitigate the performance decrease from moving from node-sass to
dart-sass
== test plan
go to some assignment's syllabus page, edit the file
app/stylesheets/jst/courses/Syllabus.scss with something fun like:
#syllabus .day_date { background: $fire; }
rerun `npx brandable_css`, reload the page and verify it's on fire,
optionally change your setting to enable High Contrast mode, reload
the syllabus page and verify the color changes (it picks up the other
variant stylesheet)
[1]: https://github.com/instructure/brandable_css/pull/4/commits/80af6e70af6ad60312187f256c2457d33ca75202
Change-Id: Ie48cc71d4837ee02313b2d45a9ad2944725acad2
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/268615
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: August Thornton <august@instructure.com>
QA-Review: August Thornton <august@instructure.com>
Product-Review: August Thornton <august@instructure.com>
2021-07-08 08:03:09 +08:00
|
|
|
"loader-utils": "^1",
|
2020-07-16 05:11:24 +08:00
|
|
|
"merge-stream": "^2",
|
catch and report on rogue imports
fixes FOO-2422
this patch codifies the access rules between modules in the new UI file
structure:
packages/ can be accessed by everyone
ui/shared/ can only be accessed by Canvas packages and features
ui/features/ can only be accessed by boot
ui/boot/ can only be accessed by entrypoint
ui/index.js can only be accessed by Rails
additionally, the specifiers used for importing may no longer be
arbitrary; generally, every enapsulated folder must use relative
specifiers for intra-imports, and bare specifiers for inter-imports
ui/features/a/a.js => ui/features/a/b.js [via] ./b.js
ui/features/a/a.js => ui/shared/a/a.js [via] @canvas/a/a
ui/features/a/a.js => packages/a/a.js [via] a/a
the rules are defined in the webpack config file, there are currently 37
violations that we have to address, for now I added a plugin to ignore
them (see frontend_build/existingEncapsulationErrors.json)
violations are reported with a detailed description of what exactly
caused the violation, what is being violated, along with a suggestion
on how to address it
- see https://github.com/instructure/esmac for the tool that applies
the rules
- see https://github.com/instructure/webpack-encapsulation-plugin for
the webpack implementation of that tool
~ test plan ~
~~~^ ^~~~
\m/
edit frontend_build/existingEncapsulationErrors.json and remove
entries from there, or alternatively just disable the IgnoreErrors
plugin to get all the errors displayed, then rerun webpack against the
offending source file to view the error report - for example:
npx webpack --entry=$PWD/packages/backbone-identity-map/index.js
# or, if u chose to disable the plugin
npx webpack
the messages should be clear and helpful; there are currently 4
scenarios for access violation, and 4 scenarios for specifier
mismatche
Change-Id: Ibae4245122e2c015ccbd47d73ac8689e0a386d86
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/275200
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Charley Kline <ckline@instructure.com>
QA-Review: Charley Kline <ckline@instructure.com>
Product-Review: Charley Kline <ckline@instructure.com>
2021-10-02 07:28:20 +08:00
|
|
|
"micromatch": "^4.0.4",
|
2021-01-07 01:40:57 +08:00
|
|
|
"mkdirp": "^1.0.4",
|
Pass correct locale to Planner
Sometimes ENV.LOCALE and ENV.MOMENT_LOCALE are different
(zh-Hans v zh-cn or mi v mi-nz). We were passing the former to planner,
but moment needs the full locale, including language and region
identifiers, and formatMessage copes with the full locale just fine,
so we really need to pass in the latter or moment eventually
blows up.
So mi-nz month names would successfully parse, had to both bump our
version of moment and tweak the canvas customized mi-nz locale data.
to test, you'll have to run yarn to update moment, then build with
RAILS_LOAD_ALL_LOCALES=1 yarn build
Note on the changes to timezoneSpec.js:
- some of the specs were parsing dates like "Mon, Aug 3", which are
being interpreted in the current year, when Aut 3 is not a Monday.
Resolved this by using MockDate to pretend today is 2/1/2015
- moment does not always interpret the Chinese characters for evening as
implying PM. I'm assuming canvas will never need that particular
construct and commented out the failing string.
- there's one date-time that's getting the date totally wrong.
- Fixed grammatically incorrect instances of
'8月 3, 2015' to ''8月 3日, 2015'
- fix cases where the year is coming after the month and day, which
would never really happen
fixes ADMIN-1331
test plan:
- have a student in course so planner is enabled.
- go to /profile/settings and Edit
- change the Language to Reo Māori (Aotearoa) and "Update Settings"
- go to the planner dashboard
- click on + to create a new todo
> expect you can create a todo.
If you want, you can repeat with any of the languages listed in the
ticket just to prove ^that wasn't a fluke.
Change-Id: I9ba069ef61529088ab92271d7857998df6bbc409
Reviewed-on: https://gerrit.instructure.com/161206
Tested-by: Jenkins
Reviewed-by: Ryan Shaw <ryan@instructure.com>
Reviewed-by: Mysti Sadler <mysti@instructure.com>
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
QA-Review: Anju Reddy <areddy@instructure.com>
Product-Review: Ed Schiebel <eschiebel@instructure.com>
2018-08-18 03:21:04 +08:00
|
|
|
"mockdate": "^2.0.2",
|
2024-02-01 04:19:23 +08:00
|
|
|
"moment-timezone-data-webpack-plugin": "^1.5.1",
|
2018-02-23 03:58:38 +08:00
|
|
|
"moxios": "^0.4",
|
2024-01-08 09:23:15 +08:00
|
|
|
"msw": "^2.0.12",
|
2018-10-04 07:01:30 +08:00
|
|
|
"nyc": "^13",
|
2024-01-23 07:00:30 +08:00
|
|
|
"patch-package": "^8.0.0",
|
|
|
|
"postinstall-postinstall": "^2.1.0",
|
2023-12-12 09:27:52 +08:00
|
|
|
"prettier": "^2.8.8",
|
2021-11-12 06:04:35 +08:00
|
|
|
"qunitjs": "^1.23.0",
|
2023-07-29 01:57:25 +08:00
|
|
|
"react-moment-proptypes": "^1.4.0",
|
2018-09-11 12:13:01 +08:00
|
|
|
"react-test-renderer": "^16",
|
2023-07-29 01:57:25 +08:00
|
|
|
"redux-devtools-extension": "^2.13.2",
|
2018-11-30 09:03:38 +08:00
|
|
|
"redux-logger": "^3.0.6",
|
make feature flags for Right To Left layout
Closes: CORE-1154
There are 2 feature flags here. One a specific user (internal
employees, sales people, contractors, etc) can turn on to see where we
are and what would still need to be done. And the other is for an
account to be able to turn on to let the users in their account that
have their language set to an RTL language (eg: Arabic, Farsi or Hebrew)
see the interface in RTL
This commit is part of a chain of commits. you'll need to apply the ones
that follow-on after this to see most of the actual Right To Left
features, this commit is mainly just to create the feature flag.
Test plan:
* go to your user settings page
* you should see a feature option for Force RTL Layout”
* it should show that it is “in development”
* it should should be hidden: eg: only appears for site admins and not
For normal users
* turn it on
(if you have this checked out along with the others that follow beind
this commit)
* navigate around canvas, most things on most pages should be RTL
* you should be able to get an idea of how much more work and what
Kind of changes we’d still need to make to get it 100%
* now turn off that user feature flag, and go to your account's settings
* turn on the "allow users from RTL languages to see RTL layout"
account-level feature flag.
* nothing should change for you, it should be LTR like normal
* set your language to either Arabic, Farsi or Hebrew
* now the interface should all be in right to left.
(again, you'll need to have the follow-on commits to this to see all
of the RTL changes)
* without either of the feature flags turned on, absolutely nothing
should be different at all anywhere in the interface.
Change-Id: Ia78d86fa46d2d289b1913c5d1340546d7f6c3a1f
Reviewed-on: https://gerrit.instructure.com/143891
Reviewed-by: Brent Burgoyne <bburgoyne@instructure.com>
QA-Review: Jeremy Putnam <jeremyp@instructure.com>
Product-Review: Ryan Shaw <ryan@instructure.com>
Tested-by: Jenkins
2018-03-17 02:25:14 +08:00
|
|
|
"sass-direction": "^1",
|
2018-02-23 03:58:38 +08:00
|
|
|
"script-loader": "^0.7",
|
2024-01-13 02:27:17 +08:00
|
|
|
"sinon": "^9.2.4",
|
2023-05-12 09:23:16 +08:00
|
|
|
"stream-browserify": "^3",
|
2019-08-21 22:55:36 +08:00
|
|
|
"style-loader": "^0.23",
|
2019-08-14 13:36:39 +08:00
|
|
|
"stylelint": "^10",
|
2024-01-09 12:16:28 +08:00
|
|
|
"terser-webpack-plugin": "5.3.10",
|
2019-08-14 13:36:39 +08:00
|
|
|
"through2": "^3",
|
2022-03-11 13:37:19 +08:00
|
|
|
"timezone-mock": "^1.3.1",
|
2020-12-19 01:36:23 +08:00
|
|
|
"tinymce": "^5",
|
2023-03-17 11:37:19 +08:00
|
|
|
"ts-node": "^10.9.1",
|
2023-11-22 22:11:39 +08:00
|
|
|
"typescript": "^5.3.2",
|
2024-01-21 23:40:07 +08:00
|
|
|
"vitest": "^1.2.1",
|
2019-03-06 02:30:44 +08:00
|
|
|
"waait": "^1",
|
2022-06-17 13:54:48 +08:00
|
|
|
"webpack": "^5",
|
|
|
|
"webpack-bundle-analyzer": "^4.5.0",
|
2021-03-09 03:33:46 +08:00
|
|
|
"webpack-cli": "^4",
|
2022-06-21 20:07:32 +08:00
|
|
|
"webpack-esmac-plugin": "^4.0.0",
|
2022-06-17 13:54:48 +08:00
|
|
|
"webpack-manifest-plugin": "^5",
|
catch and report on rogue imports
fixes FOO-2422
this patch codifies the access rules between modules in the new UI file
structure:
packages/ can be accessed by everyone
ui/shared/ can only be accessed by Canvas packages and features
ui/features/ can only be accessed by boot
ui/boot/ can only be accessed by entrypoint
ui/index.js can only be accessed by Rails
additionally, the specifiers used for importing may no longer be
arbitrary; generally, every enapsulated folder must use relative
specifiers for intra-imports, and bare specifiers for inter-imports
ui/features/a/a.js => ui/features/a/b.js [via] ./b.js
ui/features/a/a.js => ui/shared/a/a.js [via] @canvas/a/a
ui/features/a/a.js => packages/a/a.js [via] a/a
the rules are defined in the webpack config file, there are currently 37
violations that we have to address, for now I added a plugin to ignore
them (see frontend_build/existingEncapsulationErrors.json)
violations are reported with a detailed description of what exactly
caused the violation, what is being violated, along with a suggestion
on how to address it
- see https://github.com/instructure/esmac for the tool that applies
the rules
- see https://github.com/instructure/webpack-encapsulation-plugin for
the webpack implementation of that tool
~ test plan ~
~~~^ ^~~~
\m/
edit frontend_build/existingEncapsulationErrors.json and remove
entries from there, or alternatively just disable the IgnoreErrors
plugin to get all the errors displayed, then rerun webpack against the
offending source file to view the error report - for example:
npx webpack --entry=$PWD/packages/backbone-identity-map/index.js
# or, if u chose to disable the plugin
npx webpack
the messages should be clear and helpful; there are currently 4
scenarios for access violation, and 4 scenarios for specifier
mismatche
Change-Id: Ibae4245122e2c015ccbd47d73ac8689e0a386d86
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/275200
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Charley Kline <ckline@instructure.com>
QA-Review: Charley Kline <ckline@instructure.com>
Product-Review: Charley Kline <ckline@instructure.com>
2021-10-02 07:28:20 +08:00
|
|
|
"wrap-ansi": "^7.0.0",
|
2019-08-14 13:36:39 +08:00
|
|
|
"wsrun": "^5",
|
2020-04-29 05:19:29 +08:00
|
|
|
"xsslint": "instructure/xsslint#babel7",
|
2022-03-11 13:37:19 +08:00
|
|
|
"yaml-loader": "^0.5"
|
2014-01-24 23:58:37 +08:00
|
|
|
},
|
2019-03-05 23:51:37 +08:00
|
|
|
"optionalDependencies": {
|
2022-07-16 01:11:46 +08:00
|
|
|
"@storybook/addon-actions": "^6.5.9",
|
|
|
|
"@storybook/addon-essentials": "^6.5.9",
|
|
|
|
"@storybook/addon-links": "^6.5.9",
|
|
|
|
"@storybook/addon-storyshots": "^6.5.9",
|
2022-08-09 10:44:30 +08:00
|
|
|
"@storybook/builder-webpack5": "^6.5.9",
|
|
|
|
"@storybook/manager-webpack5": "^6.5.9",
|
2023-12-25 02:29:29 +08:00
|
|
|
"@storybook/react": "^6.5.9"
|
2019-03-05 23:51:37 +08:00
|
|
|
},
|
2019-08-08 04:19:35 +08:00
|
|
|
"browserslist": [
|
|
|
|
"extends @instructure/browserslist-config-canvas-lms"
|
|
|
|
],
|
2015-07-16 12:24:49 +08:00
|
|
|
"repository": "instructure/canvas-lms",
|
2014-01-24 23:58:37 +08:00
|
|
|
"scripts": {
|
2021-01-27 23:25:50 +08:00
|
|
|
"test": "yarn test:packages && if [ \"$COVERAGE\" = \"1\" ]; then yarn test:jest:coverage --runInBand; else yarn test:jest --runInBand; fi && if [ \"$COVERAGE\" = \"1\" ]; then yarn test:karma; else yarn test:karma:concurrently; fi",
|
2018-04-06 05:27:42 +08:00
|
|
|
"test:coverage": "script/generate_js_coverage",
|
2017-12-22 04:09:17 +08:00
|
|
|
"test:watch": "concurrently --names \"jest,karma\" \"jest --watch .\" \"yarn test:karma:watch\"",
|
2023-11-17 20:54:42 +08:00
|
|
|
"test:vitest": "vitest run --color",
|
|
|
|
"test:vitest:watch": "vitest watch --color",
|
|
|
|
"test:vitest:coverage": "vitest run --color --coverage",
|
2020-02-28 05:49:45 +08:00
|
|
|
"test:jest": "jest --color",
|
2024-03-23 05:45:12 +08:00
|
|
|
"test:jest:coverage": "NODE_OPTIONS=\"--max_old_space_size=5120\" jest --color --coverage --testTimeout=5000",
|
2020-05-26 23:37:35 +08:00
|
|
|
"test:jest:debug": "node --inspect-brk node_modules/.bin/jest --runInBand",
|
2021-01-06 16:57:21 +08:00
|
|
|
"test:jest:watch": "jest --color --watch",
|
2022-07-20 23:24:03 +08:00
|
|
|
"test:jest:build": "if [ \"$COVERAGE\" = \"1\" ]; then yarn test:jest:coverage --maxWorkers=3 --shard=$CI_NODE_INDEX/$CI_NODE_TOTAL; else yarn test:jest --maxWorkers=3 --shard=$CI_NODE_INDEX/$CI_NODE_TOTAL; fi",
|
2018-05-18 06:02:10 +08:00
|
|
|
"test:karma": "yarn run test:karma:watch --single-run",
|
2019-08-22 03:12:19 +08:00
|
|
|
"test:karma:concurrently": "concurrently --names \"coffee,jsa,jsg,jsh\" \"JSPEC_GROUP=coffee yarn test:karma:headless\" \"JSPEC_GROUP=jsa yarn test:karma:headless\" \"JSPEC_GROUP=jsg yarn test:karma:headless\" \"JSPEC_GROUP=jsh yarn test:karma:headless\"",
|
2022-08-11 02:15:25 +08:00
|
|
|
"test:karma:headless": "yarn run test:karma --browsers ${KARMA_BROWSER:-ChromeHeadlessNoSandbox}",
|
2018-05-18 06:02:10 +08:00
|
|
|
"test:karma:watch": "node --max-old-space-size=4096 ./node_modules/.bin/karma start",
|
2022-08-11 02:15:25 +08:00
|
|
|
"test:karma:watch:headless": "yarn run test:karma:watch --browsers ${KARMA_BROWSER:-ChromeHeadlessNoSandbox}",
|
2021-01-27 23:25:50 +08:00
|
|
|
"test:packages": "if [ \"$COVERAGE\" = \"1\" ]; then yarn workspace-run-serial test:coverage; else yarn workspace-run-serial test; fi",
|
2022-06-02 22:22:55 +08:00
|
|
|
"test:packages:parallel": "if [ \"$COVERAGE\" = \"1\" ]; then yarn workspace-run test:coverage; else yarn workspace-run test; fi",
|
2017-05-03 00:44:54 +08:00
|
|
|
"build": "yarn run build:css && yarn run build:js",
|
2019-08-14 13:36:39 +08:00
|
|
|
"build:watch": "concurrently --raw \"yarn build:css:watch\" \"yarn build:js:watch\"",
|
2017-05-03 00:44:54 +08:00
|
|
|
"build:css": "brandable_css",
|
2021-07-27 23:13:08 +08:00
|
|
|
"build:css:compressed": "SASS_STYLE=compressed brandable_css",
|
2017-05-03 00:44:54 +08:00
|
|
|
"build:css:watch": "brandable_css --watch",
|
|
|
|
"build:js": "yarn run webpack-development",
|
|
|
|
"build:js:watch": "yarn run webpack",
|
2020-08-19 05:43:49 +08:00
|
|
|
"build:packages": "yarn workspace-run build:canvas",
|
Initial pace plans import
This change brings in the basic pace plans frontend with
styled-components and several other smaller libraries replaced with
InstUI 7 components. It also adds the 'reselect' library as a direct
dependency (which we already had through @instructure/outcomes-ui) and
'tsc-files' for type-checking of staged TS files on commit. There were
also some tweaks to typescript and eslint configs, mostly to get both
up to speed with the typescript code.
Finally, this also adds a `pace_plans` endpoint to
`courses_controller` to bootstrap the frontend-- this will get moved
to `pace_plans_controller` once it has been merged.
It's also worth noting that no frontend tests are included with this
change-- the existing tests were written with enzyme and are heavily
snapshot-based, so we will be replacing those with
@testing-library/react tests in later updates (in keeping with current
testing best practices at Instructure).
closes LS-2431, LS-2432, LS-2433, LS-2434, LS-2452
flag = pace_plans
Test plan:
- Set up a course with at least one module and several module items
- Turn on the pace_plans feature flag in the account associated with
that course
- Turn on the "Enable pace plans" setting in course settings
- Create a pace plan for the course via the Rails console:
c = Course.find<id>
pp = c.pace_plans.create! workflow_state: 'active'
c.context_module_tags.each_with_index do |t, i|
pp.pace_plan_module_items.create! module_item: t, duration: i*2
end
- Go to the course as a teacher or admin
- Expect to see a "Pace Plans" link in the course navigation
- Click it, expect the pace plan you created earlier to load and
render
- Expect to be able to pick dates, change durations, and toggle
checkboxes (although saves will fail, since there is no API yet).
- Expect to not see the "Pace Plans" course nav link when the feature
flag or course setting is off
- Expect /courses/<id>/pace_plans to return a 404 when the feature
flag or course setting is off
- Expect to not see the "Pace Plans" course nav link as a student
- Expect /courses/<id>/pace_plans to display an "Unauthorized" page
as a student
Change-Id: If4dc5d17f2c6a2109d4b4cb652c9e9ef00d7cc33
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/271650
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Ed Schiebel <eschiebel@instructure.com>
QA-Review: Ed Schiebel <eschiebel@instructure.com>
Product-Review: Jeff Largent <jeff.largent@instructure.com>
2021-08-18 05:14:24 +08:00
|
|
|
"check:js": "tsc --checkJs -p tsconfig.json",
|
2023-04-28 05:13:41 +08:00
|
|
|
"check:ts": "tsc -p tsconfig.json",
|
|
|
|
"check:ts:watch": "tsc --watch -p tsconfig.json",
|
2024-01-06 08:56:41 +08:00
|
|
|
"lint:packages": "eslint packages --cache --ext '.js,.jsx,.ts,.tsx'",
|
2018-11-28 06:40:21 +08:00
|
|
|
"lint:staged": "lint-staged",
|
2024-01-06 08:56:41 +08:00
|
|
|
"lint:style": "stylelint './app/**/*.{css,scss}' './packages/**/*.{css,scss}'",
|
2019-08-22 03:12:19 +08:00
|
|
|
"lint:xss": "node ./script/xsslint.js",
|
2024-01-06 08:56:41 +08:00
|
|
|
"lint": "eslint ui --cache --ext '.js,.jsx,.ts,.tsx'",
|
2024-01-23 07:00:30 +08:00
|
|
|
"postinstall": "yarn dedupe-yarn; patch-package; test -n \"$DISABLE_POSTINSTALL\" || (yarn build:packages && ./script/install_hooks)",
|
2024-02-01 04:19:23 +08:00
|
|
|
"webpack:analyze": "SKIP_SOURCEMAPS=1 WEBPACK_PEDANTIC=0 rspack --analyze",
|
|
|
|
"webpack": "gulp rev 1> /dev/null & NODE_ENV=development rspack --watch=true",
|
|
|
|
"webpack-development": "NODE_ENV=development rspack build",
|
|
|
|
"webpack-production": "NODE_ENV=production rspack build",
|
2021-04-07 23:59:07 +08:00
|
|
|
"workspace-run": "r() { wsrun --fast-exit --exclude-missing --report -c $@; exit $?; } && r",
|
2019-04-09 02:36:08 +08:00
|
|
|
"workspace-run-serial": "r() { wsrun --fast-exit --exclude-missing --collect-logs --report --serial -c $@; exit $?; } && r",
|
2016-11-08 05:13:53 +08:00
|
|
|
"jspec": "./spec/jspec.sh",
|
2016-08-17 05:30:29 +08:00
|
|
|
"jspec-watch": "./spec/jspec.sh --watch",
|
2018-03-03 02:20:00 +08:00
|
|
|
"a11y-report": "./spec/jspec.sh --a11y",
|
2018-08-11 00:22:49 +08:00
|
|
|
"upgrade-and-dedupe": "rm -rf yarn.lock node_modules && yes 1 | yarn install --flat --production --ignore-scripts && git checkout package.json && yarn install && git add yarn.lock",
|
2020-05-28 06:04:02 +08:00
|
|
|
"upgrade-instructure-ui": "script/upgrade-instructure-ui",
|
2021-10-16 00:46:44 +08:00
|
|
|
"dedupe-yarn": "yarn yarn-deduplicate",
|
2020-11-18 03:27:40 +08:00
|
|
|
"clean": "yarn workspace-run-serial clean",
|
2021-04-21 05:46:42 +08:00
|
|
|
"storybook": "start-storybook -p 6006 --no-dll --static-dir ./public/javascripts,./public",
|
2021-02-06 07:39:54 +08:00
|
|
|
"test-storybook": "yarn jest --roots .storybook --testMatch **/storybook.test.js"
|
2017-11-22 07:09:15 +08:00
|
|
|
},
|
|
|
|
"resolutions": {
|
2021-01-14 05:14:23 +08:00
|
|
|
"graphael": "https://github.com/instructure/graphael.git",
|
2021-05-26 01:22:32 +08:00
|
|
|
"@apollo/react-testing": "3.0.1",
|
|
|
|
"@apollo/react-common": "3.0.1",
|
|
|
|
"@apollo/react-components": "3.0.1",
|
|
|
|
"@apollo/react-hoc": "3.0.1",
|
|
|
|
"@apollo/react-hooks": "3.0.1",
|
2023-05-06 06:29:29 +08:00
|
|
|
"@apollo/react-ssr": "3.0.1",
|
2024-03-20 22:19:20 +08:00
|
|
|
"@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.cd77847.0",
|
|
|
|
"@instructure/emotion": "8.51.0",
|
|
|
|
"@instructure/ui-a11y-content": "8.51.0",
|
|
|
|
"@instructure/ui-alerts": "8.51.0",
|
|
|
|
"@instructure/ui-buttons": "8.51.0",
|
|
|
|
"@instructure/ui-color-utils": "8.51.0",
|
|
|
|
"@instructure/ui-dom-utils": "8.51.0",
|
|
|
|
"@instructure/ui-drilldown": "8.51.0",
|
|
|
|
"@instructure/ui-grid": "8.51.0",
|
|
|
|
"@instructure/ui-icons": "8.51.0",
|
|
|
|
"@instructure/ui-menu": "8.51.0",
|
|
|
|
"@instructure/ui-responsive": "8.51.0",
|
|
|
|
"@instructure/ui-simple-select": "8.51.0",
|
|
|
|
"@instructure/ui-spinner": "8.51.0",
|
|
|
|
"@instructure/ui-text": "8.51.0",
|
|
|
|
"@instructure/ui-text-input": "8.51.0",
|
|
|
|
"@instructure/ui-truncate-text": "8.51.0",
|
|
|
|
"@instructure/ui-view": "8.51.0",
|
|
|
|
"@instructure/uid": "8.51.0"
|
2011-11-11 00:31:45 +08:00
|
|
|
}
|
2018-05-02 04:54:56 +08:00
|
|
|
}
|