diff --git a/deno.lock b/deno.lock index 050439f..e8877af 100644 --- a/deno.lock +++ b/deno.lock @@ -35,6 +35,7 @@ } }, "redirects": { + "https://deno.land/std/fs/mod.ts": "https://deno.land/std@0.224.0/fs/mod.ts", "https://esm.sh/@bridge-editor/common-utils@^0.3.3?target=denonext": "https://esm.sh/@bridge-editor/common-utils@0.3.3?target=denonext", "https://esm.sh/@bridge-editor/js-runtime@^0.4.5?target=denonext": "https://esm.sh/@bridge-editor/js-runtime@0.4.5?target=denonext", "https://esm.sh/@bridge-editor/mc-project-core@^0.5.0-alpha.2?target=denonext": "https://esm.sh/@bridge-editor/mc-project-core@0.5.0-alpha.2?target=denonext", @@ -53,6 +54,70 @@ "https://esm.sh/sourcemap-codec@^1.4.8?target=denonext": "https://esm.sh/sourcemap-codec@1.4.8?target=denonext" }, "remote": { + "https://deno.land/std@0.224.0/assert/assert.ts": "09d30564c09de846855b7b071e62b5974b001bb72a4b797958fe0660e7849834", + "https://deno.land/std@0.224.0/assert/assertion_error.ts": "ba8752bd27ebc51f723702fac2f54d3e94447598f54264a6653d6413738a8917", + "https://deno.land/std@0.224.0/fs/_create_walk_entry.ts": "5d9d2aaec05bcf09a06748b1684224d33eba7a4de24cf4cf5599991ca6b5b412", + "https://deno.land/std@0.224.0/fs/_get_file_info_type.ts": "da7bec18a7661dba360a1db475b826b18977582ce6fc9b25f3d4ee0403fe8cbd", + "https://deno.land/std@0.224.0/fs/_is_same_path.ts": "709c95868345fea051c58b9e96af95cff94e6ae98dfcff2b66dee0c212c4221f", + "https://deno.land/std@0.224.0/fs/_is_subdir.ts": "c68b309d46cc8568ed83c000f608a61bbdba0943b7524e7a30f9e450cf67eecd", + "https://deno.land/std@0.224.0/fs/_to_path_string.ts": "29bfc9c6c112254961d75cbf6ba814d6de5349767818eb93090cecfa9665591e", + "https://deno.land/std@0.224.0/fs/copy.ts": "7ab12a16adb65d155d4943c88081ca16ce3b0b5acada64c1ce93800653678039", + "https://deno.land/std@0.224.0/fs/empty_dir.ts": "e400e96e1d2c8c558a5a1712063bd43939e00619c1d1cc29959babc6f1639418", + "https://deno.land/std@0.224.0/fs/ensure_dir.ts": "51a6279016c65d2985f8803c848e2888e206d1b510686a509fa7cc34ce59d29f", + "https://deno.land/std@0.224.0/fs/ensure_file.ts": "67608cf550529f3d4aa1f8b6b36bf817bdc40b14487bf8f60e61cbf68f507cf3", + "https://deno.land/std@0.224.0/fs/ensure_link.ts": "5c98503ebfa9cc05e2f2efaa30e91e60b4dd5b43ebbda82f435c0a5c6e3ffa01", + "https://deno.land/std@0.224.0/fs/ensure_symlink.ts": "cafe904cebacb9a761977d6dbf5e3af938be946a723bb394080b9a52714fafe4", + "https://deno.land/std@0.224.0/fs/eol.ts": "18c4ac009d0318504c285879eb7f47942643f13619e0ff070a0edc59353306bd", + "https://deno.land/std@0.224.0/fs/exists.ts": "3d38cb7dcbca3cf313be343a7b8af18a87bddb4b5ca1bd2314be12d06533b50f", + "https://deno.land/std@0.224.0/fs/expand_glob.ts": "2e428d90acc6676b2aa7b5c78ef48f30641b13f1fe658e7976c9064fb4b05309", + "https://deno.land/std@0.224.0/fs/mod.ts": "c25e6802cbf27f3050f60b26b00c2d8dba1cb7fcdafe34c66006a7473b7b34d4", + "https://deno.land/std@0.224.0/fs/move.ts": "ca205d848908d7f217353bc5c623627b1333490b8b5d3ef4cab600a700c9bd8f", + "https://deno.land/std@0.224.0/fs/walk.ts": "cddf87d2705c0163bff5d7767291f05b0f46ba10b8b28f227c3849cace08d303", + "https://deno.land/std@0.224.0/path/_common/assert_path.ts": "dbdd757a465b690b2cc72fc5fb7698c51507dec6bfafce4ca500c46b76ff7bd8", + "https://deno.land/std@0.224.0/path/_common/basename.ts": "569744855bc8445f3a56087fd2aed56bdad39da971a8d92b138c9913aecc5fa2", + "https://deno.land/std@0.224.0/path/_common/constants.ts": "dc5f8057159f4b48cd304eb3027e42f1148cf4df1fb4240774d3492b5d12ac0c", + "https://deno.land/std@0.224.0/path/_common/dirname.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", + "https://deno.land/std@0.224.0/path/_common/from_file_url.ts": "d672bdeebc11bf80e99bf266f886c70963107bdd31134c4e249eef51133ceccf", + "https://deno.land/std@0.224.0/path/_common/glob_to_reg_exp.ts": "6cac16d5c2dc23af7d66348a7ce430e5de4e70b0eede074bdbcf4903f4374d8d", + "https://deno.land/std@0.224.0/path/_common/normalize.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", + "https://deno.land/std@0.224.0/path/_common/normalize_string.ts": "33edef773c2a8e242761f731adeb2bd6d683e9c69e4e3d0092985bede74f4ac3", + "https://deno.land/std@0.224.0/path/_common/strip_trailing_separators.ts": "7024a93447efcdcfeaa9339a98fa63ef9d53de363f1fbe9858970f1bba02655a", + "https://deno.land/std@0.224.0/path/_os.ts": "8fb9b90fb6b753bd8c77cfd8a33c2ff6c5f5bc185f50de8ca4ac6a05710b2c15", + "https://deno.land/std@0.224.0/path/basename.ts": "7ee495c2d1ee516ffff48fb9a93267ba928b5a3486b550be73071bc14f8cc63e", + "https://deno.land/std@0.224.0/path/constants.ts": "0c206169ca104938ede9da48ac952de288f23343304a1c3cb6ec7625e7325f36", + "https://deno.land/std@0.224.0/path/dirname.ts": "85bd955bf31d62c9aafdd7ff561c4b5fb587d11a9a5a45e2b01aedffa4238a7c", + "https://deno.land/std@0.224.0/path/from_file_url.ts": "911833ae4fd10a1c84f6271f36151ab785955849117dc48c6e43b929504ee069", + "https://deno.land/std@0.224.0/path/glob_to_regexp.ts": "7f30f0a21439cadfdae1be1bf370880b415e676097fda584a63ce319053b5972", + "https://deno.land/std@0.224.0/path/is_absolute.ts": "4791afc8bfd0c87f0526eaa616b0d16e7b3ab6a65b62942e50eac68de4ef67d7", + "https://deno.land/std@0.224.0/path/is_glob.ts": "a65f6195d3058c3050ab905705891b412ff942a292bcbaa1a807a74439a14141", + "https://deno.land/std@0.224.0/path/join.ts": "ae2ec5ca44c7e84a235fd532e4a0116bfb1f2368b394db1c4fb75e3c0f26a33a", + "https://deno.land/std@0.224.0/path/join_globs.ts": "5b3bf248b93247194f94fa6947b612ab9d3abd571ca8386cf7789038545e54a0", + "https://deno.land/std@0.224.0/path/normalize.ts": "4155743ccceeed319b350c1e62e931600272fad8ad00c417b91df093867a8352", + "https://deno.land/std@0.224.0/path/posix/_util.ts": "1e3937da30f080bfc99fe45d7ed23c47dd8585c5e473b2d771380d3a6937cf9d", + "https://deno.land/std@0.224.0/path/posix/basename.ts": "d2fa5fbbb1c5a3ab8b9326458a8d4ceac77580961b3739cd5bfd1d3541a3e5f0", + "https://deno.land/std@0.224.0/path/posix/constants.ts": "93481efb98cdffa4c719c22a0182b994e5a6aed3047e1962f6c2c75b7592bef1", + "https://deno.land/std@0.224.0/path/posix/dirname.ts": "76cd348ffe92345711409f88d4d8561d8645353ac215c8e9c80140069bf42f00", + "https://deno.land/std@0.224.0/path/posix/from_file_url.ts": "951aee3a2c46fd0ed488899d024c6352b59154c70552e90885ed0c2ab699bc40", + "https://deno.land/std@0.224.0/path/posix/glob_to_regexp.ts": "76f012fcdb22c04b633f536c0b9644d100861bea36e9da56a94b9c589a742e8f", + "https://deno.land/std@0.224.0/path/posix/is_absolute.ts": "cebe561ad0ae294f0ce0365a1879dcfca8abd872821519b4fcc8d8967f888ede", + "https://deno.land/std@0.224.0/path/posix/join.ts": "7fc2cb3716aa1b863e990baf30b101d768db479e70b7313b4866a088db016f63", + "https://deno.land/std@0.224.0/path/posix/join_globs.ts": "a9475b44645feddceb484ee0498e456f4add112e181cb94042cdc6d47d1cdd25", + "https://deno.land/std@0.224.0/path/posix/normalize.ts": "baeb49816a8299f90a0237d214cef46f00ba3e95c0d2ceb74205a6a584b58a91", + "https://deno.land/std@0.224.0/path/posix/normalize_glob.ts": "9c87a829b6c0f445d03b3ecadc14492e2864c3ebb966f4cea41e98326e4435c6", + "https://deno.land/std@0.224.0/path/posix/resolve.ts": "08b699cfeee10cb6857ccab38fa4b2ec703b0ea33e8e69964f29d02a2d5257cf", + "https://deno.land/std@0.224.0/path/resolve.ts": "a6f977bdb4272e79d8d0ed4333e3d71367cc3926acf15ac271f1d059c8494d8d", + "https://deno.land/std@0.224.0/path/windows/_util.ts": "d5f47363e5293fced22c984550d5e70e98e266cc3f31769e1710511803d04808", + "https://deno.land/std@0.224.0/path/windows/basename.ts": "6bbc57bac9df2cec43288c8c5334919418d784243a00bc10de67d392ab36d660", + "https://deno.land/std@0.224.0/path/windows/constants.ts": "5afaac0a1f67b68b0a380a4ef391bf59feb55856aa8c60dfc01bd3b6abb813f5", + "https://deno.land/std@0.224.0/path/windows/dirname.ts": "33e421be5a5558a1346a48e74c330b8e560be7424ed7684ea03c12c21b627bc9", + "https://deno.land/std@0.224.0/path/windows/from_file_url.ts": "ced2d587b6dff18f963f269d745c4a599cf82b0c4007356bd957cb4cb52efc01", + "https://deno.land/std@0.224.0/path/windows/glob_to_regexp.ts": "e45f1f89bf3fc36f94ab7b3b9d0026729829fabc486c77f414caebef3b7304f8", + "https://deno.land/std@0.224.0/path/windows/is_absolute.ts": "4a8f6853f8598cf91a835f41abed42112cebab09478b072e4beb00ec81f8ca8a", + "https://deno.land/std@0.224.0/path/windows/join.ts": "8d03530ab89195185103b7da9dfc6327af13eabdcd44c7c63e42e27808f50ecf", + "https://deno.land/std@0.224.0/path/windows/join_globs.ts": "a9475b44645feddceb484ee0498e456f4add112e181cb94042cdc6d47d1cdd25", + "https://deno.land/std@0.224.0/path/windows/normalize.ts": "78126170ab917f0ca355a9af9e65ad6bfa5be14d574c5fb09bb1920f52577780", + "https://deno.land/std@0.224.0/path/windows/normalize_glob.ts": "9c87a829b6c0f445d03b3ecadc14492e2864c3ebb966f4cea41e98326e4435c6", + "https://deno.land/std@0.224.0/path/windows/resolve.ts": "8dae1dadfed9d46ff46cc337c9525c0c7d959fb400a6308f34595c45bdca1972", "https://esm.sh/@bridge-editor/common-utils@0.3.3/denonext/common-utils.mjs": "74445c7dc6158d701fd24e1c59e586d1c24432c4a6006e169865856116a9f5d1", "https://esm.sh/@bridge-editor/common-utils@0.3.3?target=denonext": "041dff997849a71eb7bde4dfe97fed3fe83bf1ae0b390cd725916038d29a4597", "https://esm.sh/@bridge-editor/dash-compiler@0.11.7": "9022b115079e7eba6c29b2ce64e5cce3f4609bf37ae75be70dcceff20ee0931c", diff --git a/src/CLI.ts b/src/CLI.ts index d9d5544..15846b9 100644 --- a/src/CLI.ts +++ b/src/CLI.ts @@ -3,6 +3,7 @@ import { CLIWatcher } from "./CLIWatcher.ts"; import { comMojangFolder, previewComMojangFolder } from "./comMojangFolder.ts"; import { Dash, isMatch } from "./deps.ts"; import { DenoFileSystem } from "./FileSystem.ts"; +import { getLocalData, saveLocalData, tryInvalidateLocalData } from "./LocalCache.ts"; import { FileTypeImpl, PackTypeImpl } from "./McProjectCore.ts"; interface IDashOptions { @@ -25,13 +26,28 @@ export class CLI { mode, verbose: true, - requestJsonData: (dataPath: string) => - fetch( + requestJsonData: async (dataPath: string) => { + const cached = await getLocalData(dataPath); + + if (cached) { + try { + return JSON.parse(cached); + } catch { + // empty + } + } + + const data = await fetch( dataPath.replace( "data/", "https://raw.githubusercontent.com/bridge-core/editor-packages/main/", ), - ).then((resp) => resp.json()), + ).then((resp) => resp.json()); + + saveLocalData(dataPath, JSON.stringify(data)); + + return data; + }, }); await dash.setup(); @@ -64,13 +80,15 @@ export class CLI { async build(options: IDashOptions) { this.verifyOptions(options); + await tryInvalidateLocalData(); const dash = await this.createDashService(options); await dash.build(); } async watch(options: IDashOptions) { this.verifyOptions(options); - const dash = await this.createDashService(options); + await tryInvalidateLocalData(); + const dash = await this.createDashService(options); await dash.build(); await new CLIWatcher(dash).watch(options.reload); } diff --git a/src/LocalCache.ts b/src/LocalCache.ts new file mode 100644 index 0000000..b072391 --- /dev/null +++ b/src/LocalCache.ts @@ -0,0 +1,71 @@ +import { fs, path } from "./deps.ts"; + +export async function tryInvalidateLocalData() { + const localDataPath = await getLocalDataPath(); + + if (!localDataPath) return; + + try { + let time = 0; + + const timestampFilePath = path.join(localDataPath, ".timestamp"); + + if (await fs.exists(timestampFilePath)) { + const lastUpdatedTimestamp = await Deno.readTextFile(timestampFilePath); + + time = parseInt(lastUpdatedTimestamp); + } + + const now = Date.now(); + + if (now - time > 1000 * 60 * 60 * 24) { + console.log("Invalidating local cache of remote data!"); + + await fs.emptyDir(localDataPath); + } + } catch { + // empty + } +} + +export async function getLocalDataPath(): Promise { + const userDir = Deno.env.get("HOME") || Deno.env.get("USERPROFILE"); + + if (!userDir) return undefined; + + const appDataPath = path.join(userDir, ".dash"); + + await fs.ensureDir(appDataPath); + + return appDataPath; +} + +export async function saveLocalData(filePath: string, content: string) { + const localDataPath = await getLocalDataPath(); + + if (!localDataPath) return; + + const fullPath = path.join(localDataPath, filePath); + + await fs.ensureDir(path.dirname(fullPath)); + + await Deno.writeTextFile(fullPath, content); + + const timestampFilePath = path.join(localDataPath, ".timestamp"); + + if (!await fs.exists(timestampFilePath)) await Deno.writeTextFile(timestampFilePath, Date.now().toString()); +} + +export async function getLocalData(filePath: string): Promise { + const localDataPath = await getLocalDataPath(); + + if (!localDataPath) return; + + const fullPath = path.join(localDataPath, filePath); + + try { + return await Deno.readTextFile(fullPath); + } catch { + return; + } +} diff --git a/src/McProjectCore.ts b/src/McProjectCore.ts index 55c221a..8e58a3a 100644 --- a/src/McProjectCore.ts +++ b/src/McProjectCore.ts @@ -1,10 +1,25 @@ import { FileType, IFileType, PackType } from "./deps.ts"; +import { getLocalData, saveLocalData } from "./LocalCache.ts"; export class PackTypeImpl extends PackType { async setup() { + const cached = await getLocalData("packDefinitions.json"); + + if (cached) { + try { + this.packTypes = JSON.parse(cached); + + return; + } catch { + // empty + } + } + this.packTypes = await fetch( "https://raw.githubusercontent.com/bridge-core/editor-packages/main/packages/minecraftBedrock/packDefinitions.json", ).then((resp) => resp.json()); + + saveLocalData("packDefinitions.json", JSON.stringify(this.packTypes)); } } export class FileTypeImpl extends FileType { @@ -12,9 +27,24 @@ export class FileTypeImpl extends FileType { async setup() { this._cache.clear(); + + const cached = await getLocalData("fileDefinitions.json"); + + if (cached) { + try { + this.fileTypes = JSON.parse(cached); + + return; + } catch { + // empty + } + } + this.fileTypes = await fetch( "https://raw.githubusercontent.com/bridge-core/editor-packages/main/dist/minecraftBedrock/fileDefinitions.json", ).then((resp) => resp.json()); + + saveLocalData("fileDefinitions.json", JSON.stringify(this.fileTypes)); } override addPluginFileType(fileDef: IFileType) { diff --git a/src/deps.ts b/src/deps.ts index cc9d1e2..0a4c12e 100644 --- a/src/deps.ts +++ b/src/deps.ts @@ -1,4 +1,5 @@ export * as path from "jsr:@std/path"; +export * as fs from "https://deno.land/std/fs/mod.ts"; export { FileType, type IFileType,