pxt-core
Version:
Microsoft MakeCode provides Blocks / JavaScript / Python tools and editors
1,138 lines (1,137 loc) • 41.1 kB
TypeScript
/// <reference path="../localtypings/monaco.d.ts" />
/// <reference path="pxtlib.d.ts" />
/// <reference path="pxtblocks.d.ts" />
declare namespace pxt.editor {
enum SimState {
Stopped = 0,
Pending = 1,
Starting = 2,
Running = 3
}
interface IEditor {
undo(): void;
redo(): void;
hasUndo(): boolean;
hasRedo(): boolean;
zoomIn(): void;
zoomOut(): void;
resize(): void;
setScale(scale: number): void;
}
interface IFile {
name: string;
virtual?: boolean;
}
function isBlocks(f: IFile): boolean;
interface FileHistoryEntry {
id: string;
name: string;
pos: any;
}
interface EditorSettings {
editorFontSize: number;
fileHistory: FileHistoryEntry[];
}
enum ErrorListState {
HeaderOnly = "errorListHeader",
Expanded = "errorListExpanded"
}
interface IAppProps {
}
interface IAppState {
active?: boolean;
header?: pxt.workspace.Header;
editorState?: EditorState;
currFile?: IFile;
fileState?: string;
showFiles?: boolean;
sideDocsLoadUrl?: string;
sideDocsCollapsed?: boolean;
projectName?: string;
suppressPackageWarning?: boolean;
tutorialOptions?: pxt.tutorial.TutorialOptions;
lightbox?: boolean;
keymap?: boolean;
simState?: SimState;
autoRun?: boolean;
resumeOnVisibility?: boolean;
compiling?: boolean;
isSaving?: boolean;
publishing?: boolean;
hideEditorFloats?: boolean;
collapseEditorTools?: boolean;
showBlocks?: boolean;
showParts?: boolean;
fullscreen?: boolean;
showMiniSim?: boolean;
mute?: boolean;
embedSimView?: boolean;
editorPosition?: {
lineNumber: number;
column: number;
file: IFile;
};
tracing?: boolean;
debugging?: boolean;
debugFirstRun?: boolean;
bannerVisible?: boolean;
pokeUserComponent?: string;
flashHint?: boolean;
editorOffset?: string;
print?: boolean;
greenScreen?: boolean;
accessibleBlocks?: boolean;
home?: boolean;
hasError?: boolean;
cancelledDownload?: boolean;
simSerialActive?: boolean;
deviceSerialActive?: boolean;
errorListState?: ErrorListState;
screenshoting?: boolean;
extensionsVisible?: boolean;
isMultiplayerGame?: boolean;
onboarding?: boolean;
}
interface EditorState {
filters?: pxt.editor.ProjectFilters;
searchBar?: boolean;
hasCategories?: boolean;
}
interface ProjectCreationOptions {
prj?: pxt.ProjectTemplate;
name?: string;
documentation?: string;
filesOverride?: pxt.Map<string>;
filters?: ProjectFilters;
temporary?: boolean;
tutorial?: pxt.tutorial.TutorialOptions;
dependencies?: pxt.Map<string>;
tsOnly?: boolean;
languageRestriction?: LanguageRestriction;
preferredEditor?: string;
extensionUnderTest?: string;
skillmapProject?: boolean;
}
interface ExampleImportOptions {
name: string;
path: string;
loadBlocks?: boolean;
prj?: ProjectTemplate;
preferredEditor?: string;
}
interface StartActivityOptions {
activity: Activity;
path: string;
title?: string;
editor?: string;
focus?: boolean;
importOptions?: pxt.editor.ExampleImportOptions;
previousProjectHeaderId?: string;
carryoverPreviousCode?: boolean;
}
interface ProjectFilters {
namespaces?: {
[index: string]: FilterState;
};
blocks?: {
[index: string]: FilterState;
};
fns?: {
[index: string]: FilterState;
};
defaultState?: FilterState;
}
enum FilterState {
Hidden = 0,
Visible = 1,
Disabled = 2
}
interface ModalDialogButton {
label: string;
url?: string;
}
interface ModalDialogOptions {
header: string;
body: string;
buttons?: ModalDialogButton[];
}
interface ScreenshotData {
data?: ImageData;
delay?: number;
event?: "start" | "stop";
}
interface SimulatorStartOptions {
clickTrigger?: boolean;
}
interface ImportFileOptions {
extension?: boolean;
openHomeIfFailed?: boolean;
}
interface UserInfo {
id: string;
userName?: string;
name: string;
profile?: string;
loginHint?: string;
initials?: string;
photo?: string;
}
interface ShareData {
url: string;
embed: {
code?: string;
editor?: string;
simulator?: string;
url?: string;
};
qr?: string;
error?: any;
}
type Activity = "tutorial" | "recipe" | "example";
interface IProjectView {
state: IAppState;
setState(st: IAppState): void;
forceUpdate(): void;
reloadEditor(): void;
openBlocks(): void;
openJavaScript(giveFocusOnLoading?: boolean): void;
openPython(giveFocusOnLoading?: boolean): void;
openAssets(): void;
openSettings(): void;
openSimView(): void;
openSimSerial(): void;
openDeviceSerial(): void;
openPreviousEditor(): void;
switchTypeScript(): void;
openTypeScriptAsync(): Promise<void>;
openPythonAsync(): Promise<void>;
saveBlocksToTypeScriptAsync(): Promise<string>;
saveFileAsync(): Promise<void>;
saveCurrentSourceAsync(): Promise<void>;
saveProjectAsync(): Promise<void>;
loadHeaderAsync(h: pxt.workspace.Header): Promise<void>;
reloadHeaderAsync(): Promise<void>;
importProjectAsync(prj: pxt.workspace.Project, editorState?: pxt.editor.EditorState): Promise<void>;
importTutorialAsync(markdown: string): Promise<void>;
openProjectByHeaderIdAsync(headerId: string): Promise<void>;
overrideTypescriptFile(text: string): void;
overrideBlocksFile(text: string): void;
resetTutorialTemplateCode(keepAssets: boolean): Promise<void>;
exportAsync(): Promise<string>;
newEmptyProject(name?: string, documentation?: string, preferredEditor?: string): void;
newProject(options?: ProjectCreationOptions): void;
createProjectAsync(options: ProjectCreationOptions): Promise<void>;
importExampleAsync(options: ExampleImportOptions): Promise<void>;
showScriptManager(): void;
importProjectDialog(): void;
removeProject(): void;
editText(): void;
hasCloudSync(): boolean;
getPreferredEditor(): string;
saveAndCompile(): void;
updateHeaderName(name: string): void;
updateHeaderNameAsync(name: string): Promise<void>;
compile(): void;
setFile(fn: IFile, line?: number): void;
setSideFile(fn: IFile, line?: number): void;
navigateToError(diag: pxtc.KsDiagnostic): void;
setSideDoc(path: string, blocksEditor?: boolean): void;
setSideMarkdown(md: string): void;
setSideDocCollapsed(shouldCollapse?: boolean): void;
removeFile(fn: IFile, skipConfirm?: boolean): void;
updateFileAsync(name: string, content: string, open?: boolean): Promise<void>;
openHome(): void;
unloadProjectAsync(home?: boolean): Promise<void>;
setTutorialStep(step: number): void;
setTutorialInstructionsExpanded(value: boolean): void;
exitTutorial(): void;
completeTutorialAsync(): Promise<void>;
showTutorialHint(): void;
isTutorial(): boolean;
onTutorialLoaded(): void;
setTutorialCodeStatus(step: number, status: pxt.tutorial.TutorialRuleStatus[]): void;
pokeUserActivity(): void;
stopPokeUserActivity(): void;
clearUserPoke(): void;
setHintSeen(step: number): void;
setEditorOffset(): void;
anonymousPublishHeaderByIdAsync(headerId: string, projectName?: string): Promise<ShareData>;
publishCurrentHeaderAsync(persistent: boolean, screenshotUri?: string): Promise<string>;
publishAsync(name: string, screenshotUri?: string, forceAnonymous?: boolean): Promise<pxt.editor.ShareData>;
startStopSimulator(opts?: SimulatorStartOptions): void;
stopSimulator(unload?: boolean, opts?: SimulatorStartOptions): void;
restartSimulator(): void;
startSimulator(opts?: SimulatorStartOptions): void;
runSimulator(): void;
isSimulatorRunning(): boolean;
expandSimulator(): void;
collapseSimulator(): void;
toggleSimulatorCollapse(): void;
toggleSimulatorFullscreen(): void;
setSimulatorFullScreen(enabled: boolean): void;
proxySimulatorMessage(content: string): void;
toggleTrace(intervalSpeed?: number): void;
setTrace(enabled: boolean, intervalSpeed?: number): void;
toggleMute(): void;
setMute(on: boolean): void;
openInstructions(): void;
closeFlyout(): void;
printCode(): void;
requestScreenshotAsync(): Promise<string>;
downloadScreenshotAsync(): Promise<void>;
toggleDebugging(): void;
dbgPauseResume(): void;
dbgStepInto(): void;
dbgStepOver(): void;
dbgInsertBreakpoint(): void;
setBannerVisible(b: boolean): void;
typecheckNow(): void;
shouldPreserveUndoStack(): boolean;
openExtension(extension: string, url: string, consentRequired?: boolean, trusted?: boolean): void;
handleExtensionRequest(request: ExtensionRequest): void;
fireResize(): void;
updateEditorLogo(left: number, rgba?: string): number;
loadBlocklyAsync(): Promise<void>;
isBlocksEditor(): boolean;
isTextEditor(): boolean;
isPxtJsonEditor(): boolean;
blocksScreenshotAsync(pixelDensity?: number, encodeBlocks?: boolean): Promise<string>;
renderBlocksAsync(req: EditorMessageRenderBlocksRequest): Promise<EditorMessageRenderBlocksResponse>;
renderPythonAsync(req: EditorMessageRenderPythonRequest): Promise<EditorMessageRenderPythonResponse>;
toggleHighContrast(): void;
setHighContrast(on: boolean): void;
toggleGreenScreen(): void;
toggleAccessibleBlocks(): void;
setAccessibleBlocks(enabled: boolean): void;
launchFullEditor(): void;
resetWorkspace(): void;
settings: EditorSettings;
isEmbedSimActive(): boolean;
isBlocksActive(): boolean;
isJavaScriptActive(): boolean;
isPythonActive(): boolean;
isAssetsActive(): boolean;
editor: IEditor;
startActivity(options: StartActivityOptions): void;
showLightbox(): void;
hideLightbox(): void;
showOnboarding(): void;
hideOnboarding(): void;
showKeymap(show: boolean): void;
toggleKeymap(): void;
showReportAbuse(): void;
showLanguagePicker(): void;
showShareDialog(title?: string, kind?: "multiplayer" | "vscode" | "share"): void;
showAboutDialog(): void;
showLoginDialog(continuationHash?: string): void;
showProfileDialog(location?: string): void;
showImportUrlDialog(): void;
showImportFileDialog(options?: ImportFileOptions): void;
showImportGithubDialog(): void;
showResetDialog(): void;
showExitAndSaveDialog(): void;
showChooseHwDialog(skipDownload?: boolean): void;
showExperimentsDialog(): void;
showPackageDialog(query?: string): void;
showBoardDialogAsync(features?: string[], closeIcon?: boolean): Promise<void>;
checkForHwVariant(): boolean;
pairAsync(): Promise<void>;
createModalClasses(classes?: string): string;
showModalDialogAsync(options: ModalDialogOptions): Promise<void>;
askForProjectCreationOptionsAsync(): Promise<ProjectCreationOptions>;
pushScreenshotHandler(handler: (msg: ScreenshotData) => void): void;
popScreenshotHandler(): void;
openNewTab(header: pxt.workspace.Header, dependent: boolean): void;
createGitHubRepositoryAsync(): Promise<void>;
saveLocalProjectsToCloudAsync(headerIds: string[]): Promise<pxt.Map<string> | undefined>;
requestProjectCloudStatus(headerIds: string[]): Promise<void>;
convertCloudProjectsToLocal(userId: string): Promise<void>;
setLanguageRestrictionAsync(restriction: pxt.editor.LanguageRestriction): Promise<void>;
hasHeaderBeenPersistentShared(): boolean;
getSharePreferenceForHeader(): boolean;
saveSharePreferenceForHeaderAsync(anonymousByDefault: boolean): Promise<void>;
}
interface IHexFileImporter {
id: string;
canImport(data: pxt.cpp.HexFile): boolean;
importAsync(project: IProjectView, data: pxt.cpp.HexFile): Promise<void>;
}
interface IResourceImporter {
id: string;
canImport(data: File): boolean;
importAsync(project: IProjectView, data: File): Promise<void>;
}
interface ISettingsProps {
parent: IProjectView;
visible?: boolean;
collapsed?: boolean;
simSerialActive?: boolean;
devSerialActive?: boolean;
}
interface IFieldCustomOptions {
selector: string;
editor: Blockly.FieldCustomConstructor;
text?: string;
validator?: any;
}
interface ExtensionOptions {
blocklyToolbox: ToolboxDefinition;
monacoToolbox: ToolboxDefinition;
projectView: IProjectView;
}
interface IToolboxOptions {
blocklyToolbox?: ToolboxDefinition;
monacoToolbox?: ToolboxDefinition;
}
interface ExtensionResult {
hexFileImporters?: IHexFileImporter[];
resourceImporters?: IResourceImporter[];
beforeCompile?: () => void;
patchCompileResultAsync?: (r: pxtc.CompileResult) => Promise<void>;
deployAsync?: (r: pxtc.CompileResult) => Promise<void>;
saveOnlyAsync?: (r: ts.pxtc.CompileResult) => Promise<void>;
saveProjectAsync?: (project: pxt.cpp.HexFile) => Promise<void>;
renderBrowserDownloadInstructions?: () => any;
renderUsbPairDialog?: (firmwareUrl?: string, failedOnce?: boolean) => any;
renderIncompatibleHardwareDialog?: (unsupportedParts: string[]) => any;
showUploadInstructionsAsync?: (fn: string, url: string, confirmAsync: (options: any) => Promise<number>) => Promise<void>;
showProgramTooLargeErrorAsync?: (variants: string[], confirmAsync: (options: any) => Promise<number>) => Promise<pxt.commands.RecompileOptions>;
toolboxOptions?: IToolboxOptions;
blocklyPatch?: (pkgTargetVersion: string, dom: Element) => void;
webUsbPairDialogAsync?: (pairAsync: () => Promise<boolean>, confirmAsync: (options: any) => Promise<number>) => Promise<number>;
mkPacketIOWrapper?: (io: pxt.packetio.PacketIO) => pxt.packetio.PacketIOWrapper;
onTutorialCompleted?: () => void;
onCodeStart?: () => void;
onCodeStop?: () => void;
}
interface FieldExtensionOptions {
}
interface FieldExtensionResult {
fieldEditors?: IFieldCustomOptions[];
}
interface ToolboxDefinition {
loops?: ToolboxCategoryDefinition;
logic?: ToolboxCategoryDefinition;
variables?: ToolboxCategoryDefinition;
maths?: ToolboxCategoryDefinition;
text?: ToolboxCategoryDefinition;
arrays?: ToolboxCategoryDefinition;
functions?: ToolboxCategoryDefinition;
}
interface ToolboxCategoryDefinition {
/**
* The display name for the category
*/
name?: string;
/**
* The icon of this category
*/
icon?: string;
/**
* The color of this category
*/
color?: string;
/**
* The weight of the category relative to other categories in the toolbox
*/
weight?: number;
/**
* Whether or not the category should be placed in the advanced category
*/
advanced?: boolean;
/**
* Blocks to appear in the category. Specifying this field will override
* all existing blocks in the category. The ordering of the blocks is
* determined by the ordering of this array.
*/
blocks?: ToolboxBlockDefinition[];
/**
* Ordering of category groups
*/
groups?: string[];
}
interface ToolboxBlockDefinition {
/**
* Internal id used to refer to this block or snippet, must be unique
*/
name: string;
/**
* Group label used to categorize block. Blocks are arranged with other
* blocks that share the same group.
*/
group?: string;
/**
* Indicates an advanced API. Advanced APIs appear after basic ones in the
* toolbox
*/
advanced?: boolean;
/**
* The weight for the block. Blocks are arranged in order of they appear in the category
* definition's array but the weight can be specified in the case that other APIs are
* dynamically added to the category (eg. loops.forever())
*/
weight?: number;
/**
* Description of code to appear in the hover text
*/
jsDoc?: string;
/**
* TypeScript snippet of code to insert when dragged into editor
*/
snippet?: string;
/**
* Python snippet of code to insert when dragged into editor
*/
pySnippet?: string;
/**
* TypeScript name used for highlighting the snippet, uses name if not defined
*/
snippetName?: string;
/**
* Python name used for highlighting the snippet, uses name if not defined
*/
pySnippetName?: string;
/**
* Display just the snippet and nothing else. Should be set to true for
* language constructs (eg. for-loops) and to false for function
* calls (eg. Math.random())
*/
snippetOnly?: boolean;
/**
* The return type of the block. This is used to determine the shape of the block rendered.
*/
retType?: string;
/**
* The block definition in XML for the blockly toolbox.
*/
blockXml?: string;
/**
* The Blockly block id used to identify this block.
*/
blockId?: string;
}
let initExtensionsAsync: (opts: ExtensionOptions) => Promise<ExtensionResult>;
let initFieldExtensionsAsync: (opts: FieldExtensionOptions) => Promise<FieldExtensionResult>;
interface NativeHostMessage {
name?: string;
download?: string;
save?: string;
cmd?: string;
}
let HELP_IMAGE_URI: string;
function initEditorExtensionsAsync(): Promise<void>;
}
declare namespace pxt.editor {
interface EditorMessage {
/**
* Constant identifier
*/
type: "pxteditor" | "pxthost" | "pxtpkgext" | "pxtsim";
/**
* Original request id
*/
id?: string;
/**
* flag to request response
*/
response?: boolean;
}
interface EditorMessageResponse extends EditorMessage {
/**
* Additional response payload provided by the command
*/
resp?: any;
/**
* indicate if operation started or completed successfully
*/
success: boolean;
/**
* Error object if any
*/
error?: any;
}
interface EditorMessageRequest extends EditorMessage {
/**
* Request action
*/
action: "switchblocks" | "switchjavascript" | "startsimulator" | "restartsimulator" | "stopsimulator" | "hidesimulator" | "showsimulator" | "closeflyout" | "newproject" | "importproject" | "importtutorial" | "openheader" | "proxytosim" | "undo" | "redo" | "renderblocks" | "renderpython" | "setscale" | "startactivity" | "saveproject" | "unloadproject" | "shareproject" | "savelocalprojectstocloud" | "projectcloudstatus" | "requestprojectcloudstatus" | "convertcloudprojectstolocal" | "setlanguagerestriction" | "toggletrace" | "togglehighcontrast" | "sethighcontrast" | "togglegreenscreen" | "settracestate" | "setsimulatorfullscreen" | "print" | "pair" | "workspacesync" | "workspacereset" | "workspacesave" | "workspaceloaded" | "workspaceevent" | "workspacediagnostics" | "event" | "simevent" | "info" | "tutorialevent" | ExtInitializeType | ExtDataStreamType | ExtUserCodeType | ExtReadCodeType | ExtWriteCodeType;
}
/**
* Request sent by the editor when a tick/error/expection is registered
*/
interface EditorMessageEventRequest extends EditorMessageRequest {
action: "event";
tick: string;
category?: string;
message?: string;
data?: Map<string | number>;
}
type EditorMessageTutorialEventRequest = EditorMessageTutorialProgressEventRequest | EditorMessageTutorialCompletedEventRequest | EditorMessageTutorialLoadedEventRequest | EditorMessageTutorialExitEventRequest;
interface EditorMessageTutorialProgressEventRequest extends EditorMessageRequest {
action: "tutorialevent";
tutorialEvent: "progress";
currentStep: number;
totalSteps: number;
isCompleted: boolean;
tutorialId: string;
projectHeaderId: string;
}
interface EditorMessageTutorialCompletedEventRequest extends EditorMessageRequest {
action: "tutorialevent";
tutorialEvent: "completed";
tutorialId: string;
projectHeaderId: string;
}
interface EditorMessageTutorialLoadedEventRequest extends EditorMessageRequest {
action: "tutorialevent";
tutorialEvent: "loaded";
tutorialId: string;
projectHeaderId: string;
}
interface EditorMessageTutorialExitEventRequest extends EditorMessageRequest {
action: "tutorialevent";
tutorialEvent: "exit";
tutorialId: string;
projectHeaderId: string;
}
interface EditorMessageStopRequest extends EditorMessageRequest {
action: "stopsimulator";
/**
* Indicates if simulator iframes should be unloaded or kept hot.
*/
unload?: boolean;
}
interface EditorMessageNewProjectRequest extends EditorMessageRequest {
action: "newproject";
/**
* Additional optional to create new project
*/
options?: ProjectCreationOptions;
}
interface EditorMessageSetScaleRequest extends EditorMessageRequest {
action: "setscale";
scale: number;
}
interface EditorMessageSimulatorMessageProxyRequest extends EditorMessageRequest {
action: "proxytosim";
/**
* Content to send to the simulator
*/
content: any;
}
interface EditorWorkspaceSyncRequest extends EditorMessageRequest {
/**
* Synching projects from host into
*/
action: "workspacesync" | "workspacereset" | "workspaceloaded";
}
interface EditorWorkspaceEvent extends EditorMessageRequest {
action: "workspaceevent";
event: pxt.editor.events.Event;
}
interface EditorWorkspaceDiagnostics extends EditorMessageRequest {
action: "workspacediagnostics";
operation: "compile" | "decompile" | "typecheck";
output: string;
diagnostics: {
code: number;
category: "error" | "warning" | "message";
fileName?: string;
start?: number;
length?: number;
line?: number;
column?: number;
endLine?: number;
endColumn?: number;
}[];
}
interface EditorSyncState {
filters?: pxt.editor.ProjectFilters;
searchBar?: boolean;
}
interface EditorWorkspaceSyncResponse extends EditorMessageResponse {
projects: pxt.workspace.Project[];
editor?: EditorSyncState;
controllerId?: string;
}
interface EditorWorkspaceSaveRequest extends EditorMessageRequest {
action: "workspacesave";
project: pxt.workspace.Project;
}
interface EditorMessageImportProjectRequest extends EditorMessageRequest {
action: "importproject";
project: pxt.workspace.Project;
filters?: pxt.editor.ProjectFilters;
searchBar?: boolean;
}
interface EditorMessageSaveLocalProjectsToCloud extends EditorMessageRequest {
action: "savelocalprojectstocloud";
headerIds: string[];
}
interface EditorMessageSaveLocalProjectsToCloudResponse extends EditorMessageResponse {
action: "savelocalprojectstocloud";
headerIdMap?: pxt.Map<string>;
}
interface EditorMessageProjectCloudStatus extends EditorMessageRequest {
action: "projectcloudstatus";
headerId: string;
status: pxt.cloud.CloudStatus;
}
interface EditorMessageRequestProjectCloudStatus extends EditorMessageRequest {
action: "requestprojectcloudstatus";
headerIds: string[];
}
interface EditorMessageConvertCloudProjectsToLocal extends EditorMessageRequest {
action: "convertcloudprojectstolocal";
userId: string;
}
interface EditorMessageImportTutorialRequest extends EditorMessageRequest {
action: "importtutorial";
markdown: string;
}
interface EditorMessageOpenHeaderRequest extends EditorMessageRequest {
action: "openheader";
headerId: string;
}
interface EditorMessageRenderBlocksRequest extends EditorMessageRequest {
action: "renderblocks";
ts: string;
snippetMode?: boolean;
layout?: pxt.blocks.BlockLayout;
}
interface EditorMessageRenderBlocksResponse {
svg: SVGSVGElement;
xml: Promise<any>;
}
interface EditorMessageRenderPythonRequest extends EditorMessageRequest {
action: "renderpython";
ts: string;
}
interface EditorMessageRenderPythonResponse {
python: string;
}
interface EditorSimulatorEvent extends EditorMessageRequest {
action: "simevent";
subtype: "toplevelfinished" | "started" | "stopped" | "resumed";
}
interface EditorSimulatorStoppedEvent extends EditorSimulatorEvent {
subtype: "stopped";
exception?: string;
}
interface EditorMessageToggleTraceRequest extends EditorMessageRequest {
action: "toggletrace";
intervalSpeed?: number;
}
interface EditorMessageSetTraceStateRequest extends EditorMessageRequest {
action: "settracestate";
enabled: boolean;
intervalSpeed?: number;
}
interface EditorMessageSetSimulatorFullScreenRequest extends EditorMessageRequest {
action: "setsimulatorfullscreen";
enabled: boolean;
}
interface EditorMessageSetHighContrastRequest extends EditorMessageRequest {
action: "sethighcontrast";
on: boolean;
}
interface EditorMessageStartActivity extends EditorMessageRequest {
action: "startactivity";
activityType: "tutorial" | "example" | "recipe";
path: string;
title?: string;
previousProjectHeaderId?: string;
carryoverPreviousCode?: boolean;
}
interface InfoMessage {
versions: pxt.TargetVersions;
locale: string;
availableLocales?: string[];
}
interface PackageExtensionData {
ts: string;
json?: any;
}
interface EditorPkgExtMessageRequest extends EditorMessageRequest {
package: string;
}
interface EditorPkgExtMessageResponse extends EditorMessageResponse {
package: string;
}
interface EditorSimulatorTickEvent extends EditorMessageEventRequest {
type: "pxtsim";
}
interface EditorShareRequest extends EditorMessageRequest {
action: "shareproject";
headerId: string;
projectName: string;
}
interface EditorShareResponse extends EditorMessageRequest {
action: "shareproject";
script: Cloud.JsonScript;
}
interface EditorSetLanguageRestriction extends EditorMessageRequest {
action: "setlanguagerestriction";
restriction: pxt.editor.LanguageRestriction;
}
/**
* Binds incoming window messages to the project view.
* Requires the "allowParentController" flag in the pxtarget.json/appTheme object.
*
* When the project view receives a request (EditorMessageRequest),
* it starts the command and returns the result upon completion.
* The response (EditorMessageResponse) contains the request id and result.
* Some commands may be async, use the ``id`` field to correlate to the original request.
*/
function bindEditorMessages(getEditorAsync: () => Promise<IProjectView>): void;
/**
* Sends analytics messages upstream to container if any
*/
function enableControllerAnalytics(): void;
/**
* Determines if host messages should be posted
*/
function shouldPostHostMessages(): boolean;
/**
* Posts a message from the editor to the host
*/
function postHostMessageAsync(msg: EditorMessageRequest): Promise<EditorMessageResponse>;
}
declare namespace pxt.editor.events {
type EditorType = 'blocks' | 'ts';
interface Event {
type: string;
editor: EditorType;
}
interface CreateEvent extends Event {
type: "create";
blockId: string;
}
interface UIEvent extends Event {
type: "ui";
action: "groupHelpClicked";
data?: pxt.Map<string>;
}
}
declare namespace pxt.editor.experiments {
interface Experiment {
id: string;
name: string;
description: string;
feedbackUrl?: string;
enableOnline?: boolean;
}
function syncTheme(): AppTheme;
function all(): Experiment[];
function clear(): void;
function someEnabled(): boolean;
function isEnabled(experiment: Experiment | string): boolean;
function toggle(experiment: Experiment): void;
function state(): string;
function setState(experiment: Experiment, enabled: boolean): void;
}
declare namespace pxt.editor {
interface DataStreams<T> {
console?: T;
messages?: T;
}
interface ExtensionFiles {
code?: string;
json?: string;
jres?: string;
asm?: string;
}
interface WriteExtensionFiles extends ExtensionFiles {
dependencies?: pxt.Map<string>;
}
interface ExtensionMessage extends EditorMessage {
type: "pxtpkgext";
}
interface ExtensionResponse extends EditorMessageResponse {
type: "pxtpkgext";
extId: string;
}
interface ExtensionRequest extends EditorMessageRequest {
type: "pxtpkgext";
extId: string;
body?: any;
}
/**
* Events are fired by the editor on the extension iFrame. Extensions
* receive events, they don't send them.
*/
interface ExtensionEvent extends ExtensionMessage {
event: string;
target: string;
}
/**
* Event fired when the extension is loaded.
*/
interface LoadedEvent extends ExtensionEvent {
event: "extloaded";
}
/**
* Event fired when the extension becomes visible.
*/
interface ShownEvent extends ExtensionEvent {
event: "extshown";
}
/**
* Event fired when the extension becomes hidden.
*/
interface HiddenEvent extends ExtensionEvent {
event: "exthidden";
body: HiddenReason;
}
type HiddenReason = "useraction" | "other";
/**
* Event fired when console data is received
*/
interface ConsoleEvent extends ExtensionEvent {
event: "extconsole";
body: {
source: string;
sim: boolean;
data: string;
};
}
/**
* Event fired when a message packet is received
*/
interface MessagePacketEvent extends ExtensionEvent {
event: "extmessagepacket";
body: {
source?: string;
channel: string;
data: Uint8Array;
};
}
/**
* Event fired when extension is first shown. Extension
* should send init request in response
*/
type ExtInitializeType = "extinit";
interface InitializeRequest extends ExtensionRequest {
action: ExtInitializeType;
body: string;
}
interface InitializeResponse extends ExtensionResponse {
target?: pxt.AppTarget;
}
/**
* Requests data stream event to be fired. Permission will
* be requested if not already received.
*/
type ExtDataStreamType = "extdatastream";
interface DataStreamRequest extends ExtensionRequest {
action: ExtDataStreamType;
body: DataStreams<boolean>;
}
interface DataStreamResponse extends ExtensionResponse {
resp: DataStreams<boolean>;
}
/**
* Request to read the user's code. Will request permission if
* not already granted
*/
type ExtUserCodeType = "extusercode";
interface UserCodeRequest extends ExtensionRequest {
action: ExtUserCodeType;
}
interface UserCodeResponse extends ExtensionResponse {
resp?: {
[index: string]: string;
};
}
/**
* Request to read the files saved by this extension
*/
type ExtReadCodeType = "extreadcode";
interface ReadCodeRequest extends ExtensionRequest {
action: ExtReadCodeType;
}
interface ReadCodeResponse extends ExtensionResponse {
action: ExtReadCodeType;
body?: ExtensionFiles;
}
/**
* Request to write the JSON and/or TS files saved
* by this extension
*/
type ExtWriteCodeType = "extwritecode";
interface WriteCodeRequest extends ExtensionRequest {
action: ExtWriteCodeType;
body?: WriteExtensionFiles;
}
interface WriteCodeResponse extends ExtensionResponse {
}
}
declare namespace pxt.vs {
interface BlockDefiniton {
commentAttr: pxtc.CommentAttrs;
fns?: Map<string>;
}
interface MethodDef {
sig: string;
snippet: string;
comment?: string;
metaData?: pxtc.CommentAttrs;
snippetOnly?: boolean;
}
interface NameDefiniton {
fns: {
[fn: string]: MethodDef;
};
vars?: {
[index: string]: string;
};
metaData?: pxtc.CommentAttrs;
builtin?: boolean;
}
type DefinitionMap = {
[ns: string]: NameDefiniton;
};
function syncModels(mainPkg: MainPackage, libs: {
[path: string]: monaco.IDisposable;
}, currFile: string, readOnly: boolean): void;
function initMonacoAsync(element: HTMLElement): Promise<monaco.editor.IStandaloneCodeEditor>;
function createEditor(element: HTMLElement): monaco.editor.IStandaloneCodeEditor;
}
declare namespace pxt.workspace {
type ScriptText = pxt.Map<string>;
interface Project {
header?: Header;
text?: ScriptText;
}
interface Asset {
name: string;
size: number;
url: string;
}
type Version = any;
interface File {
header: Header;
text: ScriptText;
version: Version;
}
interface WorkspaceProvider {
listAsync(): Promise<Header[]>;
getAsync(h: Header): Promise<File>;
setAsync(h: Header, prevVersion: Version, text?: ScriptText): Promise<Version>;
deleteAsync?: (h: Header, prevVersion: Version) => Promise<void>;
resetAsync(): Promise<void>;
loadedAsync?: () => Promise<void>;
getSyncState?: () => pxt.editor.EditorSyncState;
saveScreenshotAsync?: (h: Header, screenshot: string, icon: string) => Promise<void>;
saveAssetAsync?: (id: string, filename: string, data: Uint8Array) => Promise<void>;
listAssetsAsync?: (id: string) => Promise<Asset[]>;
fireEvent?: (ev: pxt.editor.events.Event) => void;
}
function freshHeader(name: string, modTime: number): Header;
}
declare namespace pxt.editor {
interface TextEdit {
range: monaco.Range;
replacement: string;
}
interface MonacoFieldEditorHost {
contentDiv(): HTMLDivElement;
getText(range: monaco.Range): string;
blocksInfo(): pxtc.BlocksInfo;
package(): pxt.MainPackage;
writeFileAsync(filename: string, content: string): Promise<void>;
readFile(filename: string): string;
}
interface MonacoFieldEditor {
getId(): string;
showEditorAsync(fileType: FileType, editrange: monaco.Range, host: MonacoFieldEditorHost): Promise<TextEdit>;
onClosed(): void;
dispose(): void;
}
interface MonacoFieldEditorDefinition {
id: string;
matcher: MonacoFindArguments;
foldMatches?: boolean;
alwaysBuildOnClose?: boolean;
glyphCssClass?: string;
weight?: number;
proto: {
new (): MonacoFieldEditor;
};
heightInPixels?: number;
}
interface MonacoFindArguments {
searchString: string;
isRegex: boolean;
matchWholeWord: boolean;
matchCase: boolean;
validateRange?: (range: monaco.Range, model: monaco.editor.ITextModel) => monaco.Range;
}
function registerMonacoFieldEditor(name: string, definition: MonacoFieldEditorDefinition): void;
function getMonacoFieldEditor(name: string): MonacoFieldEditorDefinition;
}
declare namespace pxt.editor {
class MonacoReactFieldEditor<U> implements MonacoFieldEditor {
private resolver;
private rejecter;
protected fileType: pxt.editor.FileType;
protected editrange: monaco.Range;
protected host: MonacoFieldEditorHost;
protected fv: pxt.react.FieldEditorView<U>;
getId(): string;
showEditorAsync(fileType: FileType, editrange: monaco.Range, host: MonacoFieldEditorHost): Promise<TextEdit>;
onClosed(): void;
dispose(): void;
protected initAsync(): Promise<void>;
protected textToValue(text: string): U;
protected resultToText(result: U): string;
protected getFieldEditorId(): string;
protected getOptions(): any;
}
}
declare namespace pxt.editor {
class MonacoSongEditor extends MonacoReactFieldEditor<pxt.Song> {
protected isPython: boolean;
protected isAsset: boolean;
protected text: string;
protected textToValue(text: string): pxt.Song;
protected resultToText(result: pxt.Song): string;
protected getFieldEditorId(): string;
protected getOptions(): any;
}
const songEditorDefinition: MonacoFieldEditorDefinition;
}
declare namespace pxt.editor {
class MonacoSoundEffectEditor extends MonacoReactFieldEditor<pxt.assets.Sound> {
protected value: pxt.assets.Sound;
protected textToValue(text: string): pxt.assets.Sound;
protected resultToText(result: pxt.assets.Sound): string;
protected getFieldEditorId(): string;
protected getOptions(): any;
}
const soundEditorDefinition: MonacoFieldEditorDefinition;
}
declare namespace pxt.editor {
class MonacoSpriteEditor extends MonacoReactFieldEditor<pxt.ProjectImage> {
protected isPython: boolean;
protected isAsset: boolean;
protected textToValue(text: string): pxt.ProjectImage;
protected resultToText(result: pxt.ProjectImage): string;
protected getFieldEditorId(): string;
protected getOptions(): any;
}
const spriteEditorDefinition: MonacoFieldEditorDefinition;
}
declare namespace pxt.editor {
class MonacoTilemapEditor extends MonacoReactFieldEditor<pxt.ProjectTilemap> {
protected isTilemapLiteral: boolean;
protected tilemapLiteral: string;
protected textToValue(text: string): pxt.ProjectTilemap;
protected readTilemap(text: string): pxt.ProjectTilemap;
protected resultToText(asset: pxt.ProjectTilemap): string;
protected getFieldEditorId(): string;
protected getOptions(): any;
protected getCreateTilemapRange(): monaco.Range;
}
const tilemapEditorDefinition: MonacoFieldEditorDefinition;
}