///
///
///
declare namespace pxt {
// targetconfig.json
type GalleryShuffle = "daily";
interface GalleryProps {
url: string;
experimentName?: string;
locales?: string[];
shuffle?: GalleryShuffle;
// pings this url to determine if the gallery is available
// value @random@ will be expanded to a random string
// looks for 200, 403 error codes
testUrl?: string;
// requires youtube acces
youTube?: boolean;
}
interface TargetConfig {
packages?: PackagesConfig;
shareLinks?: ShareConfig;
skillMap?: SkillMapConfig;
multiplayer?: MultiplayerConfig;
// common galleries
galleries?: pxt.Map;
// localized galleries
localizedGalleries?: pxt.Map>;
windowsStoreLink?: string;
// localized options on download dialog; name, description, url, imageUrl, variant used.
hardwareOptions?: CodeCard[];
// release manifest for the electron app
electronManifest?: pxt.electron.ElectronManifest;
profileNotification?: ProfileNotification;
kiosk?: KioskConfig;
teachertool?: TeacherToolConfig;
}
interface PackagesConfig {
approvedOrgs?: string[];
releases?: pxt.Map; // per major version list of approved company/project#tag
bannedOrgs?: string[];
bannedRepos?: string[];
allowUnapproved?: boolean;
approvedRepoLib?: pxt.Map;
builtinExtensionsLib?: pxt.Map;
// list of trusted custom editor extension urls
// that can bypass consent and send/receive messages
approvedEditorExtensionUrls?: string[];
}
interface RepoData {
preferred?: boolean;
tags?: string[];
// format:
// "acme-corp/pxt-widget": "min:v0.1.2" - auto-upgrade to that version
// "acme-corp/pxt-widget": "dv:foo,bar" - add "disablesVariant": ["foo", "bar"] to pxt.json
upgrades?: string[];
// This repo's simulator extension configuration
simx?: SimulatorExtensionConfig;
// if true, this repo will not be shown in extension search results
hidden?: boolean;
}
interface SimulatorExtensionConfig {
aspectRatio?: number; // Aspect ratio for the iframe. Default: 1.22.
permanent?: boolean; // If true, don't recycle the iframe between runs. Default: true.
devUrl?: string; // URL to load for local development. Pass `simxdev` on URL to enable. Default: undefined.
index?: string; // The path to the simulator extension's entry point within the repo. Default: "index.html".
// backend-only options
sha?: string; // The commit to checkout (must exist in the branch/ref). Required.
repo?: string; // Actual repo to load simulator extension from. Defaults to key of parent in `approvedRepoLib` map.
ref?: string; // The branch of the repo to sync. Default: "gh-pages".
}
interface ShareConfig {
approved?: string[];
}
interface SkillMapConfig {
defaultPath?: string;
pathAliases?: pxt.Map; // map in the format "alias": "path"
}
interface MultiplayerConfig {
games?: MultiplayerGameCard[];
}
interface MultiplayerGameCard {
shareId: string;
title: string;
subtitle: string;
image?: string;
}
interface KioskConfig {
games: KioskGame[];
}
interface KioskGame {
id: string;
name: string;
description: string;
highScoreMode: string;
}
interface TeacherToolConfig {
showSharePageEvalButton?: boolean; // show the "Evaluate" button on the share page
defaultChecklistUrl?: string; // default checklist to use when a project is loaded without a checklist already active
carousels?: TeacherToolCarouselConfig[];
}
interface TeacherToolCarouselConfig {
title: string;
cardsUrl: string;
}
interface AppTarget {
id: string; // has to match ^[a-z]+$; used in URLs and domain names
platformid?: string; // eg "codal"; used when search for gh packages ("for PXT/codal"); defaults to id
nickname?: string; // friendly id used when generating files, folders, etc... id is used instead if missing
name: string; // long name
description?: string; // description
thumbnailName?: string; // name imprited on thumbnails when using saveAsPNG
corepkg: string;
title?: string;
cloud?: AppCloud;
simulator?: AppSimulator;
blocksprj: ProjectTemplate;
tsprj: ProjectTemplate;
runtime?: RuntimeOptions;
compile: ts.pxtc.CompileTarget;
serial?: AppSerial;
appTheme: AppTheme;
compileService?: TargetCompileService;
ignoreDocsErrors?: boolean;
uploadApiStringsBranchRx?: string; // regular expression to match branches that should upload api strings
uploadDocs?: boolean; // enable uploading to crowdin on master or v* builds
variants?: Map; // patches on top of the current AppTarget for different chip variants
multiVariants?: string[];
disabledVariants?: string[];
alwaysMultiVariant?: boolean;
queryVariants?: Map; // patches on top of the current AppTarget using query url regex
unsupportedBrowsers?: BrowserOptions[]; // list of unsupported browsers for a specific target (eg IE11 in arcade). check browserutils.js browser() function for strings
checkdocsdirs?: string[]; // list of /docs subfolders for checkdocs, irrespective of SUMMARY.md
cacheusedblocksdirs?: string[]; // list of /docs subfolders for parsing and caching used block ids (for tutorial loading)
blockIdMap?: Map; // list of target-specific blocks that are "synonyms" (eg. "agentturnright" and "minecraftAgentTurn")
defaultBadges?: pxt.auth.Badge[];
noSimShims?: boolean; // skip check for simshims and only build from cpp / user level typescript.
}
interface BrowserOptions {
id: string;
}
interface ProjectTemplate {
id: string;
config: PackageConfig;
files: pxt.Map;
}
interface BlockToolboxDefinition {
namespace: string;
type: string;
gap?: number;
weight?: number;
fields?: pxt.Map;
}
interface BlockOptions {
category?: string; // category in toolbox where the block should appear (defaults to "Loops")
group?: string; // group in toolbox category where the block should appear (defaults to none)
color?: string; // defaults to the color of the "Loops" category
weight?: number; // defaults to 0
namespace?: string; // namespace where the block's function lives (defaults to none)
callName?: string; // name of the block's function if changed in target
}
interface FunctionEditorTypeInfo {
typeName?: string; // The actual type that gets emitted to ts
label?: string; // A user-friendly label for the type, e.g. "text" for the string type
icon?: string; // The className of a semantic icon, e.g. "calculator", "text width", etc
defaultName?: string; // The default argument name to use in the function declaration for this type
}
interface RuntimeOptions {
mathBlocks?: boolean;
textBlocks?: boolean;
listsBlocks?: boolean;
variablesBlocks?: boolean;
functionBlocks?: boolean;
functionsOptions?: {
extraFunctionEditorTypes?: FunctionEditorTypeInfo[];
};
logicBlocks?: boolean;
loopsBlocks?: boolean;
onStartNamespace?: string; // default = loops
onStartColor?: string;
onStartGroup?: string;
onStartWeight?: number;
onStartUnDeletable?: boolean;
pauseUntilBlock?: BlockOptions;
breakBlock?: boolean;
continueBlock?: boolean;
extraBlocks?: BlockToolboxDefinition[]; // deprecated
assetExtensions?: string[];
palette?: string[];
paletteNames?: string[]; // human readable names for palette colors
tilesetFieldEditorIdentity?: string; // The qualified name of the API used with the field_tileset field editor. Currently, only for pxt-arcade
screenSize?: Size;
bannedCategories?: string[]; // a list of categories to exclude blocks from
}
interface AppSerial {
useHF2?: boolean;
noDeploy?: boolean;
useEditor?: boolean;
vendorId?: string; // used by node-serial
productId?: string; // used by node-serial
nameFilter?: string; // regex to match devices
rawHID?: boolean;
log?: boolean; // pipe messages to log
editorTheme?: SerialTheme;
}
interface SerialTheme {
graphBackground?: string;
gridFillStyle?: string;
gridStrokeStyle?: string;
strokeColor?: string;
lineColors?: string[];
}
interface AppCloud {
// specify the desired api root, https://makecode.com/api/
apiRoot?: string;
workspaces?: boolean;
packages?: boolean;
sharing?: boolean; // uses cloud-based anonymous sharing
thumbnails?: boolean; // attach screenshots/thumbnail to published scripts
importing?: boolean; // import url dialog
embedding?: boolean;
showBadges?: boolean; // show badges in user profile
githubPackages?: boolean; // allow searching github for packages
noGithubProxy?: boolean;
maxFileSize?: number; // maximum file size in bytes
warnFileSize?: number; // warn aboutfile size in bytes
cloudProviders?: pxt.Map;
}
type IdentityProviderId = "makecode" | "microsoft" | "google" | "github" | "clever";
interface AppCloudProvider {
id: IdentityProviderId;
name?: string;
icon?: string;
client_id?: string;
redirect?: boolean; // Whether or not to popup or redirect the oauth. Default to popup
identity?: boolean; // Whether or not this provider can be used for top-level login
order?: number; // Sort order
}
interface AppSimulator {
autoRun?: boolean; // enable autoRun in regular mode, not light mode
autoRunLight?: boolean; // force autorun in light mode
stopOnChange?: boolean;
emptyRunCode?: string; // when non-empty and autoRun is disabled, this code is run upon simulator first start
hideRestart?: boolean;
hideRun?: boolean;
// moved to theme
// moved to theme
// debugger?: boolean;
hideFullscreen?: boolean;
streams?: boolean;
aspectRatio?: number; // width / height
boardDefinition?: pxsim.BoardDefinition;
dynamicBoardDefinition?: boolean; // if true, boardDefinition comes from board package
parts?: boolean; // parts enabled?
// moved to theme
// instructions?: boolean;
partsAspectRatio?: number; // aspect ratio of the simulator when parts are displayed
headless?: boolean; // whether simulator should still run while collapsed
trustedUrls?: string[]; // URLs that are allowed in simulator modal messages
invalidatedClass?: string; // CSS class to be applied to the sim iFrame when it needs to be updated (defaults to sepia filter)
stoppedClass?: string; // CSS class to be applied to the sim iFrame when it isn't running (defaults to grayscale filter)
keymap?: boolean; // when non-empty and autoRun is disabled, this code is run upon simulator first start
// a map of allowed simulator channel to URL to handle specific control messages
// DEPRECATED. Use `simx` in targetconfig.json approvedRepoLib instead.
messageSimulators?: pxt.Map<{
// the URL to load the simulator, $PARENT_ORIGIN$ will be replaced by the parent
// origin to validate messages
url: string;
// url when localhost developer mode is enabled, add localhostmessagesims=1 to enable this mode
localHostUrl?: string;
aspectRatio?: number;
// don't recycle the iframe between runs
permanent?: boolean;
}>;
// This is for testing new simulator extensions before adding them to targetconfig.json.
// DO NOT SHIP SIMULATOR EXTENSIONS HERE. Add them to targetconfig.json/approvedRepoLib instead.
testSimulatorExtensions?: pxt.Map;
}
interface TargetCompileService {
yottaTarget?: string; // bbc-microbit-classic-gcc
yottaBinary?: string; // defaults to "pxt-microbit-app-combined.hex"
yottaCorePackage?: string; // pxt-microbit-core
yottaConfig?: any; // additional config
yottaConfigCompatibility?: boolean; // enforce emitting backward compatible yotta config entries (YOTTA_CFG_)
platformioIni?: string[];
codalTarget?: string | {
name: string; // "codal-arduino-uno"
url: string; // "https://github.com/lancaster-university/codal-arduino-uno"
branch: string; // "master"
type: string; // "git"
branches?: pxt.Map; // overrides repo url -> commit sha
};
codalBinary?: string;
codalDefinitions?: any;
dockerImage?: string;
dockerArgs?: string[];
githubCorePackage?: string; // microsoft/pxt-microbit-core
gittag: string;
serviceId: string;
buildEngine?: string; // default is yotta, set to platformio
skipCloudBuild?: boolean;
}
interface FeatureFlag {
includeRegions?: string[];
excludeRegions?: string[];
}
interface AppTheme {
id?: string;
name?: string;
title?: string;
description?: string;
twitter?: string;
defaultLocale?: string;
logoWide?: boolean; // the portrait logo is not square, but wide
logoUrl?: string;
logo?: string;
hideMenubarLogo?: boolean; // if true, partner logo won't be shown in the top-left corner (menu bar)
portraitLogo?: string;
highContrastLogo?: string;
highContrastPortraitLogo?: string;
rightLogo?: string;
docsLogo?: string;
docsHeader?: string;
organization?: string;
organizationText?: string;
organizationShortText?: string;
organizationUrl?: string;
organizationLogo?: string;
organizationWideLogo?: string;
homeUrl?: string;
shareUrl?: string;
embedUrl?: string;
// betaUrl?: string; deprecated, beta button automatically shows up in experiments dialog
docMenu?: DocMenuEntry[];
TOC?: TOCMenuEntry[];
hideSideDocs?: boolean;
homeScreenHero?: string | CodeCard; // home screen hero image or codecard
homeScreenHeroGallery?: string; // path to markdown file containing the gallery to display on homescreen
sideDoc?: string; // deprecated
hasReferenceDocs?: boolean; // if true: the monaco editor will add an option in the context menu to load the reference docs
feedbackUrl?: string; // is set: a feedback link will show in the settings menu
boardName?: string; // official branded name for the board or product
boardNickname?: string; // common nickname to use for the board or product
driveDisplayName?: string; // name of the drive as it shows in the explorer
privacyUrl?: string;
termsOfUseUrl?: string;
contactUrl?: string;
accentColor?: string; // used in PWA manifest as theme color
backgroundColor?: string; // use in PWA manifest as background color
cardLogo?: string;
thumbLogo?: string;
appLogo?: string;
htmlDocIncludes?: Map;
htmlTemplates?: Map;
githubUrl?: string;
usbDocs?: string;
useTextLogo?: string; // if true: use the organization string + board name in menu bar instead of image
invertedMenu?: boolean; // if true: apply the inverted class to the menu
coloredToolbox?: boolean; // if true: color the blockly toolbox categories
invertedToolbox?: boolean; // if true: use the blockly inverted toolbox
invertedMonaco?: boolean; // if true: use the vs-dark monaco theme
invertedGitHub?: boolean; // inverted github view
lightToc?: boolean; // if true: do NOT use inverted style in docs toc
// FIXME (riknoll): Can't use Blockly types here
blocklyOptions?: any; // Blockly options, see Configuration: https://developers.google.com/blockly/guides/get-started/web
hideFlyoutHeadings?: boolean; // Hide the flyout headings at the top of the flyout when on a mobile device.
monacoColors?: pxt.Map; // Monaco theme colors, see https://code.visualstudio.com/docs/getstarted/theme-color-reference
simAnimationEnter?: string; // Simulator enter animation
simAnimationExit?: string; // Simulator exit animation
hasAudio?: boolean; // target uses the Audio manager. if true: a mute button is added to the simulator toolbar.
crowdinProject?: string;
crowdinProjectId?: number; // Crowdin project id. Can be found by going to the project page in Crowdin and selecting Tools > API
monacoToolbox?: boolean; // if true: show the monaco toolbox when in the monaco editor
blockHats?: boolean; // if true, event blocks have hats
allowParentController?: boolean; // allow parent iframe to control editor
allowPackageExtensions?: boolean; // allow packages that include editor extensions
allowSimulatorTelemetry?: boolean; // allow the simulator to send telemetry messages
hideEmbedEdit?: boolean; // hide the edit button in the embedded view
blocksOnly?: boolean; // blocks only workspace
python?: boolean; // enable Python?
hideDocsSimulator?: boolean; // do not show simulator button in docs
hideDocsEdit?: boolean; // do not show edit button in docs
hideMenuBar?: boolean; // Hides the main menu bar
hideEditorToolbar?: boolean; // Hides the bottom editor toolbar
appStoreID?: string; // Apple iTune Store ID if any
mobileSafariDownloadProtocol?: string; // custom protocol to be used on iOS
sounds?: {
tutorialStep?: string;
tutorialNext?: string;
dialogClick?: string;
},
disableLiveTranslations?: boolean; // don't load translations from crowdin
extendEditor?: boolean; // whether a target specific editor.js is loaded
extendFieldEditors?: boolean; // wether a target specific fieldeditors.js is loaded
extendScriptPage?: boolean; // if set to true, builds scriptpage.js from scriptPage/ folder when building target
highContrast?: boolean; // simulator has a high contrast mode
print?: boolean; //Print blocks and text feature
greenScreen?: boolean; // display webcam stream in background
instructions?: boolean; // display make instructions
debugger?: boolean; // debugger button
selectLanguage?: boolean; // add language picker to settings menu
availableLocales?: string[]; // the list of enabled language codes
showProjectSettings?: boolean; // show a link to pxt.json in the cogwheel menu
useUploadMessage?: boolean; // change "Download" text to "Upload"
downloadIcon?: string; // which icon io use for download
blockColors?: Map; // block namespace colors, used for build in categories
blockIcons?: Map;
blocklyColors?: pxt.Map; // Overrides for the styles in the workspace Blockly.Theme.ComponentStyle
defaultColorTheme?: string; // default color theme id for the editor
highContrastColorTheme?: string; // theme id for high contrast mode
socialOptions?: SocialOptions; // show social icons in share dialog, options like twitter handle and org handle
noReloadOnUpdate?: boolean; // do not notify the user or reload the page when a new app cache is downloaded
appPathNames?: string[]; // Authorized URL paths in embedded apps, all other paths will display a warning banner
defaultBlockGap?: number; // For targets to override block gap
hideShareEmbed?: boolean; // don't show advanced embedding options in share dialog
hideNewProjectButton?: boolean; // do not show the "new project" button in home page
saveInMenu?: boolean; // move save icon under gearwheel menu
lockedEditor?: boolean; // remove default home navigation links from the editor
hideReplaceMyCode?: boolean; // hides the "replace my code" button for tutorials with templates in their markdown
fileNameExclusiveFilter?: string; // anything that does not match this regex is removed from the filename,
copyrightText?: string; // footer text for any copyright text to be included at the bottom of the home screen and about page
browserDbPrefixes?: { [majorVersion: number]: string }; // Prefix used when storing projects in the DB to allow side-by-side projects of different major versions
editorVersionPaths?: { [majorVersion: number]: string }; // A map of major editor versions to their corresponding paths (alpha, v1, etc.)
experiments?: string[]; // list of experiment ids, also enables this feature
supportedExperiences?: string[]; // list of supported "experiences" (separate CRAs, like code eval)
chooseBoardOnNewProject?: boolean; // when multiple boards are support, show board dialog on "new project"
bluetoothUartConsole?: boolean; // pair with BLE UART services and pipe console output
bluetoothUartFilters?: { name?: string; namePrefix?: string; }[]; // device name prefix -- required
bluetoothPartialFlashing?: boolean; // enable partial flashing over BLE
topBlocks?: boolean; // show a top blocks category in the editor
pairingButton?: boolean; // display a pairing button
tagColors?: pxt.Map; // optional colors for tags
dontSuspendOnVisibility?: boolean; // we're inside an app, don't suspend the editor
disableFileAccessinMaciOs?: boolean; //Disable save & import of files in Mac and iOS, mainly used as embed webkit doesn't support these
disableFileAccessinAndroid?: boolean; // Disable import of files in Android.
baseTheme?: string; // Use this to determine whether to show a light or dark theme, default is 'light', options are 'light', 'dark', or 'hc'
scriptManager?: boolean; // Whether or not to enable the script manager. default: false
monacoFieldEditors?: string[]; // A list of field editors to show in monaco. Currently only "image-editor" is supported
disableAPICache?: boolean; // Disables the api cache in target.js
sidebarTutorial?: boolean; // Move the tutorial pane to be on the left side of the screen
legacyTutorial?: boolean; // Use the legacy tutorial format without tabs
/**
* Internal and temporary flags:
* These flags may be removed without notice, please don't take a dependency on them
*/
simCollapseInMenu?: boolean; // don't show any of the collapse / uncollapse buttons down the bottom, instead show it in the menu
bigRunButton?: boolean; // show the run button as a big button on the right
transparentEditorToolbar?: boolean; // make the editor toolbar float with a transparent background
hideProjectRename?: boolean; // Temporary flag until we figure out a better way to show the name
addNewTypeScriptFile?: boolean; // when enabled, the [+] explorer button asks for file name, instead of using "custom.ts"
simScreenshot?: boolean; // allows to download a screenshot of the simulator
simScreenshotKey?: string; // keyboard key name
simScreenshotMaxUriLength?: number; // maximum base64 encoded length to be uploaded
simGif?: boolean; // record gif of the simulator
simGifKey?: string; // shortcut to start stop
simGifTransparent?: string; // specify the gif transparency color
simGifQuality?: number; // generated gif quality (pixel sampling size) - 30 (poor) - 1 (best), default 16
simGifMaxFrames?: number; // maximum number of frames, default 64
simGifWidth?: number; // with in pixels for gif frames
qrCode?: boolean; // generate QR code for shared urls
importExtensionFiles?: boolean; // import extensions from files
debugExtensionCode?: boolean; // debug extension and libs code in the Monaco debugger
snippetBuilder?: boolean; // Snippet builder experimental feature
experimentalHw?: boolean; // enable experimental hardware
// recipes?: boolean; // inlined tutorials - deprecated
checkForHwVariantWebUSB?: boolean; // check for hardware variant using webusb before compiling
preferWebUSBDownload?: boolean; // default to webusb over normal browser download when available
shareFinishedTutorials?: boolean; // always pop a share dialog once the tutorial is finished
leanShare?: boolean; // use leanscript.html instead of script.html for sharing pages
nameProjectFirst?: boolean; // prompt user to name project when creating new one
chooseLanguageRestrictionOnNewProject?: boolean; // include 'options' menu when creating a new project
githubEditor?: boolean; // allow editing github repositories from the editor
githubCompiledJs?: boolean; // commit binary.js in commit when creating a github release,
blocksCollapsing?: boolean; // collapse/uncollapse functions/event in blocks
workspaceSearch?: boolean; // allow CTRL+F blocks workspace search
hideHomeDetailsVideo?: boolean; // hide video/large image from details card
tutorialBlocksDiff?: boolean; // automatically display blocks diffs in tutorials
tutorialTextDiff?: boolean; // automatically display text diffs in tutorials
openProjectNewTab?: boolean; // allow opening project in a new tab
openProjectNewDependentTab?: boolean; // allow opening project in a new tab -- connected
tutorialExplicitHints?: boolean; // allow use explicit hints
errorList?: boolean; // error list experiment
embedBlocksInSnapshot?: boolean; // embed blocks xml in right-click snapshot
identity?: boolean; // login with identity providers
assetEditor?: boolean | AssetConfig; // enable asset editor view (in blocks/text toggle)
disableMemoryWorkspaceWarning?: boolean; // do not warn the user when switching to in memory workspace
embeddedTutorial?: boolean;
disableBlobObjectDownload?: boolean; // use data uri downloads instead of object urls
immersiveReader?: boolean; // enables the immersive reader for tutorials
downloadDialogTheme?: DownloadDialogTheme;
songEditor?: boolean; // enable the song asset type and field editor
multiplayer?: boolean; // enable multiplayer features
shareToKiosk?: boolean; // enable sharing to a kiosk
tours?: {
editor?: string // path to markdown file for the editor tour steps
}
tutorialSimSidebarLangs?: string[]; // Enable tutorial layout with sim in sidebar for specific editor languages (blocks, python, or javascript). Desktop only.
showOpenInVscode?: boolean; // show the open in VS Code button
matchWebUSBDeviceInSim?: boolean; // if set, pass current device id as theme to sim when available.
condenseProfile?: boolean; // if set, will make the profile dialog smaller
cloudProfileIcon?: string; // the file path for added imagery on smaller profile dialogs
timeMachine?: boolean; // Save/restore old versions of a project experiment
blocklySoundVolume?: number; // A number between 0 and 1 that sets the volume for blockly sounds (e.g. connect, disconnect, click)
timeMachineQueryParams?: string[]; // An array of query params to pass to timemachine iframe embed
timeMachineDiffInterval?: number; // An interval in milliseconds at which to take diffs to store in project history. Defaults to 5 minutes
timeMachineSnapshotInterval?: number; // An interval in milliseconds at which to take full project snapshots in project history. Defaults to 15 minutes
adjustBlockContrast?: boolean; // If set to true, all block colors will automatically be adjusted to have a contrast ratio of 4.5 with text
pxtJsonOptions?: PxtJsonOption[];
enabledFeatures?: pxt.Map;
forceEnableAiErrorHelp?: boolean; // Enables the AI Error Help feature, regardless of geo setting.
shareHomepageContent?: boolean; // Show buttons to share links to homepage content more easily
showProjectDescription?: boolean; // Show project description in pxtjson editor and share dialog
}
interface DownloadDialogTheme {
webUSBDeviceNames?: string[];
minimumFirmwareVersion?: string;
deviceIcon?: string;
deviceSuccessIcon?: string;
downloadMenuHelpURL?: string;
downloadHelpURL?: string;
troubleshootWebUSBHelpURL?: string;
incompatibleHardwareHelpURL?: string;
dragFileImage?: string;
connectDeviceImage?: string;
disconnectDeviceImage?: string;
selectDeviceImage?: string;
connectionSuccessImage?: string;
incompatibleHardwareImage?: string;
browserUnpairImage?: string;
usbDeviceForgottenImage?: string;
// The following fields used to be displayed, but students
// found the dialog confusing / hard to use; now we redirect
// them to help docs instead if pairing fails for step by step instructions.
// checkFirmwareVersionImage?: string;
// checkUSBCableImage?: string;
// firmwareHelpURL?: string;
}
interface SocialOptions {
twitterHandle?: string;
orgTwitterHandle?: string;
hashtags?: string;
related?: string;
discourse?: string; // URL to the discourse powered forum
discourseCategory?: string;
}
interface DocMenuEntry {
name: string;
// needs to have one of `path` or `subitems`
path?: string;
// force opening in separate window
popout?: boolean;
tutorial?: boolean;
subitems?: DocMenuEntry[];
}
interface TOCMenuEntry {
name: string;
path?: string;
subitems?: TOCMenuEntry[];
markdown?: string;
}
interface PxtJsonOption {
label: string;
property: string;
type: "checkbox";
}
interface AssetConfig {
[index: string /*pxt.AssetType*/]: (boolean | { label?: string; iconClass?: string });
}
interface TargetBundle extends AppTarget {
bundledpkgs: Map