penguin/AstroJS

Javascript framework for my blog

commit a912d45b9aae06c1e4728c482bdbed27b8417db5

author斟酌 鵬兄 <tgckpg@gmail.com>
date2026-06-14T23:12:40Z
subjectMigrate old externs 5/x
commit a912d45b9aae06c1e4728c482bdbed27b8417db5
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2026-06-14T23:12:40Z

    Migrate old externs 5/x
---
 README.md                                          | 16 ++----------
 botanjs/src/Astro/Blog/AstroEdit/Draft.js          |  2 +-
 botanjs/src/Astro/Blog/AstroEdit/Flag.js           |  2 +-
 botanjs/src/Astro/Blog/AstroEdit/SiteLibrary.js    |  2 ++
 .../src/Astro/Blog/AstroEdit/SmartInput/_this.js   |  2 +-
 botanjs/src/Astro/Blog/AstroEdit/_this.js          | 14 +++++-----
 botanjs/src/Components/Vim/VimArea.js              |  1 -
 botanjs/src/_this.js                               |  4 +--
 .../src/externs/Astro.Blog.AstroEdit.Article.js    |  8 ++++--
 botanjs/src/externs/Astro.Blog.AstroEdit.Draft.js  |  6 +++++
 botanjs/src/externs/Astro.Blog.AstroEdit.Flag.js   |  8 ++++++
 .../src/externs/Astro.Blog.AstroEdit.IPlugin.js    | 24 ++++++++++++-----
 .../externs/Astro.Blog.AstroEdit.SiteLibrary.js    |  7 +++++
 .../src/externs/Astro.Blog.AstroEdit.Uploader.js   |  5 ++++
 .../src/externs/Astro.Blog.AstroEdit.Visualizer.js |  8 ++++--
 botanjs/src/externs/BotanEvent.js                  | 26 +++++++++++--------
 botanjs/src/externs/Components.Vim.VimArea.js      |  4 ++-
 botanjs/src/externs/System.utils.js                | 30 ++++++++++++++++------
 botanjs/src/externs/_AstConf_.AstroEdit.js         | 21 ++++++++-------
 resolver-go/cmd/api-server/main.go                 |  2 +-
 resolver-go/internal/generated/buildinfo_gen.go    |  2 +-
 resolver-go/internal/generated/classmap_gen.go     | 24 ++++++++---------
 resolver-go/internal/generated/externs_gen.go      |  4 +++
 resolver-go/internal/resolver/resolver.go          | 17 ++++++++++--
 24 files changed, 153 insertions(+), 86 deletions(-)

diff --git a/README.md b/README.md
index 39eca40..4e89b9c 100644
--- a/README.md
+++ b/README.md
@@ -3,23 +3,11 @@
 
 The current backend Js/Css services for [my blog](https://blog.astropenguin.net)
 
-### Try it - Docker for windows (using windows container with nanoserver)
-- docker -f windows/docker-compose.yml build
-- docker -f windows/docker-compose.yml up
+### Try it
+`make build`
 
 ### Features
 - Compressable by Closure Compiler (Advanced Compression)
 - Python-like, class oriented syntax structure
 - Everything is merged into one file for that page
 - css class inheritance
-
-### Documentation
-- Will be added later
-
-### Prerequisties
-- python3
-- virtualenv ( optional )
-- pip install Flask
-- pip install Celery
-- pip install redis
-- pip install compressinja
diff --git a/botanjs/src/Astro/Blog/AstroEdit/Draft.js b/botanjs/src/Astro/Blog/AstroEdit/Draft.js
index e3b5f9e..b7d40e1 100644
--- a/botanjs/src/Astro/Blog/AstroEdit/Draft.js
+++ b/botanjs/src/Astro/Blog/AstroEdit/Draft.js
@@ -13,7 +13,7 @@
 	/** @param {Astro.Blog.AstroEdit.Article} article */
 	var Draft = function ( article, draftsUri )
 	{
-		/** @type {Astro.Blog.AstroEdit.Article} */
+		/** @type {typeof Astro.Blog.AstroEdit.Article} */
 		var Article = ns[ NS_INVOKE ]( "Article" );
 
 		if ( !( article instanceof Article ) ) return;
diff --git a/botanjs/src/Astro/Blog/AstroEdit/Flag.js b/botanjs/src/Astro/Blog/AstroEdit/Flag.js
index b6015b4..59fbd01 100644
--- a/botanjs/src/Astro/Blog/AstroEdit/Flag.js
+++ b/botanjs/src/Astro/Blog/AstroEdit/Flag.js
@@ -182,7 +182,7 @@
 		}
 	}
 
-	Flag.prototype.getSetData = function () {	};
+	Flag.prototype.getData = function () { };
 	Flag.prototype.setForView = function ( flagList ) {	};
 
 	ns[ NS_EXPORT ]( EX_CLASS, "Flag", Flag );
diff --git a/botanjs/src/Astro/Blog/AstroEdit/SiteLibrary.js b/botanjs/src/Astro/Blog/AstroEdit/SiteLibrary.js
index 869af25..f9e4d6d 100644
--- a/botanjs/src/Astro/Blog/AstroEdit/SiteLibrary.js
+++ b/botanjs/src/Astro/Blog/AstroEdit/SiteLibrary.js
@@ -762,6 +762,8 @@
 		Dand.id( "asl_refresh", true ).addEventListener( "click", function( e ) { refreshCanvas( 0 ); } );
 		new IDOMObject( document ).addEventListeners([ dKeyUp, dKeyDown ]);
 		stage.addEventListener(showLibrary);
+
+		this.stage = stage;
 	};
 
 	ns[ NS_EXPORT ]( EX_CLASS, "SiteLibrary", SiteLibrary );
diff --git a/botanjs/src/Astro/Blog/AstroEdit/SmartInput/_this.js b/botanjs/src/Astro/Blog/AstroEdit/SmartInput/_this.js
index 1f410b7..3b2ad7a 100644
--- a/botanjs/src/Astro/Blog/AstroEdit/SmartInput/_this.js
+++ b/botanjs/src/Astro/Blog/AstroEdit/SmartInput/_this.js
@@ -69,6 +69,7 @@
 		this.title = title;
 		this.desc = desc;
 		this.__cands = [];
