Jump to content

TypeScript Error#TS9005 while compiling JavaScript to ".d.ts"


sagnik

Recommended Posts

Quote

src/js/SGNUIKit.loader.js:29:1 - error TS9005: Declaration emit for this file requires using private name 'SGNUKConfig'. An explicit type annotation may unblock declaration emit.

29 const forEach = (obj, callback) => {
   ~~~~~

 

  • Here's the part of the code:
/**
 * Performs the specified action for each element in an object.
 *
 * @param {Object} obj
 * @param {(value:any, key:string)=>void} callback A function that accepts up to three arguments. forEach calls the <b><i>callback</i></b> function one time for each element in the object.
 */
const forEach = (obj, callback) => {
	let value;
	//context = context || this;  //apply the function to 'this' by default

	for(const key in obj) {
		if(key !== 'length' && obj.hasOwnProperty(key)) {  //to rule out inherited properties
			value = obj[key];
			if(typeof callback === 'function')
				callback(value, key);
		}
	}
}

/**
 * Appends new elements to the end of an object, and returns the new length of the object.
 * @param {Object} obj
 * @param {...any} items New elements to add to the object.
 */
const push = (obj, ...items) => {
	let k = obj.length || 0;

	items.forEach((value) => {
		obj[k] = value;
		k++;
		obj.length = k;
	});
}

const SGNUIKit = {
	isReady: false,
	isInit: false,
	isPreloaderHeld: false,
	configs: {
		'urls': {
			'api': {
				'geonames': 'https://secure.geonames.org/',
				'osm': 'https://nominatim.openstreetmap.org/'
			},
		},
		'api': {
			'geonames': '' //username
		},
		'geocoding': {
			'defaultAPI': 'osm'
		}
	},
	components: {},
	onChangeListener: {},
	onInitListener: {},
	onReadyListener: {},
	callCounts: {
		'init': 0,
		'ready': 0,
		'config': 0,
		'component': 0,
		'holdPreloader': 0,
	},

	/**
	 * This callback is called when a component is loaded/removed or the status of readiness is changed.
	 *
	 * @callback SGNUIKitChangeCallback
	 * @param {string} state The name of the state which is changed.
	 * @param {boolean|JSON} value The value of the state which is changed.
	 * @param {JSON} components The <b><i>JSON</i></b> object of loaded <b>SGNUIKit</b> components, or an empty <b><i>JSON</i></b> object if no components loaded.
	 */
	/**
	 * This callback is called when <b>SGNUIKit</b> is ready.
	 *
	 * @callback SGNUIKitReadyCallback
	 * @param {boolean} isReady the status of readiness of <b>SGNUIKit</b>.
	 */

	/**
	 * Add a loaded <b>SGNUIKit</b> component.
	 *
	 * @param {{}} config The <b><i>JSON</i></b> object of the <b>SGNUIKit</b> configuration options.
	 */
	set config(config) {
		if(config !== undefined && config !== null && config !== "") {
			this.configs = new SGNUKConfig(config);
			this.callCounts.config++;

			forEach(this.onChangeListener, (listener) => listener("config", config, this.configs));
		}
	},

	/**
	 * Get the list of loaded <b>SGNUIKit</b> components.
	 *
	 * @return {Object} The <b><i>JSON</i></b> object of loaded <b>SGNUIKit</b> components, or an empty <b><i>JSON</i></b> object if no components loaded.
	 */
	get config() {
		return this.configs;
	},

	/**
	 * Add a loaded <b>SGNUIKit</b> component.
	 *
	 * @param {{}} value The <b><i>JSON</i></b> object of the loaded <b>SGNUIKit</b> component.
	 */
	set component(value) {
		if(value !== undefined && value !== null && value !== "") {
			Object.assign(this.components, value);
			this.callCounts.component++;

			forEach(this.onChangeListener, (listener) => listener("components", value, this.components));
			//this.onChangeListener.forEach((listener) => listener("components", value, this.components));
		}
	},

	/**
	 * Get the list of loaded <b>SGNUIKit</b> components.
	 *
	 * @return {object} The <b><i>JSON</i></b> object of loaded <b>SGNUIKit</b> components, or an empty <b><i>JSON</i></b> object if no components loaded.
	 */
	get component() {
		return this.components;
	},

	/**
	 * Check if a <b>SGNUIKit</b> component is loaded.
	 *
	 * @param {string|number} id The <i>ID</i> of the <b>SGNUIKit</b> component to check.
	 */
	isComponentLoaded: function(id) {
		return this.components.hasOwnProperty(id);
	},

	/**
	 * Set the status of readiness of <b>SGNUIKit</b>.
	 *
	 * @param {boolean} isInit The the status of readiness of <b>SGNUIKit</b>.
	 */
	set init(isInit) {
		this.isInit = isInit;
		this.callCounts.init++;
		forEach(this.onChangeListener, (listener) => listener("init", this.isInit));

		if(isInit)
			forEach(this.onInitListener, (listener) => listener(isInit));
	},

	/**
	 * Get the status of readiness of <b>SGNUIKit</b>.
	 *
	 * @return {boolean} <b><i>TRUE</i></b> if <b>SGNUIKit</b> is ready, <b><i>FALSE</i></b> otherwise.
	 */
	get init() {
		return this.isInit;
	},

	/**
	 * Set the status of readiness of <b>SGNUIKit</b>.
	 *
	 * @param {boolean} isReady The the status of readiness of <b>SGNUIKit</b>.
	 */
	set ready(isReady) {
		this.isReady = isReady;
		this.callCounts.ready++;
		forEach(this.onChangeListener, (listener) => listener("ready", this.isReady));
		//this.onChangeListener.forEach((listener) => listener("ready", this.isReady));

		if(isReady)
			forEach(this.onReadyListener, (listener) => listener(isReady));
		//this.onReadyListener.forEach((listener) => listener(isReady));
	},

	/**
	 * Get the status of readiness of <b>SGNUIKit</b>.
	 *
	 * @return {boolean} <b><i>TRUE</i></b> if <b>SGNUIKit</b> is ready, <b><i>FALSE</i></b> otherwise.
	 */
	get ready() {
		return this.isReady;
	},

	/**
	 * Hold the <b>SGNUIKit</b> preloader even after  <b>SGNUIKit</b> has finished loading the components.
	 *
	 * @param {boolean} hold The the status of readiness of <b>SGNUIKit</b>.
	 */
	set holdPreloader(hold) {
		this.isPreloaderHeld = hold;
		this.callCounts.holdPreloader++;
		forEach(this.onChangeListener, (listener) => listener("holdPreloader", this.isPreloaderHeld));
		//this.onChangeListener.forEach((listener) => listener("holdPreloader", this.isPreloaderHeld));
	},

	/**
	 * Get the status of readiness of <b>SGNUIKit</b>.
	 *
	 * @return {boolean} <b><i>TRUE</i></b> if <b>SGNUIKit</b> is ready, <b><i>FALSE</i></b> otherwise.
	 */
	get holdPreloader() {
		return this.isPreloaderHeld;
	},

	/**
	 * Set the handler for <b>SGNUIKit</b> <b><i>OnChange</i></b> event, which will be triggered when a component is loaded/removed or the status of readiness is changed.
	 *
	 * @param {SGNUIKitChangeCallback}listener
	 * @param {string|number}[id=undefined]
	 */
	setOnChangeListener: function(listener, id) {
		if(typeof id !== 'string' || $.isNumeric(id))
			this.onChangeListener[id] = listener;
		else
			push(this.onChangeListener, listener);
	},

	/**
	 * Set the handler for <b>SGNUIKit</b> <b><i>OnReady</i></b> event, which will be triggered when the <b>SGNUIKit</b> is ready.
	 *
	 * @param {SGNUIKitReadyCallback}listener
	 * @param {string|number}[id=undefined]
	 */
	setOnInitListener: function(listener, id) {
		if(typeof id !== 'string' || $.isNumeric(id))
			this.onInitListener[id] = listener;
		else
			push(this.onInitListener, listener);

		if(this.init)
			forEach(this.onInitListener, (listener) => listener(this.isInit));
	},

	/**
	 * Set the handler for <b>SGNUIKit</b> <b><i>OnReady</i></b> event, which will be triggered when the <b>SGNUIKit</b> is ready.
	 *
	 * @param {SGNUIKitReadyCallback}listener
	 * @param {string|number}[id=undefined]
	 */
	setOnReadyListener: function(listener, id) {
		if(typeof id !== 'string' || $.isNumeric(id))
			this.onReadyListener[id] = listener;
		else
			push(this.onReadyListener, listener);

		if(this.ready)
			forEach(this.onReadyListener, (listener) => listener(this.isReady));
		//this.onReadyListener.forEach((listener) => listener(this.ready));
	},
};
window.SGNUIKit = SGNUIKit;

if(typeof jQuery === 'undefined') {
  // EMBED JQUERY
}

/***
 * @return {SGNUKConfig}
 */
const SGNUKConfig = function(config) {
	const plugin = this;
	const _defaults = {
		'urls': {
			'api': {
				'geonames': 'https://secure.geonames.org/',
				'osm': 'https://nominatim.openstreetmap.org/'
			},
		}
	}
	plugin.config = {
		'api': {
			'geonames': undefined //username
		},
		'geocoding': {
			'defaultAPI': 'osm'
		}
	}

	const init = () => {
		plugin.config = Object.assign(plugin.config, config);
		plugin.config = Object.assign(plugin.config, _defaults);
	}

	init();

	return plugin;
};

((callback) => {
	const head  = document.head || document.getElementsByTagName("head")[0],
	      style = document.createElement("style");
	const currentScript = document.currentScript || document.querySelector("script[src*=\"SGNUIKit.loader.js\"]");
	let preloader = `\t\t\t<div class="preloader">\n`;
	//OTHER CODES HERE

	head.appendChild(style);

	preloaderElem.innerHTML = preloader;

	window.onload = function() {
		document.body.classList.add("has-preloader");
		document.body.insertBefore(preloaderElem, document.body.firstChild);

		if(typeof callback === 'function')
			callback();
	};
})(() => {
	(async precallback => {
		const title = document.title;
		if(title !== undefined)
			document.title = "Loading...";

		if(window.jQuery)
			$.holdReady(true);
      	//OTHER CODES HERE
		async function finishLoad() {
			progress = (filestoload > 0) ? Math.round((filesloaded * 100) / filestoload) : 100;

			await new Promise(resolve => {
				if(filesloaded >= filestoload) {
					resolve();
				}
			}).then(function() {
				document.querySelector('head > title').innerHTML = title;
				if(typeof precallback === "function" && progress === 100)
					precallback();
			});
		}
    })(function() {
		(async callback => {
			(() => {
				const startLoad = new Promise(async function(resolve) {
					await loadStyle(0);
					await loadScript(0);
					if(loaded === total)
						resolve();
				});

				startLoad.then(() => {
					finishLoad();
				});
			})();
			async function finishLoad() {
				const progress = Math.round((loaded * 100) / total);

				await new Promise(resolve => {
					if(loaded === total) {
						resolve();
					}
				}).then(function() {
					if(typeof callback === "function")
						callback(loaded, total, progress);
				});
			}
		})((loaded, total, progress) => {
			if(progress === 100) {
				SGNUIKit.init = true;

				const styles = document.querySelector("style#sgn-uikit-styles");
				const left = document.querySelector("style[data-cke=\"true\"]");
				if(left !== null)
					left.parentNode.removeChild(left);
				if(styles !== null)
					styles.parentNode.removeChild(styles);

				$.holdReady(false);
				jQuery.ready();
			}
		});
	});
	(() => {
		SGNUIKit.setOnChangeListener((prop, value) => {
			if(prop === 'holdPreloader') {
				if(SGNUIKit.init && !value) {
					finalize(true);
				}
			} else {
				if(prop === 'init' && value) {
					finalize(false);
				}
			}
		}, 'sgn-uk-prop-change-listener');
	})();
});

 

  • tsconfig.json
{
	"include": [
		//"./src/addons/*.js",
		"./src/js/*.js"
	],
	"compilerOptions": {
		"outDir": "./dist/lib",
		"declarationDir": "dist/types",
		"target": "ES6",
		"module": "ES6",
		"moduleResolution": "Classic",
		"strictPropertyInitialization": false,
		"esModuleInterop": true,
		"noImplicitAny": true,
		"noImplicitReturns": true,
		"noImplicitThis": true,
		"allowSyntheticDefaultImports": true,
		"removeComments": true,
		"allowJs": true,
		"checkJs": true,
		"strict": false,
		"skipLibCheck": true,
		"allowUmdGlobalAccess": true,
		"alwaysStrict": true,
		"useDefineForClassFields": true,
		// Generate d.ts files
		"declaration": true,
		// only output d.ts files
		"emitDeclarationOnly": true,
		"declarationMap": true,
		//"types": [],
		"typeRoots": [
			"./src/types"
		]
	},
	"exclude": [
		"node_modules",
		"./node_modules",
		"./node_modules/*",
		"./node_modules/@types/node/index.d.ts",
		".backup",
		".github",
		"build",
		"demos",
		"dist",
		"docs",
		"release"
	]
}

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...