@graffiticode/parser 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/src/config/config.d.ts +3 -0
- package/dist/api/src/config/config.js +4 -0
- package/dist/api/src/config/config.js.map +1 -0
- package/dist/api/src/config/index.d.ts +1 -0
- package/dist/api/src/config/index.js +3 -0
- package/dist/api/src/config/index.js.map +1 -0
- package/dist/api/src/lang/base-url.d.ts +7 -0
- package/dist/api/src/lang/base-url.js +24 -0
- package/dist/api/src/lang/base-url.js.map +1 -0
- package/dist/api/src/lang/compile.d.ts +4 -0
- package/dist/api/src/lang/compile.js +6 -0
- package/dist/api/src/lang/compile.js.map +1 -0
- package/dist/api/src/lang/get-asset.d.ts +4 -0
- package/dist/api/src/lang/get-asset.js +9 -0
- package/dist/api/src/lang/get-asset.js.map +1 -0
- package/dist/api/src/lang/index.d.ts +4 -0
- package/dist/api/src/lang/index.js +22 -0
- package/dist/api/src/lang/index.js.map +1 -0
- package/dist/api/src/lang/ping-lang.d.ts +5 -0
- package/dist/api/src/lang/ping-lang.js +31 -0
- package/dist/api/src/lang/ping-lang.js.map +1 -0
- package/dist/api/src/util.d.ts +23 -0
- package/dist/api/src/util.js +187 -0
- package/dist/api/src/util.js.map +1 -0
- package/dist/parser/src/ast.d.ts +58 -0
- package/dist/parser/src/ast.js +683 -0
- package/dist/parser/src/ast.js.map +1 -0
- package/dist/parser/src/env.d.ts +8 -0
- package/dist/parser/src/env.js +38 -0
- package/dist/parser/src/env.js.map +1 -0
- package/dist/parser/src/fold.d.ts +4 -0
- package/dist/parser/src/fold.js +217 -0
- package/dist/parser/src/fold.js.map +1 -0
- package/dist/parser/src/folder.d.ts +30 -0
- package/dist/parser/src/folder.js +231 -0
- package/dist/parser/src/folder.js.map +1 -0
- package/dist/parser/src/index.d.ts +5 -0
- package/dist/parser/src/index.js +6 -0
- package/dist/parser/src/index.js.map +1 -0
- package/dist/parser/src/parse.d.ts +56 -0
- package/dist/parser/src/parse.js +902 -0
- package/dist/parser/src/parse.js.map +1 -0
- package/dist/parser/src/parser.d.ts +17 -0
- package/dist/parser/src/parser.js +89 -0
- package/dist/parser/src/parser.js.map +1 -0
- package/dist/parser/src/parserForTests.d.ts +3 -0
- package/dist/parser/src/parserForTests.js +4 -0
- package/dist/parser/src/parserForTests.js.map +1 -0
- package/dist/parser/src/stringstream.d.ts +10 -0
- package/dist/parser/src/stringstream.js +21 -0
- package/dist/parser/src/stringstream.js.map +1 -0
- package/dist/parser/src/testing/index.d.ts +2 -0
- package/dist/parser/src/testing/index.js +17 -0
- package/dist/parser/src/testing/index.js.map +1 -0
- package/dist/parser/src/types.d.ts +44 -0
- package/dist/parser/src/types.js +2 -0
- package/dist/parser/src/types.js.map +1 -0
- package/package.json +2 -4
- package/src/ast.js +724 -0
- package/src/env.js +46 -0
- package/src/folder.js +244 -0
- package/src/parse.js +35 -935
- package/src/parse.ts~ +1037 -0
- package/src/{parser.js~ → parser.ts~} +25 -7
- package/src/stringstream.js +22 -0
- package/src/fold.js +0 -235
- package/src/parser.spec.js~ +0 -175
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../api/src/config/config.js"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;IAC3C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;AAC7B,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const getConfig: () => any;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../api/src/config/index.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const buildGetBaseUrlForLanguage = ({ isNonEmptyString, env, getConfig, getCompilerHost, getCompilerPort }) => (lang) => {
|
|
2
|
+
if (Number.isInteger(Number.parseInt(lang, 10))) {
|
|
3
|
+
lang = `L${lang}`;
|
|
4
|
+
}
|
|
5
|
+
if (!isNonEmptyString(lang)) {
|
|
6
|
+
throw new Error("lang must be a non empty string");
|
|
7
|
+
}
|
|
8
|
+
const envBaseUrl = env[`BASE_URL_${lang.toUpperCase()}`];
|
|
9
|
+
if (isNonEmptyString(envBaseUrl)) {
|
|
10
|
+
return envBaseUrl;
|
|
11
|
+
}
|
|
12
|
+
const config = getConfig() || {};
|
|
13
|
+
const host = getCompilerHost(lang, config);
|
|
14
|
+
const port = getCompilerPort(lang, config);
|
|
15
|
+
let protocol = "https";
|
|
16
|
+
if (host === "localhost") {
|
|
17
|
+
protocol = "http";
|
|
18
|
+
}
|
|
19
|
+
else if (isNonEmptyString(config.protocol)) {
|
|
20
|
+
protocol = config.protocol;
|
|
21
|
+
}
|
|
22
|
+
return `${protocol}://${host}:${port}`;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=base-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-url.js","sourceRoot":"","sources":["../../../../../api/src/lang/base-url.js"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,EACzC,gBAAgB,EAChB,GAAG,EACH,SAAS,EACT,eAAe,EACf,eAAe,EAChB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE;IACb,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;QAChD,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACzD,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,QAAQ,GAAG,OAAO,CAAC;IACvB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,QAAQ,GAAG,MAAM,CAAC;IACpB,CAAC;SAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7B,CAAC;IACD,OAAO,GAAG,QAAQ,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;AACzC,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const buildCompile = ({ getBaseUrlForLanguage, bent }) => async (lang, req) => {
|
|
2
|
+
const baseUrl = getBaseUrlForLanguage(lang);
|
|
3
|
+
const compilePost = bent(baseUrl, "POST", "json", 200, 202);
|
|
4
|
+
return await compilePost("/compile", req);
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../../../api/src/lang/compile.js"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,qBAAqB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACnF,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5D,OAAO,MAAM,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const buildGetAsset = ({ getBaseUrlForLanguage, bent }) => {
|
|
2
|
+
return async (lang, path) => {
|
|
3
|
+
const baseUrl = getBaseUrlForLanguage(lang);
|
|
4
|
+
const getLanguageAsset = bent(baseUrl, "string");
|
|
5
|
+
const asset = await getLanguageAsset(path);
|
|
6
|
+
return asset;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=get-asset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-asset.js","sourceRoot":"","sources":["../../../../../api/src/lang/get-asset.js"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,qBAAqB,EAAE,IAAI,EAAE,EAAE,EAAE;IAC/D,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC1B,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import bent from "bent";
|
|
2
|
+
import { getConfig } from "../config/index.js";
|
|
3
|
+
import { isNonEmptyString, getCompilerHost, getCompilerPort } from "../util.js";
|
|
4
|
+
import { buildGetBaseUrlForLanguage } from "./base-url.js";
|
|
5
|
+
import { buildCompile } from "./compile.js";
|
|
6
|
+
import { buildGetAsset } from "./get-asset.js";
|
|
7
|
+
import { buildPingLang } from "./ping-lang.js";
|
|
8
|
+
export const getBaseUrlForLanguage = buildGetBaseUrlForLanguage({
|
|
9
|
+
isNonEmptyString,
|
|
10
|
+
env: process.env,
|
|
11
|
+
getConfig,
|
|
12
|
+
getCompilerHost,
|
|
13
|
+
getCompilerPort
|
|
14
|
+
});
|
|
15
|
+
export const compile = buildCompile({ getBaseUrlForLanguage, bent });
|
|
16
|
+
export const getLangAsset = buildGetAsset({ getBaseUrlForLanguage, bent });
|
|
17
|
+
export const pingLang = buildPingLang({
|
|
18
|
+
getBaseUrlForLanguage,
|
|
19
|
+
bent,
|
|
20
|
+
log: console.log
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../api/src/lang/index.js"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,CAAC,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;IAC9D,gBAAgB;IAChB,GAAG,EAAE,OAAO,CAAC,GAAG;IAChB,SAAS;IACT,eAAe;IACf,eAAe;CAChB,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;IACpC,qBAAqB;IACrB,IAAI;IACJ,GAAG,EAAE,OAAO,CAAC,GAAG;CACjB,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const noop = _ => { };
|
|
2
|
+
export const buildPingLang = ({ getBaseUrlForLanguage, bent, log }) => {
|
|
3
|
+
const cache = new Map();
|
|
4
|
+
const pingLangInternal = async (lang) => {
|
|
5
|
+
const baseUrl = getBaseUrlForLanguage(lang);
|
|
6
|
+
try {
|
|
7
|
+
const headLang = bent(baseUrl, "HEAD");
|
|
8
|
+
await headLang("/");
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
log(`Failed to ping language ${baseUrl}: ${err.message}`);
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
return async (lang, resume) => {
|
|
17
|
+
if (typeof resume !== "function") {
|
|
18
|
+
resume = noop;
|
|
19
|
+
}
|
|
20
|
+
if (!cache.has(lang)) {
|
|
21
|
+
cache.set(lang, pingLangInternal(lang));
|
|
22
|
+
}
|
|
23
|
+
const pong = await cache.get(lang);
|
|
24
|
+
if (!pong) {
|
|
25
|
+
cache.delete(lang);
|
|
26
|
+
}
|
|
27
|
+
resume(pong);
|
|
28
|
+
return pong;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=ping-lang.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ping-lang.js","sourceRoot":"","sources":["../../../../../api/src/lang/ping-lang.js"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAEtB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,qBAAqB,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;IACpE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;IAExB,MAAM,gBAAgB,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACvC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,2BAA2B,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAC5B,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function error(val: any, err: any): void;
|
|
2
|
+
export function message(errorCode: any, args?: any[]): string;
|
|
3
|
+
export function reserveCodeRange(first: any, last: any, moduleName: any): void;
|
|
4
|
+
export function parseJSON(str: any): any;
|
|
5
|
+
export function setMetadataBuilds(data: any, build: any): void;
|
|
6
|
+
export function getCompilerHost(lang: any, config: any): any;
|
|
7
|
+
export function getCompilerPort(lang: any, config: any): any;
|
|
8
|
+
export function getClientHost(lang: any, config: any): "localhost" | "console.graffiticode.com";
|
|
9
|
+
export function getClientPort(lang: any, config: any): "443" | "3000";
|
|
10
|
+
export function isNonEmptyString(str: any): boolean;
|
|
11
|
+
export function isNonNullObject(obj: any): boolean;
|
|
12
|
+
export function cleanAndTrimObj(str: any): any;
|
|
13
|
+
export function cleanAndTrimSrc(str: any): any;
|
|
14
|
+
export function dot2num(dot: any): number;
|
|
15
|
+
export function num2dot(num: any): number;
|
|
16
|
+
export function statusCodeFromErrors(errs: any): any;
|
|
17
|
+
export function messageFromErrors(errs: any): any;
|
|
18
|
+
export function internalError(error: any): {
|
|
19
|
+
statusCode: number;
|
|
20
|
+
error: string;
|
|
21
|
+
} & {
|
|
22
|
+
error: any;
|
|
23
|
+
};
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
const DEBUG = process.env.GRAFFITICODE_DEBUG === "true" || false;
|
|
2
|
+
const assert = (function assert() {
|
|
3
|
+
// If 'DEBUG' is false then 'assert' is a no-op.
|
|
4
|
+
return !DEBUG
|
|
5
|
+
? () => { }
|
|
6
|
+
: (val, str) => {
|
|
7
|
+
if (str === undefined) {
|
|
8
|
+
str = "failed!";
|
|
9
|
+
}
|
|
10
|
+
if (!val) {
|
|
11
|
+
const err = new Error(str);
|
|
12
|
+
throw err;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
})();
|
|
16
|
+
export function error(val, err) {
|
|
17
|
+
// If 'val' is false then report 'err'.
|
|
18
|
+
if (!val) {
|
|
19
|
+
throw new Error(err);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const messages = {};
|
|
23
|
+
export function message(errorCode, args = []) {
|
|
24
|
+
let str = messages[errorCode];
|
|
25
|
+
if (args) {
|
|
26
|
+
args.forEach(function (arg, i) {
|
|
27
|
+
str = str.replace("%" + (i + 1), arg);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return errorCode + ": " + str;
|
|
31
|
+
}
|
|
32
|
+
const reservedCodes = [];
|
|
33
|
+
export function reserveCodeRange(first, last, moduleName) {
|
|
34
|
+
assert(first <= last, "Invalid code range");
|
|
35
|
+
const noConflict = reservedCodes.every(function (range) {
|
|
36
|
+
return last < range.first || first > range.last;
|
|
37
|
+
});
|
|
38
|
+
assert(noConflict, "Conflicting request for error code range");
|
|
39
|
+
reservedCodes.push({ first, last, name: moduleName });
|
|
40
|
+
}
|
|
41
|
+
export function parseJSON(str) {
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(str);
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
console.log("ERROR parsing JSON: " + JSON.stringify(str));
|
|
47
|
+
console.log(e.stack);
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function setMetadataBuilds(data, build) {
|
|
52
|
+
if (typeof data !== "object" || data === null || data instanceof Array) {
|
|
53
|
+
// We got nothing to hang the metadata on.
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (!data._) {
|
|
57
|
+
data._ = {};
|
|
58
|
+
}
|
|
59
|
+
if (!data._.builds) {
|
|
60
|
+
data._.builds = [];
|
|
61
|
+
}
|
|
62
|
+
if (!data._.builds.some(b => build.name === b.name)) {
|
|
63
|
+
data._.builds.push(build);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function getCompilerHost(lang, config) {
|
|
67
|
+
config = config || global.config || {};
|
|
68
|
+
if (config.useLocalCompiles) {
|
|
69
|
+
return "localhost";
|
|
70
|
+
}
|
|
71
|
+
lang = lang.toLowerCase();
|
|
72
|
+
lang = lang.indexOf("l") === 0 && lang || "l" + lang;
|
|
73
|
+
if (config.hosts && config.hosts[lang]) {
|
|
74
|
+
return config.hosts[lang];
|
|
75
|
+
}
|
|
76
|
+
return `${lang}.graffiticode.org`;
|
|
77
|
+
}
|
|
78
|
+
export function getCompilerPort(lang, config) {
|
|
79
|
+
config = config || global.config || {};
|
|
80
|
+
lang = lang.toLowerCase();
|
|
81
|
+
if (config.useLocalCompiles) {
|
|
82
|
+
lang = lang.indexOf("l") === 0 && lang.substring(1) || lang;
|
|
83
|
+
return `5${lang}`;
|
|
84
|
+
}
|
|
85
|
+
lang = lang.indexOf("l") === 0 && lang || "l" + lang;
|
|
86
|
+
if (config.ports && config.ports[lang]) {
|
|
87
|
+
return config.ports[lang];
|
|
88
|
+
}
|
|
89
|
+
return "443";
|
|
90
|
+
}
|
|
91
|
+
export function getClientHost(lang, config) {
|
|
92
|
+
config = config || global.config || {};
|
|
93
|
+
if (config.useLocalCompiles) {
|
|
94
|
+
return "localhost";
|
|
95
|
+
}
|
|
96
|
+
return "console.graffiticode.com";
|
|
97
|
+
}
|
|
98
|
+
export function getClientPort(lang, config) {
|
|
99
|
+
config = config || global.config || {};
|
|
100
|
+
if (config.useLocalCompiles) {
|
|
101
|
+
return "3000";
|
|
102
|
+
}
|
|
103
|
+
return "443";
|
|
104
|
+
}
|
|
105
|
+
export function isNonEmptyString(str) {
|
|
106
|
+
return (typeof (str) === "string" && str.length > 0);
|
|
107
|
+
}
|
|
108
|
+
export function isNonNullObject(obj) {
|
|
109
|
+
return (typeof obj === "object" && obj !== null);
|
|
110
|
+
}
|
|
111
|
+
export function cleanAndTrimObj(str) {
|
|
112
|
+
if (!str) {
|
|
113
|
+
return str;
|
|
114
|
+
}
|
|
115
|
+
str = str.replace(/'/g, "''");
|
|
116
|
+
str = str.replace(/\n/g, " ");
|
|
117
|
+
while (str.charAt(0) === " ") {
|
|
118
|
+
str = str.substring(1);
|
|
119
|
+
}
|
|
120
|
+
while (str.charAt(str.length - 1) === " ") {
|
|
121
|
+
str = str.substring(0, str.length - 1);
|
|
122
|
+
}
|
|
123
|
+
return str;
|
|
124
|
+
}
|
|
125
|
+
export function cleanAndTrimSrc(str) {
|
|
126
|
+
if (!str || typeof str !== "string") {
|
|
127
|
+
return str;
|
|
128
|
+
}
|
|
129
|
+
str = str.replace(/'/g, "''");
|
|
130
|
+
while (str.charAt(0) === " ") {
|
|
131
|
+
str = str.substring(1);
|
|
132
|
+
}
|
|
133
|
+
while (str.charAt(str.length - 1) === " ") {
|
|
134
|
+
str = str.substring(0, str.length - 1);
|
|
135
|
+
}
|
|
136
|
+
return str;
|
|
137
|
+
}
|
|
138
|
+
// From http://javascript.about.com/library/blipconvert.htm
|
|
139
|
+
export function dot2num(dot) {
|
|
140
|
+
const d = dot.split(".");
|
|
141
|
+
const n = ((((((+d[0]) * 256) + (+d[1])) * 256) + (+d[2])) * 256) + (+d[3]);
|
|
142
|
+
if (isNaN(n)) {
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
return n;
|
|
146
|
+
}
|
|
147
|
+
export function num2dot(num) {
|
|
148
|
+
let d = num % 256;
|
|
149
|
+
for (let i = 3; i > 0; i--) {
|
|
150
|
+
num = Math.floor(num / 256);
|
|
151
|
+
d = num % 256 + "." + d;
|
|
152
|
+
}
|
|
153
|
+
return d;
|
|
154
|
+
}
|
|
155
|
+
export function statusCodeFromErrors(errs) {
|
|
156
|
+
if (!Array.isArray(errs)) {
|
|
157
|
+
errs = [errs];
|
|
158
|
+
}
|
|
159
|
+
for (const err in errs) {
|
|
160
|
+
if (err.statusCode) {
|
|
161
|
+
return err.statusCode;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return 500;
|
|
165
|
+
}
|
|
166
|
+
export function messageFromErrors(errs) {
|
|
167
|
+
if (!Array.isArray(errs)) {
|
|
168
|
+
errs = [errs];
|
|
169
|
+
}
|
|
170
|
+
for (const err in errs) {
|
|
171
|
+
if (err.data) {
|
|
172
|
+
if (err.data.error) {
|
|
173
|
+
return err.data.error;
|
|
174
|
+
}
|
|
175
|
+
return err.data;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return "Internal error";
|
|
179
|
+
}
|
|
180
|
+
const INTERNAL_ERROR = {
|
|
181
|
+
statusCode: 500,
|
|
182
|
+
error: "Internal error"
|
|
183
|
+
};
|
|
184
|
+
export function internalError(error) {
|
|
185
|
+
return Object.assign(INTERNAL_ERROR, { error });
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../../../api/src/util.js"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM,IAAI,KAAK,CAAC;AACjE,MAAM,MAAM,GAAG,CAAC,SAAS,MAAM;IAC7B,gDAAgD;IAChD,OAAO,CAAC,KAAK;QACX,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACX,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACX,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,GAAG,GAAG,SAAS,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC3B,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;AACR,CAAC,CAAC,EAAE,CAAC;AAEL,MAAM,UAAU,KAAK,CAAC,GAAG,EAAE,GAAG;IAC5B,uCAAuC;IACvC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,UAAU,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE;IAC1C,IAAI,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC9B,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,EAAE,CAAC;YAC3B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,SAAS,GAAG,IAAI,GAAG,GAAG,CAAC;AAChC,CAAC;AAED,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,UAAU,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU;IACtD,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,oBAAoB,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,KAAK;QACpD,OAAO,IAAI,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,UAAU,EAAE,0CAA0C,CAAC,CAAC;IAC/D,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAG;IAC3B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAI,EAAE,KAAK;IAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,YAAY,KAAK,EAAE,CAAC;QACvE,0CAA0C;QAC1C,OAAO;IACT,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACZ,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAI,EAAE,MAAM;IAC1C,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACvC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC1B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC;IACrD,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,GAAG,IAAI,mBAAmB,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAI,EAAE,MAAM;IAC1C,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACvC,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC1B,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAC5D,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IACD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC;IACrD,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAI,EAAE,MAAM;IACxC,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACvC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,0BAA0B,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAI,EAAE,MAAM;IACxC,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACvC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAG;IAClC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAG;IACjC,OAAO,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAG;IACjC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,GAAG,CAAC;IACb,CAAC;IACD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QAC7B,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QAC1C,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAG;IACjC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC;IACb,CAAC;IACD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QAC7B,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QAC1C,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,OAAO,CAAC,GAAG;IACzB,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACb,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAG;IACzB,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QAC5B,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAI;IACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACnB,OAAO,GAAG,CAAC,UAAU,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAI;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;YACxB,CAAC;YACD,OAAO,GAAG,CAAC,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,cAAc,GAAG;IACrB,UAAU,EAAE,GAAG;IACf,KAAK,EAAE,gBAAgB;CACxB,CAAC;AACF,MAAM,UAAU,aAAa,CAAC,KAAK;IACjC,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Context } from "./types";
|
|
2
|
+
export interface AstNode {
|
|
3
|
+
tag?: string;
|
|
4
|
+
elts: any[];
|
|
5
|
+
coord?: Coord;
|
|
6
|
+
}
|
|
7
|
+
export interface Coord {
|
|
8
|
+
from?: number;
|
|
9
|
+
to?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class Ast {
|
|
12
|
+
static push(ctx: Context, node: any): void;
|
|
13
|
+
static topNode(ctx: Context): number;
|
|
14
|
+
static pop(ctx: Context): number;
|
|
15
|
+
static peek(ctx: Context, n?: number): number;
|
|
16
|
+
static intern(ctx: Context, n: AstNode): number;
|
|
17
|
+
static node(ctx: Context, nid: number): AstNode;
|
|
18
|
+
static dumpAll(ctx: Context): string;
|
|
19
|
+
static poolToJSON(ctx: Context): Record<string, any>;
|
|
20
|
+
static dump(n: any): string;
|
|
21
|
+
static fold(ctx: Context, fn: any, args: any[]): void;
|
|
22
|
+
static applyLate(ctx: Context, count: number): void;
|
|
23
|
+
static apply(ctx: Context, fnId: number, argc: number): void;
|
|
24
|
+
static error(ctx: Context, str: string, coord?: Coord): void;
|
|
25
|
+
static bool(ctx: Context, val: any): void;
|
|
26
|
+
static nul(ctx: Context): void;
|
|
27
|
+
static number(ctx: Context, num: string | number, coord?: Coord): void;
|
|
28
|
+
static string(ctx: Context, str: string, coord?: Coord): void;
|
|
29
|
+
static setName(ctx: Context, name: string, coord?: Coord): void;
|
|
30
|
+
static expr(ctx: Context, argc: number): void;
|
|
31
|
+
static parenExpr(ctx: Context, coord?: Coord): void;
|
|
32
|
+
static list(ctx: Context, count: number, coord?: Coord, reverse?: boolean): void;
|
|
33
|
+
static binaryExpr(ctx: Context, name: string): void;
|
|
34
|
+
static unaryExpr(ctx: Context, name: string): void;
|
|
35
|
+
static prefixExpr(ctx: Context, name: string): void;
|
|
36
|
+
static neg(ctx: Context): void;
|
|
37
|
+
static add(ctx: Context, coord?: Coord): void;
|
|
38
|
+
static sub(ctx: Context): void;
|
|
39
|
+
static div(ctx: Context): void;
|
|
40
|
+
static mod(ctx: Context): void;
|
|
41
|
+
static pow(ctx: Context): void;
|
|
42
|
+
static concat(ctx: Context): void;
|
|
43
|
+
static eq(ctx: Context): void;
|
|
44
|
+
static ne(ctx: Context): void;
|
|
45
|
+
static lt(ctx: Context): void;
|
|
46
|
+
static gt(ctx: Context): void;
|
|
47
|
+
static le(ctx: Context): void;
|
|
48
|
+
static ge(ctx: Context): void;
|
|
49
|
+
static ifExpr(ctx: Context): void;
|
|
50
|
+
static caseExpr(ctx: Context, n: number): void;
|
|
51
|
+
static ofClause(ctx: Context): void;
|
|
52
|
+
static record(ctx: Context): void;
|
|
53
|
+
static binding(ctx: Context): void;
|
|
54
|
+
static lambda(ctx: Context, env: any, nid: number): void;
|
|
55
|
+
static exprs(ctx: Context, count: number, inReverse?: boolean): void;
|
|
56
|
+
static letDef(ctx: Context): void;
|
|
57
|
+
static program(ctx: Context): void;
|
|
58
|
+
}
|