+		/** @type Array<Astro.Blog.AstroEdit.SmartInput.Definition> */
 		this.__defs = defs || {};
 		this.Empty = !defs;
 	};
@@ -79,7 +80,6 @@
 
 		for( var i in this.__defs )
 		{
-			/** @param {Astro.Blog.AstroEdit.SmartInput.Definition} */
 			var c = this.__defs[i];
 			this.__cands.push( Dand.wrapc( "cn", [ i, Dand.wrapc( "desc", c.desc ) ], new DataKey( "key", i ) ) );
 		}
diff --git a/botanjs/src/Astro/Blog/AstroEdit/_this.js b/botanjs/src/Astro/Blog/AstroEdit/_this.js
index 754fc6b..168bbe8 100644
--- a/botanjs/src/Astro/Blog/AstroEdit/_this.js
+++ b/botanjs/src/Astro/Blog/AstroEdit/_this.js
@@ -11,19 +11,19 @@
 	var Bootstrap                                  = __import( "Astro.Bootstrap" );
 	/** @type {Astro.Blog.Config} */
 	var Config                                     = __import( "Astro.Blog.Config" );
-	/** @type {Astro.Blog.AstroEdit.Article} */
+	/** @type {typeof Astro.Blog.AstroEdit.Article} */
 	var Article                                    = __import( "Astro.Blog.AstroEdit.Article" );
-	/** @type {Astro.Blog.AstroEdit.Draft} */
+	/** @type {typeof Astro.Blog.AstroEdit.Draft} */
 	var Draft                                      = __import( "Astro.Blog.AstroEdit.Draft" );
-	/** @type {Astro.Blog.AstroEdit.Flag} */
+	/** @type {typeof Astro.Blog.AstroEdit.Flag} */
 	var Flag                                       = __import( "Astro.Blog.AstroEdit.Flag" );
-	/** @type {Astro.Blog.AstroEdit.Visualizer} */
+	/** @type {typeof Astro.Blog.AstroEdit.Visualizer} */
 	var Visualizer                                 = __import( "Astro.Blog.AstroEdit.Visualizer" );
-	/** @type {Astro.Blog.AstroEdit.Uploader} */
+	/** @type {typeof Astro.Blog.AstroEdit.Uploader} */
 	var Uploader                                   = __import( "Astro.Blog.AstroEdit.Uploader" );
-	/** @type {Astro.Blog.AstroEdit.SiteLibrary} */
+	/** @type {typeof Astro.Blog.AstroEdit.SiteLibrary} */
 	var SiteLibrary                                = __import( "Astro.Blog.AstroEdit.SiteLibrary" );
-	/** @type {Components.Vim.VimArea} */
+	/** @type {typeof Components.Vim.VimArea} */
 	var VimArea                                    = __import( "Components.Vim.VimArea" );
 
 	// calls the smart bar
diff --git a/botanjs/src/Components/Vim/VimArea.js b/botanjs/src/Components/Vim/VimArea.js
index 32ebc24..009bef9 100644
--- a/botanjs/src/Components/Vim/VimArea.js
+++ b/botanjs/src/Components/Vim/VimArea.js
@@ -45,7 +45,6 @@
 		};
 	};
 
