Esempio n. 1
0
        public JavaScriptValue LoadModule(JSFileObject file, string[] modulesToReload = null)
        {
            if (modulesToReload != null)
            {
                //TODO: For now we just reload all. Later on it would be nice to reaload only the changed ones and the ones
                // referencing them

                foreach (var m in moduleCache.Keys.ToList())
                {
                    if (!_predefinedModules.ContainsKey(m))
                    {
                        moduleCache.Remove(m);
                    }
                }
                //foreach (var m in modulesToReload)
                //{
                //    moduleCache.Remove(m);
                //}
            }

            var rootModule = CreateModule(null, file);

            ParseModuleQueue();

            var returnValue = JavaScriptModuleRecord.RunModule(rootModule);

            ParseModuleQueue();

            return(returnValue);
        }
Esempio n. 2
0
        private JavaScriptModuleRecord CreateModule(JavaScriptModuleRecord?parent, JSFileObject file)
        {
            if (moduleCache.ContainsKey(file.Path))
            {
                return(moduleCache[file.Path]);
            }

            var result = JavaScriptModuleRecord.Create(parent, file.Path);

            moduleCache.Add(file.Path, result);
            result.HostUrl = file.Path;

            JavaScriptModuleRecord.SetFetchModuleCallback(
                result,
                (JavaScriptModuleRecord reference, JavaScriptValue name, out JavaScriptModuleRecord record) =>
            {
                var moduleName = name.ToString();
                var parentPath = reference.HostUrl;

                if (_predefinedModules.ContainsKey(moduleName))
                {
                    record = CreateModule(reference, _predefinedModules[moduleName]);

                    return(JavaScriptErrorCode.NoError);
                }

                var modulePath = string.IsNullOrWhiteSpace(parentPath)
                        ? moduleName
                        : Path.GetFullPath($"{Path.Combine(Path.GetDirectoryName(parentPath), moduleName)}");

                modulePath = RemovePathToResources(modulePath);

                var module = Resources.Load <JSFileObject>(modulePath);

                if (module == null)
                {
                    throw new EntryPointNotFoundException($"Module {modulePath} doesn't exist'");
                }

                record = CreateModule(reference, module);

                return(JavaScriptErrorCode.NoError);
            });

            JavaScriptModuleRecord.SetFetchModuleScriptCallback(result, FetchImportedModuleFromScript);
            JavaScriptModuleRecord.SetNotifyReady(result, ModuleNotifyReady);

            if (file.Path != null)
            {
                _moduleParseQueue.Enqueue(() =>
                {
                    JavaScriptModuleRecord.ParseScript(result, file.Code, _currentSourceContext++);
                    // Debug.Log($"module {file.Path} Parsed");
                });
            }

            // Debug.Log($"{file.Path} module created");
            return(result);
        }