From a6c91ebc569110993c7c4130f0456504f624459a Mon Sep 17 00:00:00 2001 From: Sam Gammon Date: Thu, 17 Feb 2022 17:29:47 -0800 Subject: [PATCH] Feature: Closure Support This changeset amends the current copy of IncrementalDOM to work again from Closure and Soy's iDOM compiler. --- .bazelrc | 3 + .bazelversion | 1 + BUILD | 15 +- WORKSPACE | 32 ++ closure/BUILD | 43 +++ closure/index.d.ts | 9 + closure/index.js | 81 +++++ closure/index_es5_tsconfig.json | 1 + closure/src/assertions.d.ts | 86 ++++++ closure/src/assertions.js | 232 +++++++++++++++ closure/src/attributes.d.ts | 37 +++ closure/src/attributes.js | 172 +++++++++++ closure/src/changes.d.ts | 15 + closure/src/changes.js | 57 ++++ closure/src/context.d.ts | 17 ++ closure/src/context.js | 68 +++++ closure/src/core.d.ts | 92 ++++++ closure/src/core.js | 476 ++++++++++++++++++++++++++++++ closure/src/debug.d.ts | 2 + closure/src/debug.js | 13 + closure/src/diff.d.ts | 16 + closure/src/diff.js | 86 ++++++ closure/src/dom_util.d.ts | 30 ++ closure/src/dom_util.js | 127 ++++++++ closure/src/global.d.ts | 5 + closure/src/global.js | 37 +++ closure/src/node_data.d.ts | 80 +++++ closure/src/node_data.js | 226 ++++++++++++++ closure/src/nodes.d.ts | 18 ++ closure/src/nodes.js | 80 +++++ closure/src/notifications.d.ts | 16 + closure/src/notifications.js | 39 +++ closure/src/src_es5_tsconfig.json | 1 + closure/src/symbols.d.ts | 5 + closure/src/symbols.js | 16 + closure/src/types.d.ts | 16 + closure/src/types.js | 43 +++ closure/src/util.d.ts | 27 ++ closure/src/util.js | 66 +++++ closure/src/virtual_elements.d.ts | 96 ++++++ closure/src/virtual_elements.js | 344 +++++++++++++++++++++ external/tsickle.bzl | 41 +++ package-lock.json | 70 +++-- package.json | 11 +- release/BUILD | 3 +- src/BUILD | 5 +- test/BUILD | 1 + tools/BUILD.bazel | 0 tools/ts.bzl | 30 ++ tools/tsc/BUILD.bazel | 21 ++ tsconfig.json | 7 +- 51 files changed, 2984 insertions(+), 31 deletions(-) create mode 100644 .bazelversion create mode 100644 closure/BUILD create mode 100755 closure/index.d.ts create mode 100755 closure/index.js create mode 100755 closure/index_es5_tsconfig.json create mode 100755 closure/src/assertions.d.ts create mode 100755 closure/src/assertions.js create mode 100755 closure/src/attributes.d.ts create mode 100755 closure/src/attributes.js create mode 100755 closure/src/changes.d.ts create mode 100755 closure/src/changes.js create mode 100755 closure/src/context.d.ts create mode 100755 closure/src/context.js create mode 100755 closure/src/core.d.ts create mode 100755 closure/src/core.js create mode 100755 closure/src/debug.d.ts create mode 100755 closure/src/debug.js create mode 100755 closure/src/diff.d.ts create mode 100755 closure/src/diff.js create mode 100755 closure/src/dom_util.d.ts create mode 100755 closure/src/dom_util.js create mode 100755 closure/src/global.d.ts create mode 100755 closure/src/global.js create mode 100755 closure/src/node_data.d.ts create mode 100755 closure/src/node_data.js create mode 100755 closure/src/nodes.d.ts create mode 100755 closure/src/nodes.js create mode 100755 closure/src/notifications.d.ts create mode 100755 closure/src/notifications.js create mode 100755 closure/src/src_es5_tsconfig.json create mode 100755 closure/src/symbols.d.ts create mode 100755 closure/src/symbols.js create mode 100755 closure/src/types.d.ts create mode 100755 closure/src/types.js create mode 100755 closure/src/util.d.ts create mode 100755 closure/src/util.js create mode 100755 closure/src/virtual_elements.d.ts create mode 100755 closure/src/virtual_elements.js create mode 100644 external/tsickle.bzl create mode 100644 tools/BUILD.bazel create mode 100644 tools/ts.bzl create mode 100644 tools/tsc/BUILD.bazel diff --git a/.bazelrc b/.bazelrc index 9cb698bc..9089907f 100644 --- a/.bazelrc +++ b/.bazelrc @@ -58,3 +58,6 @@ try-import %workspace%/.bazelrc.user # It would find the "test/*.ts" reference when compiling //src:src, and the FileCache will then error # when TS attempts to read one of these files that doesn't belong in the compilation. build --worker_sandboxing + +# Don't allow workers for TypeScript compiler +build --strategy=TypeScriptCompile=sandboxed diff --git a/.bazelversion b/.bazelversion new file mode 100644 index 00000000..0062ac97 --- /dev/null +++ b/.bazelversion @@ -0,0 +1 @@ +5.0.0 diff --git a/BUILD b/BUILD index d85beff5..5a264604 100644 --- a/BUILD +++ b/BUILD @@ -1,16 +1,24 @@ package(default_visibility = ["//:__subpackages__"]) -load("@npm//@bazel/typescript:index.bzl", "ts_library") +load("//tools:ts.bzl", "ts_library") load("@build_bazel_rules_nodejs//:index.bzl", "pkg_npm") +load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_binary") load("@npm//@bazel/rollup:index.bzl", "rollup_bundle") ### Produce umd and cjs bundles ts_library( - name = "dev", + name = "index", srcs = ["index.ts"], - tsickle_typed = True, deps = ["//src"], + package_name = "incrementaldom", + module_name = "incrementaldom", + visibility = ["//visibility:public"], +) + +alias( + name = "dev", + actual = "index", ) [ @@ -81,7 +89,6 @@ genrule( ts_library( name = "release", srcs = [":release_index"], - tsickle_typed = True, deps = ["//release"], ) diff --git a/WORKSPACE b/WORKSPACE index 3d453490..43e705cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -12,6 +12,12 @@ http_archive( urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/4.6.0/rules_nodejs-4.6.0.tar.gz"], ) +http_archive( + name = "rules_nodejs", + sha256 = "ddb78717b802f8dd5d4c01c340ecdc007c8ced5c1df7db421d0df3d642ea0580", + urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/4.6.0/rules_nodejs-4.6.0.tar.gz"], +) + load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories") node_repositories(package_json = ["//:package.json"]) @@ -32,6 +38,21 @@ Try running `npm run bazel` instead. minimum_bazel_version = "0.21.0", ) +# Setup Closure tools +http_archive( + name = "io_bazel_rules_closure", + sha256 = "7d206c2383811f378a5ef03f4aacbcf5f47fd8650f6abbc3fa89f3a27dd8b176", + strip_prefix = "rules_closure-0.10.0", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/rules_closure/archive/0.10.0.tar.gz", + "https://github.com/bazelbuild/rules_closure/archive/0.10.0.tar.gz", + ], +) + +load("@io_bazel_rules_closure//closure:repositories.bzl", "rules_closure_dependencies", "rules_closure_toolchains") +rules_closure_dependencies() +rules_closure_toolchains() + # Setup the Node.js toolchain & install our npm dependencies into @npm npm_install( name = "npm", @@ -56,3 +77,14 @@ browser_repositories( chromium = True, firefox = True, ) + +# Grab `tsickle` for `tslib` sources +http_archive( + name = "com_google_angular_tsickle_tslib", + sha256 = "1cc046dd9f56041c03ca55f81e580aa1b1a6385fa95ed65abc0d70992231dd5a", + strip_prefix = "tsickle-888aba275b9d7070880b64afbf3534dd55f0f72c/third_party/tslib", + build_file = "tsickle.bzl", + urls = [ + "https://github.com/angular/tsickle/archive/888aba275b9d7070880b64afbf3534dd55f0f72c.tar.gz", + ], +) diff --git a/closure/BUILD b/closure/BUILD new file mode 100644 index 00000000..28aa3264 --- /dev/null +++ b/closure/BUILD @@ -0,0 +1,43 @@ +package( + default_visibility = ["//visibility:public"], +) + +load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_library", "closure_js_binary") + +IDOM_SUPPRESSIONS = [ + "JSC_REQUIRES_NOT_SORTED", +] + +IDOM_DEPS = [ + "@io_bazel_rules_closure//closure/templates:soy_tslib", +] + + +closure_js_library( + name = "src", + srcs = glob(["src/**/*.js"]), + lenient = True, + deps = IDOM_DEPS, + suppress = IDOM_SUPPRESSIONS, +) + +closure_js_library( + name = "index", + srcs = ["index.js"], + exports = [":src"], + lenient = True, + deps = [":src"] + IDOM_DEPS, + suppress = IDOM_SUPPRESSIONS, +) + +closure_js_binary( + name = "bin", + deps = [":index"] + IDOM_DEPS, + entry_points = ["goog:incrementaldom.index"], + dependency_mode = "PRUNE_LEGACY", +) + +alias( + name = "closure", + actual = "index", +) diff --git a/closure/index.d.ts b/closure/index.d.ts new file mode 100755 index 00000000..48d949bc --- /dev/null +++ b/closure/index.d.ts @@ -0,0 +1,9 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +export { applyAttr, applyProp, attributes, createAttributeMap } from './src/attributes'; +export { alignWithDOM, alwaysDiffAttributes, close, createPatchInner, createPatchOuter, currentElement, currentContext, currentPointer, open, patchInner as patch, patchInner, patchOuter, skip, skipNode, tryGetCurrentElement } from './src/core'; +export { setKeyAttributeName } from './src/global'; +export { clearCache, getKey, importNode, isDataInitialized } from './src/node_data'; +export { notifications } from './src/notifications'; +export { symbols } from './src/symbols'; +export { applyAttrs, applyStatics, attr, elementClose, elementOpen, elementOpenEnd, elementOpenStart, elementVoid, key, text } from './src/virtual_elements'; +export * from './src/types'; diff --git a/closure/index.js b/closure/index.js new file mode 100755 index 00000000..d6920792 --- /dev/null +++ b/closure/index.js @@ -0,0 +1,81 @@ +/** + * @fileoverview added by tsickle + * Generated from: index.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +goog.module('incrementaldom'); +var module = module || { id: 'index.js' }; +goog.require('tslib'); +const tsickle_attributes_1 = goog.requireType("incrementaldom.src.attributes"); +const tsickle_core_2 = goog.requireType("incrementaldom.src.core"); +const tsickle_global_3 = goog.requireType("incrementaldom.src.global"); +const tsickle_node_data_4 = goog.requireType("incrementaldom.src.node_data"); +const tsickle_notifications_5 = goog.requireType("incrementaldom.src.notifications"); +const tsickle_symbols_6 = goog.requireType("incrementaldom.src.symbols"); +const tsickle_virtual_elements_7 = goog.requireType("incrementaldom.src.virtual_elements"); +const tsickle_types_8 = goog.requireType("incrementaldom.src.types"); +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +var attributes_1 = goog.require('incrementaldom.src.attributes'); +exports.applyAttr = attributes_1.applyAttr; +exports.applyProp = attributes_1.applyProp; +exports.attributes = attributes_1.attributes; +exports.createAttributeMap = attributes_1.createAttributeMap; +var core_1 = goog.require('incrementaldom.src.core'); +exports.alignWithDOM = core_1.alignWithDOM; +exports.alwaysDiffAttributes = core_1.alwaysDiffAttributes; +exports.close = core_1.close; +exports.createPatchInner = core_1.createPatchInner; +exports.createPatchOuter = core_1.createPatchOuter; +exports.currentElement = core_1.currentElement; +exports.currentContext = core_1.currentContext; +exports.currentPointer = core_1.currentPointer; +exports.open = core_1.open; +exports.patch = core_1.patchInner; +exports.patchInner = core_1.patchInner; +exports.patchOuter = core_1.patchOuter; +exports.skip = core_1.skip; +exports.skipNode = core_1.skipNode; +exports.tryGetCurrentElement = core_1.tryGetCurrentElement; +var global_1 = goog.require('incrementaldom.src.global'); +exports.setKeyAttributeName = global_1.setKeyAttributeName; +var node_data_1 = goog.require('incrementaldom.src.node_data'); +exports.clearCache = node_data_1.clearCache; +exports.getKey = node_data_1.getKey; +exports.importNode = node_data_1.importNode; +exports.isDataInitialized = node_data_1.isDataInitialized; +var notifications_1 = goog.require('incrementaldom.src.notifications'); +exports.notifications = notifications_1.notifications; +var symbols_1 = goog.require('incrementaldom.src.symbols'); +exports.symbols = symbols_1.symbols; +var virtual_elements_1 = goog.require('incrementaldom.src.virtual_elements'); +exports.applyAttrs = virtual_elements_1.applyAttrs; +exports.applyStatics = virtual_elements_1.applyStatics; +exports.attr = virtual_elements_1.attr; +exports.elementClose = virtual_elements_1.elementClose; +exports.elementOpen = virtual_elements_1.elementOpen; +exports.elementOpenEnd = virtual_elements_1.elementOpenEnd; +exports.elementOpenStart = virtual_elements_1.elementOpenStart; +exports.elementVoid = virtual_elements_1.elementVoid; +exports.key = virtual_elements_1.key; +exports.text = virtual_elements_1.text; +var types_1 = goog.require('incrementaldom.src.types'); +/** @typedef {!tsickle_types_8.ElementConstructor} */ +exports.ElementConstructor; // re-export typedef +/** @typedef {!tsickle_types_8.AttrMutator} */ +exports.AttrMutator; // re-export typedef +/** @typedef {!tsickle_types_8.AttrMutatorConfig} */ +exports.AttrMutatorConfig; // re-export typedef +/** @typedef {!tsickle_types_8.NameOrCtorDef} */ +exports.NameOrCtorDef; // re-export typedef +/** @typedef {!tsickle_types_8.Key} */ +exports.Key; // re-export typedef +/** @typedef {!tsickle_types_8.Statics} */ +exports.Statics; // re-export typedef +/** @typedef {!tsickle_types_8.PatchFunction} */ +exports.PatchFunction; // re-export typedef +/** @typedef {!tsickle_types_8.MatchFnDef} */ +exports.MatchFnDef; // re-export typedef +/** @typedef {!tsickle_types_8.PatchConfig} */ +exports.PatchConfig; // re-export typedef +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxrRUFBc0Y7QUFBOUUsaUNBQUEsU0FBUyxDQUFBO0FBQUUsaUNBQUEsU0FBUyxDQUFBO0FBQUUsa0NBQUEsVUFBVSxDQUFBO0FBQUUsMENBQUEsa0JBQWtCLENBQUE7QUFDNUQsc0RBQWtQO0FBQTFPLDhCQUFBLFlBQVksQ0FBQTtBQUFFLHNDQUFBLG9CQUFvQixDQUFBO0FBQUUsdUJBQUEsS0FBSyxDQUFBO0FBQUUsa0NBQUEsZ0JBQWdCLENBQUE7QUFBRSxrQ0FBQSxnQkFBZ0IsQ0FBQTtBQUFFLGdDQUFBLGNBQWMsQ0FBQTtBQUFFLGdDQUFBLGNBQWMsQ0FBQTtBQUFFLGdDQUFBLGNBQWMsQ0FBQTtBQUFFLHNCQUFBLElBQUksQ0FBQTtBQUFFLHVCQUFBLFVBQVUsQ0FBUztBQUFFLDRCQUFBLFVBQVUsQ0FBQTtBQUFFLDRCQUFBLFVBQVUsQ0FBQTtBQUFFLHNCQUFBLElBQUksQ0FBQTtBQUFFLDBCQUFBLFFBQVEsQ0FBQTtBQUFFLHNDQUFBLG9CQUFvQixDQUFBO0FBQzlOLDBEQUFpRDtBQUF6Qyx1Q0FBQSxtQkFBbUIsQ0FBQTtBQUMzQixnRUFBaUY7QUFBekUsaUNBQUEsVUFBVSxDQUFBO0FBQUMsNkJBQUEsTUFBTSxDQUFBO0FBQUUsaUNBQUEsVUFBVSxDQUFBO0FBQUUsd0NBQUEsaUJBQWlCLENBQUE7QUFDeEQsd0VBQWtEO0FBQTFDLHdDQUFBLGFBQWEsQ0FBQTtBQUNyQiw0REFBc0M7QUFBOUIsNEJBQUEsT0FBTyxDQUFBO0FBQ2YsOEVBQTJKO0FBQW5KLHdDQUFBLFVBQVUsQ0FBQTtBQUFFLDBDQUFBLFlBQVksQ0FBQTtBQUFFLGtDQUFBLElBQUksQ0FBQTtBQUFFLDBDQUFBLFlBQVksQ0FBQTtBQUFFLHlDQUFBLFdBQVcsQ0FBQTtBQUFFLDRDQUFBLGNBQWMsQ0FBQTtBQUFFLDhDQUFBLGdCQUFnQixDQUFBO0FBQUUseUNBQUEsV0FBVyxDQUFBO0FBQUUsaUNBQUEsR0FBRyxDQUFBO0FBQUUsa0NBQUEsSUFBSSxDQUFBO0FBQzNILHdEQUE0QiIsInNvdXJjZXNDb250ZW50IjpbIi8vICBDb3B5cmlnaHQgMjAxOCBUaGUgSW5jcmVtZW50YWwgRE9NIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKiogQGxpY2Vuc2UgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgKi9cblxuZXhwb3J0IHthcHBseUF0dHIsIGFwcGx5UHJvcCwgYXR0cmlidXRlcywgY3JlYXRlQXR0cmlidXRlTWFwfSBmcm9tICcuL3NyYy9hdHRyaWJ1dGVzJztcbmV4cG9ydCB7YWxpZ25XaXRoRE9NLCBhbHdheXNEaWZmQXR0cmlidXRlcywgY2xvc2UsIGNyZWF0ZVBhdGNoSW5uZXIsIGNyZWF0ZVBhdGNoT3V0ZXIsIGN1cnJlbnRFbGVtZW50LCBjdXJyZW50Q29udGV4dCwgY3VycmVudFBvaW50ZXIsIG9wZW4sIHBhdGNoSW5uZXIgYXMgcGF0Y2gsIHBhdGNoSW5uZXIsIHBhdGNoT3V0ZXIsIHNraXAsIHNraXBOb2RlLCB0cnlHZXRDdXJyZW50RWxlbWVudH0gZnJvbSAnLi9zcmMvY29yZSc7XG5leHBvcnQge3NldEtleUF0dHJpYnV0ZU5hbWV9IGZyb20gJy4vc3JjL2dsb2JhbCc7XG5leHBvcnQge2NsZWFyQ2FjaGUsZ2V0S2V5LCBpbXBvcnROb2RlLCBpc0RhdGFJbml0aWFsaXplZH0gZnJvbSAnLi9zcmMvbm9kZV9kYXRhJztcbmV4cG9ydCB7bm90aWZpY2F0aW9uc30gZnJvbSAnLi9zcmMvbm90aWZpY2F0aW9ucyc7XG5leHBvcnQge3N5bWJvbHN9IGZyb20gJy4vc3JjL3N5bWJvbHMnO1xuZXhwb3J0IHthcHBseUF0dHJzLCBhcHBseVN0YXRpY3MsIGF0dHIsIGVsZW1lbnRDbG9zZSwgZWxlbWVudE9wZW4sIGVsZW1lbnRPcGVuRW5kLCBlbGVtZW50T3BlblN0YXJ0LCBlbGVtZW50Vm9pZCwga2V5LCB0ZXh0fSBmcm9tICcuL3NyYy92aXJ0dWFsX2VsZW1lbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL3R5cGVzJztcbiJdfQ== \ No newline at end of file diff --git a/closure/index_es5_tsconfig.json b/closure/index_es5_tsconfig.json new file mode 100755 index 00000000..387ec478 --- /dev/null +++ b/closure/index_es5_tsconfig.json @@ -0,0 +1 @@ +{"compilerOptions": {"target": "es2015", "module": "umd", "downlevelIteration": true, "skipDefaultLibCheck": true, "moduleResolution": "node", "outDir": "../../../bazel-out/darwin-fastbuild/bin", "rootDir": "../../..", "rootDirs": ["../../..", "../../../bazel-out/darwin-fastbuild/bin", "../../../bazel-out/darwin-fastbuild/bin"], "baseUrl": "../../..", "paths": {"@incremental_dom/src": ["src", "bazel-out/darwin-fastbuild/bin/src", "bazel-out/darwin-fastbuild/bin/src"], "@incremental_dom/src/*": ["src/*", "bazel-out/darwin-fastbuild/bin/src/*", "bazel-out/darwin-fastbuild/bin/src/*"], "incremental_dom": ["", "bazel-out/darwin-fastbuild/bin/", "bazel-out/darwin-fastbuild/bin/"], "incremental_dom/*": ["./*", "bazel-out/darwin-fastbuild/bin/*", "bazel-out/darwin-fastbuild/bin/*"], "*": ["external/npm/node_modules/*", "external/npm/node_modules/@types/*"]}, "preserveConstEnums": false, "experimentalDecorators": true, "emitDecoratorMetadata": true, "jsx": "react", "noErrorTruncation": false, "noEmitOnError": false, "declaration": true, "declarationDir": "../../../bazel-out/darwin-fastbuild/bin", "stripInternal": true, "inlineSourceMap": true, "inlineSources": true, "sourceMap": false, "typeRoots": ["../../../external/npm/node_modules/@types"], "types": []}, "bazelOptions": {"workspaceName": "incremental_dom", "target": "//:index", "package": "", "tsickleGenerateExterns": true, "tsickleExternsPath": "", "untyped": false, "typeBlackListPaths": [], "ignoreWarningPaths": [], "es5Mode": true, "manifest": "bazel-out/darwin-fastbuild/bin/index.es5.MF", "compilationTargetSrc": ["index.ts"], "addDtsClutzAliases": false, "typeCheckDependencies": false, "expectedDiagnostics": [], "typeCheck": true, "allowedStrictDeps": ["bazel-out/darwin-fastbuild/bin/src/debug.d.ts", "bazel-out/darwin-fastbuild/bin/src/assertions.d.ts", "bazel-out/darwin-fastbuild/bin/src/attributes.d.ts", "bazel-out/darwin-fastbuild/bin/src/changes.d.ts", "bazel-out/darwin-fastbuild/bin/src/context.d.ts", "bazel-out/darwin-fastbuild/bin/src/core.d.ts", "bazel-out/darwin-fastbuild/bin/src/diff.d.ts", "bazel-out/darwin-fastbuild/bin/src/dom_util.d.ts", "bazel-out/darwin-fastbuild/bin/src/global.d.ts", "bazel-out/darwin-fastbuild/bin/src/node_data.d.ts", "bazel-out/darwin-fastbuild/bin/src/nodes.d.ts", "bazel-out/darwin-fastbuild/bin/src/notifications.d.ts", "bazel-out/darwin-fastbuild/bin/src/symbols.d.ts", "bazel-out/darwin-fastbuild/bin/src/types.d.ts", "bazel-out/darwin-fastbuild/bin/src/util.d.ts", "bazel-out/darwin-fastbuild/bin/src/virtual_elements.d.ts", "index.ts"], "moduleName": "incremental_dom", "nodeModulesPrefix": "external/npm/node_modules"}, "files": ["../../../external/npm/node_modules/typescript/lib/protocol.d.ts", "../../../external/npm/node_modules/typescript/lib/tsserverlibrary.d.ts", "../../../external/npm/node_modules/typescript/lib/typescript.d.ts", "../../../external/npm/node_modules/typescript/lib/typescriptServices.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/debug.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/assertions.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/attributes.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/changes.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/context.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/core.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/diff.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/dom_util.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/global.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/node_data.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/nodes.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/notifications.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/symbols.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/types.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/util.d.ts", "../../../bazel-out/darwin-fastbuild/bin/src/virtual_elements.d.ts", "../../../index.ts"], "compileOnSave": false, "extends": "../../../tsconfig"} \ No newline at end of file diff --git a/closure/src/assertions.d.ts b/closure/src/assertions.d.ts new file mode 100755 index 00000000..ba9b0e0b --- /dev/null +++ b/closure/src/assertions.d.ts @@ -0,0 +1,86 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +import { NameOrCtorDef } from "./types"; +/** + * Asserts that a value exists and is not null or undefined. goog.asserts + * is not used in order to avoid dependencies on external code. + * @param val The value to assert is truthy. + * @returns The value. + */ +declare function assert(val: T | null | undefined): T; +/** + * Makes sure that there is a current patch context. + * @param functionName The name of the caller, for the error message. + */ +declare function assertInPatch(functionName: string): void; +/** + * Makes sure that a patch closes every node that it opened. + * @param openElement + * @param root + */ +declare function assertNoUnclosedTags(openElement: Node | null, root: Node | DocumentFragment): void; +/** + * Makes sure that node being outer patched has a parent node. + * @param parent + */ +declare function assertPatchOuterHasParentNode(parent: Node | null): void; +/** + * Makes sure that the caller is not where attributes are expected. + * @param functionName The name of the caller, for the error message. + */ +declare function assertNotInAttributes(functionName: string): void; +/** + * Makes sure that the caller is not inside an element that has declared skip. + * @param functionName The name of the caller, for the error message. + */ +declare function assertNotInSkip(functionName: string): void; +/** + * Makes sure that the caller is where attributes are expected. + * @param functionName The name of the caller, for the error message. + */ +declare function assertInAttributes(functionName: string): void; +/** + * Makes sure the patch closes virtual attributes call + */ +declare function assertVirtualAttributesClosed(): void; +/** + * Makes sure that tags are correctly nested. + * @param currentNameOrCtor + * @param nameOrCtor + */ +declare function assertCloseMatchesOpenTag(currentNameOrCtor: NameOrCtorDef, nameOrCtor: NameOrCtorDef): void; +/** + * Makes sure that no children elements have been declared yet in the current + * element. + * @param functionName The name of the caller, for the error message. + * @param previousNode + */ +declare function assertNoChildrenDeclaredYet(functionName: string, previousNode: Node | null): void; +/** + * Checks that a call to patchOuter actually patched the element. + * @param maybeStartNode The value for the currentNode when the patch + * started. + * @param maybeCurrentNode The currentNode when the patch finished. + * @param expectedNextNode The Node that is expected to follow the + * currentNode after the patch; + * @param expectedPrevNode The Node that is expected to preceed the + * currentNode after the patch. + */ +declare function assertPatchElementNoExtras(maybeStartNode: Node | null, maybeCurrentNode: Node | null, expectedNextNode: Node | null, expectedPrevNode: Node | null): void; +/** + * @param newContext The current patch context. + */ +declare function updatePatchContext(newContext: {} | null): void; +/** + * Updates the state of being in an attribute declaration. + * @param value Whether or not the patch is in an attribute declaration. + * @return the previous value. + */ +declare function setInAttributes(value: boolean): boolean; +/** + * Updates the state of being in a skip element. + * @param value Whether or not the patch is skipping the children of a + * parent node. + * @return the previous value. + */ +declare function setInSkip(value: boolean): boolean; +export { assert, assertInPatch, assertNoUnclosedTags, assertNotInAttributes, assertInAttributes, assertCloseMatchesOpenTag, assertVirtualAttributesClosed, assertNoChildrenDeclaredYet, assertNotInSkip, assertPatchElementNoExtras, assertPatchOuterHasParentNode, setInAttributes, setInSkip, updatePatchContext }; diff --git a/closure/src/assertions.js b/closure/src/assertions.js new file mode 100755 index 00000000..2dd059d6 --- /dev/null +++ b/closure/src/assertions.js @@ -0,0 +1,232 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/assertions.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +goog.module('incrementaldom.src.assertions'); +var module = module || { id: 'src/assertions.js' }; +goog.require('tslib'); +const tsickle_global_1 = goog.requireType("incrementaldom.src.global"); +const tsickle_types_2 = goog.requireType("incrementaldom.src.types"); +// Copyright 2015 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +var global_1 = goog.require('incrementaldom.src.global'); +/** + * Keeps track whether or not we are in an attributes declaration (after + * elementOpenStart, but before elementOpenEnd). + * @type {boolean} + */ +let inAttributes = false; +/** + * Keeps track whether or not we are in an element that should not have its + * children cleared. + * @type {boolean} + */ +let inSkip = false; +/** + * Keeps track of whether or not we are in a patch. + * @type {boolean} + */ +let inPatch = false; +/** + * Asserts that a value exists and is not null or undefined. goog.asserts + * is not used in order to avoid dependencies on external code. + * @template T + * @param {(undefined|null|T)} val The value to assert is truthy. + * @return {T} The value. + */ +function assert(val) { + if (global_1.DEBUG && !val) { + throw new Error("Expected value to be defined"); + } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return (/** @type {T} */ (val)); +} +exports.assert = assert; +/** + * Makes sure that there is a current patch context. + * @param {string} functionName The name of the caller, for the error message. + * @return {void} + */ +function assertInPatch(functionName) { + if (!inPatch) { + throw new Error("Cannot call " + functionName + "() unless in patch."); + } +} +exports.assertInPatch = assertInPatch; +/** + * Makes sure that a patch closes every node that it opened. + * @param {(null|!Node)} openElement + * @param {(!Node|!DocumentFragment)} root + * @return {void} + */ +function assertNoUnclosedTags(openElement, root) { + if (openElement === root) { + return; + } + /** @type {(null|!Node)} */ + let currentElement = openElement; + /** @type {!Array} */ + const openTags = []; + while (currentElement && currentElement !== root) { + openTags.push(currentElement.nodeName.toLowerCase()); + currentElement = currentElement.parentNode; + } + throw new Error("One or more tags were not closed:\n" + openTags.join("\n")); +} +exports.assertNoUnclosedTags = assertNoUnclosedTags; +/** + * Makes sure that node being outer patched has a parent node. + * @param {(null|!Node)} parent + * @return {void} + */ +function assertPatchOuterHasParentNode(parent) { + if (!parent) { + console.warn("patchOuter requires the node have a parent if there is a key."); + } +} +exports.assertPatchOuterHasParentNode = assertPatchOuterHasParentNode; +/** + * Makes sure that the caller is not where attributes are expected. + * @param {string} functionName The name of the caller, for the error message. + * @return {void} + */ +function assertNotInAttributes(functionName) { + if (inAttributes) { + throw new Error(functionName + + "() can not be called between " + + "elementOpenStart() and elementOpenEnd()."); + } +} +exports.assertNotInAttributes = assertNotInAttributes; +/** + * Makes sure that the caller is not inside an element that has declared skip. + * @param {string} functionName The name of the caller, for the error message. + * @return {void} + */ +function assertNotInSkip(functionName) { + if (inSkip) { + throw new Error(functionName + + "() may not be called inside an element " + + "that has called skip()."); + } +} +exports.assertNotInSkip = assertNotInSkip; +/** + * Makes sure that the caller is where attributes are expected. + * @param {string} functionName The name of the caller, for the error message. + * @return {void} + */ +function assertInAttributes(functionName) { + if (!inAttributes) { + throw new Error(functionName + + "() can only be called after calling " + + "elementOpenStart()."); + } +} +exports.assertInAttributes = assertInAttributes; +/** + * Makes sure the patch closes virtual attributes call + * @return {void} + */ +function assertVirtualAttributesClosed() { + if (inAttributes) { + throw new Error("elementOpenEnd() must be called after calling " + "elementOpenStart()."); + } +} +exports.assertVirtualAttributesClosed = assertVirtualAttributesClosed; +/** + * Makes sure that tags are correctly nested. + * @param {(string|!tsickle_types_2.ElementConstructor)} currentNameOrCtor + * @param {(string|!tsickle_types_2.ElementConstructor)} nameOrCtor + * @return {void} + */ +function assertCloseMatchesOpenTag(currentNameOrCtor, nameOrCtor) { + if (currentNameOrCtor !== nameOrCtor) { + throw new Error('Received a call to close "' + + nameOrCtor + + '" but "' + + currentNameOrCtor + + '" was open.'); + } +} +exports.assertCloseMatchesOpenTag = assertCloseMatchesOpenTag; +/** + * Makes sure that no children elements have been declared yet in the current + * element. + * @param {string} functionName The name of the caller, for the error message. + * @param {(null|!Node)} previousNode + * @return {void} + */ +function assertNoChildrenDeclaredYet(functionName, previousNode) { + if (previousNode !== null) { + throw new Error(functionName + + "() must come before any child " + + "declarations inside the current element."); + } +} +exports.assertNoChildrenDeclaredYet = assertNoChildrenDeclaredYet; +/** + * Checks that a call to patchOuter actually patched the element. + * @param {(null|!Node)} maybeStartNode The value for the currentNode when the patch + * started. + * @param {(null|!Node)} maybeCurrentNode The currentNode when the patch finished. + * @param {(null|!Node)} expectedNextNode The Node that is expected to follow the + * currentNode after the patch; + * @param {(null|!Node)} expectedPrevNode The Node that is expected to preceed the + * currentNode after the patch. + * @return {void} + */ +function assertPatchElementNoExtras(maybeStartNode, maybeCurrentNode, expectedNextNode, expectedPrevNode) { + /** @type {!Node} */ + const startNode = assert(maybeStartNode); + /** @type {!Node} */ + const currentNode = assert(maybeCurrentNode); + /** @type {boolean} */ + const wasUpdated = currentNode.nextSibling === expectedNextNode && + currentNode.previousSibling === expectedPrevNode; + /** @type {boolean} */ + const wasChanged = currentNode.nextSibling === startNode.nextSibling && + currentNode.previousSibling === expectedPrevNode; + /** @type {boolean} */ + const wasRemoved = currentNode === startNode; + if (!wasUpdated && !wasChanged && !wasRemoved) { + throw new Error("There must be exactly one top level call corresponding " + + "to the patched element."); + } +} +exports.assertPatchElementNoExtras = assertPatchElementNoExtras; +/** + * @param {(null|*)} newContext The current patch context. + * @return {void} + */ +function updatePatchContext(newContext) { + inPatch = newContext != null; +} +exports.updatePatchContext = updatePatchContext; +/** + * Updates the state of being in an attribute declaration. + * @param {boolean} value Whether or not the patch is in an attribute declaration. + * @return {boolean} the previous value. + */ +function setInAttributes(value) { + /** @type {boolean} */ + const previous = inAttributes; + inAttributes = value; + return previous; +} +exports.setInAttributes = setInAttributes; +/** + * Updates the state of being in a skip element. + * @param {boolean} value Whether or not the patch is skipping the children of a + * parent node. + * @return {boolean} the previous value. + */ +function setInSkip(value) { + /** @type {boolean} */ + const previous = inSkip; + inSkip = value; + return previous; +} +exports.setInSkip = setInSkip; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hc3NlcnRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLDBEQUFpQzs7Ozs7O0lBTzdCLFlBQVksR0FBRyxLQUFLOzs7Ozs7SUFNcEIsTUFBTSxHQUFHLEtBQUs7Ozs7O0lBS2QsT0FBTyxHQUFHLEtBQUs7Ozs7Ozs7O0FBUW5CLFNBQVMsTUFBTSxDQUFlLEdBQXlCO0lBQ3JELElBQUksY0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztLQUNqRDtJQUNELG9FQUFvRTtJQUNwRSxPQUFPLG1CQUFBLEdBQUcsRUFBQyxDQUFDO0FBQ2QsQ0FBQztBQTRNQyx3QkFBTTs7Ozs7O0FBdE1SLFNBQVMsYUFBYSxDQUFDLFlBQW9CO0lBQ3pDLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsR0FBRyxZQUFZLEdBQUcscUJBQXFCLENBQUMsQ0FBQztLQUN4RTtBQUNILENBQUM7QUFtTUMsc0NBQWE7Ozs7Ozs7QUE1TGYsU0FBUyxvQkFBb0IsQ0FDM0IsV0FBd0IsRUFDeEIsSUFBNkI7SUFFN0IsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFO1FBQ3hCLE9BQU87S0FDUjs7UUFFRyxjQUFjLEdBQUcsV0FBVzs7VUFDMUIsUUFBUSxHQUFrQixFQUFFO0lBQ2xDLE9BQU8sY0FBYyxJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUU7UUFDaEQsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDckQsY0FBYyxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUM7S0FDNUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFB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QixPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBMEJDLDBDQUFlOzs7Ozs7O0FBbEJqQixTQUFTLFNBQVMsQ0FBQyxLQUFjOztVQUN6QixRQUFRLEdBQUcsTUFBTTtJQUN2QixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ2YsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQWVDLDhCQUFTIiwic291cmNlc0NvbnRlbnQiOlsiLy8gIENvcHlyaWdodCAyMDE1IFRoZSBJbmNyZW1lbnRhbCBET00gQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKiBAbGljZW5zZSBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCAqL1xuXG5pbXBvcnQgeyBERUJVRyB9IGZyb20gXCIuL2dsb2JhbFwiO1xuaW1wb3J0IHsgTmFtZU9yQ3RvckRlZiB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgd2hldGhlciBvciBub3Qgd2UgYXJlIGluIGFuIGF0dHJpYnV0ZXMgZGVjbGFyYXRpb24gKGFmdGVyXG4gKiBlbGVtZW50T3BlblN0YXJ0LCBidXQgYmVmb3JlIGVsZW1lbnRPcGVuRW5kKS5cbiAqL1xubGV0IGluQXR0cmlidXRlcyA9IGZhbHNlO1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiBhbiBlbGVtZW50IHRoYXQgc2hvdWxkIG5vdCBoYXZlIGl0c1xuICogY2hpbGRyZW4gY2xlYXJlZC5cbiAqL1xubGV0IGluU2tpcCA9IGZhbHNlO1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiBhIHBhdGNoLlxuICovXG5sZXQgaW5QYXRjaCA9IGZhbHNlO1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBhIHZhbHVlIGV4aXN0cyBhbmQgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkLiBnb29nLmFzc2VydHNcbiAqIGlzIG5vdCB1c2VkIGluIG9yZGVyIHRvIGF2b2lkIGRlcGVuZGVuY2llcyBvbiBleHRlcm5hbCBjb2RlLlxuICogQHBhcmFtIHZhbCBUaGUgdmFsdWUgdG8gYXNzZXJ0IGlzIHRydXRoeS5cbiAqIEByZXR1cm5zIFRoZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0PFQgZXh0ZW5kcyB7fT4odmFsOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFQge1xuICBpZiAoREVCVUcgJiYgIXZhbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIHZhbHVlIHRvIGJlIGRlZmluZWRcIik7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgcmV0dXJuIHZhbCE7XG59XG5cbi8qKlxuICogTWFrZXMgc3VyZSB0aGF0IHRoZXJlIGlzIGEgY3VycmVudCBwYXRjaCBjb250ZXh0LlxuICogQHBhcmFtIGZ1bmN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgY2FsbGVyLCBmb3IgdGhlIGVycm9yIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEluUGF0Y2goZnVuY3Rpb25OYW1lOiBzdHJpbmcpIHtcbiAgaWYgKCFpblBhdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNhbGwgXCIgKyBmdW5jdGlvbk5hbWUgKyBcIigpIHVubGVzcyBpbiBwYXRjaC5cIik7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWtlcyBzdXJlIHRoYXQgYSBwYXRjaCBjbG9zZXMgZXZlcnkgbm9kZSB0aGF0IGl0IG9wZW5lZC5cbiAqIEBwYXJhbSBvcGVuRWxlbWVudFxuICogQHBhcmFtIHJvb3RcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Tm9VbmNsb3NlZFRhZ3MoXG4gIG9wZW5FbGVtZW50OiBOb2RlIHwgbnVsbCxcbiAgcm9vdDogTm9kZSB8IERvY3VtZW50RnJhZ21lbnRcbikge1xuICBpZiAob3BlbkVsZW1lbnQgPT09IHJvb3QpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgY3VycmVudEVsZW1lbnQgPSBvcGVuRWxlbWVudDtcbiAgY29uc3Qgb3BlblRhZ3M6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ICE9PSByb290KSB7XG4gICAgb3BlblRhZ3MucHVzaChjdXJyZW50RWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudE5vZGU7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJPbmUgb3IgbW9yZSB0YWdzIHdlcmUgbm90IGNsb3NlZDpcXG5cIiArIG9wZW5UYWdzLmpvaW4oXCJcXG5cIikpO1xufVxuXG4vKipcbiAqIE1ha2VzIHN1cmUgdGhhdCBub2RlIGJlaW5nIG91dGVyIHBhdGNoZWQgaGFzIGEgcGFyZW50IG5vZGUuXG4gKiBAcGFyYW0gcGFyZW50XG4gKi9cbmZ1bmN0aW9uIGFzc2VydFBhdGNoT3V0ZXJIYXNQYXJlbnROb2RlKHBhcmVudDogTm9kZSB8IG51bGwpIHtcbiAgaWYgKCFwYXJlbnQpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcInBhdGNoT3V0ZXIgcmVxdWlyZXMgdGhlIG5vZGUgaGF2ZSBhIHBhcmVudCBpZiB0aGVyZSBpcyBhIGtleS5cIlxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWtlcyBzdXJlIHRoYXQgdGhlIGNhbGxlciBpcyBub3Qgd2hlcmUgYXR0cmlidXRlcyBhcmUgZXhwZWN0ZWQuXG4gKiBAcGFyYW0gZnVuY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBjYWxsZXIsIGZvciB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Tm90SW5BdHRyaWJ1dGVzKGZ1bmN0aW9uTmFtZTogc3RyaW5nKSB7XG4gIGlmIChpbkF0dHJpYnV0ZXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBmdW5jdGlvbk5hbWUgK1xuICAgICAgICBcIigpIGNhbiBub3QgYmUgY2FsbGVkIGJldHdlZW4gXCIgK1xuICAgICAgICBcImVsZW1lbnRPcGVuU3RhcnQoKSBhbmQgZWxlbWVudE9wZW5FbmQoKS5cIlxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWtlcyBzdXJlIHRoYXQgdGhlIGNhbGxlciBpcyBub3QgaW5zaWRlIGFuIGVsZW1lbnQgdGhhdCBoYXMgZGVjbGFyZWQgc2tpcC5cbiAqIEBwYXJhbSBmdW5jdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGNhbGxlciwgZm9yIHRoZSBlcnJvciBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBhc3NlcnROb3RJblNraXAoZnVuY3Rpb25OYW1lOiBzdHJpbmcpIHtcbiAgaWYgKGluU2tpcCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGZ1bmN0aW9uTmFtZSArXG4gICAgICAgIFwiKCkgbWF5IG5vdCBiZSBjYWxsZWQgaW5zaWRlIGFuIGVsZW1lbnQgXCIgK1xuICAgICAgICBcInRoYXQgaGFzIGNhbGxlZCBza2lwKCkuXCJcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogTWFrZXMgc3VyZSB0aGF0IHRoZSBjYWxsZXIgaXMgd2hlcmUgYXR0cmlidXRlcyBhcmUgZXhwZWN0ZWQuXG4gKiBAcGFyYW0gZnVuY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBjYWxsZXIsIGZvciB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0SW5BdHRyaWJ1dGVzKGZ1bmN0aW9uTmFtZTogc3RyaW5nKSB7XG4gIGlmICghaW5BdHRyaWJ1dGVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgZnVuY3Rpb25OYW1lICtcbiAgICAgICAgXCIoKSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgY2FsbGluZyBcIiArXG4gICAgICAgIFwiZWxlbWVudE9wZW5TdGFydCgpLlwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIE1ha2VzIHN1cmUgdGhlIHBhdGNoIGNsb3NlcyB2aXJ0dWFsIGF0dHJpYnV0ZXMgY2FsbFxuICovXG5mdW5jdGlvbiBhc3NlcnRWaXJ0dWFsQXR0cmlidXRlc0Nsb3NlZCgpIHtcbiAgaWYgKGluQXR0cmlidXRlcykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiZWxlbWVudE9wZW5FbmQoKSBtdXN0IGJlIGNhbGxlZCBhZnRlciBjYWxsaW5nIFwiICsgXCJlbGVtZW50T3BlblN0YXJ0KCkuXCJcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogTWFrZXMgc3VyZSB0aGF0IHRhZ3MgYXJlIGNvcnJlY3RseSBuZXN0ZWQuXG4gKiBAcGFyYW0gY3VycmVudE5hbWVPckN0b3JcbiAqIEBwYXJhbSBuYW1lT3JDdG9yXG4gKi9cbmZ1bmN0aW9uIGFzc2VydENsb3NlTWF0Y2hlc09wZW5UYWcoXG4gIGN1cnJlbnROYW1lT3JDdG9yOiBOYW1lT3JDdG9yRGVmLFxuICBuYW1lT3JDdG9yOiBOYW1lT3JDdG9yRGVmXG4pIHtcbiAgaWYgKGN1cnJlbnROYW1lT3JDdG9yICE9PSBuYW1lT3JDdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1JlY2VpdmVkIGEgY2FsbCB0byBjbG9zZSBcIicgK1xuICAgICAgICBuYW1lT3JDdG9yICtcbiAgICAgICAgJ1wiIGJ1dCBcIicgK1xuICAgICAgICBjdXJyZW50TmFtZU9yQ3RvciArXG4gICAgICAgICdcIiB3YXMgb3Blbi4nXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIE1ha2VzIHN1cmUgdGhhdCBubyBjaGlsZHJlbiBlbGVtZW50cyBoYXZlIGJlZW4gZGVjbGFyZWQgeWV0IGluIHRoZSBjdXJyZW50XG4gKiBlbGVtZW50LlxuICogQHBhcmFtIGZ1bmN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgY2FsbGVyLCBmb3IgdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0gcHJldmlvdXNOb2RlXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vQ2hpbGRyZW5EZWNsYXJlZFlldChcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmcsXG4gIHByZXZpb3VzTm9kZTogTm9kZSB8IG51bGxcbikge1xuICBpZiAocHJldmlvdXNOb2RlICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgZnVuY3Rpb25OYW1lICtcbiAgICAgICAgXCIoKSBtdXN0IGNvbWUgYmVmb3JlIGFueSBjaGlsZCBcIiArXG4gICAgICAgIFwiZGVjbGFyYXRpb25zIGluc2lkZSB0aGUgY3VycmVudCBlbGVtZW50LlwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB0aGF0IGEgY2FsbCB0byBwYXRjaE91dGVyIGFjdHVhbGx5IHBhdGNoZWQgdGhlIGVsZW1lbnQuXG4gKiBAcGFyYW0gbWF5YmVTdGFydE5vZGUgVGhlIHZhbHVlIGZvciB0aGUgY3VycmVudE5vZGUgd2hlbiB0aGUgcGF0Y2hcbiAqICAgICBzdGFydGVkLlxuICogQHBhcmFtIG1heWJlQ3VycmVudE5vZGUgVGhlIGN1cnJlbnROb2RlIHdoZW4gdGhlIHBhdGNoIGZpbmlzaGVkLlxuICogQHBhcmFtIGV4cGVjdGVkTmV4dE5vZGUgVGhlIE5vZGUgdGhhdCBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlXG4gKiAgICBjdXJyZW50Tm9kZSBhZnRlciB0aGUgcGF0Y2g7XG4gKiBAcGFyYW0gZXhwZWN0ZWRQcmV2Tm9kZSBUaGUgTm9kZSB0aGF0IGlzIGV4cGVjdGVkIHRvIHByZWNlZWQgdGhlXG4gKiAgICBjdXJyZW50Tm9kZSBhZnRlciB0aGUgcGF0Y2guXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFBhdGNoRWxlbWVudE5vRXh0cmFzKFxuICBtYXliZVN0YXJ0Tm9kZTogTm9kZSB8IG51bGwsXG4gIG1heWJlQ3VycmVudE5vZGU6IE5vZGUgfCBudWxsLFxuICBleHBlY3RlZE5leHROb2RlOiBOb2RlIHwgbnVsbCxcbiAgZXhwZWN0ZWRQcmV2Tm9kZTogTm9kZSB8IG51bGxcbikge1xuICBjb25zdCBzdGFydE5vZGUgPSBhc3NlcnQobWF5YmVTdGFydE5vZGUpO1xuICBjb25zdCBjdXJyZW50Tm9kZSA9IGFzc2VydChtYXliZUN1cnJlbnROb2RlKTtcbiAgY29uc3Qgd2FzVXBkYXRlZCA9XG4gICAgY3VycmVudE5vZGUubmV4dFNpYmxpbmcgPT09IGV4cGVjdGVkTmV4dE5vZGUgJiZcbiAgICBjdXJyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmcgPT09IGV4cGVjdGVkUHJldk5vZGU7XG4gIGNvbnN0IHdhc0NoYW5nZWQgPVxuICAgIGN1cnJlbnROb2RlLm5leHRTaWJsaW5nID09PSBzdGFydE5vZGUubmV4dFNpYmxpbmcgJiZcbiAgICBjdXJyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmcgPT09IGV4cGVjdGVkUHJldk5vZGU7XG4gIGNvbnN0IHdhc1JlbW92ZWQgPSBjdXJyZW50Tm9kZSA9PT0gc3RhcnROb2RlO1xuXG4gIGlmICghd2FzVXBkYXRlZCAmJiAhd2FzQ2hhbmdlZCAmJiAhd2FzUmVtb3ZlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiVGhlcmUgbXVzdCBiZSBleGFjdGx5IG9uZSB0b3AgbGV2ZWwgY2FsbCBjb3JyZXNwb25kaW5nIFwiICtcbiAgICAgICAgXCJ0byB0aGUgcGF0Y2hlZCBlbGVtZW50LlwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSBuZXdDb250ZXh0IFRoZSBjdXJyZW50IHBhdGNoIGNvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVBhdGNoQ29udGV4dChuZXdDb250ZXh0OiB7fSB8IG51bGwpIHtcbiAgaW5QYXRjaCA9IG5ld0NvbnRleHQgIT0gbnVsbDtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiBiZWluZyBpbiBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0gdmFsdWUgV2hldGhlciBvciBub3QgdGhlIHBhdGNoIGlzIGluIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi5cbiAqIEByZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLlxuICovXG5mdW5jdGlvbiBzZXRJbkF0dHJpYnV0ZXModmFsdWU6IGJvb2xlYW4pIHtcbiAgY29uc3QgcHJldmlvdXMgPSBpbkF0dHJpYnV0ZXM7XG4gIGluQXR0cmlidXRlcyA9IHZhbHVlO1xuICByZXR1cm4gcHJldmlvdXM7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgc3RhdGUgb2YgYmVpbmcgaW4gYSBza2lwIGVsZW1lbnQuXG4gKiBAcGFyYW0gdmFsdWUgV2hldGhlciBvciBub3QgdGhlIHBhdGNoIGlzIHNraXBwaW5nIHRoZSBjaGlsZHJlbiBvZiBhXG4gKiAgICBwYXJlbnQgbm9kZS5cbiAqIEByZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLlxuICovXG5mdW5jdGlvbiBzZXRJblNraXAodmFsdWU6IGJvb2xlYW4pIHtcbiAgY29uc3QgcHJldmlvdXMgPSBpblNraXA7XG4gIGluU2tpcCA9IHZhbHVlO1xuICByZXR1cm4gcHJldmlvdXM7XG59XG5cbmV4cG9ydCB7XG4gIGFzc2VydCxcbiAgYXNzZXJ0SW5QYXRjaCxcbiAgYXNzZXJ0Tm9VbmNsb3NlZFRhZ3MsXG4gIGFzc2VydE5vdEluQXR0cmlidXRlcyxcbiAgYXNzZXJ0SW5BdHRyaWJ1dGVzLFxuICBhc3NlcnRDbG9zZU1hdGNoZXNPcGVuVGFnLFxuICBhc3NlcnRWaXJ0dWFsQXR0cmlidXRlc0Nsb3NlZCxcbiAgYXNzZXJ0Tm9DaGlsZHJlbkRlY2xhcmVkWWV0LFxuICBhc3NlcnROb3RJblNraXAsXG4gIGFzc2VydFBhdGNoRWxlbWVudE5vRXh0cmFzLFxuICBhc3NlcnRQYXRjaE91dGVySGFzUGFyZW50Tm9kZSxcbiAgc2V0SW5BdHRyaWJ1dGVzLFxuICBzZXRJblNraXAsXG4gIHVwZGF0ZVBhdGNoQ29udGV4dFxufTtcbiJdfQ== \ No newline at end of file diff --git a/closure/src/attributes.d.ts b/closure/src/attributes.d.ts new file mode 100755 index 00000000..3ca705b0 --- /dev/null +++ b/closure/src/attributes.d.ts @@ -0,0 +1,37 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +import { AttrMutatorConfig } from "./types"; +/** + * Applies an attribute or property to a given Element. If the value is null + * or undefined, it is removed from the Element. Otherwise, the value is set + * as an attribute. + * @param el The element to apply the attribute to. + * @param name The attribute's name. + * @param value The attribute's value. + */ +declare function applyAttr(el: Element, name: string, value: unknown): void; +/** + * Applies a property to a given Element. + * @param el The element to apply the property to. + * @param name The property's name. + * @param value The property's value. + */ +declare function applyProp(el: Element, name: string, value: unknown): void; +declare function createAttributeMap(): AttrMutatorConfig; +/** + * A publicly mutable object to provide custom mutators for attributes. + * NB: The result of createMap() has to be recast since closure compiler + * will just assume attributes is "any" otherwise and throws away + * the type annotation set by tsickle. + */ +declare const attributes: AttrMutatorConfig; +/** + * Calls the appropriate attribute mutator for this attribute. + * @param el The Element to apply the attribute to. + * @param name The attribute's name. + * @param value The attribute's value. If the value is an object or + * function it is set on the Element, otherwise, it is set as an HTML + * attribute. + * @param attrs The attribute map of mutators. + */ +declare function updateAttribute(el: Element, name: string, value: unknown, attrs: AttrMutatorConfig): void; +export { createAttributeMap, updateAttribute, applyProp, applyAttr, attributes }; diff --git a/closure/src/attributes.js b/closure/src/attributes.js new file mode 100755 index 00000000..d6aec578 --- /dev/null +++ b/closure/src/attributes.js @@ -0,0 +1,172 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/attributes.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +goog.module('incrementaldom.src.attributes'); +var module = module || { id: 'src/attributes.js' }; +goog.require('tslib'); +const tsickle_types_1 = goog.requireType("incrementaldom.src.types"); +const tsickle_assertions_2 = goog.requireType("incrementaldom.src.assertions"); +const tsickle_util_3 = goog.requireType("incrementaldom.src.util"); +const tsickle_symbols_4 = goog.requireType("incrementaldom.src.symbols"); +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +var assertions_1 = goog.require('incrementaldom.src.assertions'); +var util_1 = goog.require('incrementaldom.src.util'); +var symbols_1 = goog.require('incrementaldom.src.symbols'); +/** + * @param {string} name The name of the attribute. For example "tabindex" or + * "xlink:href". + * @return {(null|string)} The namespace to use for the attribute, or null if there is + * no namespace. + */ +function getNamespace(name) { + if (name.lastIndexOf("xml:", 0) === 0) { + return "http://www.w3.org/XML/1998/namespace"; + } + if (name.lastIndexOf("xlink:", 0) === 0) { + return "http://www.w3.org/1999/xlink"; + } + return null; +} +/** + * Applies an attribute or property to a given Element. If the value is null + * or undefined, it is removed from the Element. Otherwise, the value is set + * as an attribute. + * @param {!Element} el The element to apply the attribute to. + * @param {string} name The attribute's name. + * @param {*} value The attribute's value. + * @return {void} + */ +function applyAttr(el, name, value) { + if (value == null) { + el.removeAttribute(name); + } + else { + /** @type {(null|string)} */ + const attrNS = getNamespace(name); + if (attrNS) { + el.setAttributeNS(attrNS, name, (/** @type {string} */ (value))); + } + else { + el.setAttribute(name, (/** @type {string} */ (value))); + } + } +} +exports.applyAttr = applyAttr; +/** + * Applies a property to a given Element. + * @param {!Element} el The element to apply the property to. + * @param {string} name The property's name. + * @param {*} value The property's value. + * @return {void} + */ +function applyProp(el, name, value) { + ((/** @type {?} */ (el)))[name] = value; +} +exports.applyProp = applyProp; +/** + * Applies a value to a style declaration. Supports CSS custom properties by + * setting properties containing a dash using CSSStyleDeclaration.setProperty. + * @param {!CSSStyleDeclaration} style A style declaration. + * @param {string} prop The property to apply. This can be either camelcase or dash + * separated. For example: "backgroundColor" and "background-color" are both + * supported. + * @param {string} value The value of the property. + * @return {void} + */ +function setStyleValue(style, prop, value) { + if (prop.indexOf("-") >= 0) { + style.setProperty(prop, value); + } + else { + ((/** @type {?} */ (style)))[prop] = value; + } +} +/** + * Applies a style to an Element. No vendor prefix expansion is done for + * property names/values. + * @param {!Element} el The Element to apply the style for. + * @param {string} name The attribute's name. + * @param {(string|!Object)} style The style to set. Either a string of css or an object + * containing property-value pairs. + * @return {void} + */ +function applyStyle(el, name, style) { + // MathML elements inherit from Element, which does not have style. We cannot + // do `instanceof HTMLElement` / `instanceof SVGElement`, since el can belong + // to a different document, so just check that it has a style. + assertions_1.assert("style" in el); + /** @type {!CSSStyleDeclaration} */ + const elStyle = ((/** @type {(!HTMLElement|!SVGElement)} */ (el))).style; + if (typeof style === "string") { + elStyle.cssText = style; + } + else { + elStyle.cssText = ""; + for (const prop in style) { + if (util_1.has(style, prop)) { + setStyleValue(elStyle, prop, style[prop]); + } + } + } +} +/** + * Updates a single attribute on an Element. + * @param {!Element} el The Element to apply the attribute to. + * @param {string} name The attribute's name. + * @param {*} value The attribute's value. If the value is an object or + * function it is set on the Element, otherwise, it is set as an HTML + * attribute. + * @return {void} + */ +function applyAttributeTyped(el, name, value) { + /** @type {string} */ + const type = typeof value; + if (type === "object" || type === "function") { + applyProp(el, name, value); + } + else { + applyAttr(el, name, value); + } +} +/** + * @return {!tsickle_types_1.AttrMutatorConfig} + */ +function createAttributeMap() { + /** @type {!tsickle_types_1.AttrMutatorConfig} */ + const attributes = (/** @type {!tsickle_types_1.AttrMutatorConfig} */ (util_1.createMap())); + // Special generic mutator that's called for any attribute that does not + // have a specific mutator. + attributes[symbols_1.symbols.default] = applyAttributeTyped; + attributes["style"] = applyStyle; + return attributes; +} +exports.createAttributeMap = createAttributeMap; +/** + * A publicly mutable object to provide custom mutators for attributes. + * NB: The result of createMap() has to be recast since closure compiler + * will just assume attributes is "any" otherwise and throws away + * the type annotation set by tsickle. + * @type {!tsickle_types_1.AttrMutatorConfig} + */ +const attributes = createAttributeMap(); +exports.attributes = attributes; +/** + * Calls the appropriate attribute mutator for this attribute. + * @param {!Element} el The Element to apply the attribute to. + * @param {string} name The attribute's name. + * @param {*} value The attribute's value. If the value is an object or + * function it is set on the Element, otherwise, it is set as an HTML + * attribute. + * @param {!tsickle_types_1.AttrMutatorConfig} attrs The attribute map of mutators. + * @return {void} + */ +function updateAttribute(el, name, value, attrs) { + /** @type {function(!Element, string, ?): void} */ + const mutator = attrs[name] || attrs[symbols_1.symbols.default]; + mutator(el, name, value); +} +exports.updateAttribute = updateAttribute; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hdHRyaWJ1dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBSUEsa0VBQXNDO0FBQ3RDLHNEQUF3QztBQUN4Qyw0REFBb0M7Ozs7Ozs7QUFRcEMsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNyQyxPQUFPLHNDQUFzQyxDQUFDO0tBQy9DO0lBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDdkMsT0FBTyw4QkFBOEIsQ0FBQztLQUN2QztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQzs7Ozs7Ozs7OztBQVVELFNBQVMsU0FBUyxDQUFDLEVBQVcsRUFBRSxJQUFZLEVBQUUsS0FBYztJQUMxRCxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7UUFDakIsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUMxQjtTQUFNOztjQUNDLE1BQU0sR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO1FBQ2pDLElBQUksTUFBTSxFQUFFO1lBQ1YsRUFBRSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLHdCQUFBLEtBQUssRUFBVSxDQUFDLENBQUM7U0FDbEQ7YUFBTTtZQUNMLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLHdCQUFBLEtBQUssRUFBVSxDQUFDLENBQUM7U0FDeEM7S0FDRjtBQUNILENBQUM7QUE0SEMsOEJBQVM7Ozs7Ozs7O0FBcEhYLFNBQVMsU0FBUyxDQUFDLEVBQVcsRUFBRSxJQUFZLEVBQUUsS0FBYztJQUMxRCxDQUFDLG1CQUFBLEVBQUUsRUFBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQzVCLENBQUM7QUFpSEMsOEJBQVM7Ozs7Ozs7Ozs7O0FBdEdYLFNBQVMsYUFBYSxDQUNwQixLQUEwQixFQUMxQixJQUFZLEVBQ1osS0FBYTtJQUViLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDMUIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDaEM7U0FBTTtRQUNMLENBQUMsbUJBQUEsS0FBSyxFQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7S0FDOUI7QUFDSCxDQUFDOzs7Ozs7Ozs7O0FBVUQsU0FBUyxVQUFVLENBQ2pCLEVBQVcsRUFDWCxJQUFZLEVBQ1osS0FBdUM7Ozs7SUFLdkMsbUJBQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7O1VBQ2hCLE9BQU8sR0FBRyxDQUFDLDRDQUEwQixFQUFFLEVBQUEsQ0FBQyxDQUFDLEtBQUs7SUFFcEQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDN0IsT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7S0FDekI7U0FBTTtRQUNMLE9BQU8sQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBRXJCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1lBQ3hCLElBQUksVUFBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDcEIsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDM0M7U0FDRjtLQUNGO0FBQ0gsQ0FBQzs7Ozs7Ozs7OztBQVVELFNBQVMsbUJBQW1CLENBQUMsRUFBVyxFQUFFLElBQVksRUFBRSxLQUFjOztVQUM5RCxJQUFJLEdBQUcsT0FBTyxLQUFLO0lBRXpCLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFO1FBQzVDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzVCO1NBQU07UUFDTCxTQUFTLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztLQUM1QjtBQUNILENBQUM7Ozs7QUFFRCxTQUFTLGtCQUFrQjs7VUFDbkIsVUFBVSxHQUFzQixvREFBQSxnQkFBUyxFQUFFLEVBQXFCOzs7SUFHdEUsVUFBVSxDQUFDLGlCQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsbUJBQW1CLENBQUM7SUFFbEQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQztJQUNqQyxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBOEJDLGdEQUFrQjs7Ozs7Ozs7TUF0QmQsVUFBVSxHQUFHLGtCQUFrQixFQUFFO0FBMEJyQyxnQ0FBVTs7Ozs7Ozs7Ozs7QUFmWixTQUFTLGVBQWUsQ0FDdEIsRUFBVyxFQUNYLElBQVksRUFDWixLQUFjLEVBQ2QsS0FBd0I7O1VBRWxCLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLGlCQUFPLENBQUMsT0FBTyxDQUFDO0lBQ3JELE9BQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFJQywwQ0FBZSIsInNvdXJjZXNDb250ZW50IjpbIi8vICBDb3B5cmlnaHQgMjAxOCBUaGUgSW5jcmVtZW50YWwgRE9NIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKiogQGxpY2Vuc2UgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgKi9cblxuaW1wb3J0IHsgQXR0ck11dGF0b3JDb25maWcgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcIi4vYXNzZXJ0aW9uc1wiO1xuaW1wb3J0IHsgY3JlYXRlTWFwLCBoYXMgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgeyBzeW1ib2xzIH0gZnJvbSBcIi4vc3ltYm9sc1wiO1xuXG4vKipcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuIEZvciBleGFtcGxlIFwidGFiaW5kZXhcIiBvclxuICogICAgXCJ4bGluazpocmVmXCIuXG4gKiBAcmV0dXJucyBUaGUgbmFtZXNwYWNlIHRvIHVzZSBmb3IgdGhlIGF0dHJpYnV0ZSwgb3IgbnVsbCBpZiB0aGVyZSBpc1xuICogbm8gbmFtZXNwYWNlLlxuICovXG5mdW5jdGlvbiBnZXROYW1lc3BhY2UobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChuYW1lLmxhc3RJbmRleE9mKFwieG1sOlwiLCAwKSA9PT0gMCkge1xuICAgIHJldHVybiBcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiO1xuICB9XG5cbiAgaWYgKG5hbWUubGFzdEluZGV4T2YoXCJ4bGluazpcIiwgMCkgPT09IDApIHtcbiAgICByZXR1cm4gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGFuIGF0dHJpYnV0ZSBvciBwcm9wZXJ0eSB0byBhIGdpdmVuIEVsZW1lbnQuIElmIHRoZSB2YWx1ZSBpcyBudWxsXG4gKiBvciB1bmRlZmluZWQsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgRWxlbWVudC4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgaXMgc2V0XG4gKiBhcyBhbiBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0gZWwgVGhlIGVsZW1lbnQgdG8gYXBwbHkgdGhlIGF0dHJpYnV0ZSB0by5cbiAqIEBwYXJhbSBuYW1lIFRoZSBhdHRyaWJ1dGUncyBuYW1lLlxuICogQHBhcmFtIHZhbHVlIFRoZSBhdHRyaWJ1dGUncyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlBdHRyKGVsOiBFbGVtZW50LCBuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgZWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGF0dHJOUyA9IGdldE5hbWVzcGFjZShuYW1lKTtcbiAgICBpZiAoYXR0ck5TKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGVOUyhhdHRyTlMsIG5hbWUsIHZhbHVlIGFzIHN0cmluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBwcm9wZXJ0eSB0byBhIGdpdmVuIEVsZW1lbnQuXG4gKiBAcGFyYW0gZWwgVGhlIGVsZW1lbnQgdG8gYXBwbHkgdGhlIHByb3BlcnR5IHRvLlxuICogQHBhcmFtIG5hbWUgVGhlIHByb3BlcnR5J3MgbmFtZS5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgcHJvcGVydHkncyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlQcm9wKGVsOiBFbGVtZW50LCBuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gIChlbCBhcyBhbnkpW25hbWVdID0gdmFsdWU7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHZhbHVlIHRvIGEgc3R5bGUgZGVjbGFyYXRpb24uIFN1cHBvcnRzIENTUyBjdXN0b20gcHJvcGVydGllcyBieVxuICogc2V0dGluZyBwcm9wZXJ0aWVzIGNvbnRhaW5pbmcgYSBkYXNoIHVzaW5nIENTU1N0eWxlRGVjbGFyYXRpb24uc2V0UHJvcGVydHkuXG4gKiBAcGFyYW0gc3R5bGUgQSBzdHlsZSBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSBwcm9wIFRoZSBwcm9wZXJ0eSB0byBhcHBseS4gVGhpcyBjYW4gYmUgZWl0aGVyIGNhbWVsY2FzZSBvciBkYXNoXG4gKiAgICBzZXBhcmF0ZWQuIEZvciBleGFtcGxlOiBcImJhY2tncm91bmRDb2xvclwiIGFuZCBcImJhY2tncm91bmQtY29sb3JcIiBhcmUgYm90aFxuICogICAgc3VwcG9ydGVkLlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIHNldFN0eWxlVmFsdWUoXG4gIHN0eWxlOiBDU1NTdHlsZURlY2xhcmF0aW9uLFxuICBwcm9wOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmdcbikge1xuICBpZiAocHJvcC5pbmRleE9mKFwiLVwiKSA+PSAwKSB7XG4gICAgc3R5bGUuc2V0UHJvcGVydHkocHJvcCwgdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIChzdHlsZSBhcyBhbnkpW3Byb3BdID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgc3R5bGUgdG8gYW4gRWxlbWVudC4gTm8gdmVuZG9yIHByZWZpeCBleHBhbnNpb24gaXMgZG9uZSBmb3JcbiAqIHByb3BlcnR5IG5hbWVzL3ZhbHVlcy5cbiAqIEBwYXJhbSBlbCBUaGUgRWxlbWVudCB0byBhcHBseSB0aGUgc3R5bGUgZm9yLlxuICogQHBhcmFtIG5hbWUgVGhlIGF0dHJpYnV0ZSdzIG5hbWUuXG4gKiBAcGFyYW0gIHN0eWxlIFRoZSBzdHlsZSB0byBzZXQuIEVpdGhlciBhIHN0cmluZyBvZiBjc3Mgb3IgYW4gb2JqZWN0XG4gKiAgICAgY29udGFpbmluZyBwcm9wZXJ0eS12YWx1ZSBwYWlycy5cbiAqL1xuZnVuY3Rpb24gYXBwbHlTdHlsZShcbiAgZWw6IEVsZW1lbnQsXG4gIG5hbWU6IHN0cmluZyxcbiAgc3R5bGU6IHN0cmluZyB8IHsgW2s6IHN0cmluZ106IHN0cmluZyB9XG4pIHtcbiAgLy8gTWF0aE1MIGVsZW1lbnRzIGluaGVyaXQgZnJvbSBFbGVtZW50LCB3aGljaCBkb2VzIG5vdCBoYXZlIHN0eWxlLiBXZSBjYW5ub3RcbiAgLy8gZG8gYGluc3RhbmNlb2YgSFRNTEVsZW1lbnRgIC8gYGluc3RhbmNlb2YgU1ZHRWxlbWVudGAsIHNpbmNlIGVsIGNhbiBiZWxvbmdcbiAgLy8gdG8gYSBkaWZmZXJlbnQgZG9jdW1lbnQsIHNvIGp1c3QgY2hlY2sgdGhhdCBpdCBoYXMgYSBzdHlsZS5cbiAgYXNzZXJ0KFwic3R5bGVcIiBpbiBlbCk7XG4gIGNvbnN0IGVsU3R5bGUgPSAoPEhUTUxFbGVtZW50IHwgU1ZHRWxlbWVudD5lbCkuc3R5bGU7XG5cbiAgaWYgKHR5cGVvZiBzdHlsZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGVsU3R5bGUuY3NzVGV4dCA9IHN0eWxlO1xuICB9IGVsc2Uge1xuICAgIGVsU3R5bGUuY3NzVGV4dCA9IFwiXCI7XG5cbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gc3R5bGUpIHtcbiAgICAgIGlmIChoYXMoc3R5bGUsIHByb3ApKSB7XG4gICAgICAgIHNldFN0eWxlVmFsdWUoZWxTdHlsZSwgcHJvcCwgc3R5bGVbcHJvcF0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBzaW5nbGUgYXR0cmlidXRlIG9uIGFuIEVsZW1lbnQuXG4gKiBAcGFyYW0gZWwgVGhlIEVsZW1lbnQgdG8gYXBwbHkgdGhlIGF0dHJpYnV0ZSB0by5cbiAqIEBwYXJhbSBuYW1lIFRoZSBhdHRyaWJ1dGUncyBuYW1lLlxuICogQHBhcmFtIHZhbHVlIFRoZSBhdHRyaWJ1dGUncyB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCBvclxuICogICAgIGZ1bmN0aW9uIGl0IGlzIHNldCBvbiB0aGUgRWxlbWVudCwgb3RoZXJ3aXNlLCBpdCBpcyBzZXQgYXMgYW4gSFRNTFxuICogICAgIGF0dHJpYnV0ZS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlBdHRyaWJ1dGVUeXBlZChlbDogRWxlbWVudCwgbmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG4gIGlmICh0eXBlID09PSBcIm9iamVjdFwiIHx8IHR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGFwcGx5UHJvcChlbCwgbmFtZSwgdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGFwcGx5QXR0cihlbCwgbmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUF0dHJpYnV0ZU1hcCgpIHtcbiAgY29uc3QgYXR0cmlidXRlczogQXR0ck11dGF0b3JDb25maWcgPSBjcmVhdGVNYXAoKSBhcyBBdHRyTXV0YXRvckNvbmZpZztcbiAgLy8gU3BlY2lhbCBnZW5lcmljIG11dGF0b3IgdGhhdCdzIGNhbGxlZCBmb3IgYW55IGF0dHJpYnV0ZSB0aGF0IGRvZXMgbm90XG4gIC8vIGhhdmUgYSBzcGVjaWZpYyBtdXRhdG9yLlxuICBhdHRyaWJ1dGVzW3N5bWJvbHMuZGVmYXVsdF0gPSBhcHBseUF0dHJpYnV0ZVR5cGVkO1xuXG4gIGF0dHJpYnV0ZXNbXCJzdHlsZVwiXSA9IGFwcGx5U3R5bGU7XG4gIHJldHVybiBhdHRyaWJ1dGVzO1xufVxuXG4vKipcbiAqIEEgcHVibGljbHkgbXV0YWJsZSBvYmplY3QgdG8gcHJvdmlkZSBjdXN0b20gbXV0YXRvcnMgZm9yIGF0dHJpYnV0ZXMuXG4gKiBOQjogVGhlIHJlc3VsdCBvZiBjcmVhdGVNYXAoKSBoYXMgdG8gYmUgcmVjYXN0IHNpbmNlIGNsb3N1cmUgY29tcGlsZXJcbiAqIHdpbGwganVzdCBhc3N1bWUgYXR0cmlidXRlcyBpcyBcImFueVwiIG90aGVyd2lzZSBhbmQgdGhyb3dzIGF3YXlcbiAqIHRoZSB0eXBlIGFubm90YXRpb24gc2V0IGJ5IHRzaWNrbGUuXG4gKi9cbmNvbnN0IGF0dHJpYnV0ZXMgPSBjcmVhdGVBdHRyaWJ1dGVNYXAoKTtcblxuLyoqXG4gKiBDYWxscyB0aGUgYXBwcm9wcmlhdGUgYXR0cmlidXRlIG11dGF0b3IgZm9yIHRoaXMgYXR0cmlidXRlLlxuICogQHBhcmFtIGVsIFRoZSBFbGVtZW50IHRvIGFwcGx5IHRoZSBhdHRyaWJ1dGUgdG8uXG4gKiBAcGFyYW0gbmFtZSBUaGUgYXR0cmlidXRlJ3MgbmFtZS5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgYXR0cmlidXRlJ3MgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3Qgb3JcbiAqICAgICBmdW5jdGlvbiBpdCBpcyBzZXQgb24gdGhlIEVsZW1lbnQsIG90aGVyd2lzZSwgaXQgaXMgc2V0IGFzIGFuIEhUTUxcbiAqICAgICBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0gYXR0cnMgVGhlIGF0dHJpYnV0ZSBtYXAgb2YgbXV0YXRvcnMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZShcbiAgZWw6IEVsZW1lbnQsXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4gIGF0dHJzOiBBdHRyTXV0YXRvckNvbmZpZ1xuKSB7XG4gIGNvbnN0IG11dGF0b3IgPSBhdHRyc1tuYW1lXSB8fCBhdHRyc1tzeW1ib2xzLmRlZmF1bHRdO1xuICBtdXRhdG9yKGVsLCBuYW1lLCB2YWx1ZSk7XG59XG5cbmV4cG9ydCB7XG4gIGNyZWF0ZUF0dHJpYnV0ZU1hcCxcbiAgdXBkYXRlQXR0cmlidXRlLFxuICBhcHBseVByb3AsXG4gIGFwcGx5QXR0cixcbiAgYXR0cmlidXRlc1xufTtcbiJdfQ== \ No newline at end of file diff --git a/closure/src/changes.d.ts b/closure/src/changes.d.ts new file mode 100755 index 00000000..255d22bb --- /dev/null +++ b/closure/src/changes.d.ts @@ -0,0 +1,15 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +/** + * TODO(tomnguyen): This is a bit silly and really needs to be better typed. + * @param fn A function to call. + * @param a The first argument to the function. + * @param b The second argument to the function. + * @param c The third argument to the function. + * @param d The fourth argument to the function + */ +declare function queueChange(fn: (a: A, b: B, c: C, d: D) => void, a: A, b: B, c: C, d: D): void; +/** + * Flushes the changes buffer, calling the functions for each change. + */ +declare function flush(): void; +export { queueChange, flush }; diff --git a/closure/src/changes.js b/closure/src/changes.js new file mode 100755 index 00000000..79187bc6 --- /dev/null +++ b/closure/src/changes.js @@ -0,0 +1,57 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/changes.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +goog.module('incrementaldom.src.changes'); +var module = module || { id: 'src/changes.js' }; +goog.require('tslib'); +const tsickle_util_1 = goog.requireType("incrementaldom.src.util"); +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +var util_1 = goog.require('incrementaldom.src.util'); +/** @type {!Array} */ +const buffer = []; +/** @type {number} */ +let bufferStart = 0; +/** + * TODO(tomnguyen): This is a bit silly and really needs to be better typed. + * @template A, B, C, D + * @param {function(A, B, C, D): void} fn A function to call. + * @param {A} a The first argument to the function. + * @param {B} b The second argument to the function. + * @param {C} c The third argument to the function. + * @param {D} d The fourth argument to the function + * @return {void} + */ +function queueChange(fn, a, b, c, d) { + buffer.push(fn); + buffer.push(a); + buffer.push(b); + buffer.push(c); + buffer.push(d); +} +exports.queueChange = queueChange; +/** + * Flushes the changes buffer, calling the functions for each change. + * @return {void} + */ +function flush() { + // A change may cause this function to be called re-entrantly. Keep track of + // the portion of the buffer we are consuming. Updates the start pointer so + // that the next call knows where to start from. + /** @type {number} */ + const start = bufferStart; + /** @type {number} */ + const end = buffer.length; + bufferStart = end; + for (let i = start; i < end; i += 5) { + /** @type {function(?, ?, ?, ?): undefined} */ + const fn = (/** @type {function(?, ?, ?, ?): undefined} */ (buffer[i])); + fn(buffer[i + 1], buffer[i + 2], buffer[i + 3], buffer[i + 4]); + } + bufferStart = start; + util_1.truncateArray(buffer, start); +} +exports.flush = flush; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jaGFuZ2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0Esc0RBQXVDOztNQUVqQyxNQUFNLEdBQWUsRUFBRTs7SUFFekIsV0FBVyxHQUFHLENBQUM7Ozs7Ozs7Ozs7O0FBVW5CLFNBQVMsV0FBVyxDQUNsQixFQUFvQyxFQUNwQyxDQUFJLEVBQ0osQ0FBSSxFQUNKLENBQUksRUFDSixDQUFJO0lBRUosTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLENBQUM7QUF1QlEsa0NBQVc7Ozs7O0FBbEJwQixTQUFTLEtBQUs7Ozs7O1VBSU4sS0FBSyxHQUFHLFdBQVc7O1VBQ25CLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTTtJQUV6QixXQUFXLEdBQUcsR0FBRyxDQUFDO0lBRWxCLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTs7Y0FDN0IsRUFBRSxHQUFHLGlEQUFBLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBaUQ7UUFDckUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNoRTtJQUVELFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsb0JBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVxQixzQkFBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vICBDb3B5cmlnaHQgMjAxOCBUaGUgSW5jcmVtZW50YWwgRE9NIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKiogQGxpY2Vuc2UgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgKi9cblxuaW1wb3J0IHsgdHJ1bmNhdGVBcnJheSB9IGZyb20gXCIuL3V0aWxcIjtcblxuY29uc3QgYnVmZmVyOiBBcnJheTxhbnk+ID0gW107XG5cbmxldCBidWZmZXJTdGFydCA9IDA7XG5cbi8qKlxuICogVE9ETyh0b21uZ3V5ZW4pOiBUaGlzIGlzIGEgYml0IHNpbGx5IGFuZCByZWFsbHkgbmVlZHMgdG8gYmUgYmV0dGVyIHR5cGVkLlxuICogQHBhcmFtIGZuIEEgZnVuY3Rpb24gdG8gY2FsbC5cbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgZnVuY3Rpb24uXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSBjIFRoZSB0aGlyZCBhcmd1bWVudCB0byB0aGUgZnVuY3Rpb24uXG4gKiBAcGFyYW0gZCBUaGUgZm91cnRoIGFyZ3VtZW50IHRvIHRoZSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBxdWV1ZUNoYW5nZTxBLCBCLCBDLCBEPihcbiAgZm46IChhOiBBLCBiOiBCLCBjOiBDLCBkOiBEKSA9PiB2b2lkLFxuICBhOiBBLFxuICBiOiBCLFxuICBjOiBDLFxuICBkOiBEXG4pIHtcbiAgYnVmZmVyLnB1c2goZm4pO1xuICBidWZmZXIucHVzaChhKTtcbiAgYnVmZmVyLnB1c2goYik7XG4gIGJ1ZmZlci5wdXNoKGMpO1xuICBidWZmZXIucHVzaChkKTtcbn1cblxuLyoqXG4gKiBGbHVzaGVzIHRoZSBjaGFuZ2VzIGJ1ZmZlciwgY2FsbGluZyB0aGUgZnVuY3Rpb25zIGZvciBlYWNoIGNoYW5nZS5cbiAqL1xuZnVuY3Rpb24gZmx1c2goKSB7XG4gIC8vIEEgY2hhbmdlIG1heSBjYXVzZSB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCByZS1lbnRyYW50bHkuIEtlZXAgdHJhY2sgb2ZcbiAgLy8gdGhlIHBvcnRpb24gb2YgdGhlIGJ1ZmZlciB3ZSBhcmUgY29uc3VtaW5nLiBVcGRhdGVzIHRoZSBzdGFydCBwb2ludGVyIHNvXG4gIC8vIHRoYXQgdGhlIG5leHQgY2FsbCBrbm93cyB3aGVyZSB0byBzdGFydCBmcm9tLlxuICBjb25zdCBzdGFydCA9IGJ1ZmZlclN0YXJ0O1xuICBjb25zdCBlbmQgPSBidWZmZXIubGVuZ3RoO1xuXG4gIGJ1ZmZlclN0YXJ0ID0gZW5kO1xuXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSA1KSB7XG4gICAgY29uc3QgZm4gPSBidWZmZXJbaV0gYXMgKGE6IGFueSwgYjogYW55LCBjOiBhbnksIGQ6IGFueSkgPT4gdW5kZWZpbmVkO1xuICAgIGZuKGJ1ZmZlcltpICsgMV0sIGJ1ZmZlcltpICsgMl0sIGJ1ZmZlcltpICsgM10sIGJ1ZmZlcltpICsgNF0pO1xuICB9XG5cbiAgYnVmZmVyU3RhcnQgPSBzdGFydDtcbiAgdHJ1bmNhdGVBcnJheShidWZmZXIsIHN0YXJ0KTtcbn1cblxuZXhwb3J0IHsgcXVldWVDaGFuZ2UsIGZsdXNoIH07XG4iXX0= \ No newline at end of file diff --git a/closure/src/context.d.ts b/closure/src/context.d.ts new file mode 100755 index 00000000..8e5a47c6 --- /dev/null +++ b/closure/src/context.d.ts @@ -0,0 +1,17 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +/** + * A context object keeps track of the state of a patch. + */ +declare class Context { + private created; + private deleted; + readonly node: Element | DocumentFragment; + constructor(node: Element | DocumentFragment); + markCreated(node: Node): void; + markDeleted(node: Node): void; + /** + * Notifies about nodes that were created during the patch operation. + */ + notifyChanges(): void; +} +export { Context }; diff --git a/closure/src/context.js b/closure/src/context.js new file mode 100755 index 00000000..30adf9f3 --- /dev/null +++ b/closure/src/context.js @@ -0,0 +1,68 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/context.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +goog.module('incrementaldom.src.context'); +var module = module || { id: 'src/context.js' }; +goog.require('tslib'); +const tsickle_notifications_1 = goog.requireType("incrementaldom.src.notifications"); +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +var notifications_1 = goog.require('incrementaldom.src.notifications'); +/** + * A context object keeps track of the state of a patch. + */ +class Context { + /** + * @param {(!DocumentFragment|!Element)} node + */ + constructor(node) { + this.created = []; + this.deleted = []; + this.node = node; + } + /** + * @param {!Node} node + * @return {void} + */ + markCreated(node) { + this.created.push(node); + } + /** + * @param {!Node} node + * @return {void} + */ + markDeleted(node) { + this.deleted.push(node); + } + /** + * Notifies about nodes that were created during the patch operation. + * @return {void} + */ + notifyChanges() { + if (notifications_1.notifications.nodesCreated && this.created.length > 0) { + notifications_1.notifications.nodesCreated(this.created); + } + if (notifications_1.notifications.nodesDeleted && this.deleted.length > 0) { + notifications_1.notifications.nodesDeleted(this.deleted); + } + } +} +exports.Context = Context; +/* istanbul ignore if */ +if (false) { + /** + * @type {!Array} + * @private + */ + Context.prototype.created; + /** + * @type {!Array} + * @private + */ + Context.prototype.deleted; + /** @type {(!DocumentFragment|!Element)} */ + Context.prototype.node; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0Esd0VBQWdEOzs7O0FBS2hELE1BQU0sT0FBTzs7OztJQUtYLFlBQW1CLElBQWdDO1FBSjNDLFlBQU8sR0FBZ0IsRUFBRSxDQUFDO1FBQzFCLFlBQU8sR0FBZ0IsRUFBRSxDQUFDO1FBSWhDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7Ozs7O0lBRU0sV0FBVyxDQUFDLElBQVU7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQzs7Ozs7SUFFTSxXQUFXLENBQUMsSUFBVTtRQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDOzs7OztJQUtNLGFBQWE7UUFDbEIsSUFBSSw2QkFBYSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDekQsNkJBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzFDO1FBRUQsSUFBSSw2QkFBYSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDekQsNkJBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzFDO0lBQ0gsQ0FBQztDQUNGO0FBRVEsMEJBQU87Ozs7Ozs7SUE5QmQsMEJBQWtDOzs7OztJQUNsQywwQkFBa0M7O0lBQ2xDLHVCQUFpRCIsInNvdXJjZXNDb250ZW50IjpbIi8vICBDb3B5cmlnaHQgMjAxOCBUaGUgSW5jcmVtZW50YWwgRE9NIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKiogQGxpY2Vuc2UgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgKi9cblxuaW1wb3J0IHsgbm90aWZpY2F0aW9ucyB9IGZyb20gXCIuL25vdGlmaWNhdGlvbnNcIjtcblxuLyoqXG4gKiBBIGNvbnRleHQgb2JqZWN0IGtlZXBzIHRyYWNrIG9mIHRoZSBzdGF0ZSBvZiBhIHBhdGNoLlxuICovXG5jbGFzcyBDb250ZXh0IHtcbiAgcHJpdmF0ZSBjcmVhdGVkOiBBcnJheTxOb2RlPiA9IFtdO1xuICBwcml2YXRlIGRlbGV0ZWQ6IEFycmF5PE5vZGU+ID0gW107XG4gIHB1YmxpYyByZWFkb25seSBub2RlOiBFbGVtZW50IHwgRG9jdW1lbnRGcmFnbWVudDtcblxuICBwdWJsaWMgY29uc3RydWN0b3Iobm9kZTogRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICB0aGlzLm5vZGUgPSBub2RlO1xuICB9XG5cbiAgcHVibGljIG1hcmtDcmVhdGVkKG5vZGU6IE5vZGUpIHtcbiAgICB0aGlzLmNyZWF0ZWQucHVzaChub2RlKTtcbiAgfVxuXG4gIHB1YmxpYyBtYXJrRGVsZXRlZChub2RlOiBOb2RlKSB7XG4gICAgdGhpcy5kZWxldGVkLnB1c2gobm9kZSk7XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgYWJvdXQgbm9kZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZHVyaW5nIHRoZSBwYXRjaCBvcGVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgbm90aWZ5Q2hhbmdlcygpIHtcbiAgICBpZiAobm90aWZpY2F0aW9ucy5ub2Rlc0NyZWF0ZWQgJiYgdGhpcy5jcmVhdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIG5vdGlmaWNhdGlvbnMubm9kZXNDcmVhdGVkKHRoaXMuY3JlYXRlZCk7XG4gICAgfVxuXG4gICAgaWYgKG5vdGlmaWNhdGlvbnMubm9kZXNEZWxldGVkICYmIHRoaXMuZGVsZXRlZC5sZW5ndGggPiAwKSB7XG4gICAgICBub3RpZmljYXRpb25zLm5vZGVzRGVsZXRlZCh0aGlzLmRlbGV0ZWQpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBDb250ZXh0IH07XG4iXX0= \ No newline at end of file diff --git a/closure/src/core.d.ts b/closure/src/core.d.ts new file mode 100755 index 00000000..f55cdee9 --- /dev/null +++ b/closure/src/core.d.ts @@ -0,0 +1,92 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +import { Context } from "./context"; +import { Key, NameOrCtorDef, PatchConfig, PatchFunction } from "./types"; +/** + * TODO(sparhami) We should just export argsBuilder directly when Closure + * Compiler supports ES6 directly. + * @returns The Array used for building arguments. + */ +declare function getArgsBuilder(): Array; +/** + * TODO(sparhami) We should just export attrsBuilder directly when Closure + * Compiler supports ES6 directly. + * @returns The Array used for building arguments. + */ +declare function getAttrsBuilder(): Array; +/** + * Updates the internal structure of a DOM node in the case that an external + * framework tries to modify a DOM element. + * @param el The DOM node to update. + */ +declare function alwaysDiffAttributes(el: Element): void; +/** + * Changes to the next sibling of the current node. + */ +declare function nextNode(): void; +/** + * Aligns the virtual Node definition with the actual DOM, moving the + * corresponding DOM node to the correct location or creating it if necessary. + * @param nameOrCtor The name or constructor for the Node. + * @param key The key used to identify the Node. + * @param nonce The nonce attribute for the element. + */ +declare function alignWithDOM(nameOrCtor: NameOrCtorDef, key: Key, nonce?: string): void; +/** + * Makes sure that the current node is an Element with a matching nameOrCtor and + * key. + * + * @param nameOrCtor The tag or constructor for the Element. + * @param key The key used to identify this element. This can be an + * empty string, but performance may be better if a unique value is used + * when iterating over an array of items. + * @param nonce The nonce attribute for the element. + * @return The corresponding Element. + */ +declare function open(nameOrCtor: NameOrCtorDef, key?: Key, nonce?: string): HTMLElement; +/** + * Closes the currently open Element, removing any unvisited children if + * necessary. + * @returns The Element that was just closed. + */ +declare function close(): Element; +/** + * Makes sure the current node is a Text node and creates a Text node if it is + * not. + * @returns The Text node that was aligned or created. + */ +declare function text(): Text; +/** + * @returns The current Element being patched. + */ +declare function currentElement(): Element; +/** + * @returns The current Element being patched, or null if no patch is in progress. + */ +declare function tryGetCurrentElement(): Element | null; +/** + * @return The Node that will be evaluated for the next instruction. + */ +declare function currentPointer(): Node; +declare function currentContext(): Context | null; +/** + * Skips the children in a subtree, allowing an Element to be closed without + * clearing out the children. + */ +declare function skip(): void; +/** + * Creates a patcher that patches the document starting at node with a + * provided function. This function may be called during an existing patch operation. + * @param patchConfig The config to use for the patch. + * @returns The created function for patching an Element's children. + */ +declare function createPatchInner(patchConfig?: PatchConfig): PatchFunction; +/** + * Creates a patcher that patches an Element with the the provided function. + * Exactly one top level element call should be made corresponding to `node`. + * @param patchConfig The config to use for the patch. + * @returns The created function for patching an Element. + */ +declare function createPatchOuter(patchConfig?: PatchConfig): PatchFunction; +declare const patchInner: (node: Element | DocumentFragment, template: (a: T | undefined) => void, data?: T | undefined) => Node; +declare const patchOuter: (node: Element | DocumentFragment, template: (a: T | undefined) => void, data?: T | undefined) => Node | null; +export { alignWithDOM, alwaysDiffAttributes, getArgsBuilder, getAttrsBuilder, text, createPatchInner, createPatchOuter, patchInner, patchOuter, open, close, currentElement, currentContext, currentPointer, skip, nextNode as skipNode, tryGetCurrentElement }; diff --git a/closure/src/core.js b/closure/src/core.js new file mode 100755 index 00000000..e96ff8fc --- /dev/null +++ b/closure/src/core.js @@ -0,0 +1,476 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/core.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +goog.module('incrementaldom.src.core'); +var module = module || { id: 'src/core.js' }; +goog.require('tslib'); +const tsickle_assertions_1 = goog.requireType("incrementaldom.src.assertions"); +const tsickle_context_2 = goog.requireType("incrementaldom.src.context"); +const tsickle_dom_util_3 = goog.requireType("incrementaldom.src.dom_util"); +const tsickle_global_4 = goog.requireType("incrementaldom.src.global"); +const tsickle_node_data_5 = goog.requireType("incrementaldom.src.node_data"); +const tsickle_nodes_6 = goog.requireType("incrementaldom.src.nodes"); +const tsickle_types_7 = goog.requireType("incrementaldom.src.types"); +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +var assertions_1 = goog.require('incrementaldom.src.assertions'); +var context_1 = goog.require('incrementaldom.src.context'); +var dom_util_1 = goog.require('incrementaldom.src.dom_util'); +var global_1 = goog.require('incrementaldom.src.global'); +var node_data_1 = goog.require('incrementaldom.src.node_data'); +var nodes_1 = goog.require('incrementaldom.src.nodes'); +/** + * The default match function to use, if one was not specified when creating + * the patcher. + * @param {!Node} matchNode The node to match against, unused. + * @param {(string|!tsickle_types_7.ElementConstructor)} nameOrCtor The name or constructor as declared. + * @param {(string|!tsickle_types_7.ElementConstructor)} expectedNameOrCtor The name or constructor of the existing node. + * @param {(undefined|null|string|number)} key The key as declared. + * @param {(undefined|null|string|number)} expectedKey The key of the existing node. + * @return {boolean} True if the node matches, false otherwise. + */ +function defaultMatchFn(matchNode, nameOrCtor, expectedNameOrCtor, key, expectedKey) { + // Key check is done using double equals as we want to treat a null key the + // same as undefined. This should be okay as the only values allowed are + // strings, null and undefined so the == semantics are not too weird. + return nameOrCtor == expectedNameOrCtor && key == expectedKey; +} +/** @type {(null|!tsickle_context_2.Context)} */ +let context = null; +/** @type {(null|!Node)} */ +let currentNode = null; +/** @type {(null|!Node)} */ +let currentParent = null; +/** @type {(null|!Document)} */ +let doc = null; +/** @type {!Array} */ +let focusPath = []; +/** @type {function(!Node, (string|!tsickle_types_7.ElementConstructor), (string|!tsickle_types_7.ElementConstructor), (undefined|null|string|number), (undefined|null|string|number)): boolean} */ +let matchFn = defaultMatchFn; +/** + * Used to build up call arguments. Each patch call gets a separate copy, so + * this works with nested calls to patch. + * @type {!Array<(undefined|null|*)>} + */ +let argsBuilder = []; +/** + * Used to build up attrs for the an element. + * @type {!Array} + */ +let attrsBuilder = []; +/** + * TODO(sparhami) We should just export argsBuilder directly when Closure + * Compiler supports ES6 directly. + * @return {!Array} The Array used for building arguments. + */ +function getArgsBuilder() { + return argsBuilder; +} +exports.getArgsBuilder = getArgsBuilder; +/** + * TODO(sparhami) We should just export attrsBuilder directly when Closure + * Compiler supports ES6 directly. + * @return {!Array} The Array used for building arguments. + */ +function getAttrsBuilder() { + return attrsBuilder; +} +exports.getAttrsBuilder = getAttrsBuilder; +/** + * Checks whether or not the current node matches the specified nameOrCtor and + * key. This uses the specified match function when creating the patcher. + * @param {!Node} matchNode A node to match the data to. + * @param {(string|!tsickle_types_7.ElementConstructor)} nameOrCtor The name or constructor to check for. + * @param {(undefined|null|string|number)} key The key used to identify the Node. + * @return {boolean} True if the node matches, false otherwise. + */ +function matches(matchNode, nameOrCtor, key) { + /** @type {!tsickle_node_data_5.NodeData} */ + const data = node_data_1.getData(matchNode, key); + return matchFn(matchNode, nameOrCtor, data.nameOrCtor, key, data.key); +} +/** + * Finds the matching node, starting at `node` and looking at the subsequent + * siblings if a key is used. + * @param {(null|!Node)} matchNode The node to start looking at. + * @param {(string|!tsickle_types_7.ElementConstructor)} nameOrCtor The name or constructor for the Node. + * @param {(undefined|null|string|number)} key The key used to identify the Node. + * @return {(null|!Node)} The matching Node, if any exists. + */ +function getMatchingNode(matchNode, nameOrCtor, key) { + if (!matchNode) { + return null; + } + /** @type {(null|!Node)} */ + let cur = matchNode; + do { + if (matches(cur, nameOrCtor, key)) { + return cur; + } + } while (key && (cur = cur.nextSibling)); + return null; +} +/** + * Updates the internal structure of a DOM node in the case that an external + * framework tries to modify a DOM element. + * @param {!Element} el The DOM node to update. + * @return {void} + */ +function alwaysDiffAttributes(el) { + node_data_1.getData(el).alwaysDiffAttributes = true; +} +exports.alwaysDiffAttributes = alwaysDiffAttributes; +/** + * Clears out any unvisited Nodes in a given range. + * @param {(null|!Node)} maybeParentNode + * @param {(null|!Node)} startNode The node to start clearing from, inclusive. + * @param {(null|!Node)} endNode The node to clear until, exclusive. + * @return {void} + */ +function clearUnvisitedDOM(maybeParentNode, startNode, endNode) { + /** @type {!Node} */ + const parentNode = (/** @type {!Node} */ (maybeParentNode)); + /** @type {(null|!Node)} */ + let child = startNode; + while (child !== endNode) { + /** @type {(null|!ChildNode)} */ + const next = (/** @type {!Node} */ (child)).nextSibling; + parentNode.removeChild((/** @type {!Node} */ (child))); + (/** @type {!tsickle_context_2.Context} */ (context)).markDeleted((/** @type {!Node} */ (child))); + child = next; + } +} +/** + * @return {(null|!Node)} The next Node to be patched. + */ +function getNextNode() { + if (currentNode) { + return currentNode.nextSibling; + } + else { + return (/** @type {!Node} */ (currentParent)).firstChild; + } +} +/** + * Changes to the first child of the current node. + * @return {void} + */ +function enterNode() { + currentParent = currentNode; + currentNode = null; +} +/** + * Changes to the parent of the current node, removing any unvisited children. + * @return {void} + */ +function exitNode() { + clearUnvisitedDOM(currentParent, getNextNode(), null); + currentNode = currentParent; + currentParent = (/** @type {!Node} */ (currentParent)).parentNode; +} +/** + * Changes to the next sibling of the current node. + * @return {void} + */ +function nextNode() { + currentNode = getNextNode(); +} +exports.skipNode = nextNode; +/** + * Creates a Node and marking it as created. + * @param {(string|!tsickle_types_7.ElementConstructor)} nameOrCtor The name or constructor for the Node. + * @param {(undefined|null|string|number)} key The key used to identify the Node. + * @param {(undefined|string)=} nonce The nonce attribute for the element. + * @return {!Node} The newly created node. + */ +function createNode(nameOrCtor, key, nonce) { + /** @type {?} */ + let node; + if (nameOrCtor === "#text") { + node = nodes_1.createText((/** @type {!Document} */ (doc))); + } + else { + node = nodes_1.createElement((/** @type {!Document} */ (doc)), (/** @type {!Node} */ (currentParent)), nameOrCtor, key); + if (nonce) { + node.setAttribute("nonce", nonce); + } + } + (/** @type {!tsickle_context_2.Context} */ (context)).markCreated(node); + return node; +} +/** + * Aligns the virtual Node definition with the actual DOM, moving the + * corresponding DOM node to the correct location or creating it if necessary. + * @param {(string|!tsickle_types_7.ElementConstructor)} nameOrCtor The name or constructor for the Node. + * @param {(undefined|null|string|number)} key The key used to identify the Node. + * @param {(undefined|string)=} nonce The nonce attribute for the element. + * @return {void} + */ +function alignWithDOM(nameOrCtor, key, nonce) { + nextNode(); + /** @type {(null|!Node)} */ + const existingNode = getMatchingNode(currentNode, nameOrCtor, key); + /** @type {!Node} */ + const node = existingNode || createNode(nameOrCtor, key, nonce); + // If we are at the matching node, then we are done. + if (node === currentNode) { + return; + } + // Re-order the node into the right position, preserving focus if either + // node or currentNode are focused by making sure that they are not detached + // from the DOM. + if (focusPath.indexOf(node) >= 0) { + // Move everything else before the node. + dom_util_1.moveBefore((/** @type {!Node} */ (currentParent)), node, currentNode); + } + else { + (/** @type {!Node} */ (currentParent)).insertBefore(node, currentNode); + } + currentNode = node; +} +exports.alignWithDOM = alignWithDOM; +/** + * Makes sure that the current node is an Element with a matching nameOrCtor and + * key. + * + * @param {(string|!tsickle_types_7.ElementConstructor)} nameOrCtor The tag or constructor for the Element. + * @param {(undefined|null|string|number)=} key The key used to identify this element. This can be an + * empty string, but performance may be better if a unique value is used + * when iterating over an array of items. + * @param {(undefined|string)=} nonce The nonce attribute for the element. + * @return {!HTMLElement} The corresponding Element. + */ +function open(nameOrCtor, key, nonce) { + alignWithDOM(nameOrCtor, key, nonce); + enterNode(); + return (/** @type {!HTMLElement} */ (currentParent)); +} +exports.open = open; +/** + * Closes the currently open Element, removing any unvisited children if + * necessary. + * @return {!Element} The Element that was just closed. + */ +function close() { + if (global_1.DEBUG) { + assertions_1.setInSkip(false); + } + exitNode(); + return (/** @type {!Element} */ (currentNode)); +} +exports.close = close; +/** + * Makes sure the current node is a Text node and creates a Text node if it is + * not. + * @return {!Text} The Text node that was aligned or created. + */ +function text() { + alignWithDOM("#text", null); + return (/** @type {!Text} */ (currentNode)); +} +exports.text = text; +/** + * @return {!Element} The current Element being patched. + */ +function currentElement() { + if (global_1.DEBUG) { + assertions_1.assertInPatch("currentElement"); + assertions_1.assertNotInAttributes("currentElement"); + } + return (/** @type {!Element} */ (currentParent)); +} +exports.currentElement = currentElement; +/** + * @return {(null|!Element)} The current Element being patched, or null if no patch is in progress. + */ +function tryGetCurrentElement() { + return (/** @type {(null|!Element)} */ (currentParent)); +} +exports.tryGetCurrentElement = tryGetCurrentElement; +/** + * @return {!Node} The Node that will be evaluated for the next instruction. + */ +function currentPointer() { + if (global_1.DEBUG) { + assertions_1.assertInPatch("currentPointer"); + assertions_1.assertNotInAttributes("currentPointer"); + } + // TODO(tomnguyen): assert that this is not null + return (/** @type {!Node} */ (getNextNode())); +} +exports.currentPointer = currentPointer; +/** + * @return {(null|!tsickle_context_2.Context)} + */ +function currentContext() { + return context; +} +exports.currentContext = currentContext; +/** + * Skips the children in a subtree, allowing an Element to be closed without + * clearing out the children. + * @return {void} + */ +function skip() { + if (global_1.DEBUG) { + assertions_1.assertNoChildrenDeclaredYet("skip", currentNode); + assertions_1.setInSkip(true); + } + currentNode = (/** @type {!Node} */ (currentParent)).lastChild; +} +exports.skip = skip; +/** + * Returns a patcher function that sets up and restores a patch context, + * running the run function with the provided data. + * @template T, R + * @param {function((!DocumentFragment|!Element), function((undefined|T)): void, (undefined|T)=): R} run The function that will run the patch. + * @param {!tsickle_types_7.PatchConfig=} patchConfig The configuration to use for the patch. + * @return {function((!DocumentFragment|!Element), function((undefined|T)): void, (undefined|T)=): R} The created patch function. + */ +function createPatcher(run, patchConfig = {}) { + const { matches = defaultMatchFn } = patchConfig; + /** @type {function((!DocumentFragment|!Element), function((undefined|T)): void, (undefined|T)=): R} */ + const f = (/** + * @param {(!DocumentFragment|!Element)} node + * @param {function((undefined|T)): void} fn + * @param {(undefined|T)} data + * @return {R} + */ + (node, fn, data) => { + /** @type {(null|!tsickle_context_2.Context)} */ + const prevContext = context; + /** @type {(null|!Document)} */ + const prevDoc = doc; + /** @type {!Array} */ + const prevFocusPath = focusPath; + /** @type {!Array<(undefined|null|*)>} */ + const prevArgsBuilder = argsBuilder; + /** @type {!Array} */ + const prevAttrsBuilder = attrsBuilder; + /** @type {(null|!Node)} */ + const prevCurrentNode = currentNode; + /** @type {(null|!Node)} */ + const prevCurrentParent = currentParent; + /** @type {function(!Node, (string|!tsickle_types_7.ElementConstructor), (string|!tsickle_types_7.ElementConstructor), (undefined|null|string|number), (undefined|null|string|number)): boolean} */ + const prevMatchFn = matchFn; + /** @type {boolean} */ + let previousInAttributes = false; + /** @type {boolean} */ + let previousInSkip = false; + doc = node.ownerDocument; + context = new context_1.Context(node); + matchFn = matches; + argsBuilder = []; + attrsBuilder = []; + currentNode = null; + currentParent = node.parentNode; + focusPath = dom_util_1.getFocusedPath(node, currentParent); + if (global_1.DEBUG) { + previousInAttributes = assertions_1.setInAttributes(false); + previousInSkip = assertions_1.setInSkip(false); + assertions_1.updatePatchContext(context); + } + try { + /** @type {R} */ + const retVal = run(node, fn, data); + if (global_1.DEBUG) { + assertions_1.assertVirtualAttributesClosed(); + } + return retVal; + } + finally { + context.notifyChanges(); + doc = prevDoc; + context = prevContext; + matchFn = prevMatchFn; + argsBuilder = prevArgsBuilder; + attrsBuilder = prevAttrsBuilder; + currentNode = prevCurrentNode; + currentParent = prevCurrentParent; + focusPath = prevFocusPath; + // Needs to be done after assertions because assertions rely on state + // from these methods. + if (global_1.DEBUG) { + assertions_1.setInAttributes(previousInAttributes); + assertions_1.setInSkip(previousInSkip); + assertions_1.updatePatchContext(context); + } + } + }); + return f; +} +/** + * Creates a patcher that patches the document starting at node with a + * provided function. This function may be called during an existing patch operation. + * @template T + * @param {(undefined|!tsickle_types_7.PatchConfig)=} patchConfig The config to use for the patch. + * @return {function((!DocumentFragment|!Element), function((undefined|T)): void, (undefined|T)=): !Node} The created function for patching an Element's children. + */ +function createPatchInner(patchConfig) { + return createPatcher((/** + * @param {(!DocumentFragment|!Element)} node + * @param {function((undefined|T)): void} fn + * @param {(undefined|T)} data + * @return {(!DocumentFragment|!Element)} + */ + (node, fn, data) => { + currentNode = node; + enterNode(); + fn(data); + exitNode(); + if (global_1.DEBUG) { + assertions_1.assertNoUnclosedTags(currentNode, node); + } + return node; + }), patchConfig); +} +exports.createPatchInner = createPatchInner; +/** + * Creates a patcher that patches an Element with the the provided function. + * Exactly one top level element call should be made corresponding to `node`. + * @template T + * @param {(undefined|!tsickle_types_7.PatchConfig)=} patchConfig The config to use for the patch. + * @return {function((!DocumentFragment|!Element), function((undefined|T)): void, (undefined|T)=): (null|!Node)} The created function for patching an Element. + */ +function createPatchOuter(patchConfig) { + return createPatcher((/** + * @param {(!DocumentFragment|!Element)} node + * @param {function((undefined|T)): void} fn + * @param {(undefined|T)} data + * @return {(null|!Node)} + */ + (node, fn, data) => { + /** @type {!Element} */ + const startNode = (/** @type {!Element} */ (((/** @type {?} */ ({ nextSibling: node }))))); + /** @type {(null|!Node)} */ + let expectedNextNode = null; + /** @type {(null|!Node)} */ + let expectedPrevNode = null; + if (global_1.DEBUG) { + expectedNextNode = node.nextSibling; + expectedPrevNode = node.previousSibling; + } + currentNode = startNode; + fn(data); + if (global_1.DEBUG) { + if (node_data_1.getData(node).key) { + assertions_1.assertPatchOuterHasParentNode(currentParent); + } + assertions_1.assertPatchElementNoExtras(startNode, currentNode, expectedNextNode, expectedPrevNode); + } + if (currentParent) { + clearUnvisitedDOM(currentParent, getNextNode(), node.nextSibling); + } + return startNode === currentNode ? null : currentNode; + }), patchConfig); +} +exports.createPatchOuter = createPatchOuter; +/** @type {function((!DocumentFragment|!Element), function((undefined|?)): void, (undefined|?)=): !Node} */ +const patchInner = createPatchInner(); +exports.patchInner = patchInner; +/** @type {function((!DocumentFragment|!Element), function((undefined|?)): void, (undefined|?)=): (null|!Node)} */ +const patchOuter = createPatchOuter(); +exports.patchOuter = patchOuter; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0Esa0VBV3NCO0FBQ3RCLDREQUFvQztBQUNwQyw4REFBd0Q7QUFDeEQsMERBQWlDO0FBQ2pDLGdFQUFzQztBQUN0Qyx3REFBb0Q7Ozs7Ozs7Ozs7O0FBbUJwRCxTQUFTLGNBQWMsQ0FDckIsU0FBZSxFQUNmLFVBQXlCLEVBQ3pCLGtCQUFpQyxFQUNqQyxHQUFRLEVBQ1IsV0FBZ0I7SUFFaEIsMkVBQTJFO0lBQzNFLHdFQUF3RTtJQUN4RSxxRUFBcUU7SUFDckUsT0FBTyxVQUFVLElBQUksa0JBQWtCLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQztBQUNoRSxDQUFDOztJQUVHLE9BQU8sR0FBbUIsSUFBSTs7SUFFOUIsV0FBVyxHQUFnQixJQUFJOztJQUUvQixhQUFhLEdBQWdCLElBQUk7O0lBRWpDLEdBQUcsR0FBb0IsSUFBSTs7SUFFM0IsU0FBUyxHQUFnQixFQUFFOztJQUUzQixPQUFPLEdBQWUsY0FBYzs7Ozs7O0lBTXBDLFdBQVcsR0FBaUMsRUFBRTs7Ozs7SUFLOUMsWUFBWSxHQUFlLEVBQUU7Ozs7OztBQU9qQyxTQUFTLGNBQWM7SUFDckIsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQW9hQyx3Q0FBYzs7Ozs7O0FBN1poQixTQUFTLGVBQWU7SUFDdEIsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQTRaQywwQ0FBZTs7Ozs7Ozs7O0FBbFpqQixTQUFTLE9BQU8sQ0FDZCxTQUFlLEVBQ2YsVUFBeUIsRUFDekIsR0FBUTs7VUFFRixJQUFJLEdBQUcsbUJBQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO0lBRXBDLE9BQU8sT0FBTyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FB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U0FDekM7UUFFRCxXQUFXLEdBQUcsU0FBUyxDQUFDO1FBQ3hCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVULElBQUksY0FBSyxFQUFFO1lBQ1QsSUFBSSxtQkFBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRTtnQkFDckIsMENBQTZCLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDOUM7WUFDRCx1Q0FBMEIsQ0FDeEIsU0FBUyxFQUNULFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLENBQ2pCLENBQUM7U0FDSDtRQUVELElBQUksYUFBYSxFQUFFO1lBQ2pCLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDbkU7UUFFRCxPQUFPLFNBQVMsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQ3hELENBQUMsR0FBRSxXQUFXLENBQUMsQ0FBQztBQUNsQixDQUFDO0FBb0JDLDRDQUFnQjs7TUFsQlosVUFBVSxHQUlKLGdCQUFnQixFQUFFO0FBZTVCLGdDQUFVOztNQWROLFVBQVUsR0FJRyxnQkFBZ0IsRUFBRTtBQVduQyxnQ0FBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vICBDb3B5cmlnaHQgMjAxOCBUaGUgSW5jcmVtZW50YWwgRE9NIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKiogQGxpY2Vuc2UgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgKi9cblxuaW1wb3J0IHtcbiAgYXNzZXJ0SW5QYXRjaCxcbiAgYXNzZXJ0Tm9DaGlsZHJlbkRlY2xhcmVkWWV0LFxuICBhc3NlcnROb3RJbkF0dHJpYnV0ZXMsXG4gIGFzc2VydE5vVW5jbG9zZWRUYWdzLFxuICBhc3NlcnRQYXRjaEVsZW1lbnROb0V4dHJhcyxcbiAgYXNzZXJ0UGF0Y2hPdXRlckhhc1BhcmVudE5vZGUsXG4gIGFzc2VydFZpcnR1YWxBdHRyaWJ1dGVzQ2xvc2VkLFxuICBzZXRJbkF0dHJpYnV0ZXMsXG4gIHNldEluU2tpcCxcbiAgdXBkYXRlUGF0Y2hDb250ZXh0XG59IGZyb20gXCIuL2Fzc2VydGlvbnNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgeyBnZXRGb2N1c2VkUGF0aCwgbW92ZUJlZm9yZSB9IGZyb20gXCIuL2RvbV91dGlsXCI7XG5pbXBvcnQgeyBERUJVRyB9IGZyb20gXCIuL2dsb2JhbFwiO1xuaW1wb3J0IHsgZ2V0RGF0YSB9IGZyb20gXCIuL25vZGVfZGF0YVwiO1xuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgY3JlYXRlVGV4dCB9IGZyb20gXCIuL25vZGVzXCI7XG5pbXBvcnQge1xuICBLZXksXG4gIE1hdGNoRm5EZWYsXG4gIE5hbWVPckN0b3JEZWYsXG4gIFBhdGNoQ29uZmlnLFxuICBQYXRjaEZ1bmN0aW9uXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgbWF0Y2ggZnVuY3Rpb24gdG8gdXNlLCBpZiBvbmUgd2FzIG5vdCBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZ1xuICogdGhlIHBhdGNoZXIuXG4gKiBAcGFyYW0gbWF0Y2hOb2RlIFRoZSBub2RlIHRvIG1hdGNoIGFnYWluc3QsIHVudXNlZC5cbiAqIEBwYXJhbSBuYW1lT3JDdG9yIFRoZSBuYW1lIG9yIGNvbnN0cnVjdG9yIGFzIGRlY2xhcmVkLlxuICogQHBhcmFtIGV4cGVjdGVkTmFtZU9yQ3RvciBUaGUgbmFtZSBvciBjb25zdHJ1Y3RvciBvZiB0aGUgZXhpc3Rpbmcgbm9kZS5cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSBhcyBkZWNsYXJlZC5cbiAqIEBwYXJhbSBleHBlY3RlZEtleSBUaGUga2V5IG9mIHRoZSBleGlzdGluZyBub2RlLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgbm9kZSBtYXRjaGVzLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRNYXRjaEZuKFxuICBtYXRjaE5vZGU6IE5vZGUsXG4gIG5hbWVPckN0b3I6IE5hbWVPckN0b3JEZWYsXG4gIGV4cGVjdGVkTmFtZU9yQ3RvcjogTmFtZU9yQ3RvckRlZixcbiAga2V5OiBLZXksXG4gIGV4cGVjdGVkS2V5OiBLZXlcbik6IGJvb2xlYW4ge1xuICAvLyBLZXkgY2hlY2sgaXMgZG9uZSB1c2luZyBkb3VibGUgZXF1YWxzIGFzIHdlIHdhbnQgdG8gdHJlYXQgYSBudWxsIGtleSB0aGVcbiAgLy8gc2FtZSBhcyB1bmRlZmluZWQuIFRoaXMgc2hvdWxkIGJlIG9rYXkgYXMgdGhlIG9ubHkgdmFsdWVzIGFsbG93ZWQgYXJlXG4gIC8vIHN0cmluZ3MsIG51bGwgYW5kIHVuZGVmaW5lZCBzbyB0aGUgPT0gc2VtYW50aWNzIGFyZSBub3QgdG9vIHdlaXJkLlxuICByZXR1cm4gbmFtZU9yQ3RvciA9PSBleHBlY3RlZE5hbWVPckN0b3IgJiYga2V5ID09IGV4cGVjdGVkS2V5O1xufVxuXG5sZXQgY29udGV4dDogQ29udGV4dCB8IG51bGwgPSBudWxsO1xuXG5sZXQgY3VycmVudE5vZGU6IE5vZGUgfCBudWxsID0gbnVsbDtcblxubGV0IGN1cnJlbnRQYXJlbnQ6IE5vZGUgfCBudWxsID0gbnVsbDtcblxubGV0IGRvYzogRG9jdW1lbnQgfCBudWxsID0gbnVsbDtcblxubGV0IGZvY3VzUGF0aDogQXJyYXk8Tm9kZT4gPSBbXTtcblxubGV0IG1hdGNoRm46IE1hdGNoRm5EZWYgPSBkZWZhdWx0TWF0Y2hGbjtcblxuLyoqXG4gKiBVc2VkIHRvIGJ1aWxkIHVwIGNhbGwgYXJndW1lbnRzLiBFYWNoIHBhdGNoIGNhbGwgZ2V0cyBhIHNlcGFyYXRlIGNvcHksIHNvXG4gKiB0aGlzIHdvcmtzIHdpdGggbmVzdGVkIGNhbGxzIHRvIHBhdGNoLlxuICovXG5sZXQgYXJnc0J1aWxkZXI6IEFycmF5PHt9IHwgbnVsbCB8IHVuZGVmaW5lZD4gPSBbXTtcblxuLyoqXG4gKiBVc2VkIHRvIGJ1aWxkIHVwIGF0dHJzIGZvciB0aGUgYW4gZWxlbWVudC5cbiAqL1xubGV0IGF0dHJzQnVpbGRlcjogQXJyYXk8YW55PiA9IFtdO1xuXG4vKipcbiAqIFRPRE8oc3BhcmhhbWkpIFdlIHNob3VsZCBqdXN0IGV4cG9ydCBhcmdzQnVpbGRlciBkaXJlY3RseSB3aGVuIENsb3N1cmVcbiAqIENvbXBpbGVyIHN1cHBvcnRzIEVTNiBkaXJlY3RseS5cbiAqIEByZXR1cm5zIFRoZSBBcnJheSB1c2VkIGZvciBidWlsZGluZyBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGdldEFyZ3NCdWlsZGVyKCk6IEFycmF5PGFueT4ge1xuICByZXR1cm4gYXJnc0J1aWxkZXI7XG59XG5cbi8qKlxuICogVE9ETyhzcGFyaGFtaSkgV2Ugc2hvdWxkIGp1c3QgZXhwb3J0IGF0dHJzQnVpbGRlciBkaXJlY3RseSB3aGVuIENsb3N1cmVcbiAqIENvbXBpbGVyIHN1cHBvcnRzIEVTNiBkaXJlY3RseS5cbiAqIEByZXR1cm5zIFRoZSBBcnJheSB1c2VkIGZvciBidWlsZGluZyBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGdldEF0dHJzQnVpbGRlcigpOiBBcnJheTxhbnk+IHtcbiAgcmV0dXJuIGF0dHJzQnVpbGRlcjtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIGN1cnJlbnQgbm9kZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgbmFtZU9yQ3RvciBhbmRcbiAqIGtleS4gVGhpcyB1c2VzIHRoZSBzcGVjaWZpZWQgbWF0Y2ggZnVuY3Rpb24gd2hlbiBjcmVhdGluZyB0aGUgcGF0Y2hlci5cbiAqIEBwYXJhbSBtYXRjaE5vZGUgQSBub2RlIHRvIG1hdGNoIHRoZSBkYXRhIHRvLlxuICogQHBhcmFtIG5hbWVPckN0b3IgVGhlIG5hbWUgb3IgY29uc3RydWN0b3IgdG8gY2hlY2sgZm9yLlxuICogQHBhcmFtIGtleSBUaGUga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIE5vZGUuXG4gKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5vZGUgbWF0Y2hlcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBtYXRjaGVzKFxuICBtYXRjaE5vZGU6IE5vZGUsXG4gIG5hbWVPckN0b3I6IE5hbWVPckN0b3JEZWYsXG4gIGtleTogS2V5XG4pOiBib29sZWFuIHtcbiAgY29uc3QgZGF0YSA9IGdldERhdGEobWF0Y2hOb2RlLCBrZXkpO1xuXG4gIHJldHVybiBtYXRjaEZuKG1hdGNoTm9kZSwgbmFtZU9yQ3RvciwgZGF0YS5uYW1lT3JDdG9yLCBrZXksIGRhdGEua2V5KTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgbWF0Y2hpbmcgbm9kZSwgc3RhcnRpbmcgYXQgYG5vZGVgIGFuZCBsb29raW5nIGF0IHRoZSBzdWJzZXF1ZW50XG4gKiBzaWJsaW5ncyBpZiBhIGtleSBpcyB1c2VkLlxuICogQHBhcmFtIG1hdGNoTm9kZSBUaGUgbm9kZSB0byBzdGFydCBsb29raW5nIGF0LlxuICogQHBhcmFtIG5hbWVPckN0b3IgVGhlIG5hbWUgb3IgY29uc3RydWN0b3IgZm9yIHRoZSBOb2RlLlxuICogQHBhcmFtIGtleSBUaGUga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIE5vZGUuXG4gKiBAcmV0dXJucyBUaGUgbWF0Y2hpbmcgTm9kZSwgaWYgYW55IGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF0Y2hpbmdOb2RlKFxuICBtYXRjaE5vZGU6IE5vZGUgfCBudWxsLFxuICBuYW1lT3JDdG9yOiBOYW1lT3JDdG9yRGVmLFxuICBrZXk6IEtleVxuKTogTm9kZSB8IG51bGwge1xuICBpZiAoIW1hdGNoTm9kZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IGN1cjogTm9kZSB8IG51bGwgPSBtYXRjaE5vZGU7XG5cbiAgZG8ge1xuICAgIGlmIChtYXRjaGVzKGN1ciwgbmFtZU9yQ3Rvciwga2V5KSkge1xuICAgICAgcmV0dXJuIGN1cjtcbiAgICB9XG4gIH0gd2hpbGUgKGtleSAmJiAoY3VyID0gY3VyLm5leHRTaWJsaW5nKSk7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIGEgRE9NIG5vZGUgaW4gdGhlIGNhc2UgdGhhdCBhbiBleHRlcm5hbFxuICogZnJhbWV3b3JrIHRyaWVzIHRvIG1vZGlmeSBhIERPTSBlbGVtZW50LlxuICogQHBhcmFtIGVsIFRoZSBET00gbm9kZSB0byB1cGRhdGUuXG4gKi9cbmZ1bmN0aW9uIGFsd2F5c0RpZmZBdHRyaWJ1dGVzKGVsOiBFbGVtZW50KSB7XG4gIGdldERhdGEoZWwpLmFsd2F5c0RpZmZBdHRyaWJ1dGVzID0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDbGVhcnMgb3V0IGFueSB1bnZpc2l0ZWQgTm9kZXMgaW4gYSBnaXZlbiByYW5nZS5cbiAqIEBwYXJhbSBtYXliZVBhcmVudE5vZGVcbiAqIEBwYXJhbSBzdGFydE5vZGUgVGhlIG5vZGUgdG8gc3RhcnQgY2xlYXJpbmcgZnJvbSwgaW5jbHVzaXZlLlxuICogQHBhcmFtIGVuZE5vZGUgVGhlIG5vZGUgdG8gY2xlYXIgdW50aWwsIGV4Y2x1c2l2ZS5cbiAqL1xuZnVuY3Rpb24gY2xlYXJVbnZpc2l0ZWRET00oXG4gIG1heWJlUGFyZW50Tm9kZTogTm9kZSB8IG51bGwsXG4gIHN0YXJ0Tm9kZTogTm9kZSB8IG51bGwsXG4gIGVuZE5vZGU6IE5vZGUgfCBudWxsXG4pIHtcbiAgY29uc3QgcGFyZW50Tm9kZSA9IG1heWJlUGFyZW50Tm9kZSE7XG4gIGxldCBjaGlsZCA9IHN0YXJ0Tm9kZTtcblxuICB3aGlsZSAoY2hpbGQgIT09IGVuZE5vZGUpIHtcbiAgICBjb25zdCBuZXh0ID0gY2hpbGQhLm5leHRTaWJsaW5nO1xuICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQhKTtcbiAgICBjb250ZXh0IS5tYXJrRGVsZXRlZChjaGlsZCEpO1xuICAgIGNoaWxkID0gbmV4dDtcbiAgfVxufVxuXG4vKipcbiAqIEByZXR1cm4gVGhlIG5leHQgTm9kZSB0byBiZSBwYXRjaGVkLlxuICovXG5mdW5jdGlvbiBnZXROZXh0Tm9kZSgpOiBOb2RlIHwgbnVsbCB7XG4gIGlmIChjdXJyZW50Tm9kZSkge1xuICAgIHJldHVybiBjdXJyZW50Tm9kZS5uZXh0U2libGluZztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3VycmVudFBhcmVudCEuZmlyc3RDaGlsZDtcbiAgfVxufVxuXG4vKipcbiAqIENoYW5nZXMgdG8gdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGVudGVyTm9kZSgpIHtcbiAgY3VycmVudFBhcmVudCA9IGN1cnJlbnROb2RlO1xuICBjdXJyZW50Tm9kZSA9IG51bGw7XG59XG5cbi8qKlxuICogQ2hhbmdlcyB0byB0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUsIHJlbW92aW5nIGFueSB1bnZpc2l0ZWQgY2hpbGRyZW4uXG4gKi9cbmZ1bmN0aW9uIGV4aXROb2RlKCkge1xuICBjbGVhclVudmlzaXRlZERPTShjdXJyZW50UGFyZW50LCBnZXROZXh0Tm9kZSgpLCBudWxsKTtcblxuICBjdXJyZW50Tm9kZSA9IGN1cnJlbnRQYXJlbnQ7XG4gIGN1cnJlbnRQYXJlbnQgPSBjdXJyZW50UGFyZW50IS5wYXJlbnROb2RlO1xufVxuXG4vKipcbiAqIENoYW5nZXMgdG8gdGhlIG5leHQgc2libGluZyBvZiB0aGUgY3VycmVudCBub2RlLlxuICovXG5mdW5jdGlvbiBuZXh0Tm9kZSgpIHtcbiAgY3VycmVudE5vZGUgPSBnZXROZXh0Tm9kZSgpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBOb2RlIGFuZCBtYXJraW5nIGl0IGFzIGNyZWF0ZWQuXG4gKiBAcGFyYW0gbmFtZU9yQ3RvciBUaGUgbmFtZSBvciBjb25zdHJ1Y3RvciBmb3IgdGhlIE5vZGUuXG4gKiBAcGFyYW0ga2V5IFRoZSBrZXkgdXNlZCB0byBpZGVudGlmeSB0aGUgTm9kZS5cbiAqIEBwYXJhbSBub25jZSBUaGUgbm9uY2UgYXR0cmlidXRlIGZvciB0aGUgZWxlbWVudC5cbiAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgbm9kZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTm9kZShuYW1lT3JDdG9yOiBOYW1lT3JDdG9yRGVmLCBrZXk6IEtleSwgbm9uY2U/OiBzdHJpbmcpOiBOb2RlIHtcbiAgbGV0IG5vZGU7XG5cbiAgaWYgKG5hbWVPckN0b3IgPT09IFwiI3RleHRcIikge1xuICAgIG5vZGUgPSBjcmVhdGVUZXh0KGRvYyEpO1xuICB9IGVsc2Uge1xuICAgIG5vZGUgPSBjcmVhdGVFbGVtZW50KGRvYyEsIGN1cnJlbnRQYXJlbnQhLCBuYW1lT3JDdG9yLCBrZXkpO1xuICAgIGlmIChub25jZSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gICAgfVxuICB9XG5cbiAgY29udGV4dCEubWFya0NyZWF0ZWQobm9kZSk7XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbi8qKlxuICogQWxpZ25zIHRoZSB2aXJ0dWFsIE5vZGUgZGVmaW5pdGlvbiB3aXRoIHRoZSBhY3R1YWwgRE9NLCBtb3ZpbmcgdGhlXG4gKiBjb3JyZXNwb25kaW5nIERPTSBub2RlIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uIG9yIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS5cbiAqIEBwYXJhbSBuYW1lT3JDdG9yIFRoZSBuYW1lIG9yIGNvbnN0cnVjdG9yIGZvciB0aGUgTm9kZS5cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBOb2RlLlxuICogQHBhcmFtIG5vbmNlIFRoZSBub25jZSBhdHRyaWJ1dGUgZm9yIHRoZSBlbGVtZW50LlxuICovXG5mdW5jdGlvbiBhbGlnbldpdGhET00obmFtZU9yQ3RvcjogTmFtZU9yQ3RvckRlZiwga2V5OiBLZXksIG5vbmNlPzogc3RyaW5nKSB7XG4gIG5leHROb2RlKCk7XG4gIGNvbnN0IGV4aXN0aW5nTm9kZSA9IGdldE1hdGNoaW5nTm9kZShjdXJyZW50Tm9kZSwgbmFtZU9yQ3Rvciwga2V5KTtcbiAgY29uc3Qgbm9kZSA9IGV4aXN0aW5nTm9kZSB8fCBjcmVhdGVOb2RlKG5hbWVPckN0b3IsIGtleSwgbm9uY2UpO1xuXG4gIC8vIElmIHdlIGFyZSBhdCB0aGUgbWF0Y2hpbmcgbm9kZSwgdGhlbiB3ZSBhcmUgZG9uZS5cbiAgaWYgKG5vZGUgPT09IGN1cnJlbnROb2RlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUmUtb3JkZXIgdGhlIG5vZGUgaW50byB0aGUgcmlnaHQgcG9zaXRpb24sIHByZXNlcnZpbmcgZm9jdXMgaWYgZWl0aGVyXG4gIC8vIG5vZGUgb3IgY3VycmVudE5vZGUgYXJlIGZvY3VzZWQgYnkgbWFraW5nIHN1cmUgdGhhdCB0aGV5IGFyZSBub3QgZGV0YWNoZWRcbiAgLy8gZnJvbSB0aGUgRE9NLlxuICBpZiAoZm9jdXNQYXRoLmluZGV4T2Yobm9kZSkgPj0gMCkge1xuICAgIC8vIE1vdmUgZXZlcnl0aGluZyBlbHNlIGJlZm9yZSB0aGUgbm9kZS5cbiAgICBtb3ZlQmVmb3JlKGN1cnJlbnRQYXJlbnQhLCBub2RlLCBjdXJyZW50Tm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgY3VycmVudFBhcmVudCEuaW5zZXJ0QmVmb3JlKG5vZGUsIGN1cnJlbnROb2RlKTtcbiAgfVxuXG4gIGN1cnJlbnROb2RlID0gbm9kZTtcbn1cblxuLyoqXG4gKiBNYWtlcyBzdXJlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBhbiBFbGVtZW50IHdpdGggYSBtYXRjaGluZyBuYW1lT3JDdG9yIGFuZFxuICoga2V5LlxuICpcbiAqIEBwYXJhbSBuYW1lT3JDdG9yIFRoZSB0YWcgb3IgY29uc3RydWN0b3IgZm9yIHRoZSBFbGVtZW50LlxuICogQHBhcmFtIGtleSBUaGUga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBlbGVtZW50LiBUaGlzIGNhbiBiZSBhblxuICogICAgIGVtcHR5IHN0cmluZywgYnV0IHBlcmZvcm1hbmNlIG1heSBiZSBiZXR0ZXIgaWYgYSB1bmlxdWUgdmFsdWUgaXMgdXNlZFxuICogICAgIHdoZW4gaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgb2YgaXRlbXMuXG4gKiBAcGFyYW0gbm9uY2UgVGhlIG5vbmNlIGF0dHJpYnV0ZSBmb3IgdGhlIGVsZW1lbnQuXG4gKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIEVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIG9wZW4oXG4gIG5hbWVPckN0b3I6IE5hbWVPckN0b3JEZWYsXG4gIGtleT86IEtleSxcbiAgbm9uY2U/OiBzdHJpbmdcbik6IEhUTUxFbGVtZW50IHtcbiAgYWxpZ25XaXRoRE9NKG5hbWVPckN0b3IsIGtleSwgbm9uY2UpO1xuICBlbnRlck5vZGUoKTtcbiAgcmV0dXJuIGN1cnJlbnRQYXJlbnQgYXMgSFRNTEVsZW1lbnQ7XG59XG5cbi8qKlxuICogQ2xvc2VzIHRoZSBjdXJyZW50bHkgb3BlbiBFbGVtZW50LCByZW1vdmluZyBhbnkgdW52aXNpdGVkIGNoaWxkcmVuIGlmXG4gKiBuZWNlc3NhcnkuXG4gKiBAcmV0dXJucyBUaGUgRWxlbWVudCB0aGF0IHdhcyBqdXN0IGNsb3NlZC5cbiAqL1xuZnVuY3Rpb24gY2xvc2UoKTogRWxlbWVudCB7XG4gIGlmIChERUJVRykge1xuICAgIHNldEluU2tpcChmYWxzZSk7XG4gIH1cblxuICBleGl0Tm9kZSgpO1xuICByZXR1cm4gY3VycmVudE5vZGUgYXMgRWxlbWVudDtcbn1cblxuLyoqXG4gKiBNYWtlcyBzdXJlIHRoZSBjdXJyZW50IG5vZGUgaXMgYSBUZXh0IG5vZGUgYW5kIGNyZWF0ZXMgYSBUZXh0IG5vZGUgaWYgaXQgaXNcbiAqIG5vdC5cbiAqIEByZXR1cm5zIFRoZSBUZXh0IG5vZGUgdGhhdCB3YXMgYWxpZ25lZCBvciBjcmVhdGVkLlxuICovXG5mdW5jdGlvbiB0ZXh0KCk6IFRleHQge1xuICBhbGlnbldpdGhET00oXCIjdGV4dFwiLCBudWxsKTtcbiAgcmV0dXJuIGN1cnJlbnROb2RlIGFzIFRleHQ7XG59XG5cbi8qKlxuICogQHJldHVybnMgVGhlIGN1cnJlbnQgRWxlbWVudCBiZWluZyBwYXRjaGVkLlxuICovXG5mdW5jdGlvbiBjdXJyZW50RWxlbWVudCgpOiBFbGVtZW50IHtcbiAgaWYgKERFQlVHKSB7XG4gICAgYXNzZXJ0SW5QYXRjaChcImN1cnJlbnRFbGVtZW50XCIpO1xuICAgIGFzc2VydE5vdEluQXR0cmlidXRlcyhcImN1cnJlbnRFbGVtZW50XCIpO1xuICB9XG4gIHJldHVybiBjdXJyZW50UGFyZW50IGFzIEVsZW1lbnQ7XG59XG5cbi8qKlxuICogQHJldHVybnMgVGhlIGN1cnJlbnQgRWxlbWVudCBiZWluZyBwYXRjaGVkLCBvciBudWxsIGlmIG5vIHBhdGNoIGlzIGluIHByb2dyZXNzLlxuICovXG5mdW5jdGlvbiB0cnlHZXRDdXJyZW50RWxlbWVudCgpOiBFbGVtZW50IHwgbnVsbCB7XG4gIHJldHVybiBjdXJyZW50UGFyZW50IGFzIEVsZW1lbnQgfCBudWxsO1xufVxuXG4vKipcbiAqIEByZXR1cm4gVGhlIE5vZGUgdGhhdCB3aWxsIGJlIGV2YWx1YXRlZCBmb3IgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGN1cnJlbnRQb2ludGVyKCk6IE5vZGUge1xuICBpZiAoREVCVUcpIHtcbiAgICBhc3NlcnRJblBhdGNoKFwiY3VycmVudFBvaW50ZXJcIik7XG4gICAgYXNzZXJ0Tm90SW5BdHRyaWJ1dGVzKFwiY3VycmVudFBvaW50ZXJcIik7XG4gIH1cbiAgLy8gVE9ETyh0b21uZ3V5ZW4pOiBhc3NlcnQgdGhhdCB0aGlzIGlzIG5vdCBudWxsXG4gIHJldHVybiBnZXROZXh0Tm9kZSgpITtcbn1cblxuZnVuY3Rpb24gY3VycmVudENvbnRleHQoKSB7XG4gIHJldHVybiBjb250ZXh0O1xufVxuXG4vKipcbiAqIFNraXBzIHRoZSBjaGlsZHJlbiBpbiBhIHN1YnRyZWUsIGFsbG93aW5nIGFuIEVsZW1lbnQgdG8gYmUgY2xvc2VkIHdpdGhvdXRcbiAqIGNsZWFyaW5nIG91dCB0aGUgY2hpbGRyZW4uXG4gKi9cbmZ1bmN0aW9uIHNraXAoKSB7XG4gIGlmIChERUJVRykge1xuICAgIGFzc2VydE5vQ2hpbGRyZW5EZWNsYXJlZFlldChcInNraXBcIiwgY3VycmVudE5vZGUpO1xuICAgIHNldEluU2tpcCh0cnVlKTtcbiAgfVxuICBjdXJyZW50Tm9kZSA9IGN1cnJlbnRQYXJlbnQhLmxhc3RDaGlsZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcGF0Y2hlciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgYW5kIHJlc3RvcmVzIGEgcGF0Y2ggY29udGV4dCxcbiAqIHJ1bm5pbmcgdGhlIHJ1biBmdW5jdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBkYXRhLlxuICogQHBhcmFtIHJ1biBUaGUgZnVuY3Rpb24gdGhhdCB3aWxsIHJ1biB0aGUgcGF0Y2guXG4gKiBAcGFyYW0gcGF0Y2hDb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGZvciB0aGUgcGF0Y2guXG4gKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBwYXRjaCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUGF0Y2hlcjxULCBSPihcbiAgcnVuOiBQYXRjaEZ1bmN0aW9uPFQsIFI+LFxuICBwYXRjaENvbmZpZzogUGF0Y2hDb25maWcgPSB7fVxuKTogUGF0Y2hGdW5jdGlvbjxULCBSPiB7XG4gIGNvbnN0IHsgbWF0Y2hlcyA9IGRlZmF1bHRNYXRjaEZuIH0gPSBwYXRjaENvbmZpZztcblxuICBjb25zdCBmOiBQYXRjaEZ1bmN0aW9uPFQsIFI+ID0gKG5vZGUsIGZuLCBkYXRhKSA9PiB7XG4gICAgY29uc3QgcHJldkNvbnRleHQgPSBjb250ZXh0O1xuICAgIGNvbnN0IHByZXZEb2MgPSBkb2M7XG4gICAgY29uc3QgcHJldkZvY3VzUGF0aCA9IGZvY3VzUGF0aDtcbiAgICBjb25zdCBwcmV2QXJnc0J1aWxkZXIgPSBhcmdzQnVpbGRlcjtcbiAgICBjb25zdCBwcmV2QXR0cnNCdWlsZGVyID0gYXR0cnNCdWlsZGVyO1xuICAgIGNvbnN0IHByZXZDdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlO1xuICAgIGNvbnN0IHByZXZDdXJyZW50UGFyZW50ID0gY3VycmVudFBhcmVudDtcbiAgICBjb25zdCBwcmV2TWF0Y2hGbiA9IG1hdGNoRm47XG4gICAgbGV0IHByZXZpb3VzSW5BdHRyaWJ1dGVzID0gZmFsc2U7XG4gICAgbGV0IHByZXZpb3VzSW5Ta2lwID0gZmFsc2U7XG5cbiAgICBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgY29udGV4dCA9IG5ldyBDb250ZXh0KG5vZGUpO1xuICAgIG1hdGNoRm4gPSBtYXRjaGVzO1xuICAgIGFyZ3NCdWlsZGVyID0gW107XG4gICAgYXR0cnNCdWlsZGVyID0gW107XG4gICAgY3VycmVudE5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnRQYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgZm9jdXNQYXRoID0gZ2V0Rm9jdXNlZFBhdGgobm9kZSwgY3VycmVudFBhcmVudCk7XG5cbiAgICBpZiAoREVCVUcpIHtcbiAgICAgIHByZXZpb3VzSW5BdHRyaWJ1dGVzID0gc2V0SW5BdHRyaWJ1dGVzKGZhbHNlKTtcbiAgICAgIHByZXZpb3VzSW5Ta2lwID0gc2V0SW5Ta2lwKGZhbHNlKTtcbiAgICAgIHVwZGF0ZVBhdGNoQ29udGV4dChjb250ZXh0KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmV0VmFsID0gcnVuKG5vZGUsIGZuLCBkYXRhKTtcbiAgICAgIGlmIChERUJVRykge1xuICAgICAgICBhc3NlcnRWaXJ0dWFsQXR0cmlidXRlc0Nsb3NlZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjb250ZXh0Lm5vdGlmeUNoYW5nZXMoKTtcblxuICAgICAgZG9jID0gcHJldkRvYztcbiAgICAgIGNvbnRleHQgPSBwcmV2Q29udGV4dDtcbiAgICAgIG1hdGNoRm4gPSBwcmV2TWF0Y2hGbjtcbiAgICAgIGFyZ3NCdWlsZGVyID0gcHJldkFyZ3NCdWlsZGVyO1xuICAgICAgYXR0cnNCdWlsZGVyID0gcHJldkF0dHJzQnVpbGRlcjtcbiAgICAgIGN1cnJlbnROb2RlID0gcHJldkN1cnJlbnROb2RlO1xuICAgICAgY3VycmVudFBhcmVudCA9IHByZXZDdXJyZW50UGFyZW50O1xuICAgICAgZm9jdXNQYXRoID0gcHJldkZvY3VzUGF0aDtcblxuICAgICAgLy8gTmVlZHMgdG8gYmUgZG9uZSBhZnRlciBhc3NlcnRpb25zIGJlY2F1c2UgYXNzZXJ0aW9ucyByZWx5IG9uIHN0YXRlXG4gICAgICAvLyBmcm9tIHRoZXNlIG1ldGhvZHMuXG4gICAgICBpZiAoREVCVUcpIHtcbiAgICAgICAgc2V0SW5BdHRyaWJ1dGVzKHByZXZpb3VzSW5BdHRyaWJ1dGVzKTtcbiAgICAgICAgc2V0SW5Ta2lwKHByZXZpb3VzSW5Ta2lwKTtcbiAgICAgICAgdXBkYXRlUGF0Y2hDb250ZXh0KGNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGY7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHBhdGNoZXIgdGhhdCBwYXRjaGVzIHRoZSBkb2N1bWVudCBzdGFydGluZyBhdCBub2RlIHdpdGggYVxuICogcHJvdmlkZWQgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBkdXJpbmcgYW4gZXhpc3RpbmcgcGF0Y2ggb3BlcmF0aW9uLlxuICogQHBhcmFtIHBhdGNoQ29uZmlnIFRoZSBjb25maWcgdG8gdXNlIGZvciB0aGUgcGF0Y2guXG4gKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBmdW5jdGlvbiBmb3IgcGF0Y2hpbmcgYW4gRWxlbWVudCdzIGNoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBjcmVhdGVQYXRjaElubmVyPFQ+KFxuICBwYXRjaENvbmZpZz86IFBhdGNoQ29uZmlnXG4pOiBQYXRjaEZ1bmN0aW9uPFQsIE5vZGU+IHtcbiAgcmV0dXJuIGNyZWF0ZVBhdGNoZXIoKG5vZGUsIGZuLCBkYXRhKSA9PiB7XG4gICAgY3VycmVudE5vZGUgPSBub2RlO1xuXG4gICAgZW50ZXJOb2RlKCk7XG4gICAgZm4oZGF0YSk7XG4gICAgZXhpdE5vZGUoKTtcblxuICAgIGlmIChERUJVRykge1xuICAgICAgYXNzZXJ0Tm9VbmNsb3NlZFRhZ3MoY3VycmVudE5vZGUsIG5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9LCBwYXRjaENvbmZpZyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHBhdGNoZXIgdGhhdCBwYXRjaGVzIGFuIEVsZW1lbnQgd2l0aCB0aGUgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLlxuICogRXhhY3RseSBvbmUgdG9wIGxldmVsIGVsZW1lbnQgY2FsbCBzaG91bGQgYmUgbWFkZSBjb3JyZXNwb25kaW5nIHRvIGBub2RlYC5cbiAqIEBwYXJhbSBwYXRjaENvbmZpZyBUaGUgY29uZmlnIHRvIHVzZSBmb3IgdGhlIHBhdGNoLlxuICogQHJldHVybnMgVGhlIGNyZWF0ZWQgZnVuY3Rpb24gZm9yIHBhdGNoaW5nIGFuIEVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBhdGNoT3V0ZXI8VD4oXG4gIHBhdGNoQ29uZmlnPzogUGF0Y2hDb25maWdcbik6IFBhdGNoRnVuY3Rpb248VCwgTm9kZSB8IG51bGw+IHtcbiAgcmV0dXJuIGNyZWF0ZVBhdGNoZXIoKG5vZGUsIGZuLCBkYXRhKSA9PiB7XG4gICAgY29uc3Qgc3RhcnROb2RlID0gKHsgbmV4dFNpYmxpbmc6IG5vZGUgfSBhcyBhbnkpIGFzIEVsZW1lbnQ7XG4gICAgbGV0IGV4cGVjdGVkTmV4dE5vZGU6IE5vZGUgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgZXhwZWN0ZWRQcmV2Tm9kZTogTm9kZSB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYgKERFQlVHKSB7XG4gICAgICBleHBlY3RlZE5leHROb2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgIGV4cGVjdGVkUHJldk5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgICB9XG5cbiAgICBjdXJyZW50Tm9kZSA9IHN0YXJ0Tm9kZTtcbiAgICBmbihkYXRhKTtcblxuICAgIGlmIChERUJVRykge1xuICAgICAgaWYgKGdldERhdGEobm9kZSkua2V5KSB7XG4gICAgICAgIGFzc2VydFBhdGNoT3V0ZXJIYXNQYXJlbnROb2RlKGN1cnJlbnRQYXJlbnQpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0UGF0Y2hFbGVtZW50Tm9FeHRyYXMoXG4gICAgICAgIHN0YXJ0Tm9kZSxcbiAgICAgICAgY3VycmVudE5vZGUsXG4gICAgICAgIGV4cGVjdGVkTmV4dE5vZGUsXG4gICAgICAgIGV4cGVjdGVkUHJldk5vZGVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRQYXJlbnQpIHtcbiAgICAgIGNsZWFyVW52aXNpdGVkRE9NKGN1cnJlbnRQYXJlbnQsIGdldE5leHROb2RlKCksIG5vZGUubmV4dFNpYmxpbmcpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFydE5vZGUgPT09IGN1cnJlbnROb2RlID8gbnVsbCA6IGN1cnJlbnROb2RlO1xuICB9LCBwYXRjaENvbmZpZyk7XG59XG5cbmNvbnN0IHBhdGNoSW5uZXI6IDxUPihcbiAgbm9kZTogRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQsXG4gIHRlbXBsYXRlOiAoYTogVCB8IHVuZGVmaW5lZCkgPT4gdm9pZCxcbiAgZGF0YT86IFQgfCB1bmRlZmluZWRcbikgPT4gTm9kZSA9IGNyZWF0ZVBhdGNoSW5uZXIoKTtcbmNvbnN0IHBhdGNoT3V0ZXI6IDxUPihcbiAgbm9kZTogRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQsXG4gIHRlbXBsYXRlOiAoYTogVCB8IHVuZGVmaW5lZCkgPT4gdm9pZCxcbiAgZGF0YT86IFQgfCB1bmRlZmluZWRcbikgPT4gTm9kZSB8IG51bGwgPSBjcmVhdGVQYXRjaE91dGVyKCk7XG5cbmV4cG9ydCB7XG4gIGFsaWduV2l0aERPTSxcbiAgYWx3YXlzRGlmZkF0dHJpYnV0ZXMsXG4gIGdldEFyZ3NCdWlsZGVyLFxuICBnZXRBdHRyc0J1aWxkZXIsXG4gIHRleHQsXG4gIGNyZWF0ZVBhdGNoSW5uZXIsXG4gIGNyZWF0ZVBhdGNoT3V0ZXIsXG4gIHBhdGNoSW5uZXIsXG4gIHBhdGNoT3V0ZXIsXG4gIG9wZW4sXG4gIGNsb3NlLFxuICBjdXJyZW50RWxlbWVudCxcbiAgY3VycmVudENvbnRleHQsXG4gIGN1cnJlbnRQb2ludGVyLFxuICBza2lwLFxuICBuZXh0Tm9kZSBhcyBza2lwTm9kZSxcbiAgdHJ5R2V0Q3VycmVudEVsZW1lbnRcbn07XG4iXX0= \ No newline at end of file diff --git a/closure/src/debug.d.ts b/closure/src/debug.d.ts new file mode 100755 index 00000000..5902e6db --- /dev/null +++ b/closure/src/debug.d.ts @@ -0,0 +1,2 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +export declare const DEBUG = true; diff --git a/closure/src/debug.js b/closure/src/debug.js new file mode 100755 index 00000000..7da605d3 --- /dev/null +++ b/closure/src/debug.js @@ -0,0 +1,13 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/debug.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +goog.module('incrementaldom.src.debug'); +var module = module || { id: 'src/debug.js' }; +goog.require('tslib'); +/** @type {boolean} */ +exports.DEBUG = true; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGVidWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFHYSxRQUFBLEtBQUssR0FBRyxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiLy8gIENvcHlyaWdodCAyMDE4IFRoZSBJbmNyZW1lbnRhbCBET00gQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKiBAbGljZW5zZSBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCAqL1xuXG5leHBvcnQgY29uc3QgREVCVUcgPSB0cnVlO1xuIl19 \ No newline at end of file diff --git a/closure/src/diff.d.ts b/closure/src/diff.d.ts new file mode 100755 index 00000000..3fb00309 --- /dev/null +++ b/closure/src/diff.d.ts @@ -0,0 +1,16 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +import { AttrMutatorConfig } from "./types"; +/** + * Calculates the diff between previous and next values, calling the update + * function when an item has changed value. If an item from the previous values + * is not present in the the next values, the update function is called with a + * value of `undefined`. + * @param prev The previous values, alternating name, value pairs. + * @param next The next values, alternating name, value pairs. + * @param updateCtx The context for the updateFn. + * @param updateFn A function to call when a value has changed. + * @param attrs Attribute map for mutators + * @param alwaysDiffAttributes Whether to diff attributes unconditionally + */ +declare function calculateDiff(prev: Array, next: Array, updateCtx: T, updateFn: (ctx: T, x: string, y: {} | undefined, attrs: AttrMutatorConfig) => void, attrs: AttrMutatorConfig, alwaysDiffAttributes?: boolean): void; +export { calculateDiff }; diff --git a/closure/src/diff.js b/closure/src/diff.js new file mode 100755 index 00000000..11e55854 --- /dev/null +++ b/closure/src/diff.js @@ -0,0 +1,86 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/diff.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +goog.module('incrementaldom.src.diff'); +var module = module || { id: 'src/diff.js' }; +goog.require('tslib'); +const tsickle_types_1 = goog.requireType("incrementaldom.src.types"); +const tsickle_util_2 = goog.requireType("incrementaldom.src.util"); +const tsickle_changes_3 = goog.requireType("incrementaldom.src.changes"); +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +var util_1 = goog.require('incrementaldom.src.util'); +var changes_1 = goog.require('incrementaldom.src.changes'); +/** + * Used to keep track of the previous values when a 2-way diff is necessary. + * This object is cleared out and reused. + * @type {?} + */ +const prevValuesMap = util_1.createMap(); +/** + * Calculates the diff between previous and next values, calling the update + * function when an item has changed value. If an item from the previous values + * is not present in the the next values, the update function is called with a + * value of `undefined`. + * @template T + * @param {!Array} prev The previous values, alternating name, value pairs. + * @param {!Array} next The next values, alternating name, value pairs. + * @param {T} updateCtx The context for the updateFn. + * @param {function(T, string, (undefined|*), !tsickle_types_1.AttrMutatorConfig): void} updateFn A function to call when a value has changed. + * @param {!tsickle_types_1.AttrMutatorConfig} attrs Attribute map for mutators + * @param {boolean=} alwaysDiffAttributes Whether to diff attributes unconditionally + * @return {void} + */ +function calculateDiff(prev, next, updateCtx, updateFn, attrs, alwaysDiffAttributes = false) { + /** @type {boolean} */ + const isNew = !prev.length || alwaysDiffAttributes; + /** @type {number} */ + let i = 0; + for (; i < next.length; i += 2) { + /** @type {string} */ + const name = next[i]; + if (isNew) { + prev[i] = name; + } + else if (prev[i] !== name) { + break; + } + /** @type {string} */ + const value = next[i + 1]; + if (isNew || prev[i + 1] !== value) { + prev[i + 1] = value; + changes_1.queueChange(updateFn, updateCtx, name, value, attrs); + } + } + // Items did not line up exactly as before, need to make sure old items are + // removed. This should be a rare case. + if (i < next.length || i < prev.length) { + /** @type {number} */ + const startIndex = i; + for (i = startIndex; i < prev.length; i += 2) { + prevValuesMap[prev[i]] = prev[i + 1]; + } + for (i = startIndex; i < next.length; i += 2) { + /** @type {string} */ + const name = (/** @type {string} */ (next[i])); + /** @type {string} */ + const value = next[i + 1]; + if (prevValuesMap[name] !== value) { + changes_1.queueChange(updateFn, updateCtx, name, value, attrs); + } + prev[i] = name; + prev[i + 1] = value; + delete prevValuesMap[name]; + } + util_1.truncateArray(prev, next.length); + for (const name in prevValuesMap) { + changes_1.queueChange(updateFn, updateCtx, name, undefined, attrs); + delete prevValuesMap[name]; + } + } + changes_1.flush(); +} +exports.calculateDiff = calculateDiff; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kaWZmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFJQSxzREFBa0Q7QUFDbEQsNERBQStDOzs7Ozs7TUFNekMsYUFBYSxHQUFHLGdCQUFTLEVBQUU7Ozs7Ozs7Ozs7Ozs7OztBQWNqQyxTQUFTLGFBQWEsQ0FDcEIsSUFBbUIsRUFDbkIsSUFBbUIsRUFDbkIsU0FBWSxFQUNaLFFBS1MsRUFDVCxLQUF3QixFQUN4Qix1QkFBZ0MsS0FBSzs7VUFFL0IsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxvQkFBb0I7O1FBQzlDLENBQUMsR0FBRyxDQUFDO0lBRVQsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFOztjQUN4QixJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDaEI7YUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDM0IsTUFBTTtTQUNQOztjQUVLLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRTtZQUNsQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNwQixxQkFBVyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN0RDtLQUNGO0lBRUQsMkVBQTJFO0lBQzNFLHVDQUF1QztJQUN2QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFOztjQUNoQyxVQUFVLEdBQUcsQ0FBQztRQUVwQixLQUFLLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1QyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN0QztRQUVELEtBQUssQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFOztrQkFDdEMsSUFBSSxHQUFHLHdCQUFBLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBVTs7a0JBQ3hCLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV6QixJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUU7Z0JBQ2pDLHFCQUFXLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ3REO1lBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUNmLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBRXBCLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVCO1FBRUQsb0JBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWpDLEtBQUssTUFBTSxJQUFJLElBQUksYUFBYSxFQUFFO1lBQ2hDLHFCQUFXLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3pELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVCO0tBQ0Y7SUFFRCxlQUFLLEVBQUUsQ0FBQztBQUNWLENBQUM7QUFFUSxzQ0FBYSIsInNvdXJjZXNDb250ZW50IjpbIi8vICBDb3B5cmlnaHQgMjAxOCBUaGUgSW5jcmVtZW50YWwgRE9NIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKiogQGxpY2Vuc2UgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgKi9cblxuaW1wb3J0IHsgQXR0ck11dGF0b3JDb25maWcgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlTWFwLCB0cnVuY2F0ZUFycmF5IH0gZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IHsgZmx1c2gsIHF1ZXVlQ2hhbmdlIH0gZnJvbSBcIi4vY2hhbmdlc1wiO1xuXG4vKipcbiAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgcHJldmlvdXMgdmFsdWVzIHdoZW4gYSAyLXdheSBkaWZmIGlzIG5lY2Vzc2FyeS5cbiAqIFRoaXMgb2JqZWN0IGlzIGNsZWFyZWQgb3V0IGFuZCByZXVzZWQuXG4gKi9cbmNvbnN0IHByZXZWYWx1ZXNNYXAgPSBjcmVhdGVNYXAoKTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkaWZmIGJldHdlZW4gcHJldmlvdXMgYW5kIG5leHQgdmFsdWVzLCBjYWxsaW5nIHRoZSB1cGRhdGVcbiAqIGZ1bmN0aW9uIHdoZW4gYW4gaXRlbSBoYXMgY2hhbmdlZCB2YWx1ZS4gSWYgYW4gaXRlbSBmcm9tIHRoZSBwcmV2aW91cyB2YWx1ZXNcbiAqIGlzIG5vdCBwcmVzZW50IGluIHRoZSB0aGUgbmV4dCB2YWx1ZXMsIHRoZSB1cGRhdGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYVxuICogdmFsdWUgb2YgYHVuZGVmaW5lZGAuXG4gKiBAcGFyYW0gcHJldiBUaGUgcHJldmlvdXMgdmFsdWVzLCBhbHRlcm5hdGluZyBuYW1lLCB2YWx1ZSBwYWlycy5cbiAqIEBwYXJhbSBuZXh0IFRoZSBuZXh0IHZhbHVlcywgYWx0ZXJuYXRpbmcgbmFtZSwgdmFsdWUgcGFpcnMuXG4gKiBAcGFyYW0gdXBkYXRlQ3R4IFRoZSBjb250ZXh0IGZvciB0aGUgdXBkYXRlRm4uXG4gKiBAcGFyYW0gdXBkYXRlRm4gQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYSB2YWx1ZSBoYXMgY2hhbmdlZC5cbiAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGUgbWFwIGZvciBtdXRhdG9yc1xuICogQHBhcmFtIGFsd2F5c0RpZmZBdHRyaWJ1dGVzIFdoZXRoZXIgdG8gZGlmZiBhdHRyaWJ1dGVzIHVuY29uZGl0aW9uYWxseVxuICovXG5mdW5jdGlvbiBjYWxjdWxhdGVEaWZmPFQ+KFxuICBwcmV2OiBBcnJheTxzdHJpbmc+LFxuICBuZXh0OiBBcnJheTxzdHJpbmc+LFxuICB1cGRhdGVDdHg6IFQsXG4gIHVwZGF0ZUZuOiAoXG4gICAgY3R4OiBULFxuICAgIHg6IHN0cmluZyxcbiAgICB5OiB7fSB8IHVuZGVmaW5lZCxcbiAgICBhdHRyczogQXR0ck11dGF0b3JDb25maWdcbiAgKSA9PiB2b2lkLFxuICBhdHRyczogQXR0ck11dGF0b3JDb25maWcsXG4gIGFsd2F5c0RpZmZBdHRyaWJ1dGVzOiBib29sZWFuID0gZmFsc2Vcbikge1xuICBjb25zdCBpc05ldyA9ICFwcmV2Lmxlbmd0aCB8fCBhbHdheXNEaWZmQXR0cmlidXRlcztcbiAgbGV0IGkgPSAwO1xuXG4gIGZvciAoOyBpIDwgbmV4dC5sZW5ndGg7IGkgKz0gMikge1xuICAgIGNvbnN0IG5hbWUgPSBuZXh0W2ldO1xuICAgIGlmIChpc05ldykge1xuICAgICAgcHJldltpXSA9IG5hbWU7XG4gICAgfSBlbHNlIGlmIChwcmV2W2ldICE9PSBuYW1lKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG5leHRbaSArIDFdO1xuICAgIGlmIChpc05ldyB8fCBwcmV2W2kgKyAxXSAhPT0gdmFsdWUpIHtcbiAgICAgIHByZXZbaSArIDFdID0gdmFsdWU7XG4gICAgICBxdWV1ZUNoYW5nZSh1cGRhdGVGbiwgdXBkYXRlQ3R4LCBuYW1lLCB2YWx1ZSwgYXR0cnMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEl0ZW1zIGRpZCBub3QgbGluZSB1cCBleGFjdGx5IGFzIGJlZm9yZSwgbmVlZCB0byBtYWtlIHN1cmUgb2xkIGl0ZW1zIGFyZVxuICAvLyByZW1vdmVkLiBUaGlzIHNob3VsZCBiZSBhIHJhcmUgY2FzZS5cbiAgaWYgKGkgPCBuZXh0Lmxlbmd0aCB8fCBpIDwgcHJldi5sZW5ndGgpIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gaTtcblxuICAgIGZvciAoaSA9IHN0YXJ0SW5kZXg7IGkgPCBwcmV2Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBwcmV2VmFsdWVzTWFwW3ByZXZbaV1dID0gcHJldltpICsgMV07XG4gICAgfVxuXG4gICAgZm9yIChpID0gc3RhcnRJbmRleDsgaSA8IG5leHQubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBuZXh0W2ldIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IHZhbHVlID0gbmV4dFtpICsgMV07XG5cbiAgICAgIGlmIChwcmV2VmFsdWVzTWFwW25hbWVdICE9PSB2YWx1ZSkge1xuICAgICAgICBxdWV1ZUNoYW5nZSh1cGRhdGVGbiwgdXBkYXRlQ3R4LCBuYW1lLCB2YWx1ZSwgYXR0cnMpO1xuICAgICAgfVxuXG4gICAgICBwcmV2W2ldID0gbmFtZTtcbiAgICAgIHByZXZbaSArIDFdID0gdmFsdWU7XG5cbiAgICAgIGRlbGV0ZSBwcmV2VmFsdWVzTWFwW25hbWVdO1xuICAgIH1cblxuICAgIHRydW5jYXRlQXJyYXkocHJldiwgbmV4dC5sZW5ndGgpO1xuXG4gICAgZm9yIChjb25zdCBuYW1lIGluIHByZXZWYWx1ZXNNYXApIHtcbiAgICAgIHF1ZXVlQ2hhbmdlKHVwZGF0ZUZuLCB1cGRhdGVDdHgsIG5hbWUsIHVuZGVmaW5lZCwgYXR0cnMpO1xuICAgICAgZGVsZXRlIHByZXZWYWx1ZXNNYXBbbmFtZV07XG4gICAgfVxuICB9XG5cbiAgZmx1c2goKTtcbn1cblxuZXhwb3J0IHsgY2FsY3VsYXRlRGlmZiB9O1xuIl19 \ No newline at end of file diff --git a/closure/src/dom_util.d.ts b/closure/src/dom_util.d.ts new file mode 100755 index 00000000..daa381c3 --- /dev/null +++ b/closure/src/dom_util.d.ts @@ -0,0 +1,30 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +/** + * Checks if the node is an Element. This is faster than an instanceof check. + * @param node The node to check. + * @return Whether or not the node is an Element. + */ +declare function isElement(node: Node): node is Element; +/** + * Checks if the node is a text node. This is faster than an instanceof check. + * @param node The node to check. + * @return Whether or not the node is a Text. + */ +declare function isText(node: Node): node is Text; +/** + * Gets the path of nodes that contain the focused node in the same document as + * a reference node, up until the root. + * @param node The reference node to get the activeElement for. + * @param root The root to get the focused path until. + * @returns The path of focused parents, if any exist. + */ +declare function getFocusedPath(node: Node, root: Node | null): Array; +/** + * Like insertBefore, but instead of moving the desired node, it moves all the + * other nodes after. + * @param parentNode + * @param node + * @param referenceNode + */ +declare function moveBefore(parentNode: Node, node: Node, referenceNode: Node | null): void; +export { isElement, isText, getFocusedPath, moveBefore }; diff --git a/closure/src/dom_util.js b/closure/src/dom_util.js new file mode 100755 index 00000000..2427c58c --- /dev/null +++ b/closure/src/dom_util.js @@ -0,0 +1,127 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/dom_util.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +goog.module('incrementaldom.src.dom_util'); +var module = module || { id: 'src/dom_util.js' }; +goog.require('tslib'); +const tsickle_assertions_1 = goog.requireType("incrementaldom.src.assertions"); +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +var assertions_1 = goog.require('incrementaldom.src.assertions'); +/** + * Checks if the node is the root of a document. This is either a Document + * or ShadowRoot. DocumentFragments are included for simplicity of the + * implementation, though we only want to consider Documents or ShadowRoots. + * @param {!Node} node The node to check. + * @return {boolean} True if the node the root of a document, false otherwise. + */ +function isDocumentRoot(node) { + return node.nodeType === 11 || node.nodeType === 9; +} +/** + * Checks if the node is an Element. This is faster than an instanceof check. + * @param {!Node} node The node to check. + * @return {boolean} Whether or not the node is an Element. + */ +function isElement(node) { + return node.nodeType === 1; +} +exports.isElement = isElement; +/** + * Checks if the node is a text node. This is faster than an instanceof check. + * @param {!Node} node The node to check. + * @return {boolean} Whether or not the node is a Text. + */ +function isText(node) { + return node.nodeType === 3; +} +exports.isText = isText; +/** + * @param {!Node} node The node to start at, inclusive. + * @param {(null|!Node)} root The root ancestor to get until, exclusive. + * @return {!Array} The ancestry of DOM nodes. + */ +function getAncestry(node, root) { + /** @type {!Array} */ + const ancestry = []; + /** @type {(null|!Node)} */ + let cur = node; + while (cur !== root) { + /** @type {!Node} */ + const n = assertions_1.assert(cur); + ancestry.push(n); + cur = n.parentNode; + } + return ancestry; +} +/** + * \@param this + * \@return The root node of the DOM tree that contains this node. + * @type {?} + */ +const getRootNode = (typeof Node !== "undefined" && ((/** @type {?} */ (Node))).prototype.getRootNode) || + (/** + * @this {!Node} + * @return {!Node} + */ + function () { + /** @type {(null|!Node)} */ + let cur = (/** @type {!Node} */ (this)); + /** @type {!Node} */ + let prev = cur; + while (cur) { + prev = cur; + cur = cur.parentNode; + } + return prev; + }); +/** + * @param {!Node} node The node to get the activeElement for. + * @return {(null|!Element)} The activeElement in the Document or ShadowRoot + * corresponding to node, if present. + */ +function getActiveElement(node) { + /** @type {?} */ + const root = getRootNode.call(node); + return isDocumentRoot(root) ? root.activeElement : null; +} +/** + * Gets the path of nodes that contain the focused node in the same document as + * a reference node, up until the root. + * @param {!Node} node The reference node to get the activeElement for. + * @param {(null|!Node)} root The root to get the focused path until. + * @return {!Array} The path of focused parents, if any exist. + */ +function getFocusedPath(node, root) { + /** @type {(null|!Element)} */ + const activeElement = getActiveElement(node); + if (!activeElement || !node.contains(activeElement)) { + return []; + } + return getAncestry(activeElement, root); +} +exports.getFocusedPath = getFocusedPath; +/** + * Like insertBefore, but instead of moving the desired node, it moves all the + * other nodes after. + * @param {!Node} parentNode + * @param {!Node} node + * @param {(null|!Node)} referenceNode + * @return {void} + */ +function moveBefore(parentNode, node, referenceNode) { + /** @type {(null|!ChildNode)} */ + const insertReferenceNode = node.nextSibling; + /** @type {(null|!Node)} */ + let cur = referenceNode; + while (cur !== null && cur !== node) { + /** @type {(null|!ChildNode)} */ + const next = cur.nextSibling; + parentNode.insertBefore(cur, insertReferenceNode); + cur = next; + } +} +exports.moveBefore = moveBefore; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZG9tX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFHQSxrRUFBc0M7Ozs7Ozs7O0FBU3RDLFNBQVMsY0FBYyxDQUFDLElBQVU7SUFDaEMsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQztBQUNyRCxDQUFDOzs7Ozs7QUFPRCxTQUFTLFNBQVMsQ0FBQyxJQUFVO0lBQzNCLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQTRGUSw4QkFBUzs7Ozs7O0FBckZsQixTQUFTLE1BQU0sQ0FBQyxJQUFVO0lBQ3hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQW1GbUIsd0JBQU07Ozs7OztBQTVFMUIsU0FBUyxXQUFXLENBQUMsSUFBVSxFQUFFLElBQWlCOztVQUMxQyxRQUFRLEdBQWdCLEVBQUU7O1FBQzVCLEdBQUcsR0FBZ0IsSUFBSTtJQUUzQixPQUFPLEdBQUcsS0FBSyxJQUFJLEVBQUU7O2NBQ2IsQ0FBQyxHQUFTLG1CQUFNLENBQUMsR0FBRyxDQUFDO1FBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsR0FBRyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUM7S0FDcEI7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDOzs7Ozs7TUFNSyxXQUFXLEdBQ2YsQ0FBQyxPQUFPLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyxtQkFBQSxJQUFJLEVBQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7Ozs7O0lBQ3BFOztZQUNNLEdBQUcsR0FBZ0IsdUJBQUEsSUFBSSxFQUFROztZQUMvQixJQUFJLEdBQUcsR0FBRztRQUVkLE9BQU8sR0FBRyxFQUFFO1lBQ1YsSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUNYLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO1NBQ3RCO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUE7Ozs7OztBQU9ILFNBQVMsZ0JBQWdCLENBQUMsSUFBVTs7VUFDNUIsSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25DLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDMUQsQ0FBQzs7Ozs7Ozs7QUFTRCxTQUFTLGNBQWMsQ0FBQyxJQUFVLEVBQUUsSUFBaUI7O1VBQzdDLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7SUFFNUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDbkQsT0FBTyxFQUFFLENBQUM7S0FDWDtJQUVELE9BQU8sV0FBVyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBb0IyQix3Q0FBYzs7Ozs7Ozs7O0FBWDFDLFNBQVMsVUFBVSxDQUFDLFVBQWdCLEVBQUUsSUFBVSxFQUFFLGFBQTBCOztVQUNwRSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsV0FBVzs7UUFDeEMsR0FBRyxHQUFHLGFBQWE7SUFFdkIsT0FBTyxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7O2NBQzdCLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVztRQUM1QixVQUFVLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2xELEdBQUcsR0FBRyxJQUFJLENBQUM7S0FDWjtBQUNILENBQUM7QUFFMkMsZ0NBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyAgQ29weXJpZ2h0IDIwMTggVGhlIEluY3JlbWVudGFsIERPTSBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqIEBsaWNlbnNlIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wICovXG5cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCIuL2Fzc2VydGlvbnNcIjtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIG5vZGUgaXMgdGhlIHJvb3Qgb2YgYSBkb2N1bWVudC4gVGhpcyBpcyBlaXRoZXIgYSBEb2N1bWVudFxuICogb3IgU2hhZG93Um9vdC4gRG9jdW1lbnRGcmFnbWVudHMgYXJlIGluY2x1ZGVkIGZvciBzaW1wbGljaXR5IG9mIHRoZVxuICogaW1wbGVtZW50YXRpb24sIHRob3VnaCB3ZSBvbmx5IHdhbnQgdG8gY29uc2lkZXIgRG9jdW1lbnRzIG9yIFNoYWRvd1Jvb3RzLlxuICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5vZGUgdGhlIHJvb3Qgb2YgYSBkb2N1bWVudCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBpc0RvY3VtZW50Um9vdChub2RlOiBOb2RlKTogbm9kZSBpcyBEb2N1bWVudCB8IFNoYWRvd1Jvb3Qge1xuICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMTEgfHwgbm9kZS5ub2RlVHlwZSA9PT0gOTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIG5vZGUgaXMgYW4gRWxlbWVudC4gVGhpcyBpcyBmYXN0ZXIgdGhhbiBhbiBpbnN0YW5jZW9mIGNoZWNrLlxuICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBub2RlIGlzIGFuIEVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlOiBOb2RlKTogbm9kZSBpcyBFbGVtZW50IHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDE7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBub2RlIGlzIGEgdGV4dCBub2RlLiBUaGlzIGlzIGZhc3RlciB0aGFuIGFuIGluc3RhbmNlb2YgY2hlY2suXG4gKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm4gV2hldGhlciBvciBub3QgdGhlIG5vZGUgaXMgYSBUZXh0LlxuICovXG5mdW5jdGlvbiBpc1RleHQobm9kZTogTm9kZSk6IG5vZGUgaXMgVGV4dCB7XG4gIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAzO1xufVxuXG4vKipcbiAqIEBwYXJhbSAgbm9kZSBUaGUgbm9kZSB0byBzdGFydCBhdCwgaW5jbHVzaXZlLlxuICogQHBhcmFtICByb290IFRoZSByb290IGFuY2VzdG9yIHRvIGdldCB1bnRpbCwgZXhjbHVzaXZlLlxuICogQHJldHVybiBUaGUgYW5jZXN0cnkgb2YgRE9NIG5vZGVzLlxuICovXG5mdW5jdGlvbiBnZXRBbmNlc3RyeShub2RlOiBOb2RlLCByb290OiBOb2RlIHwgbnVsbCkge1xuICBjb25zdCBhbmNlc3RyeTogQXJyYXk8Tm9kZT4gPSBbXTtcbiAgbGV0IGN1cjogTm9kZSB8IG51bGwgPSBub2RlO1xuXG4gIHdoaWxlIChjdXIgIT09IHJvb3QpIHtcbiAgICBjb25zdCBuOiBOb2RlID0gYXNzZXJ0KGN1cik7XG4gICAgYW5jZXN0cnkucHVzaChuKTtcbiAgICBjdXIgPSBuLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gYW5jZXN0cnk7XG59XG5cbi8qKlxuICogQHBhcmFtIHRoaXNcbiAqIEByZXR1cm5zIFRoZSByb290IG5vZGUgb2YgdGhlIERPTSB0cmVlIHRoYXQgY29udGFpbnMgdGhpcyBub2RlLlxuICovXG5jb25zdCBnZXRSb290Tm9kZSA9XG4gICh0eXBlb2YgTm9kZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiAoTm9kZSBhcyBhbnkpLnByb3RvdHlwZS5nZXRSb290Tm9kZSkgfHxcbiAgZnVuY3Rpb24odGhpczogTm9kZSkge1xuICAgIGxldCBjdXI6IE5vZGUgfCBudWxsID0gdGhpcyBhcyBOb2RlO1xuICAgIGxldCBwcmV2ID0gY3VyO1xuXG4gICAgd2hpbGUgKGN1cikge1xuICAgICAgcHJldiA9IGN1cjtcbiAgICAgIGN1ciA9IGN1ci5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIHJldHVybiBwcmV2O1xuICB9O1xuXG4vKipcbiAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIGdldCB0aGUgYWN0aXZlRWxlbWVudCBmb3IuXG4gKiBAcmV0dXJucyBUaGUgYWN0aXZlRWxlbWVudCBpbiB0aGUgRG9jdW1lbnQgb3IgU2hhZG93Um9vdFxuICogICAgIGNvcnJlc3BvbmRpbmcgdG8gbm9kZSwgaWYgcHJlc2VudC5cbiAqL1xuZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudChub2RlOiBOb2RlKTogRWxlbWVudCB8IG51bGwge1xuICBjb25zdCByb290ID0gZ2V0Um9vdE5vZGUuY2FsbChub2RlKTtcbiAgcmV0dXJuIGlzRG9jdW1lbnRSb290KHJvb3QpID8gcm9vdC5hY3RpdmVFbGVtZW50IDogbnVsbDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBwYXRoIG9mIG5vZGVzIHRoYXQgY29udGFpbiB0aGUgZm9jdXNlZCBub2RlIGluIHRoZSBzYW1lIGRvY3VtZW50IGFzXG4gKiBhIHJlZmVyZW5jZSBub2RlLCB1cCB1bnRpbCB0aGUgcm9vdC5cbiAqIEBwYXJhbSBub2RlIFRoZSByZWZlcmVuY2Ugbm9kZSB0byBnZXQgdGhlIGFjdGl2ZUVsZW1lbnQgZm9yLlxuICogQHBhcmFtIHJvb3QgVGhlIHJvb3QgdG8gZ2V0IHRoZSBmb2N1c2VkIHBhdGggdW50aWwuXG4gKiBAcmV0dXJucyBUaGUgcGF0aCBvZiBmb2N1c2VkIHBhcmVudHMsIGlmIGFueSBleGlzdC5cbiAqL1xuZnVuY3Rpb24gZ2V0Rm9jdXNlZFBhdGgobm9kZTogTm9kZSwgcm9vdDogTm9kZSB8IG51bGwpOiBBcnJheTxOb2RlPiB7XG4gIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KG5vZGUpO1xuXG4gIGlmICghYWN0aXZlRWxlbWVudCB8fCAhbm9kZS5jb250YWlucyhhY3RpdmVFbGVtZW50KSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBnZXRBbmNlc3RyeShhY3RpdmVFbGVtZW50LCByb290KTtcbn1cblxuLyoqXG4gKiBMaWtlIGluc2VydEJlZm9yZSwgYnV0IGluc3RlYWQgb2YgbW92aW5nIHRoZSBkZXNpcmVkIG5vZGUsIGl0IG1vdmVzIGFsbCB0aGVcbiAqIG90aGVyIG5vZGVzIGFmdGVyLlxuICogQHBhcmFtIHBhcmVudE5vZGVcbiAqIEBwYXJhbSBub2RlXG4gKiBAcGFyYW0gcmVmZXJlbmNlTm9kZVxuICovXG5mdW5jdGlvbiBtb3ZlQmVmb3JlKHBhcmVudE5vZGU6IE5vZGUsIG5vZGU6IE5vZGUsIHJlZmVyZW5jZU5vZGU6IE5vZGUgfCBudWxsKSB7XG4gIGNvbnN0IGluc2VydFJlZmVyZW5jZU5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICBsZXQgY3VyID0gcmVmZXJlbmNlTm9kZTtcblxuICB3aGlsZSAoY3VyICE9PSBudWxsICYmIGN1ciAhPT0gbm9kZSkge1xuICAgIGNvbnN0IG5leHQgPSBjdXIubmV4dFNpYmxpbmc7XG4gICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY3VyLCBpbnNlcnRSZWZlcmVuY2VOb2RlKTtcbiAgICBjdXIgPSBuZXh0O1xuICB9XG59XG5cbmV4cG9ydCB7IGlzRWxlbWVudCwgaXNUZXh0LCBnZXRGb2N1c2VkUGF0aCwgbW92ZUJlZm9yZSB9O1xuIl19 \ No newline at end of file diff --git a/closure/src/global.d.ts b/closure/src/global.d.ts new file mode 100755 index 00000000..2183066c --- /dev/null +++ b/closure/src/global.d.ts @@ -0,0 +1,5 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +declare function getKeyAttributeName(): string | null; +declare function setKeyAttributeName(name: string | null): void; +export { DEBUG } from "./debug"; +export { getKeyAttributeName, setKeyAttributeName }; diff --git a/closure/src/global.js b/closure/src/global.js new file mode 100755 index 00000000..2605e411 --- /dev/null +++ b/closure/src/global.js @@ -0,0 +1,37 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/global.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +goog.module('incrementaldom.src.global'); +var module = module || { id: 'src/global.js' }; +goog.require('tslib'); +const tsickle_debug_1 = goog.requireType("incrementaldom.src.debug"); +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +/** + * The name of the HTML attribute that holds the element key + * (e.g. `
`). The attribute value, if it exists, is then used + * as the default key when importing an element. + * If null, no attribute value is used as the default key. + * @type {(null|string)} + */ +let keyAttributeName = "key"; +/** + * @return {(null|string)} + */ +function getKeyAttributeName() { + return keyAttributeName; +} +exports.getKeyAttributeName = getKeyAttributeName; +/** + * @param {(null|string)} name + * @return {void} + */ +function setKeyAttributeName(name) { + keyAttributeName = name; +} +exports.setKeyAttributeName = setKeyAttributeName; +var debug_1 = goog.require('incrementaldom.src.debug'); +exports.DEBUG = debug_1.DEBUG; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2dsb2JhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFTSSxnQkFBZ0IsR0FBa0IsS0FBSzs7OztBQUUzQyxTQUFTLG1CQUFtQjtJQUMxQixPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUM7QUFPUSxrREFBbUI7Ozs7O0FBTDVCLFNBQVMsbUJBQW1CLENBQUMsSUFBbUI7SUFDOUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0FBQzFCLENBQUM7QUFHNkIsa0RBQW1CO0FBRGpELHdEQUFnQztBQUF2Qix3QkFBQSxLQUFLLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyAgQ29weXJpZ2h0IDIwMTggVGhlIEluY3JlbWVudGFsIERPTSBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqIEBsaWNlbnNlIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wICovXG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIEhUTUwgYXR0cmlidXRlIHRoYXQgaG9sZHMgdGhlIGVsZW1lbnQga2V5XG4gKiAoZS5nLiBgPGRpdiBrZXk9XCJmb29cIj5gKS4gVGhlIGF0dHJpYnV0ZSB2YWx1ZSwgaWYgaXQgZXhpc3RzLCBpcyB0aGVuIHVzZWRcbiAqIGFzIHRoZSBkZWZhdWx0IGtleSB3aGVuIGltcG9ydGluZyBhbiBlbGVtZW50LlxuICogSWYgbnVsbCwgbm8gYXR0cmlidXRlIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHQga2V5LlxuICovXG5sZXQga2V5QXR0cmlidXRlTmFtZTogc3RyaW5nIHwgbnVsbCA9IFwia2V5XCI7XG5cbmZ1bmN0aW9uIGdldEtleUF0dHJpYnV0ZU5hbWUoKSB7XG4gIHJldHVybiBrZXlBdHRyaWJ1dGVOYW1lO1xufVxuXG5mdW5jdGlvbiBzZXRLZXlBdHRyaWJ1dGVOYW1lKG5hbWU6IHN0cmluZyB8IG51bGwpIHtcbiAga2V5QXR0cmlidXRlTmFtZSA9IG5hbWU7XG59XG5cbmV4cG9ydCB7IERFQlVHIH0gZnJvbSBcIi4vZGVidWdcIjtcbmV4cG9ydCB7IGdldEtleUF0dHJpYnV0ZU5hbWUsIHNldEtleUF0dHJpYnV0ZU5hbWUgfTtcbiJdfQ== \ No newline at end of file diff --git a/closure/src/node_data.d.ts b/closure/src/node_data.d.ts new file mode 100755 index 00000000..4cf91eb3 --- /dev/null +++ b/closure/src/node_data.d.ts @@ -0,0 +1,80 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +import { Key, NameOrCtorDef } from "./types"; +declare global { + interface Node { + __incrementalDOMData: NodeData | null; + } +} +/** + * Keeps track of information needed to perform diffs for a given DOM node. + */ +export declare class NodeData { + /** + * An array of attribute name/value pairs, used for quickly diffing the + * incomming attributes to see if the DOM node's attributes need to be + * updated. + */ + private _attrsArr; + /** + * Whether or not the statics have been applied for the node yet. + */ + staticsApplied: boolean; + /** + * The key used to identify this node, used to preserve DOM nodes when they + * move within their parent. + */ + readonly key: Key; + /** + * The previous text value, for Text nodes. + */ + text: string | undefined; + /** + * The nodeName or contructor for the Node. + */ + readonly nameOrCtor: NameOrCtorDef; + alwaysDiffAttributes: boolean; + constructor(nameOrCtor: NameOrCtorDef, key: Key, text: string | undefined); + hasEmptyAttrsArr(): boolean; + getAttrsArr(length: number): Array; +} +/** + * Initializes a NodeData object for a Node. + * @param node The Node to initialized data for. + * @param nameOrCtor The NameOrCtorDef to use when diffing. + * @param key The Key for the Node. + * @param text The data of a Text node, if importing a Text node. + * @returns A NodeData object with the existing attributes initialized. + */ +declare function initData(node: Node, nameOrCtor: NameOrCtorDef, key: Key, text?: string | undefined): NodeData; +/** + * @param node The node to check. + * @returns True if the NodeData already exists, false otherwise. + */ +declare function isDataInitialized(node: Node): boolean; +/** + * Imports node and its subtree, initializing caches. + * @param node The Node to import. + */ +declare function importNode(node: Node): void; +/** + * Retrieves the NodeData object for a Node, creating it if necessary. + * @param node The node to get data for. + * @param fallbackKey A key to use if importing and no key was specified. + * Useful when not transmitting keys from serverside render and doing an + * immediate no-op diff. + * @returns The NodeData for the node. + */ +declare function getData(node: Node, fallbackKey?: Key): NodeData; +/** + * Gets the key for a Node. note that the Node should have been imported + * by now. + * @param node The node to check. + * @returns The key used to create the node. + */ +declare function getKey(node: Node): Key; +/** + * Clears all caches from a node and all of its children. + * @param node The Node to clear the cache for. + */ +declare function clearCache(node: Node): void; +export { getData, getKey, initData, importNode, isDataInitialized, clearCache }; diff --git a/closure/src/node_data.js b/closure/src/node_data.js new file mode 100755 index 00000000..74c76ede --- /dev/null +++ b/closure/src/node_data.js @@ -0,0 +1,226 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/node_data.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +goog.module('incrementaldom.src.node_data'); +var module = module || { id: 'src/node_data.js' }; +goog.require('tslib'); +const tsickle_types_1 = goog.requireType("incrementaldom.src.types"); +const tsickle_assertions_2 = goog.requireType("incrementaldom.src.assertions"); +const tsickle_util_3 = goog.requireType("incrementaldom.src.util"); +const tsickle_dom_util_4 = goog.requireType("incrementaldom.src.dom_util"); +const tsickle_global_5 = goog.requireType("incrementaldom.src.global"); +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +var assertions_1 = goog.require('incrementaldom.src.assertions'); +var util_1 = goog.require('incrementaldom.src.util'); +var dom_util_1 = goog.require('incrementaldom.src.dom_util'); +var global_1 = goog.require('incrementaldom.src.global'); +/** + * Keeps track of information needed to perform diffs for a given DOM node. + */ +class NodeData { + /** + * @param {(string|!tsickle_types_1.ElementConstructor)} nameOrCtor + * @param {(undefined|null|string|number)} key + * @param {(undefined|string)} text + */ + constructor(nameOrCtor, key, text) { + /** + * An array of attribute name/value pairs, used for quickly diffing the + * incomming attributes to see if the DOM node's attributes need to be + * updated. + */ + this._attrsArr = null; + /** + * Whether or not the statics have been applied for the node yet. + */ + this.staticsApplied = false; + this.alwaysDiffAttributes = false; + this.nameOrCtor = nameOrCtor; + this.key = key; + this.text = text; + } + /** + * @return {boolean} + */ + hasEmptyAttrsArr() { + /** @type {(null|!Array)} */ + const attrs = this._attrsArr; + return !attrs || !attrs.length; + } + /** + * @param {number} length + * @return {!Array} + */ + getAttrsArr(length) { + return this._attrsArr || (this._attrsArr = util_1.createArray(length)); + } +} +exports.NodeData = NodeData; +/* istanbul ignore if */ +if (false) { + /** + * An array of attribute name/value pairs, used for quickly diffing the + * incomming attributes to see if the DOM node's attributes need to be + * updated. + * @type {(null|!Array)} + * @private + */ + NodeData.prototype._attrsArr; + /** + * Whether or not the statics have been applied for the node yet. + * @type {boolean} + */ + NodeData.prototype.staticsApplied; + /** + * The key used to identify this node, used to preserve DOM nodes when they + * move within their parent. + * @type {(undefined|null|string|number)} + */ + NodeData.prototype.key; + /** + * The previous text value, for Text nodes. + * @type {(undefined|string)} + */ + NodeData.prototype.text; + /** + * The nodeName or contructor for the Node. + * @type {(string|!tsickle_types_1.ElementConstructor)} + */ + NodeData.prototype.nameOrCtor; + /** @type {boolean} */ + NodeData.prototype.alwaysDiffAttributes; +} +/** + * Initializes a NodeData object for a Node. + * @param {!Node} node The Node to initialized data for. + * @param {(string|!tsickle_types_1.ElementConstructor)} nameOrCtor The NameOrCtorDef to use when diffing. + * @param {(undefined|null|string|number)} key The Key for the Node. + * @param {(undefined|string)=} text The data of a Text node, if importing a Text node. + * @return {!NodeData} A NodeData object with the existing attributes initialized. + */ +function initData(node, nameOrCtor, key, text) { + /** @type {!NodeData} */ + const data = new NodeData(nameOrCtor, key, text); + node["__incrementalDOMData"] = data; + return data; +} +exports.initData = initData; +/** + * @param {!Node} node The node to check. + * @return {boolean} True if the NodeData already exists, false otherwise. + */ +function isDataInitialized(node) { + return Boolean(node["__incrementalDOMData"]); +} +exports.isDataInitialized = isDataInitialized; +/** + * Records the element's attributes. + * @param {!Element} node The Element that may have attributes + * @param {!NodeData} data The Element's data + * @return {void} + */ +function recordAttributes(node, data) { + /** @type {!NamedNodeMap} */ + const attributes = node.attributes; + /** @type {number} */ + const length = attributes.length; + if (!length) { + return; + } + /** @type {!Array} */ + const attrsArr = data.getAttrsArr(length); + // Use a cached length. The attributes array is really a live NamedNodeMap, + // which exists as a DOM "Host Object" (probably as C++ code). This makes the + // usual constant length iteration very difficult to optimize in JITs. + for (let i = 0, j = 0; i < length; i += 1, j += 2) { + /** @type {!Attr} */ + const attr = attributes[i]; + /** @type {string} */ + const name = attr.name; + /** @type {string} */ + const value = attr.value; + attrsArr[j] = name; + attrsArr[j + 1] = value; + } +} +/** + * Imports single node and its subtree, initializing caches, if it has not + * already been imported. + * @param {!Node} node The node to import. + * @param {(undefined|null|string|number)=} fallbackKey A key to use if importing and no key was specified. + * Useful when not transmitting keys from serverside render and doing an + * immediate no-op diff. + * @return {!NodeData} The NodeData for the node. + */ +function importSingleNode(node, fallbackKey) { + if (node["__incrementalDOMData"]) { + return node["__incrementalDOMData"]; + } + /** @type {string} */ + const nodeName = dom_util_1.isElement(node) ? node.localName : node.nodeName; + /** @type {(null|string)} */ + const keyAttrName = global_1.getKeyAttributeName(); + /** @type {(null|string)} */ + const keyAttr = dom_util_1.isElement(node) && keyAttrName != null + ? node.getAttribute(keyAttrName) + : null; + /** @type {(undefined|null|string|number)} */ + const key = dom_util_1.isElement(node) ? keyAttr || fallbackKey : null; + /** @type {!NodeData} */ + const data = initData(node, nodeName, key); + if (dom_util_1.isElement(node)) { + recordAttributes(node, data); + } + return data; +} +/** + * Imports node and its subtree, initializing caches. + * @param {!Node} node The Node to import. + * @return {void} + */ +function importNode(node) { + importSingleNode(node); + for (let child = node.firstChild; child; child = child.nextSibling) { + importNode(child); + } +} +exports.importNode = importNode; +/** + * Retrieves the NodeData object for a Node, creating it if necessary. + * @param {!Node} node The node to get data for. + * @param {(undefined|null|string|number)=} fallbackKey A key to use if importing and no key was specified. + * Useful when not transmitting keys from serverside render and doing an + * immediate no-op diff. + * @return {!NodeData} The NodeData for the node. + */ +function getData(node, fallbackKey) { + return importSingleNode(node, fallbackKey); +} +exports.getData = getData; +/** + * Gets the key for a Node. note that the Node should have been imported + * by now. + * @param {!Node} node The node to check. + * @return {(undefined|null|string|number)} The key used to create the node. + */ +function getKey(node) { + assertions_1.assert(node["__incrementalDOMData"]); + return getData(node).key; +} +exports.getKey = getKey; +/** + * Clears all caches from a node and all of its children. + * @param {!Node} node The Node to clear the cache for. + * @return {void} + */ +function clearCache(node) { + node["__incrementalDOMData"] = null; + for (let child = node.firstChild; child; child = child.nextSibling) { + clearCache(child); + } +} +exports.clearCache = clearCache; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZV9kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25vZGVfZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFJQSxrRUFBc0M7QUFDdEMsc0RBQXFDO0FBQ3JDLDhEQUF1QztBQUN2QywwREFBK0M7Ozs7QUFXL0MsTUFBYSxRQUFROzs7Ozs7SUErQm5CLFlBQ0UsVUFBeUIsRUFDekIsR0FBUSxFQUNSLElBQXdCOzs7Ozs7UUE1QmxCLGNBQVMsR0FBc0IsSUFBSSxDQUFDOzs7O1FBS3JDLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBa0J2Qix5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFPbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDOzs7O0lBRU0sZ0JBQWdCOztjQUNmLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUztRQUM1QixPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNqQyxDQUFDOzs7OztJQUVNLFdBQVcsQ0FBQyxNQUFjO1FBQy9CLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsa0JBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7Q0FDRjtBQWpERCw0QkFpREM7Ozs7Ozs7Ozs7SUEzQ0MsNkJBQTRDOzs7OztJQUs1QyxrQ0FBOEI7Ozs7OztJQU05Qix1QkFBeUI7Ozs7O0lBS3pCLHdCQUFnQzs7Ozs7SUFLaEMsOEJBQTBDOztJQUUxQyx3Q0FBb0M7Ozs7Ozs7Ozs7QUE4QnRDLFNBQVMsUUFBUSxDQUNmLElBQVUsRUFDVixVQUF5QixFQUN6QixHQUFRLEVBQ1IsSUFBeUI7O1VBRW5CLElBQUksR0FBRyxJQUFJ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SUFDeEIsbUJBQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUMzQixDQUFDO0FBa0JpQix3QkFBTTs7Ozs7O0FBWnhCLFNBQVMsVUFBVSxDQUFDLElBQVU7SUFDNUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsSUFBSSxDQUFDO0lBRXBDLEtBQ0UsSUFBSSxLQUFLLEdBQWdCLElBQUksQ0FBQyxVQUFVLEVBQ3hDLEtBQUssRUFDTCxLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFDekI7UUFDQSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDbkI7QUFDSCxDQUFDO0FBRWtFLGdDQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLy8gIENvcHlyaWdodCAyMDE4IFRoZSBJbmNyZW1lbnRhbCBET00gQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKiBAbGljZW5zZSBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCAqL1xuXG5pbXBvcnQgeyBLZXksIE5hbWVPckN0b3JEZWYgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcIi4vYXNzZXJ0aW9uc1wiO1xuaW1wb3J0IHsgY3JlYXRlQXJyYXkgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9kb21fdXRpbFwiO1xuaW1wb3J0IHsgZ2V0S2V5QXR0cmlidXRlTmFtZSB9IGZyb20gXCIuL2dsb2JhbFwiO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBOb2RlIHtcbiAgICBfX2luY3JlbWVudGFsRE9NRGF0YTogTm9kZURhdGEgfCBudWxsO1xuICB9XG59XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHBlcmZvcm0gZGlmZnMgZm9yIGEgZ2l2ZW4gRE9NIG5vZGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb2RlRGF0YSB7XG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBhdHRyaWJ1dGUgbmFtZS92YWx1ZSBwYWlycywgdXNlZCBmb3IgcXVpY2tseSBkaWZmaW5nIHRoZVxuICAgKiBpbmNvbW1pbmcgYXR0cmlidXRlcyB0byBzZWUgaWYgdGhlIERPTSBub2RlJ3MgYXR0cmlidXRlcyBuZWVkIHRvIGJlXG4gICAqIHVwZGF0ZWQuXG4gICAqL1xuICBwcml2YXRlIF9hdHRyc0FycjogQXJyYXk8YW55PiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgc3RhdGljcyBoYXZlIGJlZW4gYXBwbGllZCBmb3IgdGhlIG5vZGUgeWV0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpY3NBcHBsaWVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBrZXkgdXNlZCB0byBpZGVudGlmeSB0aGlzIG5vZGUsIHVzZWQgdG8gcHJlc2VydmUgRE9NIG5vZGVzIHdoZW4gdGhleVxuICAgKiBtb3ZlIHdpdGhpbiB0aGVpciBwYXJlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkga2V5OiBLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmV2aW91cyB0ZXh0IHZhbHVlLCBmb3IgVGV4dCBub2Rlcy5cbiAgICovXG4gIHB1YmxpYyB0ZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBub2RlTmFtZSBvciBjb250cnVjdG9yIGZvciB0aGUgTm9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lT3JDdG9yOiBOYW1lT3JDdG9yRGVmO1xuXG4gIHB1YmxpYyBhbHdheXNEaWZmQXR0cmlidXRlcyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBuYW1lT3JDdG9yOiBOYW1lT3JDdG9yRGVmLFxuICAgIGtleTogS2V5LFxuICAgIHRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHtcbiAgICB0aGlzLm5hbWVPckN0b3IgPSBuYW1lT3JDdG9yO1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gIH1cblxuICBwdWJsaWMgaGFzRW1wdHlBdHRyc0FycigpOiBib29sZWFuIHtcbiAgICBjb25zdCBhdHRycyA9IHRoaXMuX2F0dHJzQXJyO1xuICAgIHJldHVybiAhYXR0cnMgfHwgIWF0dHJzLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBdHRyc0FycihsZW5ndGg6IG51bWJlcik6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9hdHRyc0FyciB8fCAodGhpcy5fYXR0cnNBcnIgPSBjcmVhdGVBcnJheShsZW5ndGgpKTtcbiAgfVxufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGEgTm9kZURhdGEgb2JqZWN0IGZvciBhIE5vZGUuXG4gKiBAcGFyYW0gbm9kZSBUaGUgTm9kZSB0byBpbml0aWFsaXplZCBkYXRhIGZvci5cbiAqIEBwYXJhbSBuYW1lT3JDdG9yIFRoZSBOYW1lT3JDdG9yRGVmIHRvIHVzZSB3aGVuIGRpZmZpbmcuXG4gKiBAcGFyYW0ga2V5IFRoZSBLZXkgZm9yIHRoZSBOb2RlLlxuICogQHBhcmFtIHRleHQgVGhlIGRhdGEgb2YgYSBUZXh0IG5vZGUsIGlmIGltcG9ydGluZyBhIFRleHQgbm9kZS5cbiAqIEByZXR1cm5zIEEgTm9kZURhdGEgb2JqZWN0IHdpdGggdGhlIGV4aXN0aW5nIGF0dHJpYnV0ZXMgaW5pdGlhbGl6ZWQuXG4gKi9cbmZ1bmN0aW9uIGluaXREYXRhKFxuICBub2RlOiBOb2RlLFxuICBuYW1lT3JDdG9yOiBOYW1lT3JDdG9yRGVmLFxuICBrZXk6IEtleSxcbiAgdGV4dD86IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogTm9kZURhdGEge1xuICBjb25zdCBkYXRhID0gbmV3IE5vZGVEYXRhKG5hbWVPckN0b3IsIGtleSwgdGV4dCk7XG4gIG5vZGVbXCJfX2luY3JlbWVudGFsRE9NRGF0YVwiXSA9IGRhdGE7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgTm9kZURhdGEgYWxyZWFkeSBleGlzdHMsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gaXNEYXRhSW5pdGlhbGl6ZWQobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbihub2RlW1wiX19pbmNyZW1lbnRhbERPTURhdGFcIl0pO1xufVxuXG4vKipcbiAqIFJlY29yZHMgdGhlIGVsZW1lbnQncyBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIG5vZGUgVGhlIEVsZW1lbnQgdGhhdCBtYXkgaGF2ZSBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0gZGF0YSBUaGUgRWxlbWVudCdzIGRhdGFcbiAqL1xuZnVuY3Rpb24gcmVjb3JkQXR0cmlidXRlcyhub2RlOiBFbGVtZW50LCBkYXRhOiBOb2RlRGF0YSkge1xuICBjb25zdCBhdHRyaWJ1dGVzID0gbm9kZS5hdHRyaWJ1dGVzO1xuICBjb25zdCBsZW5ndGggPSBhdHRyaWJ1dGVzLmxlbmd0aDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhdHRyc0FyciA9IGRhdGEuZ2V0QXR0cnNBcnIobGVuZ3RoKTtcblxuICAvLyBVc2UgYSBjYWNoZWQgbGVuZ3RoLiBUaGUgYXR0cmlidXRlcyBhcnJheSBpcyByZWFsbHkgYSBsaXZlIE5hbWVkTm9kZU1hcCxcbiAgLy8gd2hpY2ggZXhpc3RzIGFzIGEgRE9NIFwiSG9zdCBPYmplY3RcIiAocHJvYmFibHkgYXMgQysrIGNvZGUpLiBUaGlzIG1ha2VzIHRoZVxuICAvLyB1c3VhbCBjb25zdGFudCBsZW5ndGggaXRlcmF0aW9uIHZlcnkgZGlmZmljdWx0IHRvIG9wdGltaXplIGluIEpJVHMuXG4gIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxLCBqICs9IDIpIHtcbiAgICBjb25zdCBhdHRyID0gYXR0cmlidXRlc1tpXTtcbiAgICBjb25zdCBuYW1lID0gYXR0ci5uYW1lO1xuICAgIGNvbnN0IHZhbHVlID0gYXR0ci52YWx1ZTtcblxuICAgIGF0dHJzQXJyW2pdID0gbmFtZTtcbiAgICBhdHRyc0FycltqICsgMV0gPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEltcG9ydHMgc2luZ2xlIG5vZGUgYW5kIGl0cyBzdWJ0cmVlLCBpbml0aWFsaXppbmcgY2FjaGVzLCBpZiBpdCBoYXMgbm90XG4gKiBhbHJlYWR5IGJlZW4gaW1wb3J0ZWQuXG4gKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBpbXBvcnQuXG4gKiBAcGFyYW0gZmFsbGJhY2tLZXkgQSBrZXkgdG8gdXNlIGlmIGltcG9ydGluZyBhbmQgbm8ga2V5IHdhcyBzcGVjaWZpZWQuXG4gKiAgICBVc2VmdWwgd2hlbiBub3QgdHJhbnNtaXR0aW5nIGtleXMgZnJvbSBzZXJ2ZXJzaWRlIHJlbmRlciBhbmQgZG9pbmcgYW5cbiAqICAgIGltbWVkaWF0ZSBuby1vcCBkaWZmLlxuICogQHJldHVybnMgVGhlIE5vZGVEYXRhIGZvciB0aGUgbm9kZS5cbiAqL1xuZnVuY3Rpb24gaW1wb3J0U2luZ2xlTm9kZShub2RlOiBOb2RlLCBmYWxsYmFja0tleT86IEtleSk6IE5vZGVEYXRhIHtcbiAgaWYgKG5vZGVbXCJfX2luY3JlbWVudGFsRE9NRGF0YVwiXSkge1xuICAgIHJldHVybiBub2RlW1wiX19pbmNyZW1lbnRhbERPTURhdGFcIl07XG4gIH1cblxuICBjb25zdCBub2RlTmFtZSA9IGlzRWxlbWVudChub2RlKSA/IG5vZGUubG9jYWxOYW1lIDogbm9kZS5ub2RlTmFtZTtcbiAgY29uc3Qga2V5QXR0ck5hbWUgPSBnZXRLZXlBdHRyaWJ1dGVOYW1lKCk7XG4gIGNvbnN0IGtleUF0dHIgPVxuICAgIGlzRWxlbWVudChub2RlKSAmJiBrZXlBdHRyTmFtZSAhPSBudWxsXG4gICAgICA/IG5vZGUuZ2V0QXR0cmlidXRlKGtleUF0dHJOYW1lKVxuICAgICAgOiBudWxsO1xuICBjb25zdCBrZXkgPSBpc0VsZW1lbnQobm9kZSkgPyBrZXlBdHRyIHx8IGZhbGxiYWNrS2V5IDogbnVsbDtcbiAgY29uc3QgZGF0YSA9IGluaXREYXRhKG5vZGUsIG5vZGVOYW1lLCBrZXkpO1xuXG4gIGlmIChpc0VsZW1lbnQobm9kZSkpIHtcbiAgICByZWNvcmRBdHRyaWJ1dGVzKG5vZGUsIGRhdGEpO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogSW1wb3J0cyBub2RlIGFuZCBpdHMgc3VidHJlZSwgaW5pdGlhbGl6aW5nIGNhY2hlcy5cbiAqIEBwYXJhbSBub2RlIFRoZSBOb2RlIHRvIGltcG9ydC5cbiAqL1xuZnVuY3Rpb24gaW1wb3J0Tm9kZShub2RlOiBOb2RlKSB7XG4gIGltcG9ydFNpbmdsZU5vZGUobm9kZSk7XG5cbiAgZm9yIChcbiAgICBsZXQgY2hpbGQ6IE5vZGUgfCBudWxsID0gbm9kZS5maXJzdENoaWxkO1xuICAgIGNoaWxkO1xuICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmdcbiAgKSB7XG4gICAgaW1wb3J0Tm9kZShjaGlsZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIE5vZGVEYXRhIG9iamVjdCBmb3IgYSBOb2RlLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkuXG4gKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBnZXQgZGF0YSBmb3IuXG4gKiBAcGFyYW0gZmFsbGJhY2tLZXkgQSBrZXkgdG8gdXNlIGlmIGltcG9ydGluZyBhbmQgbm8ga2V5IHdhcyBzcGVjaWZpZWQuXG4gKiAgICBVc2VmdWwgd2hlbiBub3QgdHJhbnNtaXR0aW5nIGtleXMgZnJvbSBzZXJ2ZXJzaWRlIHJlbmRlciBhbmQgZG9pbmcgYW5cbiAqICAgIGltbWVkaWF0ZSBuby1vcCBkaWZmLlxuICogQHJldHVybnMgVGhlIE5vZGVEYXRhIGZvciB0aGUgbm9kZS5cbiAqL1xuZnVuY3Rpb24gZ2V0RGF0YShub2RlOiBOb2RlLCBmYWxsYmFja0tleT86IEtleSkge1xuICByZXR1cm4gaW1wb3J0U2luZ2xlTm9kZShub2RlLCBmYWxsYmFja0tleSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUga2V5IGZvciBhIE5vZGUuIG5vdGUgdGhhdCB0aGUgTm9kZSBzaG91bGQgaGF2ZSBiZWVuIGltcG9ydGVkXG4gKiBieSBub3cuXG4gKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFRoZSBrZXkgdXNlZCB0byBjcmVhdGUgdGhlIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGdldEtleShub2RlOiBOb2RlKSB7XG4gIGFzc2VydChub2RlW1wiX19pbmNyZW1lbnRhbERPTURhdGFcIl0pO1xuICByZXR1cm4gZ2V0RGF0YShub2RlKS5rZXk7XG59XG5cbi8qKlxuICogQ2xlYXJzIGFsbCBjYWNoZXMgZnJvbSBhIG5vZGUgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4uXG4gKiBAcGFyYW0gbm9kZSBUaGUgTm9kZSB0byBjbGVhciB0aGUgY2FjaGUgZm9yLlxuICovXG5mdW5jdGlvbiBjbGVhckNhY2hlKG5vZGU6IE5vZGUpIHtcbiAgbm9kZVtcIl9faW5jcmVtZW50YWxET01EYXRhXCJdID0gbnVsbDtcblxuICBmb3IgKFxuICAgIGxldCBjaGlsZDogTm9kZSB8IG51bGwgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgY2hpbGQ7XG4gICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZ1xuICApIHtcbiAgICBjbGVhckNhY2hlKGNoaWxkKTtcbiAgfVxufVxuXG5leHBvcnQgeyBnZXREYXRhLCBnZXRLZXksIGluaXREYXRhLCBpbXBvcnROb2RlLCBpc0RhdGFJbml0aWFsaXplZCwgY2xlYXJDYWNoZSB9O1xuIl19 \ No newline at end of file diff --git a/closure/src/nodes.d.ts b/closure/src/nodes.d.ts new file mode 100755 index 00000000..0d5de052 --- /dev/null +++ b/closure/src/nodes.d.ts @@ -0,0 +1,18 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +import { Key, NameOrCtorDef } from "./types"; +/** + * Creates an Element and initializes the NodeData. + * @param doc The document with which to create the Element. + * @param parent The parent of new Element. + * @param nameOrCtor The tag or constructor for the Element. + * @param key A key to identify the Element. + * @returns The newly created Element. + */ +declare function createElement(doc: Document, parent: Node | null, nameOrCtor: NameOrCtorDef, key: Key): Element; +/** + * Creates a Text Node. + * @param doc The document with which to create the Element. + * @returns The newly created Text. + */ +declare function createText(doc: Document): Text; +export { createElement, createText }; diff --git a/closure/src/nodes.js b/closure/src/nodes.js new file mode 100755 index 00000000..42ff8726 --- /dev/null +++ b/closure/src/nodes.js @@ -0,0 +1,80 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/nodes.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +goog.module('incrementaldom.src.nodes'); +var module = module || { id: 'src/nodes.js' }; +goog.require('tslib'); +const tsickle_node_data_1 = goog.requireType("incrementaldom.src.node_data"); +const tsickle_types_2 = goog.requireType("incrementaldom.src.types"); +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +var node_data_1 = goog.require('incrementaldom.src.node_data'); +/** + * Gets the namespace to create an element (of a given tag) in. + * @param {string} tag The tag to get the namespace for. + * @param {(null|!Node)} parent The current parent Node, if any. + * @return {?} The namespace to use. + */ +function getNamespaceForTag(tag, parent) { + if (tag === "svg") { + return "http://www.w3.org/2000/svg"; + } + if (tag === "math") { + return "http://www.w3.org/1998/Math/MathML"; + } + if (parent == null) { + return null; + } + if (node_data_1.getData(parent).nameOrCtor === "foreignObject") { + return null; + } + // Since TypeScript 4.4 namespaceURI is only defined for Attr and Element + // nodes. Checking for Element nodes here seems reasonable but breaks SVG + // rendering in Chrome in certain cases. The cast to any should be removed + // once we know why this happens. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return ((/** @type {?} */ (parent))).namespaceURI; +} +/** + * Creates an Element and initializes the NodeData. + * @param {!Document} doc The document with which to create the Element. + * @param {(null|!Node)} parent The parent of new Element. + * @param {(string|!tsickle_types_2.ElementConstructor)} nameOrCtor The tag or constructor for the Element. + * @param {(undefined|null|string|number)} key A key to identify the Element. + * @return {!Element} The newly created Element. + */ +function createElement(doc, parent, nameOrCtor, key) { + /** @type {?} */ + let el; + if (typeof nameOrCtor === "function") { + el = new nameOrCtor(); + } + else { + /** @type {?} */ + const namespace = getNamespaceForTag(nameOrCtor, parent); + if (namespace) { + el = doc.createElementNS(namespace, nameOrCtor); + } + else { + el = doc.createElement(nameOrCtor); + } + } + node_data_1.initData(el, nameOrCtor, key); + return el; +} +exports.createElement = createElement; +/** + * Creates a Text Node. + * @param {!Document} doc The document with which to create the Element. + * @return {!Text} The newly created Text. + */ +function createText(doc) { + /** @type {!Text} */ + const node = doc.createTextNode(""); + node_data_1.initData(node, "#text", null); + return node; +} +exports.createText = createText; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbm9kZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBR0EsZ0VBQWdEOzs7Ozs7O0FBU2hELFNBQVMsa0JBQWtCLENBQUMsR0FBVyxFQUFFLE1BQW1CO0lBQzFELElBQUksR0FBRyxLQUFLLEtBQUssRUFBRTtRQUNqQixPQUFPLDRCQUE0QixDQUFDO0tBQ3JDO0lBRUQsSUFBSSxHQUFHLEtBQUssTUFBTSxFQUFFO1FBQ2xCLE9BQU8sb0NBQW9DLENBQUM7S0FDN0M7SUFFRCxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7UUFDbEIsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELElBQUksbUJBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEtBQUssZUFBZSxFQUFFO1FBQ2xELE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFRCx5RUFBeUU7SUFDekUseUVBQXlFO0lBQ3pFLDBFQUEwRTtJQUMxRSxpQ0FBaUM7SUFDakMsOERBQThEO0lBQzlELE9BQU8sQ0FBQyxtQkFBQSxNQUFNLEVBQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQztBQUN0QyxDQUFDOzs7Ozs7Ozs7QUFVRCxTQUFTLGFBQWEsQ0FDcEIsR0FBYSxFQUNiLE1BQW1CLEVBQ25CLFVBQXlCLEVBQ3pCLEdBQVE7O1FBRUosRUFBRTtJQUVOLElBQUksT0FBTyxVQUFVLEtBQUssVUFBVSxFQUFFO1FBQ3BDLEVBQUUsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO0tBQ3ZCO1NBQU07O2NBQ0MsU0FBUyxHQUFHLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUM7UUFFeEQsSUFBSSxTQUFTLEVBQUU7WUFDYixFQUFFLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDakQ7YUFBTTtZQUNMLEVBQUUsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3BDO0tBQ0Y7SUFFRCxvQkFBUSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFOUIsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBYVEsc0NBQWE7Ozs7OztBQU50QixTQUFTLFVBQVUsQ0FBQyxHQUFhOztVQUN6QixJQUFJLEdBQUcsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7SUFDbkMsb0JBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUV1QixnQ0FBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vICBDb3B5cmlnaHQgMjAxOCBUaGUgSW5jcmVtZW50YWwgRE9NIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKiogQGxpY2Vuc2UgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgKi9cblxuaW1wb3J0IHsgZ2V0RGF0YSwgaW5pdERhdGEgfSBmcm9tIFwiLi9ub2RlX2RhdGFcIjtcbmltcG9ydCB7IEtleSwgTmFtZU9yQ3RvckRlZiB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogR2V0cyB0aGUgbmFtZXNwYWNlIHRvIGNyZWF0ZSBhbiBlbGVtZW50IChvZiBhIGdpdmVuIHRhZykgaW4uXG4gKiBAcGFyYW0gdGFnIFRoZSB0YWcgdG8gZ2V0IHRoZSBuYW1lc3BhY2UgZm9yLlxuICogQHBhcmFtIHBhcmVudCBUaGUgY3VycmVudCBwYXJlbnQgTm9kZSwgaWYgYW55LlxuICogQHJldHVybnMgVGhlIG5hbWVzcGFjZSB0byB1c2UuXG4gKi9cbmZ1bmN0aW9uIGdldE5hbWVzcGFjZUZvclRhZyh0YWc6IHN0cmluZywgcGFyZW50OiBOb2RlIHwgbnVsbCkge1xuICBpZiAodGFnID09PSBcInN2Z1wiKSB7XG4gICAgcmV0dXJuIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIjtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwibWF0aFwiKSB7XG4gICAgcmV0dXJuIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwiO1xuICB9XG5cbiAgaWYgKHBhcmVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoZ2V0RGF0YShwYXJlbnQpLm5hbWVPckN0b3IgPT09IFwiZm9yZWlnbk9iamVjdFwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBTaW5jZSBUeXBlU2NyaXB0IDQuNCBuYW1lc3BhY2VVUkkgaXMgb25seSBkZWZpbmVkIGZvciBBdHRyIGFuZCBFbGVtZW50XG4gIC8vIG5vZGVzLiBDaGVja2luZyBmb3IgRWxlbWVudCBub2RlcyBoZXJlIHNlZW1zIHJlYXNvbmFibGUgYnV0IGJyZWFrcyBTVkdcbiAgLy8gcmVuZGVyaW5nIGluIENocm9tZSBpbiBjZXJ0YWluIGNhc2VzLiBUaGUgY2FzdCB0byBhbnkgc2hvdWxkIGJlIHJlbW92ZWRcbiAgLy8gb25jZSB3ZSBrbm93IHdoeSB0aGlzIGhhcHBlbnMuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHJldHVybiAocGFyZW50IGFzIGFueSkubmFtZXNwYWNlVVJJO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gRWxlbWVudCBhbmQgaW5pdGlhbGl6ZXMgdGhlIE5vZGVEYXRhLlxuICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgd2l0aCB3aGljaCB0byBjcmVhdGUgdGhlIEVsZW1lbnQuXG4gKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgb2YgbmV3IEVsZW1lbnQuXG4gKiBAcGFyYW0gbmFtZU9yQ3RvciBUaGUgdGFnIG9yIGNvbnN0cnVjdG9yIGZvciB0aGUgRWxlbWVudC5cbiAqIEBwYXJhbSBrZXkgQSBrZXkgdG8gaWRlbnRpZnkgdGhlIEVsZW1lbnQuXG4gKiBAcmV0dXJucyBUaGUgbmV3bHkgY3JlYXRlZCBFbGVtZW50LlxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KFxuICBkb2M6IERvY3VtZW50LFxuICBwYXJlbnQ6IE5vZGUgfCBudWxsLFxuICBuYW1lT3JDdG9yOiBOYW1lT3JDdG9yRGVmLFxuICBrZXk6IEtleVxuKTogRWxlbWVudCB7XG4gIGxldCBlbDtcblxuICBpZiAodHlwZW9mIG5hbWVPckN0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGVsID0gbmV3IG5hbWVPckN0b3IoKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2VGb3JUYWcobmFtZU9yQ3RvciwgcGFyZW50KTtcblxuICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgIGVsID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIG5hbWVPckN0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KG5hbWVPckN0b3IpO1xuICAgIH1cbiAgfVxuXG4gIGluaXREYXRhKGVsLCBuYW1lT3JDdG9yLCBrZXkpO1xuXG4gIHJldHVybiBlbDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgVGV4dCBOb2RlLlxuICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgd2l0aCB3aGljaCB0byBjcmVhdGUgdGhlIEVsZW1lbnQuXG4gKiBAcmV0dXJucyBUaGUgbmV3bHkgY3JlYXRlZCBUZXh0LlxuICovXG5mdW5jdGlvbiBjcmVhdGVUZXh0KGRvYzogRG9jdW1lbnQpOiBUZXh0IHtcbiAgY29uc3Qgbm9kZSA9IGRvYy5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgaW5pdERhdGEobm9kZSwgXCIjdGV4dFwiLCBudWxsKTtcbiAgcmV0dXJuIG5vZGU7XG59XG5cbmV4cG9ydCB7IGNyZWF0ZUVsZW1lbnQsIGNyZWF0ZVRleHQgfTtcbiJdfQ== \ No newline at end of file diff --git a/closure/src/notifications.d.ts b/closure/src/notifications.d.ts new file mode 100755 index 00000000..9ef4ae2c --- /dev/null +++ b/closure/src/notifications.d.ts @@ -0,0 +1,16 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +export declare type NodeFunction = (n: Array) => void; +export interface Notifications { + /** + * Called after patch has completed with any Nodes that have been created + * and added to the DOM. + */ + nodesCreated: NodeFunction | null; + /** + * Called after patch has completed with any Nodes that have been removed + * from the DOM. + * Note it's an application's responsibility to handle any childNodes. + */ + nodesDeleted: NodeFunction | null; +} +export declare const notifications: Notifications; diff --git a/closure/src/notifications.js b/closure/src/notifications.js new file mode 100755 index 00000000..8a3068c1 --- /dev/null +++ b/closure/src/notifications.js @@ -0,0 +1,39 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/notifications.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +goog.module('incrementaldom.src.notifications'); +var module = module || { id: 'src/notifications.js' }; +goog.require('tslib'); +/** @typedef {function(!Array): void} */ +exports.NodeFunction; +/** + * @record + */ +function Notifications() { } +exports.Notifications = Notifications; +/* istanbul ignore if */ +if (false) { + /** + * Called after patch has completed with any Nodes that have been created + * and added to the DOM. + * @type {(null|function(!Array): void)} + */ + Notifications.prototype.nodesCreated; + /** + * Called after patch has completed with any Nodes that have been removed + * from the DOM. + * Note it's an application's responsibility to handle any childNodes. + * @type {(null|function(!Array): void)} + */ + Notifications.prototype.nodesDeleted; +} +/** @type {!Notifications} */ +exports.notifications = { + nodesCreated: null, + nodesDeleted: null +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9ub3RpZmljYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0EscUJBQW9EOzs7O0FBRXBELDRCQVlDOzs7Ozs7Ozs7SUFQQyxxQ0FBa0M7Ozs7Ozs7SUFNbEMscUNBQWtDOzs7QUFHdkIsUUFBQSxhQUFhLEdBQWtCO0lBQzFDLFlBQVksRUFBRSxJQUFJO0lBQ2xCLFlBQVksRUFBRSxJQUFJO0NBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gIENvcHlyaWdodCAyMDE4IFRoZSBJbmNyZW1lbnRhbCBET00gQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKiBAbGljZW5zZSBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCAqL1xuXG5leHBvcnQgdHlwZSBOb2RlRnVuY3Rpb24gPSAobjogQXJyYXk8Tm9kZT4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9ucyB7XG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgcGF0Y2ggaGFzIGNvbXBsZXRlZCB3aXRoIGFueSBOb2RlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkXG4gICAqIGFuZCBhZGRlZCB0byB0aGUgRE9NLlxuICAgKi9cbiAgbm9kZXNDcmVhdGVkOiBOb2RlRnVuY3Rpb24gfCBudWxsO1xuICAvKipcbiAgICogQ2FsbGVkIGFmdGVyIHBhdGNoIGhhcyBjb21wbGV0ZWQgd2l0aCBhbnkgTm9kZXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZFxuICAgKiBmcm9tIHRoZSBET00uXG4gICAqIE5vdGUgaXQncyBhbiBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIGhhbmRsZSBhbnkgY2hpbGROb2Rlcy5cbiAgICovXG4gIG5vZGVzRGVsZXRlZDogTm9kZUZ1bmN0aW9uIHwgbnVsbDtcbn1cblxuZXhwb3J0IGNvbnN0IG5vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbnMgPSB7XG4gIG5vZGVzQ3JlYXRlZDogbnVsbCxcbiAgbm9kZXNEZWxldGVkOiBudWxsXG59O1xuIl19 \ No newline at end of file diff --git a/closure/src/src_es5_tsconfig.json b/closure/src/src_es5_tsconfig.json new file mode 100755 index 00000000..090daa3f --- /dev/null +++ b/closure/src/src_es5_tsconfig.json @@ -0,0 +1 @@ +{"compilerOptions": {"target": "es2015", "module": "umd", "downlevelIteration": true, "skipDefaultLibCheck": true, "moduleResolution": "node", "outDir": "../../../../bazel-out/darwin-fastbuild/bin", "rootDir": "../../../..", "rootDirs": ["../../../..", "../../../../bazel-out/darwin-fastbuild/bin", "../../../../bazel-out/darwin-fastbuild/bin"], "baseUrl": "../../../..", "paths": {"@incremental_dom": ["src", "bazel-out/darwin-fastbuild/bin/src", "bazel-out/darwin-fastbuild/bin/src"], "@incremental_dom/*": ["src/*", "bazel-out/darwin-fastbuild/bin/src/*", "bazel-out/darwin-fastbuild/bin/src/*"], "*": ["external/npm/node_modules/*", "external/npm/node_modules/@types/*"], "incremental_dom/*": ["./*", "bazel-out/darwin-fastbuild/bin/*", "bazel-out/darwin-fastbuild/bin/*"]}, "preserveConstEnums": false, "experimentalDecorators": true, "emitDecoratorMetadata": true, "jsx": "react", "noErrorTruncation": false, "noEmitOnError": false, "declaration": true, "declarationDir": "../../../../bazel-out/darwin-fastbuild/bin", "stripInternal": true, "inlineSourceMap": true, "inlineSources": true, "sourceMap": false, "typeRoots": ["../../../../external/npm/node_modules/@types"], "types": []}, "bazelOptions": {"workspaceName": "incremental_dom", "target": "//src:src", "package": "src", "tsickleGenerateExterns": true, "tsickleExternsPath": "", "untyped": false, "typeBlackListPaths": [], "ignoreWarningPaths": [], "es5Mode": true, "manifest": "bazel-out/darwin-fastbuild/bin/src/src.es5.MF", "compilationTargetSrc": ["src/debug.ts", "src/assertions.ts", "src/attributes.ts", "src/changes.ts", "src/context.ts", "src/core.ts", "src/diff.ts", "src/dom_util.ts", "src/global.ts", "src/node_data.ts", "src/nodes.ts", "src/notifications.ts", "src/symbols.ts", "src/types.ts", "src/util.ts", "src/virtual_elements.ts"], "addDtsClutzAliases": false, "typeCheckDependencies": false, "expectedDiagnostics": [], "typeCheck": true, "allowedStrictDeps": ["src/debug.ts", "src/assertions.ts", "src/attributes.ts", "src/changes.ts", "src/context.ts", "src/core.ts", "src/diff.ts", "src/dom_util.ts", "src/global.ts", "src/node_data.ts", "src/nodes.ts", "src/notifications.ts", "src/symbols.ts", "src/types.ts", "src/util.ts", "src/virtual_elements.ts"], "moduleName": "@incremental_dom", "nodeModulesPrefix": "external/npm/node_modules"}, "files": ["../../../../external/npm/node_modules/typescript/lib/protocol.d.ts", "../../../../external/npm/node_modules/typescript/lib/tsserverlibrary.d.ts", "../../../../external/npm/node_modules/typescript/lib/typescript.d.ts", "../../../../external/npm/node_modules/typescript/lib/typescriptServices.d.ts", "../../../../src/debug.ts", "../../../../src/assertions.ts", "../../../../src/attributes.ts", "../../../../src/changes.ts", "../../../../src/context.ts", "../../../../src/core.ts", "../../../../src/diff.ts", "../../../../src/dom_util.ts", "../../../../src/global.ts", "../../../../src/node_data.ts", "../../../../src/nodes.ts", "../../../../src/notifications.ts", "../../../../src/symbols.ts", "../../../../src/types.ts", "../../../../src/util.ts", "../../../../src/virtual_elements.ts"], "compileOnSave": false, "extends": "../../../../tsconfig"} \ No newline at end of file diff --git a/closure/src/symbols.d.ts b/closure/src/symbols.d.ts new file mode 100755 index 00000000..4a158503 --- /dev/null +++ b/closure/src/symbols.d.ts @@ -0,0 +1,5 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +declare const symbols: { + default: string; +}; +export { symbols }; diff --git a/closure/src/symbols.js b/closure/src/symbols.js new file mode 100755 index 00000000..8c7d082c --- /dev/null +++ b/closure/src/symbols.js @@ -0,0 +1,16 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/symbols.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +goog.module('incrementaldom.src.symbols'); +var module = module || { id: 'src/symbols.js' }; +goog.require('tslib'); +/** @type {{default: string}} */ +const symbols = { + default: "__default" +}; +exports.symbols = symbols; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltYm9scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zeW1ib2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O01BR00sT0FBTyxHQUFHO0lBQ2QsT0FBTyxFQUFFLFdBQVc7Q0FDckI7QUFFUSwwQkFBTyIsInNvdXJjZXNDb250ZW50IjpbIi8vICBDb3B5cmlnaHQgMjAxOCBUaGUgSW5jcmVtZW50YWwgRE9NIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKiogQGxpY2Vuc2UgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgKi9cblxuY29uc3Qgc3ltYm9scyA9IHtcbiAgZGVmYXVsdDogXCJfX2RlZmF1bHRcIlxufTtcblxuZXhwb3J0IHsgc3ltYm9scyB9O1xuIl19 \ No newline at end of file diff --git a/closure/src/types.d.ts b/closure/src/types.d.ts new file mode 100755 index 00000000..56f9feeb --- /dev/null +++ b/closure/src/types.d.ts @@ -0,0 +1,16 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +export interface ElementConstructor { + new (): Element; +} +export declare type AttrMutator = (a: Element, b: string, c: any) => void; +export interface AttrMutatorConfig { + [x: string]: AttrMutator; +} +export declare type NameOrCtorDef = string | ElementConstructor; +export declare type Key = string | number | null | undefined; +export declare type Statics = Array<{}> | null | undefined; +export declare type PatchFunction = (node: Element | DocumentFragment, template: (a: T | undefined) => void, data?: T | undefined) => R; +export declare type MatchFnDef = (matchNode: Node, nameOrCtor: NameOrCtorDef, expectedNameOrCtor: NameOrCtorDef, key: Key, expectedKey: Key) => boolean; +export interface PatchConfig { + matches?: MatchFnDef; +} diff --git a/closure/src/types.js b/closure/src/types.js new file mode 100755 index 00000000..132af7da --- /dev/null +++ b/closure/src/types.js @@ -0,0 +1,43 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/types.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +goog.module('incrementaldom.src.types'); +var module = module || { id: 'src/types.js' }; +goog.require('tslib'); +/** + * @record + */ +function ElementConstructor() { } +exports.ElementConstructor = ElementConstructor; +/** @typedef {function(!Element, string, ?): void} */ +exports.AttrMutator; +/** + * @record + */ +function AttrMutatorConfig() { } +exports.AttrMutatorConfig = AttrMutatorConfig; +/** @typedef {(string|!ElementConstructor)} */ +exports.NameOrCtorDef; +/** @typedef {(undefined|null|string|number)} */ +exports.Key; +/** @typedef {(undefined|null|!Array<*>)} */ +exports.Statics; +/** @typedef {function((!DocumentFragment|!Element), function((undefined|?)): void, (undefined|?)=): ?} */ +exports.PatchFunction; +/** @typedef {function(!Node, (string|!ElementConstructor), (string|!ElementConstructor), (undefined|null|string|number), (undefined|null|string|number)): boolean} */ +exports.MatchFnDef; +/** + * @record + */ +function PatchConfig() { } +exports.PatchConfig = PatchConfig; +/* istanbul ignore if */ +if (false) { + /** @type {(undefined|function(!Node, (string|!ElementConstructor), (string|!ElementConstructor), (undefined|null|string|number), (undefined|null|string|number)): boolean)} */ + PatchConfig.prototype.matches; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUdBLGlDQUVDOzs7QUFFRCxvQkFBa0U7Ozs7QUFFbEUsZ0NBRUM7OztBQUVELHNCQUF3RDs7QUFFeEQsWUFBcUQ7O0FBRXJELGdCQUFtRDs7QUFFbkQsc0JBSU87O0FBRVAsbUJBTWE7Ozs7QUFFYiwwQkFFQzs7Ozs7SUFEQyw4QkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyAgQ29weXJpZ2h0IDIwMTggVGhlIEluY3JlbWVudGFsIERPTSBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqIEBsaWNlbnNlIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudENvbnN0cnVjdG9yIHtcbiAgbmV3ICgpOiBFbGVtZW50O1xufVxuXG5leHBvcnQgdHlwZSBBdHRyTXV0YXRvciA9IChhOiBFbGVtZW50LCBiOiBzdHJpbmcsIGM6IGFueSkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBBdHRyTXV0YXRvckNvbmZpZyB7XG4gIFt4OiBzdHJpbmddOiBBdHRyTXV0YXRvcjtcbn1cblxuZXhwb3J0IHR5cGUgTmFtZU9yQ3RvckRlZiA9IHN0cmluZyB8IEVsZW1lbnRDb25zdHJ1Y3RvcjtcblxuZXhwb3J0IHR5cGUgS2V5ID0gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IHR5cGUgU3RhdGljcyA9IEFycmF5PHt9PiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCB0eXBlIFBhdGNoRnVuY3Rpb248VCwgUj4gPSAoXG4gIG5vZGU6IEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50LFxuICB0ZW1wbGF0ZTogKGE6IFQgfCB1bmRlZmluZWQpID0+IHZvaWQsXG4gIGRhdGE/OiBUIHwgdW5kZWZpbmVkXG4pID0+IFI7XG5cbmV4cG9ydCB0eXBlIE1hdGNoRm5EZWYgPSAoXG4gIG1hdGNoTm9kZTogTm9kZSxcbiAgbmFtZU9yQ3RvcjogTmFtZU9yQ3RvckRlZixcbiAgZXhwZWN0ZWROYW1lT3JDdG9yOiBOYW1lT3JDdG9yRGVmLFxuICBrZXk6IEtleSxcbiAgZXhwZWN0ZWRLZXk6IEtleVxuKSA9PiBib29sZWFuO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhdGNoQ29uZmlnIHtcbiAgbWF0Y2hlcz86IE1hdGNoRm5EZWY7XG59XG4iXX0= \ No newline at end of file diff --git a/closure/src/util.d.ts b/closure/src/util.d.ts new file mode 100755 index 00000000..dcf36a40 --- /dev/null +++ b/closure/src/util.d.ts @@ -0,0 +1,27 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +/** + * Used to prevent property collisions between our "map" and its prototype. + * @param map The map to check. + * @param property The property to check. + * @return Whether map has property. + */ +declare function has(map: object, property: string): boolean; +/** + * Creates an map object without a prototype. + * @returns An Object that can be used as a map. + */ +declare function createMap(): any; +/** + * Truncates an array, removing items up until length. + * @param arr The array to truncate. + * @param length The new length of the array. + */ +declare function truncateArray(arr: Array<{} | null | undefined>, length: number): void; +/** + * Creates an array for a desired initial size. Note that the array will still + * be empty. + * @param initialAllocationSize The initial size to allocate. + * @returns An empty array, with an initial allocation for the desired size. + */ +declare function createArray(initialAllocationSize: number): Array; +export { createArray, createMap, has, truncateArray }; diff --git a/closure/src/util.js b/closure/src/util.js new file mode 100755 index 00000000..41d4f2f8 --- /dev/null +++ b/closure/src/util.js @@ -0,0 +1,66 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/util.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +goog.module('incrementaldom.src.util'); +var module = module || { id: 'src/util.js' }; +goog.require('tslib'); +/** + * A cached reference to the hasOwnProperty function. + * @type {function((string|number|symbol)): boolean} + */ +const hasOwnProperty = Object.prototype.hasOwnProperty; +/** + * A constructor function that will create blank objects. + * @return {void} + */ +function Blank() { } +Blank.prototype = Object.create(null); +/** + * Used to prevent property collisions between our "map" and its prototype. + * @param {!Object} map The map to check. + * @param {string} property The property to check. + * @return {boolean} Whether map has property. + */ +function has(map, property) { + return hasOwnProperty.call(map, property); +} +exports.has = has; +/** + * Creates an map object without a prototype. + * @return {?} An Object that can be used as a map. + */ +function createMap() { + return new ((/** @type {?} */ (Blank)))(); +} +exports.createMap = createMap; +/** + * Truncates an array, removing items up until length. + * @param {!Array<(undefined|null|*)>} arr The array to truncate. + * @param {number} length The new length of the array. + * @return {void} + */ +function truncateArray(arr, length) { + while (arr.length > length) { + arr.pop(); + } +} +exports.truncateArray = truncateArray; +/** + * Creates an array for a desired initial size. Note that the array will still + * be empty. + * @template T + * @param {number} initialAllocationSize The initial size to allocate. + * @return {!Array} An empty array, with an initial allocation for the desired size. + */ +function createArray(initialAllocationSize) { + /** @type {!Array} */ + const arr = new Array(initialAllocationSize); + truncateArray(arr, 0); + return arr; +} +exports.createArray = createArray; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O01BTU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYzs7Ozs7QUFLdEQsU0FBUyxLQUFLLEtBQUksQ0FBQztBQUVuQixLQUFLLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Ozs7Ozs7QUFRdEMsU0FBUyxHQUFHLENBQUMsR0FBVyxFQUFFLFFBQWdCO0lBQ3hDLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQWlDZ0Msa0JBQUc7Ozs7O0FBM0JwQyxTQUFTLFNBQVM7SUFDaEIsT0FBTyxJQUFJLENBQUMsbUJBQUEsS0FBSyxFQUFPLENBQUMsRUFBRSxDQUFDO0FBQzlCLENBQUM7QUF5QnFCLDhCQUFTOzs7Ozs7O0FBbEIvQixTQUFTLGFBQWEsQ0FBQyxHQUFpQyxFQUFFLE1BQWM7SUFDdEUsT0FBTyxHQUFHLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRTtRQUMxQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDWDtBQUNILENBQUM7QUFjcUMsc0NBQWE7Ozs7Ozs7O0FBTm5ELFNBQVMsV0FBVyxDQUFJLHFCQUE2Qjs7VUFDN0MsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDO0lBQzVDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRVEsa0NBQVciLCJzb3VyY2VzQ29udGVudCI6WyIvLyAgQ29weXJpZ2h0IDIwMTggVGhlIEluY3JlbWVudGFsIERPTSBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqIEBsaWNlbnNlIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wICovXG5cbi8qKlxuICogQSBjYWNoZWQgcmVmZXJlbmNlIHRvIHRoZSBoYXNPd25Qcm9wZXJ0eSBmdW5jdGlvbi5cbiAqL1xuY29uc3QgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgY29uc3RydWN0b3IgZnVuY3Rpb24gdGhhdCB3aWxsIGNyZWF0ZSBibGFuayBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBCbGFuaygpIHt9XG5cbkJsYW5rLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8qKlxuICogVXNlZCB0byBwcmV2ZW50IHByb3BlcnR5IGNvbGxpc2lvbnMgYmV0d2VlbiBvdXIgXCJtYXBcIiBhbmQgaXRzIHByb3RvdHlwZS5cbiAqIEBwYXJhbSBtYXAgVGhlIG1hcCB0byBjaGVjay5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gY2hlY2suXG4gKiBAcmV0dXJuIFdoZXRoZXIgbWFwIGhhcyBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gaGFzKG1hcDogb2JqZWN0LCBwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG1hcCwgcHJvcGVydHkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gbWFwIG9iamVjdCB3aXRob3V0IGEgcHJvdG90eXBlLlxuICogQHJldHVybnMgQW4gT2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBtYXAuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1hcCgpOiBhbnkge1xuICByZXR1cm4gbmV3IChCbGFuayBhcyBhbnkpKCk7XG59XG5cbi8qKlxuICogVHJ1bmNhdGVzIGFuIGFycmF5LCByZW1vdmluZyBpdGVtcyB1cCB1bnRpbCBsZW5ndGguXG4gKiBAcGFyYW0gYXJyIFRoZSBhcnJheSB0byB0cnVuY2F0ZS5cbiAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBsZW5ndGggb2YgdGhlIGFycmF5LlxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZUFycmF5KGFycjogQXJyYXk8e30gfCBudWxsIHwgdW5kZWZpbmVkPiwgbGVuZ3RoOiBudW1iZXIpIHtcbiAgd2hpbGUgKGFyci5sZW5ndGggPiBsZW5ndGgpIHtcbiAgICBhcnIucG9wKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGZvciBhIGRlc2lyZWQgaW5pdGlhbCBzaXplLiBOb3RlIHRoYXQgdGhlIGFycmF5IHdpbGwgc3RpbGxcbiAqIGJlIGVtcHR5LlxuICogQHBhcmFtIGluaXRpYWxBbGxvY2F0aW9uU2l6ZSBUaGUgaW5pdGlhbCBzaXplIHRvIGFsbG9jYXRlLlxuICogQHJldHVybnMgQW4gZW1wdHkgYXJyYXksIHdpdGggYW4gaW5pdGlhbCBhbGxvY2F0aW9uIGZvciB0aGUgZGVzaXJlZCBzaXplLlxuICovXG5mdW5jdGlvbiBjcmVhdGVBcnJheTxUPihpbml0aWFsQWxsb2NhdGlvblNpemU6IG51bWJlcik6IEFycmF5PFQ+IHtcbiAgY29uc3QgYXJyID0gbmV3IEFycmF5KGluaXRpYWxBbGxvY2F0aW9uU2l6ZSk7XG4gIHRydW5jYXRlQXJyYXkoYXJyLCAwKTtcbiAgcmV0dXJuIGFycjtcbn1cblxuZXhwb3J0IHsgY3JlYXRlQXJyYXksIGNyZWF0ZU1hcCwgaGFzLCB0cnVuY2F0ZUFycmF5IH07XG4iXX0= \ No newline at end of file diff --git a/closure/src/virtual_elements.d.ts b/closure/src/virtual_elements.d.ts new file mode 100755 index 00000000..0ad30e29 --- /dev/null +++ b/closure/src/virtual_elements.d.ts @@ -0,0 +1,96 @@ +/** @license SPDX-License-Identifier: Apache-2.0 */ +import { AttrMutatorConfig, Key, NameOrCtorDef, Statics } from "./types"; +/** + * Declares a virtual Element at the current location in the document. This + * corresponds to an opening tag and a elementClose tag is required. This is + * like elementOpen, but the attributes are defined using the attr function + * rather than being passed as arguments. Must be folllowed by 0 or more calls + * to attr, then a call to elementOpenEnd. + * @param nameOrCtor The Element's tag or constructor. + * @param key The key used to identify this element. This can be an + * empty string, but performance may be better if a unique value is used + * when iterating over an array of items. + * @param statics An array of attribute name/value pairs of the static + * attributes for the Element. Attributes will only be set once when the + * Element is created. + */ +declare function elementOpenStart(nameOrCtor: NameOrCtorDef, key?: Key, statics?: Statics): void; +/** + * Allows you to define a key after an elementOpenStart. This is useful in + * templates that define key after an element has been opened ie + * `
`. + * @param key The key to use for the next call. + */ +declare function key(key: string): void; +/** + * Buffers an attribute, which will get applied during the next call to + * `elementOpen`, `elementOpenEnd` or `applyAttrs`. + * @param name The of the attribute to buffer. + * @param value The value of the attribute to buffer. + */ +declare function attr(name: string, value: any): void; +/** + * Closes an open tag started with elementOpenStart. + * @return The corresponding Element. + */ +declare function elementOpenEnd(): HTMLElement; +/** + * @param nameOrCtor The Element's tag or constructor. + * @param key The key used to identify this element. This can be an + * empty string, but performance may be better if a unique value is used + * when iterating over an array of items. + * @param statics An array of attribute name/value pairs of the static + * attributes for the Element. Attributes will only be set once when the + * Element is created. + * @param varArgs, Attribute name/value pairs of the dynamic attributes + * for the Element. + * @return The corresponding Element. + */ +declare function elementOpen(nameOrCtor: NameOrCtorDef, key?: Key, statics?: Statics, ...varArgs: Array): HTMLElement; +/** + * Applies the currently buffered attrs to the currently open element. This + * clears the buffered attributes. + * @param attrs The attributes. + */ +declare function applyAttrs(attrs?: AttrMutatorConfig): void; +/** + * Applies the current static attributes to the currently open element. Note: + * statics should be applied before calling `applyAtrs`. + * @param statics The statics to apply to the current element. + * @param attrs The attributes. + */ +declare function applyStatics(statics: Statics, attrs?: AttrMutatorConfig): void; +/** + * Closes an open virtual Element. + * + * @param nameOrCtor The Element's tag or constructor. + * @return The corresponding Element. + */ +declare function elementClose(nameOrCtor: NameOrCtorDef): Element; +/** + * Declares a virtual Element at the current location in the document that has + * no children. + * @param nameOrCtor The Element's tag or constructor. + * @param key The key used to identify this element. This can be an + * empty string, but performance may be better if a unique value is used + * when iterating over an array of items. + * @param statics An array of attribute name/value pairs of the static + * attributes for the Element. Attributes will only be set once when the + * Element is created. + * @param varArgs Attribute name/value pairs of the dynamic attributes + * for the Element. + * @return The corresponding Element. + */ +declare function elementVoid(nameOrCtor: NameOrCtorDef, key?: Key, statics?: Statics, ...varArgs: Array): Element; +/** + * Declares a virtual Text at this point in the document. + * + * @param value The value of the Text. + * @param varArgs + * Functions to format the value which are called only when the value has + * changed. + * @return The corresponding text node. + */ +declare function text(value: string | number | boolean, ...varArgs: Array<(a: {}) => string>): Text; +/** */ +export { applyAttrs, applyStatics, elementOpenStart, elementOpenEnd, elementOpen, elementVoid, elementClose, text, attr, key }; diff --git a/closure/src/virtual_elements.js b/closure/src/virtual_elements.js new file mode 100755 index 00000000..17efde1d --- /dev/null +++ b/closure/src/virtual_elements.js @@ -0,0 +1,344 @@ +/** + * @fileoverview added by tsickle + * Generated from: src/virtual_elements.ts + * @suppress {checkTypes,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc + */ +goog.module('incrementaldom.src.virtual_elements'); +var module = module || { id: 'src/virtual_elements.js' }; +goog.require('tslib'); +const tsickle_assertions_1 = goog.requireType("incrementaldom.src.assertions"); +const tsickle_attributes_2 = goog.requireType("incrementaldom.src.attributes"); +const tsickle_core_3 = goog.requireType("incrementaldom.src.core"); +const tsickle_global_4 = goog.requireType("incrementaldom.src.global"); +const tsickle_node_data_5 = goog.requireType("incrementaldom.src.node_data"); +const tsickle_types_6 = goog.requireType("incrementaldom.src.types"); +const tsickle_util_7 = goog.requireType("incrementaldom.src.util"); +const tsickle_diff_8 = goog.requireType("incrementaldom.src.diff"); +// Copyright 2018 The Incremental DOM Authors. All Rights Reserved. +/** @license SPDX-License-Identifier: Apache-2.0 */ +var assertions_1 = goog.require('incrementaldom.src.assertions'); +var attributes_1 = goog.require('incrementaldom.src.attributes'); +var core_1 = goog.require('incrementaldom.src.core'); +var global_1 = goog.require('incrementaldom.src.global'); +var node_data_1 = goog.require('incrementaldom.src.node_data'); +var util_1 = goog.require('incrementaldom.src.util'); +var diff_1 = goog.require('incrementaldom.src.diff'); +/** + * The offset in the virtual element declaration where the attributes are + * specified. + * @type {number} + */ +const ATTRIBUTES_OFFSET = 3; +/** + * Used to keep track of the previous values when a 2-way diff is necessary. + * This object is reused. + * TODO(sparhamI) Scope this to a patch so you can call patch from an attribute + * update. + * @type {?} + */ +const prevAttrsMap = util_1.createMap(); +/** + * @param {!Element} element The Element to diff the attrs for. + * @param {!tsickle_node_data_5.NodeData} data The NodeData associated with the Element. + * @param {!tsickle_types_6.AttrMutatorConfig} attrs The attribute map of mutators + * @return {void} + */ +function diffAttrs(element, data, attrs) { + /** @type {!Array} */ + const attrsBuilder = core_1.getAttrsBuilder(); + /** @type {!Array} */ + const prevAttrsArr = data.getAttrsArr(attrsBuilder.length); + diff_1.calculateDiff(prevAttrsArr, attrsBuilder, element, attributes_1.updateAttribute, attrs, data.alwaysDiffAttributes); + util_1.truncateArray(attrsBuilder, 0); +} +/** + * Applies the statics. When importing an Element, any existing attributes that + * match a static are converted into a static attribute. + * @param {!Element} node The Element to apply statics for. + * @param {!tsickle_node_data_5.NodeData} data The NodeData associated with the Element. + * @param {(undefined|null|!Array<*>)} statics The statics array. + * @param {!tsickle_types_6.AttrMutatorConfig} attrs The attribute map of mutators. + * @return {void} + */ +function diffStatics(node, data, statics, attrs) { + if (data.staticsApplied) { + return; + } + data.staticsApplied = true; + if (!statics || !statics.length) { + return; + } + if (data.hasEmptyAttrsArr()) { + for (let i = 0; i < statics.length; i += 2) { + attributes_1.updateAttribute(node, (/** @type {string} */ (statics[i])), statics[i + 1], attrs); + } + return; + } + for (let i = 0; i < statics.length; i += 2) { + prevAttrsMap[(/** @type {string} */ (statics[i]))] = i + 1; + } + /** @type {!Array} */ + const attrsArr = data.getAttrsArr(0); + /** @type {number} */ + let j = 0; + for (let i = 0; i < attrsArr.length; i += 2) { + /** @type {?} */ + const name = attrsArr[i]; + /** @type {?} */ + const value = attrsArr[i + 1]; + /** @type {?} */ + const staticsIndex = prevAttrsMap[name]; + if (staticsIndex) { + // For any attrs that are static and have the same value, make sure we do + // not set them again. + if (statics[staticsIndex] === value) { + delete prevAttrsMap[name]; + } + continue; + } + // For any attrs that are dynamic, move them up to the right place. + attrsArr[j] = name; + attrsArr[j + 1] = value; + j += 2; + } + // Anything after `j` was either moved up already or static. + util_1.truncateArray(attrsArr, j); + for (const name in prevAttrsMap) { + attributes_1.updateAttribute(node, name, statics[prevAttrsMap[name]], attrs); + delete prevAttrsMap[name]; + } +} +/** + * Declares a virtual Element at the current location in the document. This + * corresponds to an opening tag and a elementClose tag is required. This is + * like elementOpen, but the attributes are defined using the attr function + * rather than being passed as arguments. Must be folllowed by 0 or more calls + * to attr, then a call to elementOpenEnd. + * @param {(string|!tsickle_types_6.ElementConstructor)} nameOrCtor The Element's tag or constructor. + * @param {(undefined|null|string|number)=} key The key used to identify this element. This can be an + * empty string, but performance may be better if a unique value is used + * when iterating over an array of items. + * @param {(undefined|null|!Array<*>)=} statics An array of attribute name/value pairs of the static + * attributes for the Element. Attributes will only be set once when the + * Element is created. + * @return {void} + */ +function elementOpenStart(nameOrCtor, key, statics) { + /** @type {!Array} */ + const argsBuilder = core_1.getArgsBuilder(); + if (global_1.DEBUG) { + assertions_1.assertNotInAttributes("elementOpenStart"); + assertions_1.setInAttributes(true); + } + argsBuilder[0] = nameOrCtor; + argsBuilder[1] = key; + argsBuilder[2] = statics; +} +exports.elementOpenStart = elementOpenStart; +/** + * Allows you to define a key after an elementOpenStart. This is useful in + * templates that define key after an element has been opened ie + * `
`. + * @param {string} key The key to use for the next call. + * @return {void} + */ +function key(key) { + /** @type {!Array} */ + const argsBuilder = core_1.getArgsBuilder(); + if (global_1.DEBUG) { + assertions_1.assertInAttributes("key"); + assertions_1.assert(argsBuilder); + } + argsBuilder[1] = key; +} +exports.key = key; +/** + * Buffers an attribute, which will get applied during the next call to + * `elementOpen`, `elementOpenEnd` or `applyAttrs`. + * @param {string} name The of the attribute to buffer. + * @param {?} value The value of the attribute to buffer. + * @return {void} + */ +function attr(name, value) { + /** @type {!Array} */ + const attrsBuilder = core_1.getAttrsBuilder(); + if (global_1.DEBUG) { + assertions_1.assertInPatch("attr"); + } + attrsBuilder.push(name); + attrsBuilder.push(value); +} +exports.attr = attr; +/** + * @return {string} The value of the nonce attribute. + */ +function getNonce() { + /** @type {!Array} */ + const argsBuilder = core_1.getArgsBuilder(); + /** @type {(undefined|null|!Array<*>)} */ + const statics = (/** @type {(undefined|null|!Array<*>)} */ (argsBuilder[2])); + if (statics) { + for (let i = 0; i < statics.length; i += 2) { + if (statics[i] === "nonce") { + return (/** @type {string} */ (statics[i + 1])); + } + } + } + return ""; +} +/** + * Closes an open tag started with elementOpenStart. + * @return {!HTMLElement} The corresponding Element. + */ +function elementOpenEnd() { + /** @type {!Array} */ + const argsBuilder = core_1.getArgsBuilder(); + if (global_1.DEBUG) { + assertions_1.assertInAttributes("elementOpenEnd"); + assertions_1.setInAttributes(false); + } + /** @type {!HTMLElement} */ + const node = core_1.open((/** @type {(string|!tsickle_types_6.ElementConstructor)} */ (argsBuilder[0])), (/** @type {(undefined|null|string|number)} */ (argsBuilder[1])), getNonce()); + /** @type {!tsickle_node_data_5.NodeData} */ + const data = node_data_1.getData(node); + diffStatics(node, data, (/** @type {(undefined|null|!Array<*>)} */ (argsBuilder[2])), attributes_1.attributes); + diffAttrs(node, data, attributes_1.attributes); + util_1.truncateArray(argsBuilder, 0); + return node; +} +exports.elementOpenEnd = elementOpenEnd; +/** + * @param {(string|!tsickle_types_6.ElementConstructor)} nameOrCtor The Element's tag or constructor. + * @param {(undefined|null|string|number)=} key The key used to identify this element. This can be an + * empty string, but performance may be better if a unique value is used + * when iterating over an array of items. + * @param {(undefined|null|!Array<*>)=} statics An array of attribute name/value pairs of the static + * attributes for the Element. Attributes will only be set once when the + * Element is created. + * @param {...?} varArgs + * @return {!HTMLElement} The corresponding Element. + */ +function elementOpen(nameOrCtor, key, +// Ideally we could tag statics and varArgs as an array where every odd +// element is a string and every even element is any, but this is hard. +statics, ...varArgs) { + if (global_1.DEBUG) { + assertions_1.assertNotInAttributes("elementOpen"); + assertions_1.assertNotInSkip("elementOpen"); + } + elementOpenStart(nameOrCtor, key, statics); + for (let i = ATTRIBUTES_OFFSET; i < arguments.length; i += 2) { + attr(arguments[i], arguments[i + 1]); + } + return elementOpenEnd(); +} +exports.elementOpen = elementOpen; +/** + * Applies the currently buffered attrs to the currently open element. This + * clears the buffered attributes. + * @param {!tsickle_types_6.AttrMutatorConfig=} attrs The attributes. + * @return {void} + */ +function applyAttrs(attrs = attributes_1.attributes) { + /** @type {!Element} */ + const node = core_1.currentElement(); + /** @type {!tsickle_node_data_5.NodeData} */ + const data = node_data_1.getData(node); + diffAttrs(node, data, attrs); +} +exports.applyAttrs = applyAttrs; +/** + * Applies the current static attributes to the currently open element. Note: + * statics should be applied before calling `applyAtrs`. + * @param {(undefined|null|!Array<*>)} statics The statics to apply to the current element. + * @param {!tsickle_types_6.AttrMutatorConfig=} attrs The attributes. + * @return {void} + */ +function applyStatics(statics, attrs = attributes_1.attributes) { + /** @type {!Element} */ + const node = core_1.currentElement(); + /** @type {!tsickle_node_data_5.NodeData} */ + const data = node_data_1.getData(node); + diffStatics(node, data, statics, attrs); +} +exports.applyStatics = applyStatics; +/** + * Closes an open virtual Element. + * + * @param {(string|!tsickle_types_6.ElementConstructor)} nameOrCtor The Element's tag or constructor. + * @return {!Element} The corresponding Element. + */ +function elementClose(nameOrCtor) { + if (global_1.DEBUG) { + assertions_1.assertNotInAttributes("elementClose"); + } + /** @type {!Element} */ + const node = core_1.close(); + if (global_1.DEBUG) { + assertions_1.assertCloseMatchesOpenTag(node_data_1.getData(node).nameOrCtor, nameOrCtor); + } + return node; +} +exports.elementClose = elementClose; +/** + * Declares a virtual Element at the current location in the document that has + * no children. + * @param {(string|!tsickle_types_6.ElementConstructor)} nameOrCtor The Element's tag or constructor. + * @param {(undefined|null|string|number)=} key The key used to identify this element. This can be an + * empty string, but performance may be better if a unique value is used + * when iterating over an array of items. + * @param {(undefined|null|!Array<*>)=} statics An array of attribute name/value pairs of the static + * attributes for the Element. Attributes will only be set once when the + * Element is created. + * @param {...?} varArgs Attribute name/value pairs of the dynamic attributes + * for the Element. + * @return {!Element} The corresponding Element. + */ +function elementVoid(nameOrCtor, key, +// Ideally we could tag statics and varArgs as an array where every odd +// element is a string and every even element is any, but this is hard. +statics, ...varArgs) { + elementOpen.apply(null, (/** @type {?} */ (arguments))); + return elementClose(nameOrCtor); +} +exports.elementVoid = elementVoid; +/** + * Declares a virtual Text at this point in the document. + * + * @param {(string|number|boolean)} value The value of the Text. + * @param {...function(*): string} varArgs + * Functions to format the value which are called only when the value has + * changed. + * @return {!Text} The corresponding text node. + */ +function text(value, ...varArgs) { + if (global_1.DEBUG) { + assertions_1.assertNotInAttributes("text"); + assertions_1.assertNotInSkip("text"); + } + /** @type {!Text} */ + const node = core_1.text(); + /** @type {!tsickle_node_data_5.NodeData} */ + const data = node_data_1.getData(node); + if (data.text !== value) { + data.text = (/** @type {string} */ (value)); + /** @type {(string|number|boolean)} */ + let formatted = value; + for (let i = 1; i < arguments.length; i += 1) { + /* + * Call the formatter function directly to prevent leaking arguments. + * https://github.com/google/incremental-dom/pull/204#issuecomment-178223574 + */ + /** @type {?} */ + const fn = arguments[i]; + formatted = fn(formatted); + } + // Setting node.data resets the cursor in IE/Edge. + if (node.data !== formatted) { + node.data = (/** @type {string} */ (formatted)); + } + } + return node; +} +exports.text = text; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbF9lbGVtZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy92aXJ0dWFsX2VsZW1lbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLGtFQVFzQjtBQUN0QixrRUFBMkQ7QUFDM0Qsc0RBT2dCO0FBQ2hCLDBEQUFpQztBQUNqQyxnRUFBZ0Q7QUFFaEQsc0RBQWtEO0FBQ2xELHNEQUF1Qzs7Ozs7O01BTWpDLGlCQUFpQixHQUFHLENBQUM7Ozs7Ozs7O01BUXJCLFlBQVksR0FBRyxnQkFBUyxFQUFFOzs7Ozs7O0FBT2hDLFNBQVMsU0FBUyxDQUFDLE9BQWdCLEVBQUUsSUFBYyxFQUFFLEtBQXdCOztVQUNyRSxZQUFZLEdBQUcsc0JBQWUsRUFBRTs7VUFDaEMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztJQUUxRCxvQkFBYSxDQUNYLFlBQVksRUFDWixZQUFZLEVBQ1osT0FBTyxFQUNQLDRCQUFlLEVBQ2YsS0FBSyxFQUNMLElBQUksQ0FBQyxvQkFBb0IsQ0FDMUIsQ0FBQztJQUNGLG9CQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7Ozs7Ozs7Ozs7QUFVRCxTQUFTLFdBQVcsQ0FDbEIsSUFBYSxFQUNiLElBQWMsRUFDZCxPQUFnQixFQUNoQixLQUF3QjtJQUV4QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDdkIsT0FBTztLQUNSO0lBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFFM0IsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7UUFDL0IsT0FBTztLQUNSO0lBRUQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtRQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1B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QkFLdEMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMzQjtRQUVELGtEQUFrRDtRQUNsRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQzNCLElBQUksQ0FBQyxJQUFJLEdBQUcsd0JBQUEsU0FBUyxFQUFVLENBQUM7U0FDakM7S0FDRjtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQVdDLG9CQUFJIiwic291cmNlc0NvbnRlbnQiOlsiLy8gIENvcHlyaWdodCAyMDE4IFRoZSBJbmNyZW1lbnRhbCBET00gQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKiBAbGljZW5zZSBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCAqL1xuXG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIGFzc2VydENsb3NlTWF0Y2hlc09wZW5UYWcsXG4gIGFzc2VydEluQXR0cmlidXRlcyxcbiAgYXNzZXJ0SW5QYXRjaCxcbiAgYXNzZXJ0Tm90SW5BdHRyaWJ1dGVzLFxuICBhc3NlcnROb3RJblNraXAsXG4gIHNldEluQXR0cmlidXRlc1xufSBmcm9tIFwiLi9hc3NlcnRpb25zXCI7XG5pbXBvcnQgeyBhdHRyaWJ1dGVzLCB1cGRhdGVBdHRyaWJ1dGUgfSBmcm9tIFwiLi9hdHRyaWJ1dGVzXCI7XG5pbXBvcnQge1xuICBnZXRBcmdzQnVpbGRlcixcbiAgZ2V0QXR0cnNCdWlsZGVyLFxuICBjbG9zZSxcbiAgb3BlbixcbiAgdGV4dCBhcyBjb3JlVGV4dCxcbiAgY3VycmVudEVsZW1lbnRcbn0gZnJvbSBcIi4vY29yZVwiO1xuaW1wb3J0IHsgREVCVUcgfSBmcm9tIFwiLi9nbG9iYWxcIjtcbmltcG9ydCB7IGdldERhdGEsIE5vZGVEYXRhIH0gZnJvbSBcIi4vbm9kZV9kYXRhXCI7XG5pbXBvcnQgeyBBdHRyTXV0YXRvckNvbmZpZywgS2V5LCBOYW1lT3JDdG9yRGVmLCBTdGF0aWNzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZU1hcCwgdHJ1bmNhdGVBcnJheSB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZURpZmYgfSBmcm9tIFwiLi9kaWZmXCI7XG5cbi8qKlxuICogVGhlIG9mZnNldCBpbiB0aGUgdmlydHVhbCBlbGVtZW50IGRlY2xhcmF0aW9uIHdoZXJlIHRoZSBhdHRyaWJ1dGVzIGFyZVxuICogc3BlY2lmaWVkLlxuICovXG5jb25zdCBBVFRSSUJVVEVTX09GRlNFVCA9IDM7XG5cbi8qKlxuICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyB2YWx1ZXMgd2hlbiBhIDItd2F5IGRpZmYgaXMgbmVjZXNzYXJ5LlxuICogVGhpcyBvYmplY3QgaXMgcmV1c2VkLlxuICogVE9ETyhzcGFyaGFtSSkgU2NvcGUgdGhpcyB0byBhIHBhdGNoIHNvIHlvdSBjYW4gY2FsbCBwYXRjaCBmcm9tIGFuIGF0dHJpYnV0ZVxuICogdXBkYXRlLlxuICovXG5jb25zdCBwcmV2QXR0cnNNYXAgPSBjcmVhdGVNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0gZWxlbWVudCBUaGUgRWxlbWVudCB0byBkaWZmIHRoZSBhdHRycyBmb3IuXG4gKiBAcGFyYW0gZGF0YSBUaGUgTm9kZURhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBFbGVtZW50LlxuICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGUgbWFwIG9mIG11dGF0b3JzXG4gKi9cbmZ1bmN0aW9uIGRpZmZBdHRycyhlbGVtZW50OiBFbGVtZW50LCBkYXRhOiBOb2RlRGF0YSwgYXR0cnM6IEF0dHJNdXRhdG9yQ29uZmlnKSB7XG4gIGNvbnN0IGF0dHJzQnVpbGRlciA9IGdldEF0dHJzQnVpbGRlcigpO1xuICBjb25zdCBwcmV2QXR0cnNBcnIgPSBkYXRhLmdldEF0dHJzQXJyKGF0dHJzQnVpbGRlci5sZW5ndGgpO1xuXG4gIGNhbGN1bGF0ZURpZmYoXG4gICAgcHJldkF0dHJzQXJyLFxuICAgIGF0dHJzQnVpbGRlcixcbiAgICBlbGVtZW50LFxuICAgIHVwZGF0ZUF0dHJpYnV0ZSxcbiAgICBhdHRycyxcbiAgICBkYXRhLmFsd2F5c0RpZmZBdHRyaWJ1dGVzXG4gICk7XG4gIHRydW5jYXRlQXJyYXkoYXR0cnNCdWlsZGVyLCAwKTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBzdGF0aWNzLiBXaGVuIGltcG9ydGluZyBhbiBFbGVtZW50LCBhbnkgZXhpc3RpbmcgYXR0cmlidXRlcyB0aGF0XG4gKiBtYXRjaCBhIHN0YXRpYyBhcmUgY29udmVydGVkIGludG8gYSBzdGF0aWMgYXR0cmlidXRlLlxuICogQHBhcmFtIG5vZGUgVGhlIEVsZW1lbnQgdG8gYXBwbHkgc3RhdGljcyBmb3IuXG4gKiBAcGFyYW0gZGF0YSBUaGUgTm9kZURhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBFbGVtZW50LlxuICogQHBhcmFtIHN0YXRpY3MgVGhlIHN0YXRpY3MgYXJyYXkuXG4gKiBAcGFyYW0gYXR0cnMgVGhlIGF0dHJpYnV0ZSBtYXAgb2YgbXV0YXRvcnMuXG4gKi9cbmZ1bmN0aW9uIGRpZmZTdGF0aWNzKFxuICBub2RlOiBFbGVtZW50LFxuICBkYXRhOiBOb2RlRGF0YSxcbiAgc3RhdGljczogU3RhdGljcyxcbiAgYXR0cnM6IEF0dHJNdXRhdG9yQ29uZmlnXG4pIHtcbiAgaWYgKGRhdGEuc3RhdGljc0FwcGxpZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkYXRhLnN0YXRpY3NBcHBsaWVkID0gdHJ1ZTtcblxuICBpZiAoIXN0YXRpY3MgfHwgIXN0YXRpY3MubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGRhdGEuaGFzRW1wdHlBdHRyc0FycigpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF0aWNzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICB1cGRhdGVBdHRyaWJ1dGUobm9kZSwgc3RhdGljc1tpXSBhcyBzdHJpbmcsIHN0YXRpY3NbaSArIDFdLCBhdHRycyk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhdGljcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHByZXZBdHRyc01hcFtzdGF0aWNzW2ldIGFzIHN0cmluZ10gPSBpICsgMTtcbiAgfVxuXG4gIGNvbnN0IGF0dHJzQXJyID0gZGF0YS5nZXRBdHRyc0FycigwKTtcbiAgbGV0IGogPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJzQXJyLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgY29uc3QgbmFtZSA9IGF0dHJzQXJyW2ldO1xuICAgIGNvbnN0IHZhbHVlID0gYXR0cnNBcnJbaSArIDFdO1xuICAgIGNvbnN0IHN0YXRpY3NJbmRleCA9IHByZXZBdHRyc01hcFtuYW1lXTtcblxuICAgIGlmIChzdGF0aWNzSW5kZXgpIHtcbiAgICAgIC8vIEZvciBhbnkgYXR0cnMgdGhhdCBhcmUgc3RhdGljIGFuZCBoYXZlIHRoZSBzYW1lIHZhbHVlLCBtYWtlIHN1cmUgd2UgZG9cbiAgICAgIC8vIG5vdCBzZXQgdGhlbSBhZ2Fpbi5cbiAgICAgIGlmIChzdGF0aWNzW3N0YXRpY3NJbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICAgIGRlbGV0ZSBwcmV2QXR0cnNNYXBbbmFtZV07XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEZvciBhbnkgYXR0cnMgdGhhdCBhcmUgZHluYW1pYywgbW92ZSB0aGVtIHVwIHRvIHRoZSByaWdodCBwbGFjZS5cbiAgICBhdHRyc0FycltqXSA9IG5hbWU7XG4gICAgYXR0cnNBcnJbaiArIDFdID0gdmFsdWU7XG4gICAgaiArPSAyO1xuICB9XG4gIC8vIEFueXRoaW5nIGFmdGVyIGBqYCB3YXMgZWl0aGVyIG1vdmVkIHVwIGFscmVhZHkgb3Igc3RhdGljLlxuICB0cnVuY2F0ZUFycmF5KGF0dHJzQXJyLCBqKTtcblxuICBmb3IgKGNvbnN0IG5hbWUgaW4gcHJldkF0dHJzTWFwKSB7XG4gICAgdXBkYXRlQXR0cmlidXRlKG5vZGUsIG5hbWUsIHN0YXRpY3NbcHJldkF0dHJzTWFwW25hbWVdXSwgYXR0cnMpO1xuICAgIGRlbGV0ZSBwcmV2QXR0cnNNYXBbbmFtZV07XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNsYXJlcyBhIHZpcnR1YWwgRWxlbWVudCBhdCB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgZG9jdW1lbnQuIFRoaXNcbiAqIGNvcnJlc3BvbmRzIHRvIGFuIG9wZW5pbmcgdGFnIGFuZCBhIGVsZW1lbnRDbG9zZSB0YWcgaXMgcmVxdWlyZWQuIFRoaXMgaXNcbiAqIGxpa2UgZWxlbWVudE9wZW4sIGJ1dCB0aGUgYXR0cmlidXRlcyBhcmUgZGVmaW5lZCB1c2luZyB0aGUgYXR0ciBmdW5jdGlvblxuICogcmF0aGVyIHRoYW4gYmVpbmcgcGFzc2VkIGFzIGFyZ3VtZW50cy4gTXVzdCBiZSBmb2xsbG93ZWQgYnkgMCBvciBtb3JlIGNhbGxzXG4gKiB0byBhdHRyLCB0aGVuIGEgY2FsbCB0byBlbGVtZW50T3BlbkVuZC5cbiAqIEBwYXJhbSBuYW1lT3JDdG9yIFRoZSBFbGVtZW50J3MgdGFnIG9yIGNvbnN0cnVjdG9yLlxuICogQHBhcmFtIGtleSBUaGUga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBlbGVtZW50LiBUaGlzIGNhbiBiZSBhblxuICogICAgIGVtcHR5IHN0cmluZywgYnV0IHBlcmZvcm1hbmNlIG1heSBiZSBiZXR0ZXIgaWYgYSB1bmlxdWUgdmFsdWUgaXMgdXNlZFxuICogICAgIHdoZW4gaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgb2YgaXRlbXMuXG4gKiBAcGFyYW0gc3RhdGljcyBBbiBhcnJheSBvZiBhdHRyaWJ1dGUgbmFtZS92YWx1ZSBwYWlycyBvZiB0aGUgc3RhdGljXG4gKiAgICAgYXR0cmlidXRlcyBmb3IgdGhlIEVsZW1lbnQuIEF0dHJpYnV0ZXMgd2lsbCBvbmx5IGJlIHNldCBvbmNlIHdoZW4gdGhlXG4gKiAgICAgRWxlbWVudCBpcyBjcmVhdGVkLlxuICovXG5mdW5jdGlvbiBlbGVtZW50T3BlblN0YXJ0KFxuICBuYW1lT3JDdG9yOiBOYW1lT3JDdG9yRGVmLFxuICBrZXk/OiBLZXksXG4gIHN0YXRpY3M/OiBTdGF0aWNzXG4pIHtcbiAgY29uc3QgYXJnc0J1aWxkZXIgPSBnZXRBcmdzQnVpbGRlcigpO1xuXG4gIGlmIChERUJVRykge1xuICAgIGFzc2VydE5vdEluQXR0cmlidXRlcyhcImVsZW1lbnRPcGVuU3RhcnRcIik7XG4gICAgc2V0SW5BdHRyaWJ1dGVzKHRydWUpO1xuICB9XG5cbiAgYXJnc0J1aWxkZXJbMF0gPSBuYW1lT3JDdG9yO1xuICBhcmdzQnVpbGRlclsxXSA9IGtleTtcbiAgYXJnc0J1aWxkZXJbMl0gPSBzdGF0aWNzO1xufVxuXG4vKipcbiAqIEFsbG93cyB5b3UgdG8gZGVmaW5lIGEga2V5IGFmdGVyIGFuIGVsZW1lbnRPcGVuU3RhcnQuIFRoaXMgaXMgdXNlZnVsIGluXG4gKiB0ZW1wbGF0ZXMgdGhhdCBkZWZpbmUga2V5IGFmdGVyIGFuIGVsZW1lbnQgaGFzIGJlZW4gb3BlbmVkIGllXG4gKiBgPGRpdiBrZXkoJ2ZvbycpPjwvZGl2PmAuXG4gKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gdXNlIGZvciB0aGUgbmV4dCBjYWxsLlxuICovXG5mdW5jdGlvbiBrZXkoa2V5OiBzdHJpbmcpIHtcbiAgY29uc3QgYXJnc0J1aWxkZXIgPSBnZXRBcmdzQnVpbGRlcigpO1xuXG4gIGlmIChERUJVRykge1xuICAgIGFzc2VydEluQXR0cmlidXRlcyhcImtleVwiKTtcbiAgICBhc3NlcnQoYXJnc0J1aWxkZXIpO1xuICB9XG4gIGFyZ3NCdWlsZGVyWzFdID0ga2V5O1xufVxuXG4vKipcbiAqIEJ1ZmZlcnMgYW4gYXR0cmlidXRlLCB3aGljaCB3aWxsIGdldCBhcHBsaWVkIGR1cmluZyB0aGUgbmV4dCBjYWxsIHRvXG4gKiBgZWxlbWVudE9wZW5gLCBgZWxlbWVudE9wZW5FbmRgIG9yIGBhcHBseUF0dHJzYC5cbiAqIEBwYXJhbSBuYW1lIFRoZSBvZiB0aGUgYXR0cmlidXRlIHRvIGJ1ZmZlci5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGF0dHIobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIGNvbnN0IGF0dHJzQnVpbGRlciA9IGdldEF0dHJzQnVpbGRlcigpO1xuXG4gIGlmIChERUJVRykge1xuICAgIGFzc2VydEluUGF0Y2goXCJhdHRyXCIpO1xuICB9XG5cbiAgYXR0cnNCdWlsZGVyLnB1c2gobmFtZSk7XG4gIGF0dHJzQnVpbGRlci5wdXNoKHZhbHVlKTtcbn1cblxuLyoqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBub25jZSBhdHRyaWJ1dGUuICovXG5mdW5jdGlvbiBnZXROb25jZSgpOiBzdHJpbmcge1xuICBjb25zdCBhcmdzQnVpbGRlciA9IGdldEFyZ3NCdWlsZGVyKCk7XG4gIGNvbnN0IHN0YXRpY3MgPSA8U3RhdGljcz5hcmdzQnVpbGRlclsyXTtcbiAgaWYgKHN0YXRpY3MpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRpY3MubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGlmIChzdGF0aWNzW2ldID09PSBcIm5vbmNlXCIpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRpY3NbaSArIDFdIGFzIHN0cmluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59XG5cbi8qKlxuICogQ2xvc2VzIGFuIG9wZW4gdGFnIHN0YXJ0ZWQgd2l0aCBlbGVtZW50T3BlblN0YXJ0LlxuICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBFbGVtZW50LlxuICovXG5mdW5jdGlvbiBlbGVtZW50T3BlbkVuZCgpOiBIVE1MRWxlbWVudCB7XG4gIGNvbnN0IGFyZ3NCdWlsZGVyID0gZ2V0QXJnc0J1aWxkZXIoKTtcblxuICBpZiAoREVCVUcpIHtcbiAgICBhc3NlcnRJbkF0dHJpYnV0ZXMoXCJlbGVtZW50T3BlbkVuZFwiKTtcbiAgICBzZXRJbkF0dHJpYnV0ZXMoZmFsc2UpO1xuICB9XG5cbiAgY29uc3Qgbm9kZSA9IG9wZW4oXG4gICAgPE5hbWVPckN0b3JEZWY+YXJnc0J1aWxkZXJbMF0sXG4gICAgPEtleT5hcmdzQnVpbGRlclsxXSxcbiAgICBnZXROb25jZSgpXG4gICk7XG4gIGNvbnN0IGRhdGEgPSBnZXREYXRhKG5vZGUpO1xuXG4gIGRpZmZTdGF0aWNzKG5vZGUsIGRhdGEsIDxTdGF0aWNzPmFyZ3NCdWlsZGVyWzJdLCBhdHRyaWJ1dGVzKTtcbiAgZGlmZkF0dHJzKG5vZGUsIGRhdGEsIGF0dHJpYnV0ZXMpO1xuICB0cnVuY2F0ZUFycmF5KGFyZ3NCdWlsZGVyLCAwKTtcblxuICByZXR1cm4gbm9kZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gIG5hbWVPckN0b3IgVGhlIEVsZW1lbnQncyB0YWcgb3IgY29uc3RydWN0b3IuXG4gKiBAcGFyYW0gIGtleSBUaGUga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBlbGVtZW50LiBUaGlzIGNhbiBiZSBhblxuICogICAgIGVtcHR5IHN0cmluZywgYnV0IHBlcmZvcm1hbmNlIG1heSBiZSBiZXR0ZXIgaWYgYSB1bmlxdWUgdmFsdWUgaXMgdXNlZFxuICogICAgIHdoZW4gaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgb2YgaXRlbXMuXG4gKiBAcGFyYW0gc3RhdGljcyBBbiBhcnJheSBvZiBhdHRyaWJ1dGUgbmFtZS92YWx1ZSBwYWlycyBvZiB0aGUgc3RhdGljXG4gKiAgICAgYXR0cmlidXRlcyBmb3IgdGhlIEVsZW1lbnQuIEF0dHJpYnV0ZXMgd2lsbCBvbmx5IGJlIHNldCBvbmNlIHdoZW4gdGhlXG4gKiAgICAgRWxlbWVudCBpcyBjcmVhdGVkLlxuICogQHBhcmFtIHZhckFyZ3MsIEF0dHJpYnV0ZSBuYW1lL3ZhbHVlIHBhaXJzIG9mIHRoZSBkeW5hbWljIGF0dHJpYnV0ZXNcbiAqICAgICBmb3IgdGhlIEVsZW1lbnQuXG4gKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIEVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGVsZW1lbnRPcGVuKFxuICBuYW1lT3JDdG9yOiBOYW1lT3JDdG9yRGVmLFxuICBrZXk/OiBLZXksXG4gIC8vIElkZWFsbHkgd2UgY291bGQgdGFnIHN0YXRpY3MgYW5kIHZhckFyZ3MgYXMgYW4gYXJyYXkgd2hlcmUgZXZlcnkgb2RkXG4gIC8vIGVsZW1lbnQgaXMgYSBzdHJpbmcgYW5kIGV2ZXJ5IGV2ZW4gZWxlbWVudCBpcyBhbnksIGJ1dCB0aGlzIGlzIGhhcmQuXG4gIHN0YXRpY3M/OiBTdGF0aWNzLFxuICAuLi52YXJBcmdzOiBBcnJheTxhbnk+XG4pIHtcbiAgaWYgKERFQlVHKSB7XG4gICAgYXNzZXJ0Tm90SW5BdHRyaWJ1dGVzKFwiZWxlbWVudE9wZW5cIik7XG4gICAgYXNzZXJ0Tm90SW5Ta2lwKFwiZWxlbWVudE9wZW5cIik7XG4gIH1cblxuICBlbGVtZW50T3BlblN0YXJ0KG5hbWVPckN0b3IsIGtleSwgc3RhdGljcyk7XG5cbiAgZm9yIChsZXQgaSA9IEFUVFJJQlVURVNfT0ZGU0VUOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgYXR0cihhcmd1bWVudHNbaV0sIGFyZ3VtZW50c1tpICsgMV0pO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRPcGVuRW5kKCk7XG59XG5cbi8qKlxuICogQXBwbGllcyB0aGUgY3VycmVudGx5IGJ1ZmZlcmVkIGF0dHJzIHRvIHRoZSBjdXJyZW50bHkgb3BlbiBlbGVtZW50LiBUaGlzXG4gKiBjbGVhcnMgdGhlIGJ1ZmZlcmVkIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0gYXR0cnMgVGhlIGF0dHJpYnV0ZXMuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5QXR0cnMoYXR0cnMgPSBhdHRyaWJ1dGVzKSB7XG4gIGNvbnN0IG5vZGUgPSBjdXJyZW50RWxlbWVudCgpO1xuICBjb25zdCBkYXRhID0gZ2V0RGF0YShub2RlKTtcblxuICBkaWZmQXR0cnMobm9kZSwgZGF0YSwgYXR0cnMpO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgdGhlIGN1cnJlbnQgc3RhdGljIGF0dHJpYnV0ZXMgdG8gdGhlIGN1cnJlbnRseSBvcGVuIGVsZW1lbnQuIE5vdGU6XG4gKiBzdGF0aWNzIHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSBjYWxsaW5nIGBhcHBseUF0cnNgLlxuICogQHBhcmFtIHN0YXRpY3MgVGhlIHN0YXRpY3MgdG8gYXBwbHkgdG8gdGhlIGN1cnJlbnQgZWxlbWVudC5cbiAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcy5cbiAqL1xuZnVuY3Rpb24gYXBwbHlTdGF0aWNzKHN0YXRpY3M6IFN0YXRpY3MsIGF0dHJzID0gYXR0cmlidXRlcykge1xuICBjb25zdCBub2RlID0gY3VycmVudEVsZW1lbnQoKTtcbiAgY29uc3QgZGF0YSA9IGdldERhdGEobm9kZSk7XG5cbiAgZGlmZlN0YXRpY3Mobm9kZSwgZGF0YSwgc3RhdGljcywgYXR0cnMpO1xufVxuXG4vKipcbiAqIENsb3NlcyBhbiBvcGVuIHZpcnR1YWwgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0gbmFtZU9yQ3RvciBUaGUgRWxlbWVudCdzIHRhZyBvciBjb25zdHJ1Y3Rvci5cbiAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgRWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gZWxlbWVudENsb3NlKG5hbWVPckN0b3I6IE5hbWVPckN0b3JEZWYpOiBFbGVtZW50IHtcbiAgaWYgKERFQlVHKSB7XG4gICAgYXNzZXJ0Tm90SW5BdHRyaWJ1dGVzKFwiZWxlbWVudENsb3NlXCIpO1xuICB9XG5cbiAgY29uc3Qgbm9kZSA9IGNsb3NlKCk7XG5cbiAgaWYgKERFQlVHKSB7XG4gICAgYXNzZXJ0Q2xvc2VNYXRjaGVzT3BlblRhZyhnZXREYXRhKG5vZGUpLm5hbWVPckN0b3IsIG5hbWVPckN0b3IpO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbi8qKlxuICogRGVjbGFyZXMgYSB2aXJ0dWFsIEVsZW1lbnQgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGRvY3VtZW50IHRoYXQgaGFzXG4gKiBubyBjaGlsZHJlbi5cbiAqIEBwYXJhbSBuYW1lT3JDdG9yIFRoZSBFbGVtZW50J3MgdGFnIG9yIGNvbnN0cnVjdG9yLlxuICogQHBhcmFtIGtleSBUaGUga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBlbGVtZW50LiBUaGlzIGNhbiBiZSBhblxuICogICAgIGVtcHR5IHN0cmluZywgYnV0IHBlcmZvcm1hbmNlIG1heSBiZSBiZXR0ZXIgaWYgYSB1bmlxdWUgdmFsdWUgaXMgdXNlZFxuICogICAgIHdoZW4gaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkgb2YgaXRlbXMuXG4gKiBAcGFyYW0gc3RhdGljcyBBbiBhcnJheSBvZiBhdHRyaWJ1dGUgbmFtZS92YWx1ZSBwYWlycyBvZiB0aGUgc3RhdGljXG4gKiAgICAgYXR0cmlidXRlcyBmb3IgdGhlIEVsZW1lbnQuIEF0dHJpYnV0ZXMgd2lsbCBvbmx5IGJlIHNldCBvbmNlIHdoZW4gdGhlXG4gKiAgICAgRWxlbWVudCBpcyBjcmVhdGVkLlxuICogQHBhcmFtIHZhckFyZ3MgQXR0cmlidXRlIG5hbWUvdmFsdWUgcGFpcnMgb2YgdGhlIGR5bmFtaWMgYXR0cmlidXRlc1xuICogICAgIGZvciB0aGUgRWxlbWVudC5cbiAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgRWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gZWxlbWVudFZvaWQoXG4gIG5hbWVPckN0b3I6IE5hbWVPckN0b3JEZWYsXG4gIGtleT86IEtleSxcbiAgLy8gSWRlYWxseSB3ZSBjb3VsZCB0YWcgc3RhdGljcyBhbmQgdmFyQXJncyBhcyBhbiBhcnJheSB3aGVyZSBldmVyeSBvZGRcbiAgLy8gZWxlbWVudCBpcyBhIHN0cmluZyBhbmQgZXZlcnkgZXZlbiBlbGVtZW50IGlzIGFueSwgYnV0IHRoaXMgaXMgaGFyZC5cbiAgc3RhdGljcz86IFN0YXRpY3MsXG4gIC4uLnZhckFyZ3M6IEFycmF5PGFueT5cbikge1xuICBlbGVtZW50T3Blbi5hcHBseShudWxsLCBhcmd1bWVudHMgYXMgYW55KTtcbiAgcmV0dXJuIGVsZW1lbnRDbG9zZShuYW1lT3JDdG9yKTtcbn1cblxuLyoqXG4gKiBEZWNsYXJlcyBhIHZpcnR1YWwgVGV4dCBhdCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBUZXh0LlxuICogQHBhcmFtIHZhckFyZ3NcbiAqICAgICBGdW5jdGlvbnMgdG8gZm9ybWF0IHRoZSB2YWx1ZSB3aGljaCBhcmUgY2FsbGVkIG9ubHkgd2hlbiB0aGUgdmFsdWUgaGFzXG4gKiAgICAgY2hhbmdlZC5cbiAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgdGV4dCBub2RlLlxuICovXG5mdW5jdGlvbiB0ZXh0KFxuICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbixcbiAgLi4udmFyQXJnczogQXJyYXk8KGE6IHt9KSA9PiBzdHJpbmc+XG4pIHtcbiAgaWYgKERFQlVHKSB7XG4gICAgYXNzZXJ0Tm90SW5BdHRyaWJ1dGVzKFwidGV4dFwiKTtcbiAgICBhc3NlcnROb3RJblNraXAoXCJ0ZXh0XCIpO1xuICB9XG5cbiAgY29uc3Qgbm9kZSA9IGNvcmVUZXh0KCk7XG4gIGNvbnN0IGRhdGEgPSBnZXREYXRhKG5vZGUpO1xuXG4gIGlmIChkYXRhLnRleHQgIT09IHZhbHVlKSB7XG4gICAgZGF0YS50ZXh0ID0gdmFsdWUgYXMgc3RyaW5nO1xuXG4gICAgbGV0IGZvcm1hdHRlZCA9IHZhbHVlO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAvKlxuICAgICAgICogQ2FsbCB0aGUgZm9ybWF0dGVyIGZ1bmN0aW9uIGRpcmVjdGx5IHRvIHByZXZlbnQgbGVha2luZyBhcmd1bWVudHMuXG4gICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2luY3JlbWVudGFsLWRvbS9wdWxsLzIwNCNpc3N1ZWNvbW1lbnQtMTc4MjIzNTc0XG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGZuID0gYXJndW1lbnRzW2ldO1xuICAgICAgZm9ybWF0dGVkID0gZm4oZm9ybWF0dGVkKTtcbiAgICB9XG5cbiAgICAvLyBTZXR0aW5nIG5vZGUuZGF0YSByZXNldHMgdGhlIGN1cnNvciBpbiBJRS9FZGdlLlxuICAgIGlmIChub2RlLmRhdGEgIT09IGZvcm1hdHRlZCkge1xuICAgICAgbm9kZS5kYXRhID0gZm9ybWF0dGVkIGFzIHN0cmluZztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cblxuLyoqICovXG5leHBvcnQge1xuICBhcHBseUF0dHJzLFxuICBhcHBseVN0YXRpY3MsXG4gIGVsZW1lbnRPcGVuU3RhcnQsXG4gIGVsZW1lbnRPcGVuRW5kLFxuICBlbGVtZW50T3BlbixcbiAgZWxlbWVudFZvaWQsXG4gIGVsZW1lbnRDbG9zZSxcbiAgdGV4dCxcbiAgYXR0cixcbiAga2V5XG59O1xuIl19 \ No newline at end of file diff --git a/external/tsickle.bzl b/external/tsickle.bzl new file mode 100644 index 00000000..4129017b --- /dev/null +++ b/external/tsickle.bzl @@ -0,0 +1,41 @@ +package( + default_visibility = ["//visibility:public"], +) + +load( + "@io_bazel_rules_closure//closure:defs.bzl", + js_module = "closure_js_library", +) + + +filegroup( + name = "extern-src", + srcs = ["externs.js"], +) + +filegroup( + name = "tslib-src", + srcs = ["tslib.js"], +) + +js_module( + name = "extern-lib", + srcs = [":extern-src"], +) + +js_module( + name = "tslib-lib", + srcs = [":tslib-src"], + suppress = [ + "JSC_MISSING_SEMICOLON", + "reportUnknownTypes", + ], +) + +js_module( + name = "tslib", + exports = [ + ":extern-lib", + ":tslib-lib", + ], +) diff --git a/package-lock.json b/package-lock.json index 779817ba..7131b021 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,15 @@ "name": "incremental-dom", "version": "0.7.0", "license": "Apache-2.0", + "dependencies": { + "typescript": "~4.3.2" + }, "devDependencies": { "@bazel/bazelisk": "^1.11.0", - "@bazel/concatjs": "^4.6.0", + "@bazel/concatjs": "4.6.0", "@bazel/ibazel": "^0.15.10", - "@bazel/rollup": "^4.6.0", - "@bazel/typescript": "^4.6.0", + "@bazel/rollup": "4.6.0", + "@bazel/typescript": "4.6.0", "@rollup/plugin-buble": "^0.21.3", "@types/mocha": "^5.0.0", "@types/sinon": "^4.3.0", @@ -37,7 +40,7 @@ "rollup": "^2.63.0", "sinon": "^4.0.0", "sinon-chai": "^2.9.0", - "typescript": "~3.4.1", + "tsickle": "^0.46.0", "uglify-js": "^3.6.0" } }, @@ -366,6 +369,12 @@ "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==", "dev": true }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, "node_modules/@types/mocha": { "version": "5.2.6", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.6.tgz", @@ -2683,9 +2692,9 @@ } }, "node_modules/google-protobuf": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.19.3.tgz", - "integrity": "sha512-3GRDj8o9XjcALYjgxNKeD7Wm6w/V8r1Jo4sLYMic9+VaIMLBx8TQeHP9yaoRoDymNONhnkmmveDPyjw/Fpw8+A==", + "version": "3.19.4", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.19.4.tgz", + "integrity": "sha512-OIPNCxsG2lkIvf+P5FNfJ/Km95CsXOBecS9ZcAU6m2Rq3svc0Apl9nB3GMDNKfQ9asNv4KjyAqGwPQFrVle3Yg==", "dev": true }, "node_modules/got": { @@ -6191,6 +6200,18 @@ "node": ">=0.10.0" } }, + "node_modules/tsickle": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.46.0.tgz", + "integrity": "sha512-pEkomf35SZMlCyHJH2A5/4Li8KZprvGcVUz8jcZVArZNBKVOY7YEvDRJcaEWMTOaEzvjcaeDvE95VDyDka0i2Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.1" + }, + "peerDependencies": { + "typescript": "h-joo/TypeScript#ts45-no-double-comments" + } + }, "node_modules/tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -6247,10 +6268,9 @@ } }, "node_modules/typescript": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", - "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", - "dev": true, + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7299,6 +7319,12 @@ "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==", "dev": true }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, "@types/mocha": { "version": "5.2.6", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.6.tgz", @@ -9213,9 +9239,9 @@ "dev": true }, "google-protobuf": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.19.3.tgz", - "integrity": "sha512-3GRDj8o9XjcALYjgxNKeD7Wm6w/V8r1Jo4sLYMic9+VaIMLBx8TQeHP9yaoRoDymNONhnkmmveDPyjw/Fpw8+A==", + "version": "3.19.4", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.19.4.tgz", + "integrity": "sha512-OIPNCxsG2lkIvf+P5FNfJ/Km95CsXOBecS9ZcAU6m2Rq3svc0Apl9nB3GMDNKfQ9asNv4KjyAqGwPQFrVle3Yg==", "dev": true }, "got": { @@ -12081,6 +12107,15 @@ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, + "tsickle": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.46.0.tgz", + "integrity": "sha512-pEkomf35SZMlCyHJH2A5/4Li8KZprvGcVUz8jcZVArZNBKVOY7YEvDRJcaEWMTOaEzvjcaeDvE95VDyDka0i2Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.1" + } + }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -12122,10 +12157,9 @@ } }, "typescript": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", - "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", - "dev": true + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==" }, "uglify-js": { "version": "3.6.0", diff --git a/package.json b/package.json index 4cd3f104..7a2b010d 100644 --- a/package.json +++ b/package.json @@ -24,10 +24,10 @@ }, "devDependencies": { "@bazel/bazelisk": "^1.11.0", - "@bazel/concatjs": "^4.6.0", + "@bazel/concatjs": "4.6.0", "@bazel/ibazel": "^0.15.10", - "@bazel/rollup": "^4.6.0", - "@bazel/typescript": "^4.6.0", + "@bazel/rollup": "4.6.0", + "@bazel/typescript": "4.6.0", "@rollup/plugin-buble": "^0.21.3", "@types/mocha": "^5.0.0", "@types/sinon": "^4.3.0", @@ -51,7 +51,10 @@ "rollup": "^2.63.0", "sinon": "^4.0.0", "sinon-chai": "^2.9.0", - "typescript": "~3.4.1", + "tsickle": "^0.46.0", "uglify-js": "^3.6.0" + }, + "dependencies": { + "typescript": "~4.3.2" } } diff --git a/release/BUILD b/release/BUILD index a7c2fa51..49e20f43 100644 --- a/release/BUILD +++ b/release/BUILD @@ -1,7 +1,7 @@ package(default_visibility = ["//:__subpackages__"]) load("//:constants.bzl", "RELEASE_FILES") -load("@npm//@bazel/typescript:index.bzl", "ts_library") +load("//tools:ts.bzl", "ts_library") genrule( name = "release_files", @@ -18,5 +18,4 @@ ts_library( "debug.ts", ":release_files", ], - tsickle_typed = True, ) diff --git a/src/BUILD b/src/BUILD index 3118cabe..e6bf7dd2 100644 --- a/src/BUILD +++ b/src/BUILD @@ -1,14 +1,15 @@ package(default_visibility = ["//:__subpackages__"]) -load("@npm//@bazel/typescript:index.bzl", "ts_library") +load("//tools:ts.bzl", "ts_library") load("//:constants.bzl", "RELEASE_FILES") ts_library( name = "src", + package_name = "@incremental_dom/src", + module_name = "@incremental_dom/src", srcs = [ ":all_files", ], - tsickle_typed = True, ) filegroup( diff --git a/test/BUILD b/test/BUILD index 259be4db..31492bcf 100644 --- a/test/BUILD +++ b/test/BUILD @@ -4,6 +4,7 @@ load("@npm//@bazel/typescript:index.bzl", "ts_library") ts_library( name = "test_lib", srcs = glob(["**/*.ts"]), + compiler = "//tools/tsc", deps = [ "//:dev", "//src", diff --git a/tools/BUILD.bazel b/tools/BUILD.bazel new file mode 100644 index 00000000..e69de29b diff --git a/tools/ts.bzl b/tools/ts.bzl new file mode 100644 index 00000000..d7f3364c --- /dev/null +++ b/tools/ts.bzl @@ -0,0 +1,30 @@ + +load("@io_bazel_rules_closure//closure:defs.bzl", _closure_js_library = "closure_js_library") +load("@npm//@bazel/typescript:index.bzl", _ts_library = "ts_library") + + +def ts_library(name, srcs = [], deps = [], **kwargs): + """Proxy rule for declaring TypeScript libraries.""" + + _ts_library( + name = name, + srcs = srcs, + deps = deps, + tsickle_typed = True, + compiler = "//tools/tsc", + **kwargs + ) + + native.filegroup( + name = "%s_es5" % name, + srcs = [":%s" % name], + output_group = "es5_sources", + ) + + _closure_js_library( + name = "%s_closure" % name, + srcs = [":%s_es5" % name], + deps = [ + "@tsickle//:tslib", + ], + ) diff --git a/tools/tsc/BUILD.bazel b/tools/tsc/BUILD.bazel new file mode 100644 index 00000000..58d8e20e --- /dev/null +++ b/tools/tsc/BUILD.bazel @@ -0,0 +1,21 @@ +load( + "@build_bazel_rules_nodejs//:index.bzl", + "nodejs_binary", +) + +package( + default_visibility = ["//visibility:public"], +) + + +nodejs_binary( + name = "tsc", + entry_point = "@npm//:node_modules/@bazel/typescript/internal/tsc_wrapped/tsc_wrapped.js", + templated_args = ["--bazel_patch_module_resolver", "--node_options=--max-old-space-size=2048"], + visibility = ["//visibility:public"], + data = [ + "@npm//@bazel/typescript", + "@npm//tsickle", + "@npm//typescript", + ], +) diff --git a/tsconfig.json b/tsconfig.json index 5f2f7e9a..393f77ba 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -26,5 +26,10 @@ ], "exclude": [ "node_modules" - ] + ], + "bazelOptions": { + "workspaceName": "incrementaldom", + "tsickle": true, + "googmodule": true + } }