pxt-core
Version:
Microsoft MakeCode provides Blocks / JavaScript / Python tools and editors
1,158 lines • 163 kB
TypeScript
/// <reference path="../localtypings/pxtpackage.d.ts" />
/// <reference path="../localtypings/pxtparts.d.ts" />
/// <reference path="../localtypings/pxtarget.d.ts" />
/// <reference path="../localtypings/projectheader.d.ts" />
/// <reference path="../localtypings/dom.d.ts" />
/// <reference path="../localtypings/dompurify.d.ts" />
/// <reference path="../localtypings/pxtmusic.d.ts" />
/// <reference path="../pxtcompiler/ext-typescript/lib/typescriptServices.d.ts" />
/// <reference types="web-bluetooth" />
declare namespace pxt {
function aiTrackEvent(id: string, data?: any, measures?: any): void;
function aiTrackException(err: any, kind: string, props: any): void;
function setInteractiveConsent(enabled: boolean): void;
}
declare namespace pxt.analytics {
enum ConsoleTickOptions {
Off = 0,
Short = 1,
Verbose = 2
}
let consoleTicks: ConsoleTickOptions;
function addDefaultProperties(props: Map<string | number>): void;
function enable(lang: string): void;
function trackPerformanceReport(): void;
}
declare namespace pxt {
let appTarget: TargetBundle;
let appTargetVariant: string;
let hwVariant: string;
let hwName: string;
}
declare namespace pxt.AudioContextManager {
function mute(mute: boolean): void;
function stop(): void;
function frequency(): number;
function tone(frequency: number): void;
}
declare namespace pxt.auth {
type ApiResult<T> = {
resp: T;
statusCode: number;
success: boolean;
err: any;
};
type UserProfile = {
id?: string;
idp?: {
provider?: pxt.IdentityProviderId;
username?: string;
displayName?: string;
picture?: {
mimeType?: string;
width?: number;
height?: number;
encoded?: string;
dataUrl?: string;
};
pictureUrl?: string;
};
};
type UserSkillmapState = {
mapProgress: any;
completedTags: any;
};
type UserBadgeState = {
badges: Badge[];
};
/**
* Mapping of target id to preferred color theme id.
*/
type ColorThemeIdsState = {
[targetId: string]: string;
};
type SetPrefResult = {
success: boolean;
res: UserPreferences;
};
/**
* User preference state that should be synced with the cloud.
*/
type UserPreferences = {
language?: string;
highContrast?: boolean;
accessibleBlocks?: boolean;
colorThemeIds?: ColorThemeIdsState;
reader?: string;
skillmap?: UserSkillmapState;
badges?: UserBadgeState;
email?: boolean;
};
const DEFAULT_USER_PREFERENCES: () => UserPreferences;
/**
* Cloud-synced user state.
*/
type UserState = {
profile?: UserProfile;
preferences?: UserPreferences;
};
function client(): AuthClient;
let cachedHasAuthToken: boolean;
function getAuthTokenAsync(): Promise<string>;
function hasAuthTokenAsync(): Promise<boolean>;
let cachedUserState: Readonly<UserState>;
function getUserStateAsync(): Promise<Readonly<UserState>>;
function getAuthHeadersAsync(authToken?: string): Promise<pxt.Map<string>>;
abstract class AuthClient {
constructor();
initAsync(): Promise<void>;
protected abstract onSignedIn(): Promise<void>;
protected abstract onSignedOut(): Promise<void>;
protected abstract onSignInFailed(): Promise<void>;
protected abstract onUserProfileChanged(): Promise<void>;
protected abstract onUserPreferencesChanged(diff: ts.pxtc.jsonPatch.PatchOperation[]): Promise<void>;
protected abstract onProfileDeleted(userId: string): Promise<void>;
protected abstract onApiError(err: any): Promise<void>;
protected abstract onStateCleared(): Promise<void>;
/**
* Starts the process of authenticating the user against the given identity
* provider. Upon success the backend will write an http-only session cookie
* to the response, containing the authorization token. This cookie is not
* accessible in code, but will be included in all subsequent http requests.
* @param idp The id of the identity provider.
* @param persistent Whether or not to remember this login across sessions.
* @param callbackState The URL hash and params to return to after the auth
* flow completes.
*/
loginAsync(idp: pxt.IdentityProviderId, persistent: boolean, callbackState?: CallbackState): Promise<void>;
/**
* Sign out the user and clear the auth token cookie.
*/
logoutAsync(continuationHash?: string): Promise<void>;
/**
* Sign out the user and clear the auth token cookie.
*/
static staticLogoutAsync(continuationHash?: string): Promise<void>;
deleteProfileAsync(): Promise<void>;
private initialUserPreferences_;
initialUserPreferencesAsync(): Promise<UserPreferences | undefined>;
userProfileAsync(): Promise<UserProfile | undefined>;
userPreferencesAsync(): Promise<UserPreferences | undefined>;
private initialAuthCheck_;
/**
* Checks to see if we're already logged in by trying to fetch user info from
* the backend. If we have a valid auth token cookie, it will succeed.
*/
authCheckAsync(): Promise<UserProfile | undefined>;
loggedInAsync(): Promise<boolean>;
updateUserProfileAsync(opts: {
username?: string;
avatarUrl?: string;
}): Promise<boolean>;
private patchQueue;
patchUserPreferencesAsync(patchOps: ts.pxtc.jsonPatch.PatchOperation | ts.pxtc.jsonPatch.PatchOperation[], opts?: {
immediate?: boolean;
filter?: (op: ts.pxtc.jsonPatch.PatchOperation) => boolean;
}): Promise<SetPrefResult>;
private hasUserIdAsync;
private fetchUserAsync;
private setUserProfileAsync;
private setUserPreferencesAsync;
private fetchUserPreferencesAsync;
/**
* Updates user profile state and writes it to local storage.
*/
private transformUserProfileAsync;
/**
* Updates user preference state and writes it to local storage.
*/
protected transformUserPreferencesAsync(preferences: UserPreferences): Promise<UserPreferences>;
/**
* Clear local auth state then call the onStateCleared callback.
*/
private clearAuthStateAsync;
apiAsync<T = any>(url: string, data?: any, method?: string, authToken?: string): Promise<ApiResult<T>>;
static staticApiAsync<T = any>(url: string, data?: any, method?: string, authToken?: string): Promise<ApiResult<T>>;
}
type CallbackState = {
hash?: string;
params?: pxt.Map<string>;
};
function loginCallbackAsync(qs: pxt.Map<string>): Promise<void>;
function identityProviders(): pxt.AppCloudProvider[];
function identityProvider(id: pxt.IdentityProviderId): pxt.AppCloudProvider;
function hasIdentity(): boolean;
function enableAuth(enabled?: boolean): void;
function userName(user: pxt.auth.UserProfile): string;
function identityProviderId(user: pxt.auth.UserProfile): pxt.IdentityProviderId | undefined;
function firstName(user: pxt.auth.UserProfile): string;
function userInitials(user: pxt.auth.UserProfile): string;
function generateUserProfilePicDataUrl(profile: pxt.auth.UserProfile): void;
/**
* Checks only the ID and sourceURL
*/
function badgeEquals(badgeA: pxt.auth.Badge, badgeB: pxt.auth.Badge): boolean;
function hasBadge(preferences: pxt.auth.UserBadgeState, badge: pxt.auth.Badge): boolean;
}
declare namespace pxt {
interface TelemetryEventOptions {
interactiveConsent: boolean;
}
/**
* Track an event.
*/
let tickEvent: (id: string, data?: Map<string | number>, opts?: TelemetryEventOptions) => void;
}
declare namespace pxt {
interface Logger {
info(...args: any[]): void;
log(...args: any[]): void;
debug(...args: any[]): void;
error(...args: any[]): void;
warn(...args: any[]): void;
setLogLevel(level: LogLevel): void;
getLogLevel(): LogLevel;
}
enum LogLevel {
Debug = 0,
Info = 1,
Log = 1,
Warning = 2,
Error = 3
}
class ConsoleLogger implements Logger {
protected logLevel: LogLevel;
constructor();
setLogLevel(level: LogLevel): void;
getLogLevel(): LogLevel;
info(...args: any[]): void;
log(...args: any[]): void;
debug(...args: any[]): void;
error(...args: any[]): void;
warn(...args: any[]): void;
protected shouldLog(level: LogLevel): boolean;
}
function info(...args: any[]): void;
function log(...args: any[]): void;
function debug(...args: any[]): void;
function error(...args: any[]): void;
function warn(...args: any[]): void;
function setLogger(impl: Logger): void;
function setLogLevel(level: LogLevel): void;
}
declare namespace ts.pxtc {
let __dummy: number;
}
import pxtc = ts.pxtc;
declare namespace ts.pxtc.Util {
function assert(cond: boolean, msg?: string): void;
function flatClone<T extends Object>(obj: T): T;
function clone<T>(v: T): T;
function htmlEscape(_input: string): string;
function htmlUnescape(_input: string): string;
function jsStringQuote(s: string): string;
function jsStringLiteral(s: string): string;
function initials(username: string): string;
function enableLiveLocalizationUpdates(): void;
function liveLocalizationEnabled(): boolean;
/**
* Returns the current user language, prepended by "live-" if in live mode
*/
function localeInfo(): string;
/**
* Returns current user language iSO-code. Default is `en`.
*/
function userLanguage(): string;
function normalizeLanguageCode(code: string): string[];
function setUserLanguage(localizeLang: string): void;
function isUserLanguageRtl(): boolean;
const TRANSLATION_LOCALE = "pxt";
function isTranslationMode(): boolean;
function _localize(s: string): string;
function getLocalizedStrings(): pxt.Map<string>;
function setLocalizedStrings(strs: pxt.Map<string>): void;
function translationsCache(): pxt.Map<pxt.Map<string>>;
function fmt_va(f: string, args: any[]): string;
function fmt(f: string, ...args: any[]): string;
function dumpLocStats(): void;
function lf_va(format: string, args: any[]): string;
function lf(format: string, ...args: any[]): string;
/**
* Similar to lf but the string do not get extracted into the loc file.
*/
function rlf(format: string, ...args: any[]): string;
/**
* Same as lf except the strings are not replaced in translation mode. This is used
* exclusively for blockly JSON block definitions as the crowdin in-context translation
* script doesn't handle the SVG text fields. Instead, they are translated via a context
* menu item on the block.
*/
function blf(format: string): string;
function lookup<T>(m: pxt.Map<T>, key: string): T;
function isoTime(time: number): string;
function userError(msg: string): never;
function deq(a: any, b: any): string;
function deepEqual(a: any, b: any): boolean;
}
declare const lf: typeof pxtc.U.lf;
declare namespace ts.pxtc {
/**
* atob replacement
* @param s
*/
let decodeBase64: (s: string) => string;
/**
* bota replacement
* @param s
*/
let encodeBase64: (s: string) => string;
}
declare namespace ts.pxtc.Util {
export class CancellationToken {
private pending;
private cancelled;
private resolve;
private deferred;
private progressHandler;
startOperation(): void;
isRunning(): boolean;
onProgress(progressHandler: (completed: number, total: number) => void): void;
reportProgress(completed: number, total: number): void;
cancel(): void;
cancelAsync(): Promise<void>;
isCancelled(): boolean;
throwIfCancelled(): void;
resolveCancel(): void;
}
export function codalHash16(s: string): number;
export function bufferSerial(buffers: pxt.Map<string>, data?: string, source?: string, maxBufLen?: number): void;
export function blobReadAsDataURL(blob: Blob): Promise<string>;
export function fileReadAsBufferAsync(f: File): Promise<Uint8Array>;
export function fileReadAsTextAsync(f: File): Promise<string>;
export function sanitizeFileName(name: string): string;
export function repeatMap<T>(n: number, fn: (index: number) => T): T[];
export function listsEqual<T>(a: T[], b: T[]): boolean;
export function oops(msg?: string): Error;
export function reversed<T>(arr: T[]): T[];
export function arrayEquals<U>(a: U[], b: U[], compare?: (c: U, d: U) => boolean): boolean;
export function iterMap<T>(m: pxt.Map<T>, f: (k: string, v: T) => void): void;
export function mapMap<T, S>(m: pxt.Map<T>, f: (k: string, v: T) => S): pxt.Map<S>;
export function values<T>(m: pxt.Map<T>): T[];
export function pushRange<T>(trg: T[], src: ArrayLike<T>): void;
export function concatArrayLike<T>(arrays: ArrayLike<ArrayLike<T>>): T[];
export function concat<T>(arrays: T[][]): T[];
export function memcpy(trg: Uint8Array, trgOff: number, src: ArrayLike<number>, srcOff?: number, len?: number): void;
export function uint8ArrayConcat(chunks: Uint8Array[]): Uint8Array;
export function jsonTryParse(s: string): any;
export function jsonMergeFrom(trg: any, src: any): void;
export function jsonCopyFrom<T>(trg: T, src: T): void;
export function jsonFlatten(v: any): pxt.Map<any>;
export function jsonUnFlatten(v: pxt.Map<any>): any;
export function strcmp(a: string, b: string): 0 | 1 | -1;
export function stringMapEq(a: pxt.Map<string>, b: pxt.Map<string>): boolean;
export function endsWith(str: string, suffix: string): boolean;
export function startsWith(str: string, prefix: string): boolean;
export function contains(str: string, contains: string): boolean;
export function replaceAll(str: string, old: string, new_: string): string;
export function snakify(s: string): string;
export function sortObjectFields<T>(o: T): T;
export function chopArray<T>(arr: T[], chunkSize: number): T[][];
export function unique<T>(arr: T[], f: (t: T) => string): T[];
export function groupBy<T>(arr: T[], f: (t: T) => string): pxt.Map<T[]>;
export function toDictionary<T>(arr: T[], f: (t: T) => string): pxt.Map<T>;
export function toSet<T>(arr: T[], f: (t: T) => string): pxt.Map<boolean>;
export function deepCopy(src: any): any;
export interface ArrayLike<T> {
[index: number]: T;
length: number;
}
export function toArray<T>(a: ArrayLike<T> | ReadonlyArray<T>): T[];
export function indexOfMatching<T>(arr: T[], f: (t: T) => boolean): number;
export function nextTick(f: () => void): void;
export function delay<T>(duration: number, value: T | Promise<T>): Promise<T>;
export function delay(duration: number): Promise<void>;
export function promiseMapAll<T, V>(values: T[], mapper: (obj: T) => Promise<V>): Promise<V[]>;
export function promiseMapAllSeries<T, V>(values: T[], mapper: (obj: T) => Promise<V>): Promise<V[]>;
export function promisePoolAsync<T, V>(maxConcurrent: number, inputValues: T[], handler: (input: T) => Promise<V>): Promise<V[]>;
export function memoizeString<T>(createNew: (id: string) => T): (id: string) => T;
export function promiseTimeout<T>(ms: number, promise: T | Promise<T>, msg?: string): Promise<T>;
export interface DeferredPromise<T> {
resolve: (value: T) => void;
reject: (reason: any) => void;
promise: Promise<T>;
}
export function defer<T>(): DeferredPromise<T>;
export function memoize<S, T>(getId: (v: S) => string, createNew: (v: S) => T): (id: S) => T;
export function debounce(func: (...args: any[]) => any, wait: number, immediate?: boolean): any;
export class AdaptiveDebouncer {
func: () => void;
minDelay: number;
maxDelay: number;
slowdownFactor: number;
private lastPoke;
private recentGaps;
private timeout;
private wrapped;
constructor(func: () => void, minDelay?: number, maxDelay?: number, slowdownFactor?: number);
poke(): void;
trigger(): void;
}
export function throttle(func: (...args: any[]) => any, wait: number, immediate?: boolean): any;
export function randomPermute<T>(arr: T[]): void;
export function randomPick<T>(arr: T[]): T;
export function timeSince(time: number): string;
export function unicodeToChar(text: string): string;
export function escapeForRegex(str: string): string;
export function stripUrlProtocol(str: string): string;
export function normalizePath(path: string): string;
export function pathJoin(a: string, b: string): string;
export let isNodeJS: boolean;
export interface HttpRequestOptions {
url: string;
method?: string;
data?: any;
headers?: pxt.Map<string>;
allowHttpErrors?: boolean;
allowGzipPost?: boolean;
responseArrayBuffer?: boolean;
forceLiveEndpoint?: boolean;
successCodes?: number[];
withCredentials?: boolean;
}
export interface HttpResponse {
statusCode: number;
headers: pxt.Map<string | string[]>;
buffer?: any;
text?: string;
json?: any;
}
export function requestAsync(options: HttpRequestOptions): Promise<HttpResponse>;
export function httpGetTextAsync(url: string): Promise<string>;
export function httpGetJsonAsync(url: string): Promise<any>;
export function httpPostJsonAsync(url: string, data: any): Promise<any>;
export function stringToUint8Array(input: string): Uint8Array;
export function uint8ArrayToString(input: ArrayLike<number>): string;
export function fromUTF8(binstr: string): string;
export function toUTF8(str: string, cesu8?: boolean): string;
export function toHex(bytes: ArrayLike<number>): string;
export function fromHex(hex: string): Uint8Array;
export class PromiseQueue {
promises: pxt.Map<(() => Promise<any>)[]>;
enqueue<T>(id: string, f: () => Promise<T>): Promise<T>;
}
export class PromiseBuffer<T> {
private waiting;
private available;
drain(): void;
pushError(v: Error): void;
push(v: T): void;
shiftAsync(timeout?: number): Promise<T>;
}
export function now(): number;
export function nowSeconds(): number;
export function timeout(ms: number): Promise<void>;
/**
* Utility function to run an action with exponential backoff until a condition is met or a timeout occurs.
* @param action - The main action to run.
* @param isComplete - A function that checks if the result of the action indicates completion.
* @param initialDelayMs - The starting delay to use between the initial attempt and any retry.
* @param maxDelayMs - The maximum delay between retries.
* @param timeoutMs - The total timeout for the operation.
* @param timeoutErrorMsg - The error message to throw if the operation times out.
* @param backoffFactor - The factor by which to increase the delay after each retry (default is 1.5).
*/
export function runWithBackoffAsync<T>(action: () => Promise<T>, isComplete: (result: T) => boolean, initialDelayMs: number, maxDelayMs: number, timeoutMs: number, timeoutErrorMsg: string, backoffFactor?: number): Promise<T>;
export let cpuUs: () => number;
export function getMime(filename: string): "text/plain" | "text/html" | "text/css" | "application/javascript" | "image/jpeg" | "image/png" | "image/x-icon" | "text/cache-manifest" | "application/manifest+json" | "application/json" | "image/svg+xml" | "application/vnd.ms-fontobject" | "font/ttf" | "application/font-woff" | "application/font-woff2" | "text/markdown" | "application/xml" | "audio/m4a" | "audio/mp3" | "application/wasm" | "application/octet-stream";
export function randomUint32(): number;
export function guidGen(): string;
export function downloadLiveTranslationsAsync(lang: string, filename: string, etag?: string): Promise<pxt.Map<string>>;
export const pxtLangCookieId = "PXT_LANG";
export const langCookieExpirationDays = 30;
export interface Language {
englishName: string;
localizedName: string;
}
export const allLanguages: pxt.Map<Language>;
export function isLocaleEnabled(code: string): boolean;
interface LocalizationUpdateOptions {
targetId: string;
baseUrl: string;
code: string;
force?: boolean;
}
export function updateLocalizationAsync(opts: LocalizationUpdateOptions): Promise<void>;
export enum TranslationsKind {
Editor = 0,
Sim = 1,
Apis = 2,
SkillMap = 3
}
export function downloadTranslationsAsync(targetId: string, baseUrl: string, code: string, live: boolean, translationKind?: TranslationsKind): Promise<pxt.Map<string>>;
export let httpRequestCoreAsync: (options: HttpRequestOptions) => Promise<HttpResponse>;
export let sha256: (hashData: string) => string;
export let getRandomBuf: (buf: Uint8Array) => void;
export function capitalize(n: string): string;
export function uncapitalize(n: string): string;
export function camelCaseToLowercaseWithSpaces(n: string): string;
export function snakeCaseToLowercaseWithSpaces(n: string): string;
export function range(len: number): number[];
export function multipartPostAsync(uri: string, data?: any, filename?: string, filecontents?: string): Promise<HttpResponse>;
export function toDataUri(data: string, mimetype?: string): string;
export const imageMagic = 1496611453;
export const imageHeaderSize = 36;
export function encodeBlobAsync(canvas: HTMLCanvasElement, blob: Uint8Array): HTMLCanvasElement;
export function decodeBlobAsync(dataURL: string): Promise<Uint8Array>;
export function parseQueryString(qs: string): pxt.Map<string>;
export function stringifyQueryString(url: string, qs: any): string;
export function cloneTargetBundle(target: pxt.TargetBundle): pxt.TargetBundle;
export function cloneApis(byQName: pxt.Map<pxtc.SymbolInfo>): pxt.Map<SymbolInfo>;
export function cloneSymbolInfo(sym: pxtc.SymbolInfo): pxtc.SymbolInfo;
export function toUTF8Array(s: string): Uint8Array;
export function fromUTF8Array(s: Uint8Array): string;
export function getHomeUrl(): string;
export function isExperienceSupported(experienceId: string): boolean;
export function ocvEnabled(): string;
export function bresenhamLine(x0: number, y0: number, x1: number, y1: number, handler: (x: number, y: number) => void): void;
/**
* Check if the specified feature is enabled for the user (based on pxtarget configuration and region).
*/
export function isFeatureEnabled(featureKey: string): boolean;
/**
* Remove potentially sensitive info from the given data to avoid logging it.
* Currently only supports string data.
*/
export function cleanData(data: string): string;
export function cleanData(data: pxt.Map<string | number>): pxt.Map<string | number>;
export {};
}
declare namespace ts.pxtc.BrowserImpl {
function sha256buffer(buf: Uint8Array): string;
function sha256string(s: string): string;
}
declare namespace ts.pxtc.jsonPatch {
type AddOperation = {
op: 'add';
path: (string | number)[];
value: string | number | boolean | object;
};
type ReplaceOperation = {
op: 'replace';
path: (string | number)[];
value: string | number | boolean | object;
};
type RemoveOperation = {
op: 'remove';
path: (string | number)[];
};
type PatchOperation = AddOperation | ReplaceOperation | RemoveOperation;
/**
* Returns the diff of two objects as a set of change operations, following the
* "JSON Patch" format: https://datatracker.ietf.org/doc/html/rfc6902 (with a
* small difference to the way paths are encoded).
*/
function diff(oldObj: any, newObj: any): PatchOperation[];
/**
* Applies a set of JSON Patch operations to the object.
*/
function patchInPlace(obj: any, ops: PatchOperation[]): void;
function opsAreEqual(a: PatchOperation, b: PatchOperation): boolean;
}
declare namespace ts.pxtc.jsonPatch.tests {
function diffTests(): void;
function patchTests(): void;
}
declare namespace pxt.perf {
type EventSource<T> = {
subscribe(listener: (ev: T) => void): () => void;
};
function isEnabled(): boolean;
let perfReportLogged: boolean;
function report(): {
milestones: {
[index: string]: number;
};
durations: {
[index: string]: number;
};
} | undefined;
function recordMilestone(msg: string, params?: Map<string>): void;
function measureStart(name: string): void;
function measureEnd(name: string, params?: Map<string>): void;
let measurementThresholdMs: number;
const stats: {
milestones: EventSource<{
milestone: string;
time: number;
params?: Map<string>;
}>;
durations: EventSource<{
name: string;
start: number;
duration: number;
params?: Map<string>;
}>;
};
}
declare namespace pxt {
export import U = pxtc.Util;
export import Util = pxtc.Util;
interface TCPIO {
onData: (v: Uint8Array) => void;
onError: (e: Error) => void;
connectAsync(): Promise<void>;
sendPacketAsync(pkt: Uint8Array): Promise<void>;
error(msg: string): any;
disconnectAsync(): Promise<void>;
}
let mkTCPSocket: (host: string, port: number) => TCPIO;
function setAppTarget(trg: TargetBundle): void;
function setBundledApiInfo(inf: Map<PackageApiInfo>): void;
function getBundledApiInfo(): Map<PackageApiInfo>;
function savedAppTheme(): AppTheme;
function setCompileSwitch(name: string, value: boolean): void;
function setCompileSwitches(names: string): void;
function bundledSvg(id: string): string;
function replaceStringsInJsonBlob(blobPart: any, matcher: RegExp, matchHandler: (matchingString: string) => string): any;
function reloadAppTargetVariant(temporary?: boolean): void;
function setAppTargetVariant(variant: string, opts?: {
force?: boolean;
temporary?: boolean;
}): void;
let onAppTargetChanged: () => void;
function setHwVariant(variant: string, name?: string): void;
function hasHwVariants(): boolean;
function getHwVariants(): PackageConfig[];
function getActiveHwVariant(): string;
interface PxtOptions {
debug?: boolean;
light?: boolean;
wsPort?: number;
}
let options: PxtOptions;
let reportException: (err: any, data?: Map<string | number>) => void;
let reportError: (cat: string, msg: string, data?: Map<string | number>) => void;
interface WebConfig {
relprefix: string;
workerjs: string;
monacoworkerjs: string;
gifworkerjs: string;
serviceworkerjs: string;
typeScriptWorkerJs: string;
pxtVersion: string;
pxtRelId: string;
pxtCdnUrl: string;
commitCdnUrl: string;
blobCdnUrl: string;
cdnUrl: string;
targetUrl: string;
targetVersion: string;
targetRelId: string;
targetId: string;
simUrl: string;
simserviceworkerUrl: string;
simworkerconfigUrl: string;
partsUrl?: string;
runUrl?: string;
docsUrl?: string;
multiUrl?: string;
asseteditorUrl?: string;
skillmapUrl?: string;
authcodeUrl?: string;
multiplayerUrl?: string;
kioskUrl?: string;
teachertoolUrl?: string;
isStatic?: boolean;
verprefix?: string;
ocv?: OcvConfig;
}
interface OcvConfig {
appId: number;
iframeEndpoint: string;
}
function localWebConfig(): WebConfig;
let webConfig: WebConfig;
function getOnlineCdnUrl(): string;
function setupWebConfig(cfg: WebConfig): void;
interface Host {
readFile(pkg: Package, filename: string, skipAdditionalFiles?: boolean): string;
writeFile(pkg: Package, filename: string, contents: string, force?: boolean): void;
downloadPackageAsync(pkg: Package, deps?: string[]): Promise<void>;
getHexInfoAsync(extInfo: pxtc.ExtensionInfo): Promise<pxtc.HexInfo>;
cacheStoreAsync(id: string, val: string): Promise<void>;
cacheGetAsync(id: string): Promise<string>;
}
interface FsFile {
name: string;
mtime: number;
content?: string;
prevContent?: string;
}
interface FsPkg {
path: string;
config: pxt.PackageConfig;
header: pxt.workspace.Header;
files: FsFile[];
icon?: string;
isDeleted?: boolean;
}
interface FsPkgs {
pkgs: FsPkg[];
}
interface ICompilationOptions {
}
function getEmbeddedScript(id: string): Map<string>;
function targetConfigAsync(): Promise<pxt.TargetConfig>;
function packagesConfigAsync(): Promise<pxt.PackagesConfig>;
const CONFIG_NAME = "pxt.json";
const SIMSTATE_JSON = ".simstate.json";
const SERIAL_EDITOR_FILE = "serial.txt";
const README_FILE = "README.md";
const GITIGNORE_FILE = ".gitignore";
const ASSETS_FILE = "assets.json";
const CLOUD_ID = "pxt/";
const BLOCKS_PROJECT_NAME = "blocksprj";
const JAVASCRIPT_PROJECT_NAME = "tsprj";
const PYTHON_PROJECT_NAME = "pyprj";
const MAIN_BLOCKS = "main.blocks";
const MAIN_TS = "main.ts";
const MAIN_PY = "main.py";
const DEFAULT_GROUP_NAME = "other";
const TILEMAP_CODE = "tilemap.g.ts";
const TILEMAP_JRES = "tilemap.g.jres";
const IMAGES_CODE = "images.g.ts";
const IMAGES_JRES = "images.g.jres";
const TUTORIAL_CODE_START = "_onCodeStart.ts";
const TUTORIAL_CODE_STOP = "_onCodeStop.ts";
const TUTORIAL_INFO_FILE = "tutorial-info-cache.json";
const TUTORIAL_CUSTOM_TS = "tutorial.custom.ts";
const BREAKPOINT_TABLET = 991;
const PALETTES_FILE = "_palettes.json";
const HISTORY_FILE = "_history";
function outputName(trg?: pxtc.CompileTarget): "binary.uf2" | "binary.bin" | "binary.pxt64" | "binary.elf" | "binary.hex";
function isOutputText(trg?: pxtc.CompileTarget): boolean;
}
declare namespace pxt.blocks {
let showBlockIdInTooltip: boolean;
interface PxtBlockly {
}
interface BlocklyModule {
}
let requirePxtBlockly: () => PxtBlockly;
let requireBlockly: () => BlocklyModule;
let registerFieldEditor: (selector: string, proto: any, validator?: any) => void;
const MATH_FUNCTIONS: {
unary: string[];
binary: string[];
infix: string[];
};
const ROUNDING_FUNCTIONS: string[];
interface BlockParameter {
actualName: string;
type?: string;
definitionName: string;
definitionIndex?: number;
shadowBlockId?: string;
defaultValue?: string;
isOptional?: boolean;
fieldEditor?: string;
fieldOptions?: Map<string>;
shadowOptions?: Map<string>;
range?: {
min: number;
max: number;
};
}
interface BlockCompileInfo {
parameters: ReadonlyArray<BlockParameter>;
actualNameToParam: Map<BlockParameter>;
definitionNameToParam: Map<BlockParameter>;
handlerArgs?: HandlerArg[];
thisParameter?: BlockParameter;
}
interface HandlerArg {
name: string;
type: string;
inBlockDef: boolean;
localizationKey: string;
}
const builtinFunctionInfo: pxt.Map<{
params: string[];
blockId: string;
}>;
function normalizeBlock(b: string, err?: (msg: string) => void): string;
function compileInfo(fn: pxtc.SymbolInfo): BlockCompileInfo;
function hasHandler(fn: pxtc.SymbolInfo): boolean;
function getHelpUrl(fn: pxtc.SymbolInfo): string;
/**
* Returns which Blockly block type to use for an argument reporter based
* on the specified TypeScript type.
* @param varType The variable's TypeScript type
* @return The Blockly block type of the reporter to be used
*/
function reporterTypeForArgType(varType: string): string;
function defaultIconForArgType(typeName?: string): "calculator" | "text width" | "random" | "list" | "align justify";
interface FieldDescription {
n: string;
pre?: string;
p?: string;
ni: number;
}
function parseFields(b: string): FieldDescription[];
interface BlockDefinition {
name: string;
category: string;
url: string;
tooltip?: string | Map<string>;
operators?: Map<string[]>;
block?: Map<string>;
blockTextSearch?: string;
tooltipSearch?: string;
translationIds?: string[];
}
function blockDefinitions(): Map<BlockDefinition>;
function getBlockDefinition(blockId: string): BlockDefinition;
}
declare namespace pxt.BrowserUtils {
export function isDocumentVisible(): boolean;
export function isIFrame(): boolean;
export function hasNavigator(): boolean;
export function hasWindow(): boolean;
export function isWindows(): boolean;
export function isWindows10(): boolean;
export function isMobile(): boolean;
export function isIOS(): boolean;
export function isAndroid(): boolean;
export function isMac(): boolean;
export function isLinux(): boolean;
export function isARM(): boolean;
export function isEdge(): boolean;
export function isChromiumEdge(): boolean;
export function isIE(): boolean;
export function isChrome(): boolean;
export function isSafari(): boolean;
export function isFirefox(): boolean;
export function isOpera(): boolean;
export function isMidori(): boolean;
export function isEpiphany(): boolean;
export function isTouchEnabled(): boolean;
export function isPxtElectron(): boolean;
export function isIpcRenderer(): boolean;
export function isElectron(): boolean;
export let isWinRT: () => boolean;
export function isLocalHost(ignoreFlags?: boolean): boolean;
export function isLocalHostDev(): boolean;
export function isSkillmapEditor(): boolean;
export function isTabletSize(): boolean;
export function isComputerSize(): boolean;
export function isInGame(): boolean;
export function hasFileAccess(): boolean;
export function noSharedLocalStorage(): boolean;
export function useOldTutorialLayout(): boolean;
export function hasPointerEvents(): boolean;
export function os(): string;
export function browser(): string;
export function browserVersion(): string;
export function isBrowserSupported(): boolean;
export function devicePixelRatio(): number;
export function browserDownloadBinText(text: string, name: string, opt?: BrowserDownloadOptions): string;
export function browserDownloadText(text: string, name: string, opt?: BrowserDownloadOptions): string;
export function isBrowserDownloadInSameWindow(): boolean;
export function isBrowserDownloadWithinUserContext(): boolean;
export function browserDownloadDataUri(uri: string, name: string, userContextWindow?: Window): void;
export function browserDownloadUInt8Array(buf: Uint8Array, name: string, opt?: BrowserDownloadOptions): string;
export function toDownloadDataUri(b64: string, contentType: string): string;
export interface BrowserDownloadOptions {
contentType?: string;
userContextWindow?: Window;
onError?: (err: any) => void;
maintainObjectURL?: boolean;
}
export function browserDownloadBase64(b64: string, name: string, opt?: BrowserDownloadOptions): string;
export function loadImageAsync(data: string): Promise<HTMLImageElement>;
export function loadCanvasAsync(url: string): Promise<HTMLCanvasElement>;
export function scaleImageData(img: ImageData, scale: number): ImageData;
export function imageDataToPNG(img: ImageData, scale?: number): string;
export function encodeToPngAsync(uri: string, options?: {
width?: number;
height?: number;
pixelDensity?: number;
maxSize?: number;
text?: string;
}): Promise<string>;
export function resolveCdnUrl(path: string): string;
export function loadStyleAsync(path: string, rtl?: boolean): Promise<void>;
export function loadScriptAsync(path: string): Promise<void>;
export function loadAjaxAsync(url: string): Promise<string>;
export function loadBlocklyAsync(): Promise<void>;
export function patchCdn(url: string): string;
export function initTheme(): void;
/**
* Utility method to change the hash.
* Pass keepHistory to retain an entry of the change in the browser history.
*/
export function changeHash(hash: string, keepHistory?: boolean): void;
/**
* Simple utility method to join urls.
*/
export function urlJoin(urlPath1: string, urlPath2: string): string;
/**
* Simple utility method to join multiple urls.
*/
export function joinURLs(...parts: string[]): string;
export function storageEstimateAsync(): Promise<{
quota?: number;
usage?: number;
}>;
export const scheduleStorageCleanup: any;
export function stressTranslationsAsync(): Promise<void>;
export interface ITranslationDbEntry {
id?: string;
etag: string;
time: number;
strings?: pxt.Map<string>;
md?: string;
}
export interface ITranslationDb {
getAsync(lang: string, filename: string): Promise<ITranslationDbEntry>;
setAsync(lang: string, filename: string, etag: string, strings?: pxt.Map<string>, md?: string): Promise<void>;
clearAsync(): Promise<void>;
}
export type IDBUpgradeHandler = (ev: IDBVersionChangeEvent, request: IDBRequest) => void;
export class IDBWrapper {
private name;
private version;
private upgradeHandler?;
private quotaExceededHandler?;
private skipErrorLog;
private _db;
constructor(name: string, version: number, upgradeHandler?: IDBUpgradeHandler, quotaExceededHandler?: () => void, skipErrorLog?: boolean);
private throwIfNotOpened;
private errorHandler;
private getObjectStore;
static deleteDatabaseAsync(name: string): Promise<void>;
openAsync(): Promise<void>;
getAsync<T>(storeName: string, id: string): Promise<T>;
getAllAsync<T>(storeName: string): Promise<T[]>;
setAsync(storeName: string, data: any): Promise<void>;
deleteAsync(storeName: string, id: string): Promise<void>;
deleteAllAsync(storeName: string): Promise<void>;
getObjectStoreWrapper<T>(storeName: string): IDBObjectStoreWrapper<T>;
}
export class IDBObjectStoreWrapper<T> {
protected db: IDBWrapper;
protected storeName: string;
constructor(db: IDBWrapper, storeName: string);
getAsync(id: string): Promise<T>;
getAllAsync(): Promise<T[]>;
setAsync(data: T): Promise<void>;
deleteAsync(id: string): Promise<void>;
deleteAllAsync(): Promise<void>;
}
export function translationDbAsync(): Promise<ITranslationDb>;
export function clearTranslationDbAsync(): Promise<void>;
export function getTutorialCodeHash(code: string[]): string;
interface TutorialInfoIndexedDbEntry {
id: string;
time: number;
hash: string;
blocks: Map<number>;
snippets: Map<Map<number>>;
highlightBlocks: Map<Map<number>>;
validateBlocks: Map<Map<string[]>>;
}
export interface ITutorialInfoDb {
getAsync(filename: string, code: string[], branch?: string): Promise<TutorialInfoIndexedDbEntry>;
setAsync(filename: string, snippets: Map<Map<number>>, code: string[], highlights: Map<Map<number>>, codeValidationMap: Map<Map<string[]>>, branch?: string): Promise<void>;
clearAsync(): Promise<void>;
}
class TutorialInfoIndexedDb implements ITutorialInfoDb {
protected readonly db: pxt.BrowserUtils.IDBWrapper;
static TABLE: string;
static KEYPATH: string;
static dbName(): string;
static createAsync(): Promise<TutorialInfoIndexedDb>;
private constructor();
getAsync(filename: string, code: string[], branch?: string): Promise<TutorialInfoIndexedDbEntry>;
setAsync(filename: string, snippets: Map<Map<number>>, code: string[], highlights: Map<Map<number>>, codeValidationMap: Map<Map<string[]>>, branch?: string): Promise<void>;
setWithHashAsync(filename: string, snippets: Map<Map<number>>, hash: string, highlights: Map<Map<number>>, codeValidationMap: Map<Map<string[]>>, branch?: string): Promise<void>;
clearAsync(): Promise<void>;
}
export function tutorialInfoDbAsync(): Promise<TutorialInfoIndexedDb>;
export function clearTutorialInfoDbAsync(): Promise<void>;
export interface IPointerEvents {
up: string;
down: string[];
move: string;
enter: string;
leave: string;
}
export const pointerEvents: IPointerEvents;
export function getPageX(event: any): number;
export function getPageY(event: any): number;
export function getClientX(event: any): number;
export function getClientY(event: any): number;
export function popupWindow(url: string, title: string, popUpWidth: number, popUpHeight: number): Window;
export function containsClass(el: SVGElement | HTMLElement, classes: string): boolean;
export function addClass(el: SVGElement | HTMLElement, classes: string): void;
export function removeClass(el: SVGElement | HTMLElement, classes: string): void;
export function getCookieLang(): string;
export function setCookieLang(langId: string, docs?: boolean): void;
export function cacheBustingUrl(url: string): string;
export function appendUrlQueryParams(url: string, params: URLSearchParams): string;
export function legacyCopyText(element: HTMLInputElement | HTMLTextAreaElement): boolean;
/**
* Sets the theme of the application by adding a class to the body. Themes
* are defined in CSS variable packs. The default theme is defined in
* `themes/themepacks.less`, in the `:root` pseudoclass. `highcontrast` is
* also defined there. Target-specific themes are defined in the target
* repo's `theme/themepack.less`.
*/
export function setApplicationTheme(theme: string | undefined): void;
export function isElement(node: Node): node is Element;
export {};
}
declare namespace pxt.cloud {
export type DevBackendType = "default" | "prod" | "staging" | "localhost";
const DEV_BACKEND_PROD = "https://makecode.com";
const DEV_BACKEND_STAGING = "https://staging.pxt.io";
const DEV_BACKEND_LOCALHOST = "http://localhost:8080";
type BackendUrls = typeof DEV_BACKEND_PROD | typeof DEV_BACKEND_STAGING | typeof DEV_BACKEND_LOCALHOST;
export const DEV_BACKEND: BackendUrls;
export const DEV_REGION = "US";
export function devBackendType(): DevBackendType;
export type CloudStatus = "none" | "synced" | "justSynced" | "offline" | "syncing" | "conflict" | "localEdits";
export type CloudStatusInfo = {
value: pxt.cloud.CloudStatus;
icon?: string;
tooltip?: string;
shortStatus?: string;
longStatus?: string;
indicator?: string;
};
export const cloudStatus: {
[index in pxt.cloud.CloudStatus]: CloudStatusInfo;
};
export {};
}
declare namespace pxt.commands {
enum WebUSBPairResult {
Failed = 0,
Success = 1,
UserRejected = 2
}
interface RecompileOptions {
recompile: boolean;
useVariants: string[];
}
interface DeployOptions {
reportError: (e: string) => void;
showNotification: (msg: string) => void;
}
type DeployFnAsync = (r: ts.pxtc.CompileResult, d?: DeployOptions) => Promise<void>;
let deployCoreAsync: DeployFnAsync;
let deployFallbackAsync: DeployFnAsync;
let hasDeployFn: () => DeployFnAsync;
let deployAsync: DeployFnAsync;
let patchCompileResultAsync: (r: pxtc.CompileResult) => Promise<void>;
let browserDownloadAsync: (text: string, name: string, contentType: string) => Promise<void>;
let saveOnlyAsync: (r: ts.pxtc.CompileResult) => Promise<void>;
let renderBrowserDownloadInstructions: (saveOnly?: boolean, redeploy?: () => Promise<void>) => any;
let renderUsbPairDialog: (firmwareUrl?: string, failedOnce?: boolean) => any;
let renderIncompatibleHardwareDialog: (unsupportedParts: string[]) => any;
let renderDisconnectDialog: () => {
header: string;
jsx: any;
helpUrl: string;
};
let showUsbDeviceForgottenDialog: (confirmAsync: (options: any) => Promise<number>) => Promise<void>;
let showUploadInstructionsAsync: (fn: string, url: string, confirmAsync: (options: any) => Promise<number>, saveOnly?: boolean, redeploy?: () => Promise<void>) => Promise<void>;
let showProgramTooLargeErrorAsync: (variants: string[], confirmAsync: (options: any) => Promise<number>, saveOnly?: boolean) => Promise<RecompileOptions>;
let saveProjectAsync: (project: pxt.cpp.HexFile) => Promise<void>;
let electronDeployAsync: (r: ts.pxtc.CompileResult) => Promise<void>;
let electronFileDeployAsync: (deployRequest: pxt.electron.FileDeployRequest) => Promise<void>;
let webUsbPairDialogAsync: (pairAsync: () => Promise<boolean>, confirmAsync: (options: any) => Promise<WebUSBPairResult>, implicitlyCalled?: boolean) => Promise<WebUSBPairResult>;
let onTutorialCompleted: () => void;
let onPostHostMessage: (msg: any) => void;
let perfMeasurementThresholdMs: number;
let onPerfMilestone: (payload: {
milestone: string;
time: number;
params?: Map<string>;
}) => void;
let onPerfMeasurement: (payload: {
name: string;
start: number;
duration: number;
params?: Map<string>;
}) => void;
let workspaceLoadedAsync: () => Promise<void>;
let getDownloadMenuItems: () => any[];
let notifyProjectCompiled: (headerId: string, compileResult: pxtc.CompileResult) => void;
let notifyProjectSaved: (header: pxt.workspace.Header) => void;
let onDownloadButtonClick: () => Promise<void>;
let getDefaultProjectName: () => string;
let onMarkdownActivityLoad: (path: string, title?: string, editorProjectName?: string) => Promise<void>;
}
declare namespace pxt {
function getWhiteContrastingBackground(color: string): string;
function contrastRatio(fg: string, bg: string): number;
}
declare namespace Measurements {
const TutorialInfoDbSetAsync = "tutorial info db setAsync";
const ReloadAppTargetVariant = "reloadAppTargetVariant";
const Sha256Buffer = "sha256buffer";
const WebworkerRecvHandler = "webworker recvHandler";
const NetworkRequest = "network.request";
}
declare namespace pxt {
function lzmaDecompressAsync(buf: Uint8Array): Promise<string>;
function lzmaCompressAsync(text: string): Promise<Uint8Array>;
}
declare namespace pxt.cpp {
function nsWriter(nskw?: string): {
setNs: (ns: string, over?: string) => void;
clear: () => void;
write: (s: string) => void;
incrIndent: () => void;
decrIndent: () => void;
finish: () => string;
};
function parseCppInt(v: string): number;
class PkgConflictError extends Error {
pkg0: Package;
pkg1: Package;
settingName: string;
isUserError: boolean;
isVersionConflict: boolean;
constructor(msg: string);
}
function getExtensionInfo(mainPkg: MainPackage): pxtc.ExtensionInfo;
interface HexFileMeta {
cloudId: string;
targetVersions?: pxt.TargetVersions;
editor: string;
name: string;
}
interface HexFile {
meta?: HexFileMeta;
source: string;
}
function unpackSourceFromHexFileAsync(file: File): Promise<HexFile>;
function unpackSourceFromHexAsync(dat: Uint8Array): Promise<HexFile>;
}
declare namespace pxt.hexloader {
let showLoading: (msg: string) => void;
let hideLoading: () => void;
function storeWithLimitAsync(host: Host, idxkey: string, newkey: string, newval: string, maxLen?: number): Promise<void>;
function recordGetAsync(host: Host, idxkey: string, newkey: string): Promise<void>;
function getHexInfoAsync(host: Host, extInfo: pxtc.ExtensionInfo, cloudModule?: any): Promise<pxtc.HexInfo>;
}
declare namespace pxt.crowdin {
const KEY_VARIABLE = "CROWDIN_KEY";
let testMode: boolean;
function setTestMode(): void;
function inContextLoadAsync(text: string): Promise<string>;
}
declare namespace pxt.diff {
export function toLines(file: string, includeNewline