mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
Add parsers for the background css shorthand property, make ViewBase unit testable in node environment
Add background parser and linear-gradient parser
Use sticky regexes
Simplify some types, introduce generic Parsed<T> instead of & TokenRange
Apply each parser to return a { start, end, value } object
Move the css selector parser to the css/parser and unify types
Add the first steps toward building homegrown css parser
Add somewhat standards compliant tokenizer, add baseline, rework and shady css parsers
Enable all tests again, skip flaky perf test
Improve css parser tokenizer by converting some char token types to simple string
Implement 'parse a stylesheet'
Add gonzales css-parser
Add parseLib and css-tree perf
Add a thin parser layer that will convert CSS3 tokens to values, for now output is compatible with rework
Make root tsc green
Return the requires of tns-core-modules to use relative paths for webpack to work
Implement support for '@import 'url-string';
Fix function parser, function-token is no-longer neglected
Make the style-scope be able to load from "css" and "css-ast" modules
Add a loadAppCss event so theme can be added to snapshot separately from loaded
196 lines
6.4 KiB
TypeScript
196 lines
6.4 KiB
TypeScript
// Required by TypeScript compiler
|
|
require("./decorators");
|
|
|
|
// Required by V8 snapshot generator
|
|
if (!global.__extends) {
|
|
global.__extends = function (d, b) {
|
|
for (var p in b) {
|
|
if (b.hasOwnProperty(p)) {
|
|
d[p] = b[p];
|
|
}
|
|
}
|
|
function __() { this.constructor = d; }
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
};
|
|
}
|
|
|
|
// This method iterates all the keys in the source exports object and copies them to the destination exports one.
|
|
// Note: the method will not check for naming collisions and will override any already existing entries in the destination exports.
|
|
global.moduleMerge = function (sourceExports: any, destExports: any) {
|
|
for (var key in sourceExports) {
|
|
destExports[key] = sourceExports[key];
|
|
}
|
|
}
|
|
|
|
import * as timerModule from "../timer";
|
|
import * as dialogsModule from "../ui/dialogs";
|
|
|
|
type ModuleLoader = (name?: string) => any;
|
|
const modules: Map<string, ModuleLoader> = new Map<string, ModuleLoader>();
|
|
|
|
(<any>global).moduleResolvers = [global.require];
|
|
|
|
global.registerModule = function(name: string, loader: ModuleLoader): void {
|
|
modules.set(name, loader);
|
|
}
|
|
|
|
global.moduleExists = function(name: string): boolean {
|
|
return modules.has(name);
|
|
}
|
|
|
|
global.loadModule = function(name: string): any {
|
|
const loader = modules.get(name);
|
|
if (loader) {
|
|
return loader();
|
|
}
|
|
for (let resolver of (<any>global).moduleResolvers) {
|
|
const result = resolver(name);
|
|
if (result) {
|
|
modules.set(name, () => result);
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
|
|
global.zonedCallback = function (callback: Function): Function {
|
|
if ((<any>global).zone) {
|
|
// Zone v0.5.* style callback wrapping
|
|
return (<any>global).zone.bind(callback);
|
|
}
|
|
if ((<any>global).Zone) {
|
|
// Zone v0.6.* style callback wrapping
|
|
return (<any>global).Zone.current.wrap(callback);
|
|
} else {
|
|
return callback;
|
|
}
|
|
}
|
|
|
|
global.registerModule("timer", () => require("timer"));
|
|
global.registerModule("ui/dialogs", () => require("ui/dialogs"));
|
|
global.registerModule("xhr", () => require("xhr"));
|
|
global.registerModule("fetch", () => require("fetch"));
|
|
|
|
const __tnsGlobalMergedModules = new Map<string, boolean>();
|
|
|
|
function registerOnGlobalContext(name: string, module: string): void {
|
|
|
|
Object.defineProperty(global, name, {
|
|
get: function () {
|
|
// We do not need to cache require() call since it is already cached in the runtime.
|
|
let m = global.loadModule(module);
|
|
|
|
// Redefine the property to make sure the above code is executed only once.
|
|
let resolvedValue = m[name];
|
|
Object.defineProperty(this, name, { value: resolvedValue, configurable: true, writable: true });
|
|
|
|
return resolvedValue;
|
|
},
|
|
configurable: true
|
|
});
|
|
}
|
|
|
|
let snapshotGlobals;
|
|
export function install() {
|
|
if ((<any>global).__snapshot || (<any>global).__snapshotEnabled) {
|
|
if (!snapshotGlobals) {
|
|
// require in snapshot mode is cheap
|
|
var timer: typeof timerModule = require("timer");
|
|
var dialogs: typeof dialogsModule = require("ui/dialogs");
|
|
var xhr = require("xhr");
|
|
var fetch = require("fetch");
|
|
var consoleModule = require("console");
|
|
|
|
snapshotGlobals = snapshotGlobals || {
|
|
setTimeout: timer.setTimeout,
|
|
clearTimeout: timer.clearTimeout,
|
|
setInterval: timer.setInterval,
|
|
clearInterval: timer.clearInterval,
|
|
|
|
alert: dialogs.alert,
|
|
confirm: dialogs.confirm,
|
|
prompt: dialogs.prompt,
|
|
login: dialogs.login,
|
|
action: dialogs.action,
|
|
|
|
XMLHttpRequest: xhr.XMLHttpRequest,
|
|
FormData: xhr.FormData,
|
|
|
|
fetch: fetch.fetch,
|
|
Headers: fetch.Headers,
|
|
Request: fetch.Request,
|
|
Response: fetch.Response,
|
|
|
|
console: new consoleModule.Console()
|
|
}
|
|
}
|
|
Object.assign(global, snapshotGlobals);
|
|
} else {
|
|
registerOnGlobalContext("setTimeout", "timer");
|
|
registerOnGlobalContext("clearTimeout", "timer");
|
|
registerOnGlobalContext("setInterval", "timer");
|
|
registerOnGlobalContext("clearInterval", "timer");
|
|
|
|
registerOnGlobalContext("alert", "ui/dialogs");
|
|
registerOnGlobalContext("confirm", "ui/dialogs");
|
|
registerOnGlobalContext("prompt", "ui/dialogs");
|
|
registerOnGlobalContext("login", "ui/dialogs");
|
|
registerOnGlobalContext("action", "ui/dialogs");
|
|
|
|
registerOnGlobalContext("XMLHttpRequest", "xhr");
|
|
registerOnGlobalContext("FormData", "xhr");
|
|
|
|
registerOnGlobalContext("fetch", "fetch");
|
|
registerOnGlobalContext("Headers", "fetch");
|
|
registerOnGlobalContext("Request", "fetch");
|
|
registerOnGlobalContext("Response", "fetch");
|
|
|
|
// check whether the 'android' namespace is exposed
|
|
// if positive - the current device is an Android
|
|
// so a custom implementation of the global 'console' object is attached.
|
|
// otherwise do nothing on iOS - the NS runtime provides a native 'console' functionality.
|
|
if ((<any>global).android) {
|
|
const consoleModule = require("console");
|
|
(<any>global).console = new consoleModule.Console();
|
|
}
|
|
}
|
|
}
|
|
install();
|
|
|
|
export function Deprecated(target: Object, key?: string | symbol, descriptor?: any) {
|
|
if (descriptor) {
|
|
var originalMethod = descriptor.value;
|
|
|
|
descriptor.value = function (...args: any[]) {
|
|
console.log(`${key} is deprecated`);
|
|
|
|
return originalMethod.apply(this, args);
|
|
}
|
|
|
|
return descriptor;
|
|
} else {
|
|
console.log(`${(target && (<any>target).name || target)} is deprecated`);
|
|
return target;
|
|
}
|
|
}
|
|
|
|
global.Deprecated = Deprecated;
|
|
|
|
export function Experimental(target: Object, key?: string | symbol, descriptor?: any) {
|
|
if (descriptor) {
|
|
var originalMethod = descriptor.value;
|
|
|
|
descriptor.value = function (...args: any[]) {
|
|
console.log(`${key} is experimental`);
|
|
|
|
return originalMethod.apply(this, args);
|
|
}
|
|
|
|
return descriptor;
|
|
} else {
|
|
console.log(`${(target && (<any>target).name || target)} is experimental`);
|
|
return target;
|
|
}
|
|
}
|
|
|
|
global.Experimental = Experimental;
|