-	/* stage @param {function(...?): Dandelion.IDOMElement} */
 	var VimArea = function( stage, detectScreenSize )
 	{
 		if( !stage ) throw new Error( "Invalid argument" );
diff --git a/botanjs/src/_this.js b/botanjs/src/_this.js
index e3413a4..92f301a 100644
--- a/botanjs/src/_this.js
+++ b/botanjs/src/_this.js
@@ -27,7 +27,7 @@ var __const = __static_method;
 
 /*{{{ BotanEvent & EventDispatcher */
 
-/** @type {typeof BotanEvent} */
+/** @type {typeof _BotanEvent} */
 var BotanEvent;
 
 BotanEvent = function( name, data )
@@ -70,7 +70,6 @@ BotanEvent = function( name, data )
 
 /**
  * @constructor
- * @implements {EventTarget}
  */
 var EventDispatcher = function() {
 	var events = {};
@@ -245,7 +244,6 @@ var TGR_IMPORT = 0;
 // some core methods
 var sGarden = window["BotanJS"];
 
-/** @type {BotanJS} */
 var BotanJS = null;
 var __namespace = null;
 var __import = null;
diff --git a/botanjs/src/externs/Astro.Blog.AstroEdit.Article.js b/botanjs/src/externs/Astro.Blog.AstroEdit.Article.js
index f4c3720..97ffb85 100644
--- a/botanjs/src/externs/Astro.Blog.AstroEdit.Article.js
+++ b/botanjs/src/externs/Astro.Blog.AstroEdit.Article.js
@@ -1,5 +1,9 @@
-/** @constructor */
-Astro.Blog.AstroEdit.Article = function(){};
+/** @constructor
+ * @params {string} set_article_uri
+ * @params {Array<Astro.Blog.AstroEdit.Flag>} plugins
+ */
+Astro.Blog.AstroEdit.Article = function(set_article_uri, plugins){};
+
 /** @type {Function} */
 Astro.Blog.AstroEdit.Article.saveOrBackup;
 /** @type {Function} */
diff --git a/botanjs/src/externs/Astro.Blog.AstroEdit.Draft.js b/botanjs/src/externs/Astro.Blog.AstroEdit.Draft.js
new file mode 100644
index 0000000..53e3b87
--- /dev/null
+++ b/botanjs/src/externs/Astro.Blog.AstroEdit.Draft.js
@@ -0,0 +1,6 @@
+/**
+ * @constructor
+ * @param {Astro.Blog.AstroEdit.Article} article
+ * @param {string} url
+ */
+Astro.Blog.AstroEdit.Draft = function(article, url) {};
diff --git a/botanjs/src/externs/Astro.Blog.AstroEdit.Flag.js b/botanjs/src/externs/Astro.Blog.AstroEdit.Flag.js
new file mode 100644
index 0000000..5a6846d
--- /dev/null
+++ b/botanjs/src/externs/Astro.Blog.AstroEdit.Flag.js
@@ -0,0 +1,8 @@
+/**
+ * @constructor
+ * @implements {Astro.Blog.AstroEdit.IPlugin}
+ * @param {string} id
+ * @param {string} target
+ * @param {!_AstConf_.AstroEditFlags} flagConf
+ */
+Astro.Blog.AstroEdit.Flag = function(id, target, flagConf) {};
diff --git a/botanjs/src/externs/Astro.Blog.AstroEdit.IPlugin.js b/botanjs/src/externs/Astro.Blog.AstroEdit.IPlugin.js
index 6f934ef..d1aee2c 100644
--- a/botanjs/src/externs/Astro.Blog.AstroEdit.IPlugin.js
+++ b/botanjs/src/externs/Astro.Blog.AstroEdit.IPlugin.js
@@ -1,8 +1,18 @@
-/** @constructor Plugin Interface */
-Astro.Blog.AstroEdit.IPlugin = function(){};
+/**
+ * @interface
+ */
+Astro.Blog.AstroEdit.IPlugin = function() {};
+
 /** @type {string} */
-Astro.Blog.AstroEdit.IPlugin.id;
-/** @type {Function} */
-Astro.Blog.AstroEdit.IPlugin.setFromData;
-/** @type {Function} */
-Astro.Blog.AstroEdit.IPlugin.getData;
+Astro.Blog.AstroEdit.IPlugin.prototype.id;
+
+/**
+ * @param {*} data
+ * @return {void}
+ */
+Astro.Blog.AstroEdit.IPlugin.prototype.setForView = function(data) {};
+
+/**
+ * @return {*}
+ */
+Astro.Blog.AstroEdit.IPlugin.prototype.getData = function() {};
diff --git a/botanjs/src/externs/Astro.Blog.AstroEdit.SiteLibrary.js b/botanjs/src/externs/Astro.Blog.AstroEdit.SiteLibrary.js
new file mode 100644
index 0000000..8ad324e
--- /dev/null
+++ b/botanjs/src/externs/Astro.Blog.AstroEdit.SiteLibrary.js
@@ -0,0 +1,7 @@
+/**
+ * @constructor
+ * @param {string} base_path
+ * @param {string} get_uri
+ * @param {string} set_uri
+ */
+Astro.Blog.AstroEdit.SiteLibrary = function(base_path, get_uri, set_uri) {};
diff --git a/botanjs/src/externs/Astro.Blog.AstroEdit.Uploader.js b/botanjs/src/externs/Astro.Blog.AstroEdit.Uploader.js
new file mode 100644
index 0000000..376637f
--- /dev/null
+++ b/botanjs/src/externs/Astro.Blog.AstroEdit.Uploader.js
@@ -0,0 +1,5 @@
+/**
+ * @constructor
+ * @param {string} set_file_uri
+ */
+Astro.Blog.AstroEdit.Uploader = function(set_file_uri) {};
diff --git a/botanjs/src/externs/Astro.Blog.AstroEdit.Visualizer.js b/botanjs/src/externs/Astro.Blog.AstroEdit.Visualizer.js
index e36379c..5f7adcd 100644
--- a/botanjs/src/externs/Astro.Blog.AstroEdit.Visualizer.js
+++ b/botanjs/src/externs/Astro.Blog.AstroEdit.Visualizer.js
@@ -1,5 +1,9 @@
-/** @constructor */
-Astro.Blog.AstroEdit.Visualizer = function(){};
+/** @constructor
+ * @param {Astro.Blog.AstroEdit.Article} e_document
+ * @param {HTMLElement|Dandelion.IDOMElement} controls
+ * @param {string} service_uri
+ */
+Astro.Blog.AstroEdit.Visualizer = function(e_document, controls, service_uri){};
 /** @type {Function} */
 Astro.Blog.AstroEdit.Visualizer.setContentDiv;
 /** @type {Function} */
diff --git a/botanjs/src/externs/BotanEvent.js b/botanjs/src/externs/BotanEvent.js
index a7c486b..5b79610 100644
--- a/botanjs/src/externs/BotanEvent.js
+++ b/botanjs/src/externs/BotanEvent.js
@@ -2,18 +2,22 @@
  * @param {string} name
  * @param {*} data
  **/
-var BotanEvent = function (name, data){};
+var _BotanEvent = function (name, data){};
 
-/** @type {*} */
-BotanEvent.data;
+/** @type {function(): void} */
+_BotanEvent.propagate = function() {};
+
+/** @type {function(): void} */
+_BotanEvent.stopPropagating = function() {};
 
-/** @type {Function} */
-BotanEvent.propagate = function() {};
-/** @type {Function} */
-BotanEvent.stopPropagating = function() {};
+/** @type {function(): boolean} */
+_BotanEvent.propagating = function() {};
+
+/** @type {*} */
+_BotanEvent.prototype.data;
 
-/** @type {Boolean} */
-BotanEvent.propagating;
+/** @type {function(*): void} */
+_BotanEvent.prototype.setTarget;
 
-/** @type {Function} */
-BotanEvent.setTarget;
+/** @type {string} */
+_BotanEvent.prototype.type;
diff --git a/botanjs/src/externs/Components.Vim.VimArea.js b/botanjs/src/externs/Components.Vim.VimArea.js
index a2286d1..0bf46a1 100644
--- a/botanjs/src/externs/Components.Vim.VimArea.js
+++ b/botanjs/src/externs/Components.Vim.VimArea.js
@@ -1,7 +1,9 @@
 /** @constructor
  *  @extends {EventDispatcher}
+ *  @param {Element} stage
+ *  @param {boolean} detectScreenSize
  */
-Components.Vim.VimArea = function(){};
+Components.Vim.VimArea = function(stage, detectScreenSize){};
 
 /** @type {Components.Vim.LineFeeder} */
 Components.Vim.VimArea.contentFeeder;
diff --git a/botanjs/src/externs/System.utils.js b/botanjs/src/externs/System.utils.js
index 2ac9985..67561e9 100644
--- a/botanjs/src/externs/System.utils.js
+++ b/botanjs/src/externs/System.utils.js
@@ -1,11 +1,25 @@
 /** @constructor */
 System.utils = function (){}
 
-/** @type {Function} */
-System.utils.objGetProp;
-/** @type {Function} */
-System.utils.objSearch;
-/** @type {Function} */
-System.utils.objMap;
-/** @type {Function} */
-System.utils.siteProto;
+/**
+ * @param {*} obj
+ * @param {string} prop
+ * @param {string} type
+ */
+System.utils.prototype.objGetProp = function(obj, prop, type) {};
+
+/**
+ * @param {*} obj
+ * @param {function(*): boolean} cond
+ * @param {string} prop
+ */
+System.utils.prototype.objSearch = function(obj, cond, prop) {};
+
+/**
+ * @param {*} obj
+ * @param {function(*): *} callback
+ */
+System.utils.prototype.objMap = function(obj, callback) {};
+
+/** @type {function(string): string} */
+System.utils.prototype.siteProto = function(path){};
diff --git a/botanjs/src/externs/_AstConf_.AstroEdit.js b/botanjs/src/externs/_AstConf_.AstroEdit.js
index f43e0ad..cf3738f 100644
--- a/botanjs/src/externs/_AstConf_.AstroEdit.js
+++ b/botanjs/src/externs/_AstConf_.AstroEdit.js
@@ -1,13 +1,10 @@
 /**
  * @typedef {{
- *   article_id: string,
- *   paths: !_AstConf_.AstroEdit.Paths,
- *   tags: !Object<string, *>,
- *   sections: !Object<string, *>,
- *   flags: !_AstConf_.AstroEdit.Flags
+ *   URICount: string,
+ *   URISet: string
  * }}
  */
-_AstConf_.AstroEdit;
+_AstConf_.AstroEditFlags;
 
 /**
  * @typedef {{
@@ -16,15 +13,17 @@ _AstConf_.AstroEdit;
  *   list_articles: string,
  *   get_drafts: string,
  *   get_files: string,
- *   set_file: string
+ *   set_file: string,
+ *   tags: !_AstConf_.AstroEditFlags,
+ *   sections: !_AstConf_.AstroEditFlags
  * }}
  */
-_AstConf_.AstroEdit.Paths;
+_AstConf_.AstroEditPaths;
 
 /**
  * @typedef {{
- *   URICount: string,
- *   URISet: string
+ *   article_id: string,
+ *   paths: !_AstConf_.AstroEditPaths
  * }}
  */
-_AstConf_.AstroEdit.Flags;
+_AstConf_.AstroEdit;
diff --git a/resolver-go/cmd/api-server/main.go b/resolver-go/cmd/api-server/main.go
index 6a9e144..0808e10 100644
--- a/resolver-go/cmd/api-server/main.go
+++ b/resolver-go/cmd/api-server/main.go
@@ -107,7 +107,7 @@ func (h handler) index(w http.ResponseWriter, req *http.Request) {
 					},
 				},
 				Defines: map[string]any{
-					"DEBUG": false,
+					"DEFINE_DEBUG": false,
 				},
 			},
 		})
