whet 0.0.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/LICENSE +21 -0
- package/README.md +47 -0
- package/bin/HxOverrides.d.ts +8 -0
- package/bin/HxOverrides.js +54 -0
- package/bin/Lambda.d.ts +86 -0
- package/bin/Lambda.js +141 -0
- package/bin/Map.d.ts +5 -0
- package/bin/Reflect.d.ts +19 -0
- package/bin/Reflect.js +41 -0
- package/bin/Std.d.ts +49 -0
- package/bin/Std.js +96 -0
- package/bin/StdTypes.d.ts +57 -0
- package/bin/StringTools.d.ts +23 -0
- package/bin/StringTools.js +36 -0
- package/bin/commander/AddHelpTextContext.d.ts +6 -0
- package/bin/commander/AddHelpTextPosition.d.ts +2 -0
- package/bin/commander/CommandOptions.d.ts +6 -0
- package/bin/commander/ErrorOptions.d.ts +11 -0
- package/bin/commander/ExecutableCommandOptions.d.ts +7 -0
- package/bin/commander/HelpContext.d.ts +4 -0
- package/bin/commander/HookEvent.d.ts +2 -0
- package/bin/commander/OptionValueSource.d.ts +2 -0
- package/bin/commander/OutputConfiguration.d.ts +8 -0
- package/bin/commander/ParseOptions.d.ts +4 -0
- package/bin/commander/ParseOptionsResult.d.ts +5 -0
- package/bin/genes/Register.d.ts +15 -0
- package/bin/genes/Register.js +107 -0
- package/bin/genes/util/EsMap.d.ts +12 -0
- package/bin/genes/util/EsMap.js +51 -0
- package/bin/haxe/Constraints.d.ts +8 -0
- package/bin/haxe/Constraints.js +5 -0
- package/bin/haxe/Exception.d.ts +66 -0
- package/bin/haxe/Exception.js +88 -0
- package/bin/haxe/NativeStackTrace.d.ts +7 -0
- package/bin/haxe/PosInfos.d.ts +19 -0
- package/bin/haxe/Rest.d.ts +2 -0
- package/bin/haxe/ValueException.d.ts +24 -0
- package/bin/haxe/ValueException.js +36 -0
- package/bin/haxe/crypto/Crc32.d.ts +12 -0
- package/bin/haxe/crypto/Crc32.js +40 -0
- package/bin/haxe/ds/List.d.ts +31 -0
- package/bin/haxe/ds/List.js +55 -0
- package/bin/haxe/ds/ObjectMap.d.ts +7 -0
- package/bin/haxe/ds/ObjectMap.js +25 -0
- package/bin/haxe/ds/StringMap.d.ts +6 -0
- package/bin/haxe/ds/StringMap.js +25 -0
- package/bin/haxe/exceptions/NotImplementedException.d.ts +10 -0
- package/bin/haxe/exceptions/NotImplementedException.js +27 -0
- package/bin/haxe/exceptions/PosException.d.ts +19 -0
- package/bin/haxe/exceptions/PosException.js +36 -0
- package/bin/haxe/extern/Rest.d.ts +11 -0
- package/bin/haxe/io/ArrayBufferView.d.ts +2 -0
- package/bin/haxe/io/Bytes.d.ts +19 -0
- package/bin/haxe/io/Bytes.js +78 -0
- package/bin/haxe/io/BytesBuffer.d.ts +19 -0
- package/bin/haxe/io/BytesBuffer.js +67 -0
- package/bin/haxe/io/BytesData.d.ts +2 -0
- package/bin/haxe/io/BytesOutput.d.ts +18 -0
- package/bin/haxe/io/BytesOutput.js +39 -0
- package/bin/haxe/io/Encoding.d.ts +20 -0
- package/bin/haxe/io/Encoding.js +20 -0
- package/bin/haxe/io/Error.d.ts +35 -0
- package/bin/haxe/io/Error.js +31 -0
- package/bin/haxe/io/Output.d.ts +63 -0
- package/bin/haxe/io/Output.js +126 -0
- package/bin/haxe/io/Path.d.ts +109 -0
- package/bin/haxe/io/Path.js +217 -0
- package/bin/haxe/io/UInt8Array.d.ts +2 -0
- package/bin/haxe/iterators/ArrayIterator.d.ts +19 -0
- package/bin/haxe/iterators/ArrayIterator.js +35 -0
- package/bin/haxe/macro/Expr.d.ts +331 -0
- package/bin/haxe/macro/Type.d.ts +609 -0
- package/bin/haxe/zip/Compress.d.ts +5 -0
- package/bin/haxe/zip/Compress.js +21 -0
- package/bin/haxe/zip/Entry.d.ts +27 -0
- package/bin/haxe/zip/Entry.js +15 -0
- package/bin/haxe/zip/Tools.d.ts +5 -0
- package/bin/haxe/zip/Tools.js +24 -0
- package/bin/haxe/zip/Writer.d.ts +22 -0
- package/bin/haxe/zip/Writer.js +149 -0
- package/bin/js/Boot.d.ts +18 -0
- package/bin/js/Boot.js +225 -0
- package/bin/js/Node.d.ts +6 -0
- package/bin/js/lib/ArrayBuffer.d.ts +4 -0
- package/bin/js/lib/ArrayBuffer.js +24 -0
- package/bin/js/lib/Iterator.d.ts +23 -0
- package/bin/js/lib/Map.d.ts +2 -0
- package/bin/js/lib/Object.d.ts +82 -0
- package/bin/js/lib/Promise.d.ts +10 -0
- package/bin/js/lib/intl/NumberFormat.d.ts +114 -0
- package/bin/js/node/Buffer.d.ts +3 -0
- package/bin/js/node/ChildProcess.d.ts +424 -0
- package/bin/js/node/Crypto.d.ts +21 -0
- package/bin/js/node/Dns.d.ts +57 -0
- package/bin/js/node/Fs.d.ts +308 -0
- package/bin/js/node/Http.d.ts +114 -0
- package/bin/js/node/Https.d.ts +330 -0
- package/bin/js/node/Iterator.d.ts +5 -0
- package/bin/js/node/Path.d.ts +44 -0
- package/bin/js/node/Process.d.ts +6 -0
- package/bin/js/node/Tls.d.ts +304 -0
- package/bin/js/node/Url.d.ts +126 -0
- package/bin/js/node/Util.d.ts +115 -0
- package/bin/js/node/Zlib.d.ts +29 -0
- package/bin/js/node/buffer/Buffer.d.ts +23 -0
- package/bin/js/node/buffer/Buffer.js +24 -0
- package/bin/js/node/child_process/ChildProcess.d.ts +11 -0
- package/bin/js/node/console/Console.d.ts +26 -0
- package/bin/js/node/http/Agent.d.ts +40 -0
- package/bin/js/node/http/ClientRequest.d.ts +10 -0
- package/bin/js/node/https/Agent.d.ts +50 -0
- package/bin/js/node/net/Server.d.ts +22 -0
- package/bin/js/node/net/Socket.d.ts +101 -0
- package/bin/js/node/stream/Duplex.d.ts +86 -0
- package/bin/js/node/stream/Readable.d.ts +41 -0
- package/bin/js/node/stream/Transform.d.ts +92 -0
- package/bin/js/node/stream/Writable.d.ts +57 -0
- package/bin/js/node/tls/SecureContext.d.ts +74 -0
- package/bin/js/node/tls/TLSSocket.d.ts +47 -0
- package/bin/ts/Undefined.d.ts +5 -0
- package/bin/whet/Log.d.ts +16 -0
- package/bin/whet/Log.js +106 -0
- package/bin/whet/Project.d.ts +33 -0
- package/bin/whet/Project.js +71 -0
- package/bin/whet/Source.d.ts +51 -0
- package/bin/whet/Source.js +136 -0
- package/bin/whet/SourceHash.d.ts +15 -0
- package/bin/whet/SourceHash.js +68 -0
- package/bin/whet/SourceId.d.ts +10 -0
- package/bin/whet/SourceId.js +74 -0
- package/bin/whet/Stone.d.ts +88 -0
- package/bin/whet/Stone.js +157 -0
- package/bin/whet/Utils.d.ts +16 -0
- package/bin/whet/Utils.js +72 -0
- package/bin/whet/Whet.d.ts +4 -0
- package/bin/whet/Whet.js +117 -0
- package/bin/whet/cache/BaseCache.d.ts +27 -0
- package/bin/whet/cache/BaseCache.js +210 -0
- package/bin/whet/cache/Cache.d.ts +72 -0
- package/bin/whet/cache/Cache.js +57 -0
- package/bin/whet/cache/CacheManager.d.ts +23 -0
- package/bin/whet/cache/CacheManager.js +103 -0
- package/bin/whet/cache/FileCache.d.ts +35 -0
- package/bin/whet/cache/FileCache.js +295 -0
- package/bin/whet/cache/MemoryCache.d.ts +12 -0
- package/bin/whet/cache/MemoryCache.js +58 -0
- package/bin/whet/magic/MaybeArray.d.ts +4 -0
- package/bin/whet/magic/MaybeArray.js +25 -0
- package/bin/whet/magic/RoutePathType.d.ts +9 -0
- package/bin/whet/magic/RoutePathType.js +48 -0
- package/bin/whet/magic/RouteType.d.ts +12 -0
- package/bin/whet/magic/RouteType.js +70 -0
- package/bin/whet/magic/StoneId.d.ts +5 -0
- package/bin/whet/magic/StoneId.js +32 -0
- package/bin/whet/route/Route.d.ts +15 -0
- package/bin/whet/route/Route.js +81 -0
- package/bin/whet/route/RouteResult.d.ts +22 -0
- package/bin/whet/route/RouteResult.js +25 -0
- package/bin/whet/route/Router.d.ts +33 -0
- package/bin/whet/route/Router.js +224 -0
- package/bin/whet/stones/Files.d.ts +28 -0
- package/bin/whet/stones/Files.js +86 -0
- package/bin/whet/stones/JsonStone.d.ts +33 -0
- package/bin/whet/stones/JsonStone.js +117 -0
- package/bin/whet/stones/RemoteFile.d.ts +28 -0
- package/bin/whet/stones/RemoteFile.js +71 -0
- package/bin/whet/stones/Server.d.ts +42 -0
- package/bin/whet/stones/Server.js +113 -0
- package/bin/whet/stones/Zip.d.ts +30 -0
- package/bin/whet/stones/Zip.js +111 -0
- package/bin/whet/stones/haxe/HaxeBuild.d.ts +34 -0
- package/bin/whet/stones/haxe/HaxeBuild.js +89 -0
- package/bin/whet/stones/haxe/Hxml.d.ts +102 -0
- package/bin/whet/stones/haxe/Hxml.js +348 -0
- package/bin/whet.d.ts +20 -0
- package/bin/whet.js +18 -0
- package/package.json +32 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {AnyStone} from "../Stone"
|
|
2
|
+
import {SourceData} from "../Source"
|
|
3
|
+
|
|
4
|
+
export declare class RouteResult {
|
|
5
|
+
constructor(serveId: string, sourceId: string, source: AnyStone)
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
Id under which this item is served by `Router`. Can be different from `sourceId`.
|
|
9
|
+
*/
|
|
10
|
+
serveId: string
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
Id under which this item is provided by the stone.
|
|
14
|
+
*/
|
|
15
|
+
sourceId: string
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
Stone providing this item.
|
|
19
|
+
*/
|
|
20
|
+
source: AnyStone
|
|
21
|
+
get(): Promise<SourceData>
|
|
22
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {Register} from "../../genes/Register.js"
|
|
2
|
+
|
|
3
|
+
const $global = Register.$global
|
|
4
|
+
|
|
5
|
+
export const RouteResult = Register.global("$hxClasses")["whet.route.RouteResult"] =
|
|
6
|
+
class RouteResult extends Register.inherits() {
|
|
7
|
+
new(serveId, sourceId, source) {
|
|
8
|
+
this.serveId = serveId;
|
|
9
|
+
this.sourceId = sourceId;
|
|
10
|
+
this.source = source;
|
|
11
|
+
}
|
|
12
|
+
get() {
|
|
13
|
+
var _gthis = this;
|
|
14
|
+
return this.source.getSource().then(function (data) {
|
|
15
|
+
return data.get(_gthis.sourceId);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
static get __name__() {
|
|
19
|
+
return "whet.route.RouteResult"
|
|
20
|
+
}
|
|
21
|
+
get __class__() {
|
|
22
|
+
return RouteResult
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {RouteResult} from "./RouteResult"
|
|
2
|
+
import {Route} from "./Route"
|
|
3
|
+
import {RoutePathType} from "../magic/RoutePathType"
|
|
4
|
+
import {SourceHash} from "../SourceHash"
|
|
5
|
+
|
|
6
|
+
export declare class Router {
|
|
7
|
+
constructor(routes?: null | RoutePathType)
|
|
8
|
+
protected routes: RoutePath[]
|
|
9
|
+
route(r: RoutePathType): void
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Find data sources routed under `id`. By default only single result is returned if `id`
|
|
13
|
+
* is not a directory, all results otherwise. This can be overriden by providing a second argument.
|
|
14
|
+
*/
|
|
15
|
+
find(id: string, firstOnly?: null | boolean): Promise<RouteResult[]>
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Get combined hash of all sources that would be found under supplied id.
|
|
19
|
+
*/
|
|
20
|
+
getHash(id: string, firstOnly?: null | boolean): Promise<SourceHash>
|
|
21
|
+
getHashOfEverything(): Promise<SourceHash>
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Save files filtered by `searchId` into provided `saveInto` folder.
|
|
25
|
+
*/
|
|
26
|
+
saveInto(searchId: string, saveInto: string, clearFirst?: boolean): Promise<any>
|
|
27
|
+
listContents(search?: string): Promise<string>
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export type RoutePath = {
|
|
31
|
+
route: Route,
|
|
32
|
+
routeUnder: string
|
|
33
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import {RoutePathType_Fields_} from "../magic/RoutePathType.js"
|
|
2
|
+
import {Utils} from "../Utils.js"
|
|
3
|
+
import {SourceId} from "../SourceId.js"
|
|
4
|
+
import {SourceHash} from "../SourceHash.js"
|
|
5
|
+
import * as Path__1 from "path"
|
|
6
|
+
import {Path} from "../../haxe/io/Path.js"
|
|
7
|
+
import {Register} from "../../genes/Register.js"
|
|
8
|
+
import {HxOverrides} from "../../HxOverrides.js"
|
|
9
|
+
|
|
10
|
+
const $global = Register.$global
|
|
11
|
+
|
|
12
|
+
export const Router = Register.global("$hxClasses")["whet.route.Router"] =
|
|
13
|
+
class Router extends Register.inherits() {
|
|
14
|
+
new(routes) {
|
|
15
|
+
this.routes = (routes != null) ? RoutePathType_Fields_.makeRoutePath(routes) : [];
|
|
16
|
+
}
|
|
17
|
+
route(r) {
|
|
18
|
+
var _g = 0;
|
|
19
|
+
var _g1 = RoutePathType_Fields_.makeRoutePath(r);
|
|
20
|
+
while (_g < _g1.length) this.routes.push(_g1[_g++]);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Find data sources routed under `id`. By default only single result is returned if `id`
|
|
25
|
+
* is not a directory, all results otherwise. This can be overriden by providing a second argument.
|
|
26
|
+
*/
|
|
27
|
+
find(id, firstOnly) {
|
|
28
|
+
var _gthis = this;
|
|
29
|
+
var sourceId;
|
|
30
|
+
var norm = "/" + Path.normalize((id.charAt(0) == "/") ? HxOverrides.substr(id, 1, null) : id);
|
|
31
|
+
sourceId = (id.lastIndexOf("/") == id.length - 1) ? Path.addTrailingSlash(norm) : norm;
|
|
32
|
+
return new Promise(function (res, rej) {
|
|
33
|
+
if (firstOnly == null) {
|
|
34
|
+
var norm = "/" + Path.normalize((sourceId.charAt(0) == "/") ? HxOverrides.substr(sourceId, 1, null) : sourceId);
|
|
35
|
+
var firstOnly1 = (sourceId.lastIndexOf("/") == sourceId.length - 1) ? Path.addTrailingSlash(norm) : norm;
|
|
36
|
+
var s = Path.addTrailingSlash(Path.directory(sourceId));
|
|
37
|
+
var norm = "/" + Path.normalize((s.charAt(0) == "/") ? HxOverrides.substr(s, 1, null) : s);
|
|
38
|
+
firstOnly = firstOnly1 != ((s.lastIndexOf("/") == s.length - 1) ? Path.addTrailingSlash(norm) : norm);
|
|
39
|
+
};
|
|
40
|
+
var result = [];
|
|
41
|
+
var _g = [];
|
|
42
|
+
var _g1 = 0;
|
|
43
|
+
var _g2 = _gthis.routes;
|
|
44
|
+
while (_g1 < _g2.length) {
|
|
45
|
+
var path = [_g2[_g1]];
|
|
46
|
+
++_g1;
|
|
47
|
+
_g.push(path[0].route.list().then((function (path) {
|
|
48
|
+
return function (list) {
|
|
49
|
+
var this1 = path[0].routeUnder;
|
|
50
|
+
var norm = "/" + Path.normalize((this1.charAt(0) == "/") ? HxOverrides.substr(this1, 1, null) : this1);
|
|
51
|
+
var tmp = (this1.lastIndexOf("/") == this1.length - 1) ? Path.addTrailingSlash(norm) : norm;
|
|
52
|
+
var s = Path.addTrailingSlash(Path.directory(this1));
|
|
53
|
+
var norm = "/" + Path.normalize((s.charAt(0) == "/") ? HxOverrides.substr(s, 1, null) : s);
|
|
54
|
+
if (tmp == ((s.lastIndexOf("/") == s.length - 1) ? Path.addTrailingSlash(norm) : norm)) {
|
|
55
|
+
var _g = 0;
|
|
56
|
+
while (_g < list.length) {
|
|
57
|
+
var item = list[_g];
|
|
58
|
+
++_g;
|
|
59
|
+
item.serveId = SourceId.getPutInDir(item.serveId, path[0].routeUnder);
|
|
60
|
+
var norm = "/" + Path.normalize((sourceId.charAt(0) == "/") ? HxOverrides.substr(sourceId, 1, null) : sourceId);
|
|
61
|
+
var tmp = (sourceId.lastIndexOf("/") == sourceId.length - 1) ? Path.addTrailingSlash(norm) : norm;
|
|
62
|
+
var s = Path.addTrailingSlash(Path.directory(sourceId));
|
|
63
|
+
var norm1 = "/" + Path.normalize((s.charAt(0) == "/") ? HxOverrides.substr(s, 1, null) : s);
|
|
64
|
+
if (tmp == ((s.lastIndexOf("/") == s.length - 1) ? Path.addTrailingSlash(norm1) : norm1)) {
|
|
65
|
+
var rel = SourceId.relativeTo(item.serveId, sourceId);
|
|
66
|
+
if (rel != null) {
|
|
67
|
+
item.serveId = rel;
|
|
68
|
+
result.push(item);
|
|
69
|
+
};
|
|
70
|
+
} else if (sourceId == item.serveId) {
|
|
71
|
+
var s1 = Path.withoutDirectory(sourceId);
|
|
72
|
+
var norm2 = "/" + Path.normalize((s1.charAt(0) == "/") ? HxOverrides.substr(s1, 1, null) : s1);
|
|
73
|
+
item.serveId = (s1.lastIndexOf("/") == s1.length - 1) ? Path.addTrailingSlash(norm2) : norm2;
|
|
74
|
+
result.push(item);
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
} else {
|
|
78
|
+
var _g = 0;
|
|
79
|
+
while (_g < list.length) {
|
|
80
|
+
var item = list[_g];
|
|
81
|
+
++_g;
|
|
82
|
+
item.serveId = path[0].routeUnder;
|
|
83
|
+
var norm = "/" + Path.normalize((sourceId.charAt(0) == "/") ? HxOverrides.substr(sourceId, 1, null) : sourceId);
|
|
84
|
+
var tmp = (sourceId.lastIndexOf("/") == sourceId.length - 1) ? Path.addTrailingSlash(norm) : norm;
|
|
85
|
+
var s = Path.addTrailingSlash(Path.directory(sourceId));
|
|
86
|
+
var norm1 = "/" + Path.normalize((s.charAt(0) == "/") ? HxOverrides.substr(s, 1, null) : s);
|
|
87
|
+
if (tmp == ((s.lastIndexOf("/") == s.length - 1) ? Path.addTrailingSlash(norm1) : norm1)) {
|
|
88
|
+
var rel = SourceId.relativeTo(item.serveId, sourceId);
|
|
89
|
+
if (rel != null) {
|
|
90
|
+
item.serveId = rel;
|
|
91
|
+
result.push(item);
|
|
92
|
+
};
|
|
93
|
+
} else if (sourceId == item.serveId) {
|
|
94
|
+
var s1 = Path.withoutDirectory(sourceId);
|
|
95
|
+
var norm2 = "/" + Path.normalize((s1.charAt(0) == "/") ? HxOverrides.substr(s1, 1, null) : s1);
|
|
96
|
+
item.serveId = (s1.lastIndexOf("/") == s1.length - 1) ? Path.addTrailingSlash(norm2) : norm2;
|
|
97
|
+
result.push(item);
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
})(path)));
|
|
103
|
+
};
|
|
104
|
+
Promise.all(_g).then(function (_) {
|
|
105
|
+
if (firstOnly && result.length > 1) {
|
|
106
|
+
result.length = 1;
|
|
107
|
+
};
|
|
108
|
+
res(result);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Get combined hash of all sources that would be found under supplied id.
|
|
115
|
+
*/
|
|
116
|
+
getHash(id, firstOnly) {
|
|
117
|
+
return this.find(id, firstOnly).then(function (items) {
|
|
118
|
+
var uniqueStones = [];
|
|
119
|
+
var _g = 0;
|
|
120
|
+
while (_g < items.length) {
|
|
121
|
+
var item = items[_g];
|
|
122
|
+
++_g;
|
|
123
|
+
if (uniqueStones.indexOf(item.source) == -1) {
|
|
124
|
+
uniqueStones.push(item.source);
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
var result = new Array(uniqueStones.length);
|
|
128
|
+
var _g = 0;
|
|
129
|
+
var _g1 = uniqueStones.length;
|
|
130
|
+
while (_g < _g1) {
|
|
131
|
+
var i = _g++;
|
|
132
|
+
result[i] = uniqueStones[i].getHash();
|
|
133
|
+
};
|
|
134
|
+
return Promise.all(result).then(function (hashes) {
|
|
135
|
+
return SourceHash.merge(...hashes);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
getHashOfEverything() {
|
|
140
|
+
var _this = this.routes;
|
|
141
|
+
var result = new Array(_this.length);
|
|
142
|
+
var _g = 0;
|
|
143
|
+
var _g1 = _this.length;
|
|
144
|
+
while (_g < _g1) {
|
|
145
|
+
var i = _g++;
|
|
146
|
+
var _this1 = _this[i].route.routes;
|
|
147
|
+
var result1 = new Array(_this1.length);
|
|
148
|
+
var _g2 = 0;
|
|
149
|
+
var _g3 = _this1.length;
|
|
150
|
+
while (_g2 < _g3) {
|
|
151
|
+
var i1 = _g2++;
|
|
152
|
+
result1[i1] = _this1[i1].stone.getHash();
|
|
153
|
+
};
|
|
154
|
+
result[i] = Promise.all(result1).then(function (hashes) {
|
|
155
|
+
return SourceHash.merge(...hashes);
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
return Promise.all(result).then(function (hashes) {
|
|
159
|
+
return SourceHash.merge(...hashes);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Save files filtered by `searchId` into provided `saveInto` folder.
|
|
165
|
+
*/
|
|
166
|
+
saveInto(searchId, saveInto, clearFirst) {
|
|
167
|
+
if (clearFirst == null) {
|
|
168
|
+
clearFirst = true;
|
|
169
|
+
};
|
|
170
|
+
var _gthis = this;
|
|
171
|
+
return ((clearFirst) ? Utils.deleteAll(saveInto) : Promise.resolve(null)).then(function (_) {
|
|
172
|
+
return _gthis.find(searchId);
|
|
173
|
+
}).then(function (result) {
|
|
174
|
+
var _g = [];
|
|
175
|
+
var _g1 = 0;
|
|
176
|
+
while (_g1 < result.length) {
|
|
177
|
+
var r = result[_g1];
|
|
178
|
+
++_g1;
|
|
179
|
+
var saveInto1 = saveInto;
|
|
180
|
+
var this1 = r.serveId;
|
|
181
|
+
var norm = "/" + Path.normalize(("/".charAt(0) == "/") ? HxOverrides.substr("/", 1, null) : "/");
|
|
182
|
+
var root = ("/".lastIndexOf("/") == "/".length - 1) ? Path.addTrailingSlash(norm) : norm;
|
|
183
|
+
var p = [Path__1.join(saveInto1, (root.length == 1) ? this1.substring(1) : root.substring(1, root.length - 1) + this1)];
|
|
184
|
+
_g.push(r.get().then((function (p) {
|
|
185
|
+
return function (src) {
|
|
186
|
+
return Utils.saveBytes(p[0], src.data);
|
|
187
|
+
};
|
|
188
|
+
})(p)));
|
|
189
|
+
};
|
|
190
|
+
return Promise.all(_g);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
listContents(search) {
|
|
194
|
+
if (search == null) {
|
|
195
|
+
search = "/";
|
|
196
|
+
};
|
|
197
|
+
return this.find(search).then(function (files) {
|
|
198
|
+
var result = new Array(files.length);
|
|
199
|
+
var _g = 0;
|
|
200
|
+
var _g1 = files.length;
|
|
201
|
+
while (_g < _g1) {
|
|
202
|
+
var i = _g++;
|
|
203
|
+
result[i] = files[i].serveId;
|
|
204
|
+
};
|
|
205
|
+
result.sort(function (a, b) {
|
|
206
|
+
if (a < b) {
|
|
207
|
+
return -1;
|
|
208
|
+
} else if (a > b) {
|
|
209
|
+
return 1;
|
|
210
|
+
} else {
|
|
211
|
+
return 0;
|
|
212
|
+
};
|
|
213
|
+
});
|
|
214
|
+
return result.join("\n");
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
static get __name__() {
|
|
218
|
+
return "whet.route.Router"
|
|
219
|
+
}
|
|
220
|
+
get __class__() {
|
|
221
|
+
return Router
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {StoneIdType} from "../magic/StoneId"
|
|
2
|
+
import {MaybeArray} from "../magic/MaybeArray"
|
|
3
|
+
import {CacheStrategy} from "../cache/Cache"
|
|
4
|
+
import {Stone} from "../Stone"
|
|
5
|
+
import {SourceHash} from "../SourceHash"
|
|
6
|
+
import {SourceData} from "../Source"
|
|
7
|
+
import {Project} from "../Project"
|
|
8
|
+
|
|
9
|
+
export declare class Files extends Stone<FilesConfig> {
|
|
10
|
+
constructor(config: FilesConfig)
|
|
11
|
+
protected generate(hash: SourceHash): Promise<SourceData[]>
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type FilesConfig = {
|
|
15
|
+
cacheStrategy?: null | CacheStrategy,
|
|
16
|
+
/**
|
|
17
|
+
Defaults to the Stone's class name.
|
|
18
|
+
*/
|
|
19
|
+
id?: null | StoneIdType,
|
|
20
|
+
/**
|
|
21
|
+
Can be either a file, or a directory that won't be recursed.
|
|
22
|
+
*/
|
|
23
|
+
paths: MaybeArray<string>,
|
|
24
|
+
/**
|
|
25
|
+
Defaults to the last instanced project.
|
|
26
|
+
*/
|
|
27
|
+
project?: null | Project
|
|
28
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {MaybeArray_Fields_} from "../magic/MaybeArray.js"
|
|
2
|
+
import {Stone} from "../Stone.js"
|
|
3
|
+
import {RootDir, SourceId} from "../SourceId.js"
|
|
4
|
+
import {SourceData} from "../Source.js"
|
|
5
|
+
import {Path} from "../../haxe/io/Path.js"
|
|
6
|
+
import {Register} from "../../genes/Register.js"
|
|
7
|
+
import * as Fs from "fs"
|
|
8
|
+
import {HxOverrides} from "../../HxOverrides.js"
|
|
9
|
+
|
|
10
|
+
const $global = Register.$global
|
|
11
|
+
|
|
12
|
+
export const Files = Register.global("$hxClasses")["whet.stones.Files"] =
|
|
13
|
+
class Files extends Register.inherits(Stone) {
|
|
14
|
+
new(config) {
|
|
15
|
+
super.new(config);
|
|
16
|
+
}
|
|
17
|
+
generate(hash) {
|
|
18
|
+
var _gthis = this;
|
|
19
|
+
var _g = MaybeArray_Fields_.makeArray(this.config.paths);
|
|
20
|
+
while (0 < _g.length) {
|
|
21
|
+
var pathString = _g[0];
|
|
22
|
+
var norm = "/" + Path.normalize((pathString.charAt(0) == "/") ? HxOverrides.substr(pathString, 1, null) : pathString);
|
|
23
|
+
var path = [(pathString.lastIndexOf("/") == pathString.length - 1) ? Path.addTrailingSlash(norm) : norm];
|
|
24
|
+
var tmp;
|
|
25
|
+
var norm1 = "/" + Path.normalize((path[0].charAt(0) == "/") ? HxOverrides.substr(path[0], 1, null) : path[0]);
|
|
26
|
+
var tmp1 = (path[0].lastIndexOf("/") == path[0].length - 1) ? Path.addTrailingSlash(norm1) : norm1;
|
|
27
|
+
var s = Path.addTrailingSlash(Path.directory(path[0]));
|
|
28
|
+
var norm2 = "/" + Path.normalize((s.charAt(0) == "/") ? HxOverrides.substr(s, 1, null) : s);
|
|
29
|
+
if (tmp1 == ((s.lastIndexOf("/") == s.length - 1) ? Path.addTrailingSlash(norm2) : norm2)) {
|
|
30
|
+
tmp = new Promise((function (path) {
|
|
31
|
+
return function (res, rej) {
|
|
32
|
+
var root = RootDir.fromProject(_gthis.project);
|
|
33
|
+
Fs.readdir((root.length == 1) ? path[0].substring(1) : root.substring(1, root.length - 1) + path[0], (function (path) {
|
|
34
|
+
return function (err, files) {
|
|
35
|
+
if (err != null) {
|
|
36
|
+
rej(err);
|
|
37
|
+
} else {
|
|
38
|
+
var res1 = res;
|
|
39
|
+
var _g = [];
|
|
40
|
+
var _g1 = 0;
|
|
41
|
+
while (_g1 < files.length) {
|
|
42
|
+
var file = files[_g1];
|
|
43
|
+
++_g1;
|
|
44
|
+
var norm = "/" + Path.normalize((file.charAt(0) == "/") ? HxOverrides.substr(file, 1, null) : file);
|
|
45
|
+
var filepath = SourceId.getPutInDir((file.lastIndexOf("/") == file.length - 1) ? Path.addTrailingSlash(norm) : norm, path[0]);
|
|
46
|
+
_g.push({"id": SourceId.relativeTo(filepath, path[0]), "pathId": filepath});
|
|
47
|
+
};
|
|
48
|
+
res1(_g);
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
})(path));
|
|
52
|
+
};
|
|
53
|
+
})(path));
|
|
54
|
+
} else {
|
|
55
|
+
var s1 = Path.withoutDirectory(path[0]);
|
|
56
|
+
var norm3 = "/" + Path.normalize((s1.charAt(0) == "/") ? HxOverrides.substr(s1, 1, null) : s1);
|
|
57
|
+
tmp = Promise.resolve([{"id": (s1.lastIndexOf("/") == s1.length - 1) ? Path.addTrailingSlash(norm3) : norm3, "pathId": path[0]}]);
|
|
58
|
+
};
|
|
59
|
+
return tmp.then((function () {
|
|
60
|
+
return function (files) {
|
|
61
|
+
var _g = [];
|
|
62
|
+
var _g1 = 0;
|
|
63
|
+
while (_g1 < files.length) {
|
|
64
|
+
var f = files[_g1];
|
|
65
|
+
++_g1;
|
|
66
|
+
var this1 = f.pathId;
|
|
67
|
+
var root = RootDir.fromProject(_gthis.project);
|
|
68
|
+
_g.push(SourceData.fromFile(f.id, (root.length == 1) ? this1.substring(1) : root.substring(1, root.length - 1) + this1, f.pathId));
|
|
69
|
+
};
|
|
70
|
+
return Promise.all(_g);
|
|
71
|
+
};
|
|
72
|
+
})());
|
|
73
|
+
};
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
static get __name__() {
|
|
77
|
+
return "whet.stones.Files"
|
|
78
|
+
}
|
|
79
|
+
static get __super__() {
|
|
80
|
+
return Stone
|
|
81
|
+
}
|
|
82
|
+
get __class__() {
|
|
83
|
+
return Files
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {StoneIdType} from "../magic/StoneId"
|
|
2
|
+
import {RouteType} from "../magic/RouteType"
|
|
3
|
+
import {MaybeArray} from "../magic/MaybeArray"
|
|
4
|
+
import {CacheStrategy} from "../cache/Cache"
|
|
5
|
+
import {Stone} from "../Stone"
|
|
6
|
+
import {SourceHash} from "../SourceHash"
|
|
7
|
+
import {SourceData} from "../Source"
|
|
8
|
+
import {Project} from "../Project"
|
|
9
|
+
|
|
10
|
+
export declare class JsonStone extends Stone<JsonStoneConfig> {
|
|
11
|
+
constructor(config: JsonStoneConfig)
|
|
12
|
+
data: {[key: string]: any}
|
|
13
|
+
addProjectData(): JsonStone
|
|
14
|
+
addMergeFiles(files: MaybeArray<RouteType>): JsonStone
|
|
15
|
+
protected generate(hash: SourceHash): Promise<SourceData[]>
|
|
16
|
+
protected generateHash(): Promise<SourceHash>
|
|
17
|
+
list(): Promise<string[]>
|
|
18
|
+
protected initConfig(): void
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type JsonStoneConfig = {
|
|
22
|
+
cacheStrategy?: null | CacheStrategy,
|
|
23
|
+
/**
|
|
24
|
+
Defaults to the Stone's class name.
|
|
25
|
+
*/
|
|
26
|
+
id?: null | StoneIdType,
|
|
27
|
+
mergeFiles?: null | MaybeArray<RouteType>,
|
|
28
|
+
name?: null | string,
|
|
29
|
+
/**
|
|
30
|
+
Defaults to the last instanced project.
|
|
31
|
+
*/
|
|
32
|
+
project?: null | Project
|
|
33
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import {RouteType_Fields_} from "../magic/RouteType.js"
|
|
2
|
+
import {MaybeArray_Fields_} from "../magic/MaybeArray.js"
|
|
3
|
+
import {Stone} from "../Stone.js"
|
|
4
|
+
import {SourceHash} from "../SourceHash.js"
|
|
5
|
+
import {SourceData} from "../Source.js"
|
|
6
|
+
import {Path} from "../../haxe/io/Path.js"
|
|
7
|
+
import {Register} from "../../genes/Register.js"
|
|
8
|
+
import {Reflect as Reflect__1} from "../../Reflect.js"
|
|
9
|
+
import {HxOverrides} from "../../HxOverrides.js"
|
|
10
|
+
|
|
11
|
+
const $global = Register.$global
|
|
12
|
+
|
|
13
|
+
export const JsonStone = Register.global("$hxClasses")["whet.stones.JsonStone"] =
|
|
14
|
+
class JsonStone extends Register.inherits(Stone) {
|
|
15
|
+
new(config) {
|
|
16
|
+
this.data = {};
|
|
17
|
+
super.new(config);
|
|
18
|
+
}
|
|
19
|
+
addProjectData() {
|
|
20
|
+
this.data["name"] = this.project.name;
|
|
21
|
+
this.data["id"] = this.project.id;
|
|
22
|
+
this.data["description"] = this.project.description;
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
addMergeFiles(files) {
|
|
26
|
+
this.config.mergeFiles = MaybeArray_Fields_.makeArray(this.config.mergeFiles).concat(MaybeArray_Fields_.makeArray(files));
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
generate(hash) {
|
|
30
|
+
var _gthis = this;
|
|
31
|
+
var obj = {};
|
|
32
|
+
var access = this.data;
|
|
33
|
+
var _g_keys = Reflect__1.fields(access);
|
|
34
|
+
var _g_index = 0;
|
|
35
|
+
while (_g_index < _g_keys.length) {
|
|
36
|
+
var key = _g_keys[_g_index++];
|
|
37
|
+
obj[key] = access[key];
|
|
38
|
+
};
|
|
39
|
+
var _this = MaybeArray_Fields_.makeArray(this.config.mergeFiles);
|
|
40
|
+
var result = new Array(_this.length);
|
|
41
|
+
var _g = 0;
|
|
42
|
+
var _g1 = _this.length;
|
|
43
|
+
while (_g < _g1) {
|
|
44
|
+
var i = _g++;
|
|
45
|
+
result[i] = RouteType_Fields_.makeRoute(_this[i]).getData();
|
|
46
|
+
};
|
|
47
|
+
return Promise.all(result).then(function (dataArr) {
|
|
48
|
+
var _g = 0;
|
|
49
|
+
while (_g < dataArr.length) {
|
|
50
|
+
var data = dataArr[_g];
|
|
51
|
+
++_g;
|
|
52
|
+
var _g1 = 0;
|
|
53
|
+
while (_g1 < data.length) {
|
|
54
|
+
var file = JSON.parse(data[_g1++].data.toString());
|
|
55
|
+
var _g_keys = Reflect__1.fields(file);
|
|
56
|
+
var _g_index = 0;
|
|
57
|
+
while (_g_index < _g_keys.length) {
|
|
58
|
+
var key = _g_keys[_g_index++];
|
|
59
|
+
obj[key] = file[key];
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
var s = _gthis.config.name;
|
|
64
|
+
var norm = "/" + Path.normalize((s.charAt(0) == "/") ? HxOverrides.substr(s, 1, null) : s);
|
|
65
|
+
return [SourceData.fromString((s.lastIndexOf("/") == s.length - 1) ? Path.addTrailingSlash(norm) : norm, JSON.stringify(obj, null, " "))];
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
generateHash() {
|
|
69
|
+
var _gthis = this;
|
|
70
|
+
var _this = MaybeArray_Fields_.makeArray(this.config.mergeFiles);
|
|
71
|
+
var result = new Array(_this.length);
|
|
72
|
+
var _g = 0;
|
|
73
|
+
var _g1 = _this.length;
|
|
74
|
+
while (_g < _g1) {
|
|
75
|
+
var i = _g++;
|
|
76
|
+
var _this1 = RouteType_Fields_.makeRoute(_this[i]).routes;
|
|
77
|
+
var result1 = new Array(_this1.length);
|
|
78
|
+
var _g2 = 0;
|
|
79
|
+
var _g3 = _this1.length;
|
|
80
|
+
while (_g2 < _g3) {
|
|
81
|
+
var i1 = _g2++;
|
|
82
|
+
result1[i1] = _this1[i1].stone.getHash();
|
|
83
|
+
};
|
|
84
|
+
result[i] = Promise.all(result1).then(function (hashes) {
|
|
85
|
+
return SourceHash.merge(...hashes);
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
return Promise.all(result).then(function (hashes) {
|
|
89
|
+
hashes.push(SourceHash.fromString(JSON.stringify(_gthis.data)));
|
|
90
|
+
return SourceHash.merge(...hashes);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
list() {
|
|
94
|
+
var s = this.config.name;
|
|
95
|
+
var norm = "/" + Path.normalize((s.charAt(0) == "/") ? HxOverrides.substr(s, 1, null) : s);
|
|
96
|
+
return Promise.resolve([(s.lastIndexOf("/") == s.length - 1) ? Path.addTrailingSlash(norm) : norm]);
|
|
97
|
+
}
|
|
98
|
+
initConfig() {
|
|
99
|
+
if (this.config.name == null) {
|
|
100
|
+
this.config.name = "data.json";
|
|
101
|
+
};
|
|
102
|
+
if (this.config.mergeFiles == null) {
|
|
103
|
+
this.config.mergeFiles = [];
|
|
104
|
+
};
|
|
105
|
+
super.initConfig();
|
|
106
|
+
}
|
|
107
|
+
static get __name__() {
|
|
108
|
+
return "whet.stones.JsonStone"
|
|
109
|
+
}
|
|
110
|
+
static get __super__() {
|
|
111
|
+
return Stone
|
|
112
|
+
}
|
|
113
|
+
get __class__() {
|
|
114
|
+
return JsonStone
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {StoneIdType} from "../magic/StoneId"
|
|
2
|
+
import {CacheStrategy} from "../cache/Cache"
|
|
3
|
+
import {Stone} from "../Stone"
|
|
4
|
+
import {SourceHash} from "../SourceHash"
|
|
5
|
+
import {SourceData} from "../Source"
|
|
6
|
+
import {Project} from "../Project"
|
|
7
|
+
|
|
8
|
+
export declare class RemoteFile extends Stone<RemoteFileConfig> {
|
|
9
|
+
constructor(config: RemoteFileConfig)
|
|
10
|
+
protected initConfig(): void
|
|
11
|
+
protected generate(hash: SourceHash): Promise<SourceData[]>
|
|
12
|
+
list(): Promise<string[]>
|
|
13
|
+
generateHash(): Promise<SourceHash>
|
|
14
|
+
protected getId(): string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type RemoteFileConfig = {
|
|
18
|
+
cacheStrategy?: null | CacheStrategy,
|
|
19
|
+
/**
|
|
20
|
+
Defaults to the Stone's class name.
|
|
21
|
+
*/
|
|
22
|
+
id?: null | StoneIdType,
|
|
23
|
+
/**
|
|
24
|
+
Defaults to the last instanced project.
|
|
25
|
+
*/
|
|
26
|
+
project?: null | Project,
|
|
27
|
+
url: string
|
|
28
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import {CacheStrategy, CacheDurability} from "../cache/Cache.js"
|
|
2
|
+
import {Stone} from "../Stone.js"
|
|
3
|
+
import {SourceHash} from "../SourceHash.js"
|
|
4
|
+
import {SourceData} from "../Source.js"
|
|
5
|
+
import {Log} from "../Log.js"
|
|
6
|
+
import {URL} from "url"
|
|
7
|
+
import * as Path from "path"
|
|
8
|
+
import * as Https from "https"
|
|
9
|
+
import {Path as Path__1} from "../../haxe/io/Path.js"
|
|
10
|
+
import {Register} from "../../genes/Register.js"
|
|
11
|
+
import {Buffer} from "buffer"
|
|
12
|
+
import {HxOverrides} from "../../HxOverrides.js"
|
|
13
|
+
|
|
14
|
+
const $global = Register.$global
|
|
15
|
+
|
|
16
|
+
export const RemoteFile = Register.global("$hxClasses")["whet.stones.RemoteFile"] =
|
|
17
|
+
class RemoteFile extends Register.inherits(Stone) {
|
|
18
|
+
new(config) {
|
|
19
|
+
super.new(config);
|
|
20
|
+
}
|
|
21
|
+
initConfig() {
|
|
22
|
+
if (this.config.cacheStrategy == null) {
|
|
23
|
+
this.config.cacheStrategy = CacheStrategy.InFile(CacheDurability.KeepForever);
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
generate(hash) {
|
|
27
|
+
var _gthis = this;
|
|
28
|
+
Log.log(30, ...["Downloading file.", {"url": this.config.url}]);
|
|
29
|
+
return new Promise(function (res, rej) {
|
|
30
|
+
Https.get(_gthis.config.url, function (response) {
|
|
31
|
+
if (response.statusCode < 200 || response.statusCode >= 300) {
|
|
32
|
+
response.resume();
|
|
33
|
+
throw new Error("Error downloading file. " + response.statusCode + " – " + response.statusMessage);
|
|
34
|
+
};
|
|
35
|
+
var bufs = [];
|
|
36
|
+
response.on("data", function (d) {
|
|
37
|
+
return bufs.push(d);
|
|
38
|
+
});
|
|
39
|
+
response.on("end", function () {
|
|
40
|
+
var data = Buffer.concat(bufs);
|
|
41
|
+
res([SourceData.fromBytes(_gthis.getId(), data)]);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
list() {
|
|
47
|
+
return Promise.resolve([this.getId()]);
|
|
48
|
+
}
|
|
49
|
+
generateHash() {
|
|
50
|
+
return Promise.resolve(SourceHash.fromString(this.config.url));
|
|
51
|
+
}
|
|
52
|
+
getId() {
|
|
53
|
+
var s = Path.basename(new URL(this.config.url).pathname);
|
|
54
|
+
var norm = "/" + Path__1.normalize((s.charAt(0) == "/") ? HxOverrides.substr(s, 1, null) : s);
|
|
55
|
+
if (s.lastIndexOf("/") == s.length - 1) {
|
|
56
|
+
return Path__1.addTrailingSlash(norm);
|
|
57
|
+
} else {
|
|
58
|
+
return norm;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
static get __name__() {
|
|
62
|
+
return "whet.stones.RemoteFile"
|
|
63
|
+
}
|
|
64
|
+
static get __super__() {
|
|
65
|
+
return Stone
|
|
66
|
+
}
|
|
67
|
+
get __class__() {
|
|
68
|
+
return RemoteFile
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|