Skip to content

Commit

Permalink
#56 ) Break out common elements of knockout/tko compilation to `tko.b…
Browse files Browse the repository at this point in the history
…uilder`

This may have caused a couple regressions in tests, but they should be easy to find.
  • Loading branch information
brianmhunt committed Jan 19, 2018
1 parent ab522dd commit de06cfb
Show file tree
Hide file tree
Showing 9 changed files with 350 additions and 450 deletions.
9 changes: 2 additions & 7 deletions packages/knockout/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,27 +49,22 @@
}
],
"devDependencies": {
"tko.bind": "^4.0.0-alpha4",
"tko.builder": "^4.0.0-alpha4",
"tko.binding.component": "^4.0.0-alpha4",
"tko.binding.core": "^4.0.0-alpha4",
"tko.binding.foreach": "^4.0.0-alpha4",
"tko.binding.if": "^4.0.0-alpha4",
"tko.binding.template": "^4.0.0-alpha4",
"tko.computed": "^4.0.0-alpha4",
"tko.filter.punches": "^4.0.0-alpha4",
"tko.lifecycle": "^4.0.0-alpha4",
"tko.observable": "^4.0.0-alpha4",
"tko.provider": "^4.0.0-alpha4",
"tko.provider.attr": "^4.0.0-alpha4",
"tko.provider.bindingstring": "^4.0.0-alpha4",
"tko.provider.component": "^4.0.0-alpha4",
"tko.provider.databind": "^4.0.0-alpha4",
"tko.provider.multi": "^4.0.0-alpha4",
"tko.provider.mustache": "^4.0.0-alpha4",
"tko.provider.virtual": "^4.0.0-alpha4",
"tko.utils": "^4.0.0-alpha4",
"tko.utils.component": "^4.0.0-alpha4",
"tko.utils.parser": "^4.0.0-alpha4",
"tko.utils.functionRewrite": "^4.0.0-alpha4",
"tslib": "^1.8.0"
},
"__about__shared.package.json": "These properties are copied into all packages/*/package.json. Run `yarn repackage`",
Expand Down
260 changes: 34 additions & 226 deletions packages/knockout/src/index.js
Original file line number Diff line number Diff line change
@@ -1,41 +1,4 @@
/* eslint semi: 0 */
import * as utils from 'tko.utils'

// Expose for testing.
import {
parseObjectLiteral
} from 'tko.utils.parser'

import {
functionRewrite
} from 'tko.utils.functionRewrite'

import {
// applyExtenders,
// arrayChangeEventName,
// deferUpdates,
dependencyDetection,
extenders,
isObservable,
isSubscribable,
isWriteableObservable,
observable,
observableArray,
isObservableArray,
peek,
subscribable,
toJS,
toJSON,
unwrap
} from 'tko.observable'

import {
computed,
isComputed,
isPureComputed,
pureComputed,
when
} from 'tko.computed'
import { Builder } from 'tko.builder'

import { VirtualProvider } from 'tko.provider.virtual'
import { DataBindProvider } from 'tko.provider.databind'
Expand All @@ -46,198 +9,43 @@ import {
TextMustacheProvider, AttributeMustacheProvider
} from 'tko.provider.mustache'

import {
applyBindingAccessorsToNode,
applyBindings,
applyBindingsToDescendants,
applyBindingsToNode,
contextFor,
dataFor,
getBindingHandler,
BindingHandler,
AsyncBindingHandler,
setDomNodeChildrenFromArrayMapping
} from 'tko.bind';

import {
bindings as coreBindings
} from 'tko.binding.core';

import {
anonymousTemplate,
bindings as templateBindings,
domElement,
nativeTemplateEngine,
renderTemplate,
setTemplateEngine,
templateEngine
// templateSources
} from 'tko.binding.template';

import {
bindings as ifBindings
} from 'tko.binding.if';

import {
bindings as foreachBindings
} from 'tko.binding.foreach';

import {
filters as punchesFilters
} from 'tko.filter.punches';
import { bindings as coreBindings } from 'tko.binding.core'
import { bindings as templateBindings } from 'tko.binding.template'
import { bindings as ifBindings } from 'tko.binding.if'
import { bindings as foreachBindings } from 'tko.binding.foreach'
import { bindings as componentBindings } from 'tko.binding.component'

import {
bindings as componentBindings
} from 'tko.binding.component'
import { filters } from 'tko.filter.punches'

import components from 'tko.utils.component'

var coreUtils = {}

utils.arrayForEach([
'extend',
'setTimeout',
'arrayForEach',
'arrayFirst',
'arrayFilter',
'arrayGetDistinctValues',
'arrayIndexOf',
'arrayMap',
'arrayPushAll',
'arrayRemoveItem',
'cloneNodes',
'getFormFields',
'peekObservable',
'postJson',
'parseJson',
'registerEventHandler',
'stringifyJson',
'range',
'toggleDomNodeCssClass',
'triggerEvent',
'unwrapObservable',
'objectMap',
'objectForEach',
'addOrRemoveItem',
'setTextContent',
'domData',
'parseHtmlFragment',
'setHtml',
'compareArrays',
'createSymbolOrString',
'setDomNodeChildrenFromArrayMapping'
], function (coreUtil) {
coreUtils[coreUtil] = utils[coreUtil]
})

const domNodeDisposal = {
addDisposeCallback: utils.addDisposeCallback,
otherNodeCleanerFunctions: utils.otherNodeCleanerFunctions,
removeDisposeCallback: utils.removeDisposeCallback,
removeNode: utils.removeNode
}

utils.extend(coreUtils, {
setDomNodeChildrenFromArrayMapping,
filters: punchesFilters,
parseObjectLiteral,
unwrapObservable: unwrap,
peekObservable: peek,
domNodeDisposal
})

// Create the binding provider and default bindings.
const provider = new MultiProvider({
globals: utils.options.bindingGlobals,
providers: [
new AttributeMustacheProvider(),
new TextMustacheProvider(),
new ComponentProvider(),
new DataBindProvider(),
new VirtualProvider(),
new AttributeProvider()
import { functionRewrite } from 'tko.utils.functionRewrite'

const builder = new Builder({
filters,
provider: new MultiProvider({
providers: [
new AttributeMustacheProvider(),
new TextMustacheProvider(),
new ComponentProvider(),
new DataBindProvider(),
new VirtualProvider(),
new AttributeProvider()
]
}),
bindings: [
coreBindings,
templateBindings,
ifBindings,
foreachBindings,
componentBindings,
{ each: foreachBindings.foreach }
]
})

utils.options.bindingProviderInstance = provider

provider.bindingHandlers.set(coreBindings)
provider.bindingHandlers.set(templateBindings)
provider.bindingHandlers.set(ifBindings)
provider.bindingHandlers.set(foreachBindings)
provider.bindingHandlers.set({ each: foreachBindings.foreach })
provider.bindingHandlers.set(componentBindings)

const knockoutInstance = {
// --- Top-level ---
version: '{{VERSION}}',
options: utils.options,

extenders: extenders,
filters: utils.options.filters,
Component: components.ComponentABC,

// --- Utilities ---
cleanNode: utils.cleanNode,
memoization: utils.memoization,
removeNode: utils.removeNode,
tasks: utils.tasks,
utils: coreUtils,
dependencyDetection,
computedContext: dependencyDetection,
ignoreDependencies: dependencyDetection.ignore,
selectExtensions: utils.selectExtensions,

// -- Observable ---
isObservable,
isSubscribable,
isWriteableObservable,
isWritableObservable: isWriteableObservable,
observable,
observableArray,
isObservableArray,
peek,
subscribable,
unwrap,
toJS,
toJSON,

// ... Computed ...
computed,
dependentObservable: computed,
isComputed,
isPureComputed,
pureComputed,
when: when,

// --- Templates ---
nativeTemplateEngine,
renderTemplate,
setTemplateEngine,
templateEngine,
templateSources: { domElement, anonymousTemplate },

// --- Binding ---
applyBindingAccessorsToNode,
applyBindings,
applyBindingsToDescendants,
applyBindingsToNode,
bindingHandlers: provider.bindingHandlers,
bindingProvider: provider,
contextFor,
dataFor,
getBindingHandler,
BindingHandler,
AsyncBindingHandler,
virtualElements: utils.virtualElements,
domNodeDisposal: coreUtils.domNodeDisposal,

// --- Components ---
components
}

utils.options.knockoutInstance = knockoutInstance
utils.options.bindingStringPreparsers = [functionRewrite]

// Expose the API.
export default knockoutInstance
export default builder.create({
version: '{{ VERSION }}',
components,
bindingStringPreparsers: [functionRewrite],
Component: components.ComponentABC
})
41 changes: 41 additions & 0 deletions packages/tko.builder/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"name": "tko",
"version": "4.0.0-alpha4a",
"description": "The TKO.js Javascript Library",
"main": "dist/tko.js",
"repository": "git@github.com:knockout/tko",
"author": "The Knockout Team",
"license": "MIT",
"devDependencies": {
"tko.bind": "^4.0.0-alpha4",
"tko.computed": "^4.0.0-alpha4",
"tko.filter.punches": "^4.0.0-alpha4",
"tko.lifecycle": "^4.0.0-alpha4",
"tko.observable": "^4.0.0-alpha4",
"tko.utils": "^4.0.0-alpha4",
"tko.utils.parser": "^4.0.0-alpha4",
"tslib": "^1.8.0"
},
"__about__shared.package.json": "These properties are copied into all packages/*/package.json. Run `yarn repackage`",
"standard": {
"globals": [
"assert",
"jasmine",
"beforeEach",
"before",
"after",
"afterEach",
"it",
"iit",
"xit",
"expect",
"describe",
"ddescribe"
]
},
"scripts": {
"test": "karma start ../../karma.conf.js --once",
"build": "rollup -c ../../rollup.config.js",
"watch": "karma start ../../karma.conf.js"
}
}
Loading

0 comments on commit de06cfb

Please sign in to comment.