diff --git a/resolver-go/internal/generated/buildinfo_gen.go b/resolver-go/internal/generated/buildinfo_gen.go
index 2bb91de..19fd948 100644
--- a/resolver-go/internal/generated/buildinfo_gen.go
+++ b/resolver-go/internal/generated/buildinfo_gen.go
@@ -2,5 +2,5 @@ package generated
 
 const (
 	IMAGE_TAG   = "dev"
-	Timestamp   = "20260614.213626"
+	Timestamp   = "20260614.231020"
 )
diff --git a/resolver-go/internal/generated/classmap_gen.go b/resolver-go/internal/generated/classmap_gen.go
index 63d0917..76e308c 100644
--- a/resolver-go/internal/generated/classmap_gen.go
+++ b/resolver-go/internal/generated/classmap_gen.go
@@ -7,12 +7,12 @@ var ClassMap = &classmap.Map{
 	Symbols: map[string]classmap.Symbol{
 		"Astro":                                           {Name: "Astro", Kind: "class", Parent: "", Imports: []string(nil), Resource: classmap.Resource{Src: "", JSHash: "", CSSHash: ""}},
 		"Astro.Blog":                                      {Name: "Astro.Blog", Kind: "class", Parent: "Astro", Imports: []string(nil), Resource: classmap.Resource{Src: "", JSHash: "", CSSHash: ""}},
-		"Astro.Blog.AstroEdit":                            {Name: "Astro.Blog.AstroEdit", Kind: "class", Parent: "Astro.Blog", Imports: []string{"System.utils", "System.Cycle", "Dandelion", "Astro.Bootstrap", "Astro.Blog.Config", "Astro.Blog.AstroEdit.Article", "Astro.Blog.AstroEdit.Draft", "Astro.Blog.AstroEdit.Flag", "Astro.Blog.AstroEdit.Visualizer", "Astro.Blog.AstroEdit.Uploader", "Astro.Blog.AstroEdit.SiteLibrary", "Components.Vim.VimArea", "Astro.Blog.AstroEdit.SmartInput", "Astro.Blog.SharedStyle"}, Resource: classmap.Resource{Src: "Astro/Blog/AstroEdit/_this.js", JSHash: "c21f6a1de562e3365d7874696d7e791074f935c1", CSSHash: "2d37776089eeac5d81981f100c1c029c9249e4a9"}},
+		"Astro.Blog.AstroEdit":                            {Name: "Astro.Blog.AstroEdit", Kind: "class", Parent: "Astro.Blog", Imports: []string{"System.utils", "System.Cycle", "Dandelion", "Astro.Bootstrap", "Astro.Blog.Config", "Astro.Blog.AstroEdit.Article", "Astro.Blog.AstroEdit.Draft", "Astro.Blog.AstroEdit.Flag", "Astro.Blog.AstroEdit.Visualizer", "Astro.Blog.AstroEdit.Uploader", "Astro.Blog.AstroEdit.SiteLibrary", "Components.Vim.VimArea", "Astro.Blog.AstroEdit.SmartInput", "Astro.Blog.SharedStyle"}, Resource: classmap.Resource{Src: "Astro/Blog/AstroEdit/_this.js", JSHash: "92ff148e1e100a172d0583f22fff03fa277840ce", CSSHash: "2d37776089eeac5d81981f100c1c029c9249e4a9"}},
 		"Astro.Blog.AstroEdit.Article":                    {Name: "Astro.Blog.AstroEdit.Article", Kind: "class", Parent: "Astro.Blog.AstroEdit", Imports: []string{"System.Cycle", "System.utils", "System.utils.EventKey", "System.Debug", "Components.MessageBox", "Dandelion", "Dandelion.IDOMObject", "Dandelion.IDOMElement", "Astro.Blog.Config", "Astro.Blog.Components.Bubble", "System.Net.postData", "Astro.utils.Date.pretty", "Astro.Blog.AstroEdit.Visualizer", "Astro.Blog.AstroEdit.Flag", "Astro.Blog.AstroEdit.Draft"}, Resource: classmap.Resource{Src: "Astro/Blog/AstroEdit/Article.js", JSHash: "de5683e8ccc580958a5e8f66feacb58ca0fbd4f7", CSSHash: "1"}},
-		"Astro.Blog.AstroEdit.Draft":                      {Name: "Astro.Blog.AstroEdit.Draft", Kind: "class", Parent: "Astro.Blog.AstroEdit", Imports: []string{"System.Cycle", "System.utils.IKey", "Dandelion", "System.Net.postData", "Astro.Blog.AstroEdit.Article"}, Resource: classmap.Resource{Src: "Astro/Blog/AstroEdit/Draft.js", JSHash: "f1d8d898abde5d705dec0c1fc759ee71d368d89a", CSSHash: "1"}},
-		"Astro.Blog.AstroEdit.Flag":                       {Name: "Astro.Blog.AstroEdit.Flag", Kind: "class", Parent: "Astro.Blog.AstroEdit", Imports: []string{"System.Debug", "Components.MessageBox", "Dandelion", "Dandelion.IDOMElement", "Astro.Blog.Config", "System.Net.postData"}, Resource: classmap.Resource{Src: "Astro/Blog/AstroEdit/Flag.js", JSHash: "365be7deb7a621cc7379d8c0d902a45ecceb9ee7", CSSHash: "2af9897e11ed5f3c3a750ce5488c9d91e46c6c58"}},
-		"Astro.Blog.AstroEdit.SiteLibrary":                {Name: "Astro.Blog.AstroEdit.SiteLibrary", Kind: "class", Parent: "Astro.Blog.AstroEdit", Imports: []string{"System.Cycle", "System.Debug", "System.utils.Perf", "System.utils.IKey", "System.utils.DataKey", "System.utils.EventKey", "Components.MessageBox", "Components.Mouse.ContextMenu", "Dandelion", "Dandelion.IDOMObject", "Dandelion.IDOMElement", "Astro.Blog.Config", "System.Net.postData", "Astro.utils.Date.pretty"}, Resource: classmap.Resource{Src: "Astro/Blog/AstroEdit/SiteLibrary.js", JSHash: "06de454d725addb1640bd305b901d385798c3bea", CSSHash: "ef9290487558512fa1db9a4a20b91aa8421b4b26"}},
-		"Astro.Blog.AstroEdit.SmartInput":                 {Name: "Astro.Blog.AstroEdit.SmartInput", Kind: "class", Parent: "Astro.Blog.AstroEdit", Imports: []string{"Dandelion", "Dandelion.IDOMElement", "Dandelion.IDOMObject", "System.Cycle", "System.Debug", "System.Net.ClassLoader", "System.utils", "System.utils.DataKey", "System.utils.IKey", "Components.MessageBox", "Astro.Blog.Config"}, Resource: classmap.Resource{Src: "Astro/Blog/AstroEdit/SmartInput/_this.js", JSHash: "69d20f62e5f394c2d63537b201c54883d9d7d85f", CSSHash: "4cd01e0c87e41c384afe9d9d5fb9d545bd51bd38"}},
+		"Astro.Blog.AstroEdit.Draft":                      {Name: "Astro.Blog.AstroEdit.Draft", Kind: "class", Parent: "Astro.Blog.AstroEdit", Imports: []string{"System.Cycle", "System.utils.IKey", "Dandelion", "System.Net.postData", "Astro.Blog.AstroEdit.Article"}, Resource: classmap.Resource{Src: "Astro/Blog/AstroEdit/Draft.js", JSHash: "3949dd12c90e92b3f792b86841fd72c2482a18d5", CSSHash: "1"}},
+		"Astro.Blog.AstroEdit.Flag":                       {Name: "Astro.Blog.AstroEdit.Flag", Kind: "class", Parent: "Astro.Blog.AstroEdit", Imports: []string{"System.Debug", "Components.MessageBox", "Dandelion", "Dandelion.IDOMElement", "Astro.Blog.Config", "System.Net.postData"}, Resource: classmap.Resource{Src: "Astro/Blog/AstroEdit/Flag.js", JSHash: "31bdc37b8e995c6defd12c3a4dd743e27abdaa4d", CSSHash: "2af9897e11ed5f3c3a750ce5488c9d91e46c6c58"}},
+		"Astro.Blog.AstroEdit.SiteLibrary":                {Name: "Astro.Blog.AstroEdit.SiteLibrary", Kind: "class", Parent: "Astro.Blog.AstroEdit", Imports: []string{"System.Cycle", "System.Debug", "System.utils.Perf", "System.utils.IKey", "System.utils.DataKey", "System.utils.EventKey", "Components.MessageBox", "Components.Mouse.ContextMenu", "Dandelion", "Dandelion.IDOMObject", "Dandelion.IDOMElement", "Astro.Blog.Config", "System.Net.postData", "Astro.utils.Date.pretty"}, Resource: classmap.Resource{Src: "Astro/Blog/AstroEdit/SiteLibrary.js", JSHash: "09a9a043d155709d787fd75706ccd1bd05425d6e", CSSHash: "ef9290487558512fa1db9a4a20b91aa8421b4b26"}},
+		"Astro.Blog.AstroEdit.SmartInput":                 {Name: "Astro.Blog.AstroEdit.SmartInput", Kind: "class", Parent: "Astro.Blog.AstroEdit", Imports: []string{"Dandelion", "Dandelion.IDOMElement", "Dandelion.IDOMObject", "System.Cycle", "System.Debug", "System.Net.ClassLoader", "System.utils", "System.utils.DataKey", "System.utils.IKey", "Components.MessageBox", "Astro.Blog.Config"}, Resource: classmap.Resource{Src: "Astro/Blog/AstroEdit/SmartInput/_this.js", JSHash: "c4b42f193f02a00b79ef82e4fb0801202348ef1b", CSSHash: "4cd01e0c87e41c384afe9d9d5fb9d545bd51bd38"}},
 		"Astro.Blog.AstroEdit.SmartInput.CandidateAction": {Name: "Astro.Blog.AstroEdit.SmartInput.CandidateAction", Kind: "class", Parent: "Astro.Blog.AstroEdit.SmartInput", Imports: []string(nil), Resource: classmap.Resource{Src: "", JSHash: "", CSSHash: ""}},
 		"Astro.Blog.AstroEdit.SmartInput.CandidateAction.ArticleContent":   {Name: "Astro.Blog.AstroEdit.SmartInput.CandidateAction.ArticleContent", Kind: "class", Parent: "Astro.Blog.AstroEdit.SmartInput.CandidateAction", Imports: []string{"Astro.Blog.Config", "System.Net.getData", "Astro.utils.Date.pretty"}, Resource: classmap.Resource{Src: "Astro/Blog/AstroEdit/SmartInput/CandidateAction/ArticleReference.js", JSHash: "2e66502daabb251f22f83535899c3c282f32a2c0", CSSHash: "1"}},
 		"Astro.Blog.AstroEdit.SmartInput.CandidateAction.ArticleReference": {Name: "Astro.Blog.AstroEdit.SmartInput.CandidateAction.ArticleReference", Kind: "class", Parent: "Astro.Blog.AstroEdit.SmartInput.CandidateAction", Imports: []string{"Astro.Blog.Config", "System.Net.getData", "Astro.utils.Date.pretty"}, Resource: classmap.Resource{Src: "Astro/Blog/AstroEdit/SmartInput/CandidateAction/ArticleReference.js", JSHash: "2e66502daabb251f22f83535899c3c282f32a2c0", CSSHash: "1"}},
@@ -179,7 +179,7 @@ var ClassMap = &classmap.Map{
 		"Components.Vim.Syntax.Analyzer":                                   {Name: "Components.Vim.Syntax.Analyzer", Kind: "class", Parent: "Components.Vim.Syntax", Imports: []string{"System.Debug", "Components.Vim.Beep", "Components.Vim.Syntax.Word"}, Resource: classmap.Resource{Src: "Components/Vim/Syntax/Analyzer.js", JSHash: "64b9a2ae4c6ba0f9fdc0dda87323786df6c6b339", CSSHash: "1"}},
 		"Components.Vim.Syntax.TokenMatch":                                 {Name: "Components.Vim.Syntax.TokenMatch", Kind: "class", Parent: "Components.Vim.Syntax", Imports: []string{"System.Debug", "Components.Vim.Beep", "Components.Vim.Syntax.Word"}, Resource: classmap.Resource{Src: "Components/Vim/Syntax/Analyzer.js", JSHash: "64b9a2ae4c6ba0f9fdc0dda87323786df6c6b339", CSSHash: "1"}},
 		"Components.Vim.Syntax.Word":                                       {Name: "Components.Vim.Syntax.Word", Kind: "class", Parent: "Components.Vim.Syntax", Imports: []string(nil), Resource: classmap.Resource{Src: "Components/Vim/Syntax/Word.js", JSHash: "a6d24370b0906cc0f09cfd68d96d635cd583fac3", CSSHash: "1"}},
-		"Components.Vim.VimArea":                                           {Name: "Components.Vim.VimArea", Kind: "class", Parent: "Components.Vim", Imports: []string{"Dandelion.IDOMElement", "System.utils.DataKey", "System.utils.EventKey", "System.Cycle", "System.Debug", "Components.Vim.State.Registers", "Components.Vim.State.Marks", "Components.Vim.Syntax.Analyzer", "Components.Vim.LineFeeder", "Components.Vim.StatusBar", "Components.Vim.Controls", "Components.Vim.ActionEvent", "Components.Vim.Message"}, Resource: classmap.Resource{Src: "Components/Vim/VimArea.js", JSHash: "dda35cb49939da6a71d08f68a85435f68d64e283", CSSHash: "1"}},
+		"Components.Vim.VimArea":                                           {Name: "Components.Vim.VimArea", Kind: "class", Parent: "Components.Vim", Imports: []string{"Dandelion.IDOMElement", "System.utils.DataKey", "System.utils.EventKey", "System.Cycle", "System.Debug", "Components.Vim.State.Registers", "Components.Vim.State.Marks", "Components.Vim.Syntax.Analyzer", "Components.Vim.LineFeeder", "Components.Vim.StatusBar", "Components.Vim.Controls", "Components.Vim.ActionEvent", "Components.Vim.Message"}, Resource: classmap.Resource{Src: "Components/Vim/VimArea.js", JSHash: "9639b24336a69aba93eda2e61fc127fe8e78c9dd", CSSHash: "1"}},
 		"Dandelion":                                                        {Name: "Dandelion", Kind: "class", Parent: "", Imports: []string{"System.Global.IE", "System.utils.IKey"}, Resource: classmap.Resource{Src: "Dandelion/_this.js", JSHash: "27db6b49f6b23b1a3e7e905932525a81621e0b8f", CSSHash: "1"}},
 		"Dandelion.CSSAnimations":                                          {Name: "Dandelion.CSSAnimations", Kind: "class", Parent: "Dandelion", Imports: []string(nil), Resource: classmap.Resource{Src: "Dandelion/CSSAnimations/_this.js", JSHash: "a01a6bcfc5851debc7179e9449dc93617bca3afc", CSSHash: "2d6b4b00f0c4050187ccf010e0a24e5bc6121d18"}},
 		"Dandelion.CSSAnimations.MouseOverMovie":                           {Name: "Dandelion.CSSAnimations.MouseOverMovie", Kind: "method", Parent: "Dandelion.CSSAnimations", Imports: []string(nil), Resource: classmap.Resource{Src: "Dandelion/CSSAnimations/MovieClip.js", JSHash: "5667064818a0ca32f11a9b5a27ed641058e9df6c", CSSHash: "daa6e6f4ee3365e599cf1b2680f3e907389534f3"}},
@@ -316,13 +316,13 @@ var ClassMap = &classmap.Map{
 	},
 	Files: map[string]classmap.Resource{
 		"Astro/Blog/AstroEdit/Article.js":                                     {Src: "Astro/Blog/AstroEdit/Article.js", JSHash: "de5683e8ccc580958a5e8f66feacb58ca0fbd4f7", CSSHash: "1"},
-		"Astro/Blog/AstroEdit/Draft.js":                                       {Src: "Astro/Blog/AstroEdit/Draft.js", JSHash: "f1d8d898abde5d705dec0c1fc759ee71d368d89a", CSSHash: "1"},
-		"Astro/Blog/AstroEdit/Flag.js":                                        {Src: "Astro/Blog/AstroEdit/Flag.js", JSHash: "365be7deb7a621cc7379d8c0d902a45ecceb9ee7", CSSHash: "2af9897e11ed5f3c3a750ce5488c9d91e46c6c58"},
-		"Astro/Blog/AstroEdit/SiteLibrary.js":                                 {Src: "Astro/Blog/AstroEdit/SiteLibrary.js", JSHash: "06de454d725addb1640bd305b901d385798c3bea", CSSHash: "ef9290487558512fa1db9a4a20b91aa8421b4b26"},
+		"Astro/Blog/AstroEdit/Draft.js":                                       {Src: "Astro/Blog/AstroEdit/Draft.js", JSHash: "3949dd12c90e92b3f792b86841fd72c2482a18d5", CSSHash: "1"},
+		"Astro/Blog/AstroEdit/Flag.js":                                        {Src: "Astro/Blog/AstroEdit/Flag.js", JSHash: "31bdc37b8e995c6defd12c3a4dd743e27abdaa4d", CSSHash: "2af9897e11ed5f3c3a750ce5488c9d91e46c6c58"},
+		"Astro/Blog/AstroEdit/SiteLibrary.js":                                 {Src: "Astro/Blog/AstroEdit/SiteLibrary.js", JSHash: "09a9a043d155709d787fd75706ccd1bd05425d6e", CSSHash: "ef9290487558512fa1db9a4a20b91aa8421b4b26"},
 		"Astro/Blog/AstroEdit/SmartInput/CandidateAction/ArticleReference.js": {Src: "Astro/Blog/AstroEdit/SmartInput/CandidateAction/ArticleReference.js", JSHash: "2e66502daabb251f22f83535899c3c282f32a2c0", CSSHash: "1"},
 		"Astro/Blog/AstroEdit/SmartInput/CandidateAction/Footnote.js":         {Src: "Astro/Blog/AstroEdit/SmartInput/CandidateAction/Footnote.js", JSHash: "e308b387915865640c00c1c172c20482adaa1e46", CSSHash: "1"},
 		"Astro/Blog/AstroEdit/SmartInput/CandidateAction/Heading.js":          {Src: "Astro/Blog/AstroEdit/SmartInput/CandidateAction/Heading.js", JSHash: "65e852a90c2dddce5931f45f841ec932e3b35e59", CSSHash: "1"},
-		"Astro/Blog/AstroEdit/SmartInput/_this.js":                            {Src: "Astro/Blog/AstroEdit/SmartInput/_this.js", JSHash: "69d20f62e5f394c2d63537b201c54883d9d7d85f", CSSHash: "4cd01e0c87e41c384afe9d9d5fb9d545bd51bd38"},
+		"Astro/Blog/AstroEdit/SmartInput/_this.js":                            {Src: "Astro/Blog/AstroEdit/SmartInput/_this.js", JSHash: "c4b42f193f02a00b79ef82e4fb0801202348ef1b", CSSHash: "4cd01e0c87e41c384afe9d9d5fb9d545bd51bd38"},
 		"Astro/Blog/AstroEdit/Uploader.js":                                    {Src: "Astro/Blog/AstroEdit/Uploader.js", JSHash: "7205f45c289ec5a9b39cf06c3c42f31d1286cba9", CSSHash: "1"},
 		"Astro/Blog/AstroEdit/Visualizer/Snippet/AcquireLib.js":               {Src: "Astro/Blog/AstroEdit/Visualizer/Snippet/AcquireLib.js", JSHash: "7af9a09fbf17d439fb810b3485609c4bbd816729", CSSHash: "e3860ca0ac69a86e948b811da1ebf6ba85fad57f"},
 		"Astro/Blog/AstroEdit/Visualizer/Snippet/ArticleContent.js":           {Src: "Astro/Blog/AstroEdit/Visualizer/Snippet/ArticleContent.js", JSHash: "83817c1b1e8c73a598e1c090d3dae8fb341bcebe", CSSHash: "e1cfcf676ebfc3a9ab80139ab2f7e63a2a1b286f"},
@@ -341,7 +341,7 @@ var ClassMap = &classmap.Map{
 		"Astro/Blog/AstroEdit/Visualizer/Snippet/Video.js":                    {Src: "Astro/Blog/AstroEdit/Visualizer/Snippet/Video.js", JSHash: "d6f641a25d4350b98dad2bbeeec5dedfd1c6d532", CSSHash: "ff1d4ae903c244a6aeaf78b12c375f1f45dfb3c2"},
 		"Astro/Blog/AstroEdit/Visualizer/Snippet/_this.js":                    {Src: "Astro/Blog/AstroEdit/Visualizer/Snippet/_this.js", JSHash: "38f5d8512eabf1ffb4249b1414efd2362af8dc5c", CSSHash: "1"},
 		"Astro/Blog/AstroEdit/Visualizer/_this.js":                            {Src: "Astro/Blog/AstroEdit/Visualizer/_this.js", JSHash: "6b3cece4cedda7322cfe385fe81f956bc59c01c6", CSSHash: "d43e2d27e52788d755c96f0db4ac500aa38ca2ee"},
-		"Astro/Blog/AstroEdit/_this.js":                                       {Src: "Astro/Blog/AstroEdit/_this.js", JSHash: "c21f6a1de562e3365d7874696d7e791074f935c1", CSSHash: "2d37776089eeac5d81981f100c1c029c9249e4a9"},
+		"Astro/Blog/AstroEdit/_this.js":                                       {Src: "Astro/Blog/AstroEdit/_this.js", JSHash: "92ff148e1e100a172d0583f22fff03fa277840ce", CSSHash: "2d37776089eeac5d81981f100c1c029c9249e4a9"},
 		"Astro/Blog/Components/Album.js":                                      {Src: "Astro/Blog/Components/Album.js", JSHash: "95069b6eec9f03c84969e4d3627b0730136fa300", CSSHash: "640c50241b457330678a21b940fdb4ea15a5249b"},
 		"Astro/Blog/Components/ArticleContent.js":                             {Src: "Astro/Blog/Components/ArticleContent.js", JSHash: "2e208eae51421946f874dd78cb05d974a689bdef", CSSHash: "34fc82974af2ae7040819889bc8e7a1bd2b48cd6"},
 		"Astro/Blog/Components/Bubble.js":                                     {Src: "Astro/Blog/Components/Bubble.js", JSHash: "7b344eb7e4024292d52767929d7efe6fc98a9de9", CSSHash: "2513518106d6d1c7a42e95c28becb3ddfe39e040"},
@@ -439,7 +439,7 @@ var ClassMap = &classmap.Map{
 		"Components/Vim/StatusBar.js":                                         {Src: "Components/Vim/StatusBar.js", JSHash: "461f00364ced9cb6e0ae83b9d18c6456fb051e26", CSSHash: "1"},
 		"Components/Vim/Syntax/Analyzer.js":                                   {Src: "Components/Vim/Syntax/Analyzer.js", JSHash: "64b9a2ae4c6ba0f9fdc0dda87323786df6c6b339", CSSHash: "1"},
 		"Components/Vim/Syntax/Word.js":                                       {Src: "Components/Vim/Syntax/Word.js", JSHash: "a6d24370b0906cc0f09cfd68d96d635cd583fac3", CSSHash: "1"},
-		"Components/Vim/VimArea.js":                                           {Src: "Components/Vim/VimArea.js", JSHash: "dda35cb49939da6a71d08f68a85435f68d64e283", CSSHash: "1"},
+		"Components/Vim/VimArea.js":                                           {Src: "Components/Vim/VimArea.js", JSHash: "9639b24336a69aba93eda2e61fc127fe8e78c9dd", CSSHash: "1"},
 		"Components/Vim/_this.js":                                             {Src: "Components/Vim/_this.js", JSHash: "f385a56129d2c933fd848501bbf3a5183a2dd3a8", CSSHash: "7949b25860fcef736927c01502aad09b56d764b2"},
 		"Components/_this.js":                                                 {Src: "Components/_this.js", JSHash: "f4cb7babe62a5cdae34d2c4ebcb55071e81da4ff", CSSHash: "1"},
 		"Dandelion/CSSAnimations/MovieClip.js":                                {Src: "Dandelion/CSSAnimations/MovieClip.js", JSHash: "5667064818a0ca32f11a9b5a27ed641058e9df6c", CSSHash: "daa6e6f4ee3365e599cf1b2680f3e907389534f3"},
diff --git a/resolver-go/internal/generated/externs_gen.go b/resolver-go/internal/generated/externs_gen.go
index 5341b66..0fe37e9 100644
--- a/resolver-go/internal/generated/externs_gen.go
+++ b/resolver-go/internal/generated/externs_gen.go
@@ -3,10 +3,14 @@ package generated
 
 var Externs = []string{
 	"externs/Astro.Blog.AstroEdit.Article.js",
+	"externs/Astro.Blog.AstroEdit.Draft.js",
+	"externs/Astro.Blog.AstroEdit.Flag.js",
 	"externs/Astro.Blog.AstroEdit.IPlugin.js",
+	"externs/Astro.Blog.AstroEdit.SiteLibrary.js",
 	"externs/Astro.Blog.AstroEdit.SmartInput.Definition.js",
 	"externs/Astro.Blog.AstroEdit.SmartInput.ICandidateAction.js",
 	"externs/Astro.Blog.AstroEdit.SmartInput.js",
+	"externs/Astro.Blog.AstroEdit.Uploader.js",
 	"externs/Astro.Blog.AstroEdit.Visualizer.Snippet.Model.js",
 	"externs/Astro.Blog.AstroEdit.Visualizer.Snippet.js",
 	"externs/Astro.Blog.AstroEdit.Visualizer.js",
diff --git a/resolver-go/internal/resolver/resolver.go b/resolver-go/internal/resolver/resolver.go
index 4815ddc..64cfb1d 100644
--- a/resolver-go/internal/resolver/resolver.go
+++ b/resolver-go/internal/resolver/resolver.go
@@ -252,8 +252,21 @@ func (r *Resolver) MergeJS(files []classmap.Resource) ([]byte, string, error) {
 		}
 		b.Write(src)
 	}
-	wrapped := append([]byte("(function(){"), b.Bytes()...)
-	wrapped = append(wrapped, []byte("})();")...)
+	prefix := []byte(`
+/** @define {boolean} */
+var DEFINE_DEBUG = false;
+
+(function(){
+`)
+	suffix := []byte(`
+})();
+`)
+
+	wrapped := make([]byte, 0, len(prefix)+b.Len()+len(suffix))
+	wrapped = append(wrapped, prefix...)
+	wrapped = append(wrapped, b.Bytes()...)
+	wrapped = append(wrapped, suffix...)
+
 	return wrapped, hashList(files, "js"), nil
 }