-
Notifications
You must be signed in to change notification settings - Fork 587
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
43 changed files
with
32,978 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
import { ErrorCode } from "./constants"; | ||
import { logError } from "./loggingService"; | ||
|
||
export async function fetchJsonDocAsync<T = any>(url: string): Promise<T | undefined> { | ||
try { | ||
const response = await fetch(url, { | ||
cache: "no-cache", | ||
}); | ||
if (!response.ok) { | ||
throw new Error("Unable to fetch the json file"); | ||
} else { | ||
const json = await response.json(); | ||
return json; | ||
} | ||
} catch (e) { | ||
logError(ErrorCode.fetchJsonDocAsync, e); | ||
} | ||
} | ||
|
||
export async function getProjectTextAsync(projectId: string): Promise<pxt.Cloud.JsonText | undefined> { | ||
try { | ||
const projectTextUrl = `${pxt.Cloud.apiRoot}/${projectId}/text`; | ||
const response = await fetch(projectTextUrl); | ||
if (!response.ok) { | ||
throw new Error("Unable to fetch the project details"); | ||
} else { | ||
const projectText = await response.json(); | ||
return projectText; | ||
} | ||
} catch (e) { | ||
logError(ErrorCode.getProjectTextAsync, e); | ||
} | ||
} | ||
|
||
export async function getProjectMetaAsync(projectId: string): Promise<pxt.Cloud.JsonScript | undefined> { | ||
try { | ||
const projectMetaUrl = `${pxt.Cloud.apiRoot}/${projectId}`; | ||
const response = await fetch(projectMetaUrl); | ||
if (!response.ok) { | ||
throw new Error("Unable to fetch the project meta information"); | ||
} else { | ||
const projectMeta = await response.json(); | ||
return projectMeta; | ||
} | ||
} catch (e) { | ||
logError(ErrorCode.getProjectMetaAsync, e); | ||
} | ||
} | ||
|
||
export async function downloadTargetConfigAsync(): Promise<pxt.TargetConfig | undefined> { | ||
try { | ||
return await pxt.targetConfigAsync(); | ||
} catch (e) { | ||
logError(ErrorCode.downloadTargetConfigAsync, e); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
export enum ErrorCode { | ||
downloadTargetConfigAsync = "downloadTargetConfigAsync", | ||
fetchJsonDocAsync = "fetchJsonDocAsync", | ||
getProjectTextAsync = "getProjectTextAsync", | ||
getProjectMetaAsync = "getProjectMetaAsync", | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
let tickEvent = "pxt.error"; | ||
|
||
const timestamp = () => { | ||
const time = new Date(); | ||
const hours = padTime(time.getHours()); | ||
const minutes = padTime(time.getMinutes()); | ||
const seconds = padTime(time.getSeconds()); | ||
|
||
return `[${hours}:${minutes}:${seconds}]`; | ||
}; | ||
|
||
const padTime = (time: number) => ("0" + time).slice(-2); | ||
|
||
export const logError = (errorCode: string, message?: any, data: pxt.Map<string | number> = {}) => { | ||
let dataObj = { ...data }; | ||
if (message) { | ||
if (typeof message === "object") { | ||
dataObj = { ...dataObj, ...message }; | ||
// Look for non-enumerable properties found on Error objects | ||
["message", "stack", "name"].forEach(key => { | ||
if (message[key]) { | ||
dataObj[key] = message[key]; | ||
} | ||
}); | ||
} else { | ||
dataObj.message = message; | ||
} | ||
} | ||
pxt.tickEvent(tickEvent, { | ||
...dataObj, | ||
errorCode, | ||
}); | ||
console.error(timestamp(), errorCode, dataObj); | ||
}; | ||
|
||
export const logInfo = (message: any) => { | ||
console.log(timestamp(), message); | ||
}; | ||
|
||
export const logDebug = (message: any) => { | ||
if (pxt.BrowserUtils.isLocalHost() || pxt.options.debug) { | ||
console.log(timestamp(), message); | ||
} | ||
}; | ||
|
||
|
||
export const setTickEvent = (event: string) => { | ||
tickEvent = event; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
DISABLE_ESLINT_PLUGIN=true | ||
GENERATE_SOURCEMAP=false | ||
BROWSER=none |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
module.exports = { | ||
"parserOptions": { | ||
"project": "tutorialtool/tsconfig.json", | ||
}, | ||
"ignorePatterns": ["tests/**/*.spec.ts", "public/**/*", "build/**/*"] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
.vscode | ||
build | ||
!package-lock.json |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
{ | ||
"arrowParens": "avoid", | ||
"semi": true, | ||
"tabWidth": 4, | ||
"printWidth":120 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
# Teacher Tool | ||
|
||
## Localhost testing | ||
|
||
To test the Teacher Tool locally: | ||
|
||
1. Ensure your pxt repo is up to date and has been built recently. | ||
2. In a command shell, in the `pxt` repo, cd into the `tutorialtool` folder and start the Teacher Tool dev server: `npm run start`. This will *not* open a browser window. | ||
3. In another command shell, in the target repo (e.g. `pxt-arcade` or `pxt-microbit`), start the pxt dev server: `pxt serve --rebundle --noauth`. This will open the editor webapp in a browser. | ||
1. **Note the `--noauth` parameter.** It is important to include this option when running on localhost in order to download certain required startup files from the localhost pxt server. | ||
|
||
Requests to the `/eval` endpoint will be routed to the Teacher Tool dev server. | ||
|
||
Debug and step through Teacher Tool code using the browser dev tools (F12 to open). | ||
|
||
|
||
## Test in staging environment | ||
|
||
1. In the pxt repo, run `gulp` to ensure production teacher tool is built. | ||
2. In a browser, go to `https://staging.pxt.io/oauth/gettoken`. This should return a url with an auth token embedded. Copy the entire url value to your clipboard. | ||
- It should look something like `https://staging.pxt.io/?access_token=X.XXXXXXXX` | ||
- If you get access denied, contact your manager to help you. | ||
3. In a command shell, set environment variable `PXT_ACCESS_TOKEN` with the copied value. | ||
4. In the same shell, in the pxt-arcade repo, run `pxt uploadtrg --rebundle`. This should return a url to your private build. | ||
- It should look something like `https://arcade.staging.pxt.io/app/XXXXXX-XXXXX` | ||
- Paste in a browser and append "/tutorialtool". This should take you to your teacher tool build in staging. | ||
|
||
## Test in production environment | ||
|
||
Follow the "Test in staging environment" instructions, but get your auth token from `https://makecode.com/oauth/gettoken`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
const { aliasWebpack } = require("react-app-alias-ex"); | ||
const NodePolyfillPlugin = require("node-polyfill-webpack-plugin"); | ||
const HtmlWebpackPlugin = require("html-webpack-plugin"); | ||
|
||
module.exports = function (config, env) { | ||
const isEnvProduction = env === "production"; | ||
const aliasFn = aliasWebpack({}); | ||
config = { | ||
...aliasFn(config), | ||
plugins: [ | ||
...config.plugins.filter((p) => !(p instanceof HtmlWebpackPlugin)), | ||
new NodePolyfillPlugin(), | ||
new HtmlWebpackPlugin( | ||
Object.assign( | ||
{}, | ||
{ | ||
inject: true, | ||
template: "./public/index.html", | ||
}, | ||
isEnvProduction | ||
? { | ||
minify: { | ||
removeComments: false, | ||
collapseWhitespace: false, | ||
removeRedundantAttributes: true, | ||
useShortDoctype: true, | ||
removeEmptyAttributes: true, | ||
removeStyleLinkTypeAttributes: true, | ||
keepClosingSlash: true, | ||
minifyJS: true, | ||
minifyCSS: true, | ||
minifyURLs: true, | ||
}, | ||
} | ||
: undefined | ||
) | ||
), | ||
], | ||
}; | ||
return config; | ||
}; |
Oops, something went wrong.