From 4251bef1c26e0e968c916b4e9de620b3041295a5 Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Tue, 22 Jun 2021 21:22:14 -0400 Subject: [PATCH 01/15] sites) add minimum-esm site --- sites/minimum-esm/Makefile | 32 +++++++++++++++++++++ sites/minimum-esm/README.md | 9 ++++++ sites/minimum-esm/src/entry.tsx | 49 ++++++++++++++++++++++++++++++++ sites/minimum-esm/src/index.d.ts | 7 +++++ sites/minimum-esm/src/index.html | 8 ++++++ sites/minimum-esm/tsconfig.json | 21 ++++++++++++++ 6 files changed, 126 insertions(+) create mode 100644 sites/minimum-esm/Makefile create mode 100644 sites/minimum-esm/README.md create mode 100644 sites/minimum-esm/src/entry.tsx create mode 100644 sites/minimum-esm/src/index.d.ts create mode 100644 sites/minimum-esm/src/index.html create mode 100644 sites/minimum-esm/tsconfig.json diff --git a/sites/minimum-esm/Makefile b/sites/minimum-esm/Makefile new file mode 100644 index 000000000..8db57ef36 --- /dev/null +++ b/sites/minimum-esm/Makefile @@ -0,0 +1,32 @@ + +NODE_BIN := ../../node_modules/.bin +ESBUILD := $(NODE_BIN)/esbuild +PORT := 8080 + +dist := dist/entry.js dist/index.html + +all: build + +src/index.html: + +dist/entry.js: src/entry.tsx + $(ESBUILD) src/entry.tsx \ + --bundle \ + --sourcemap \ + --metafile=dist/meta.json \ + --outfile=dist/entry.js + +dist/index.html: src/index.html + cp src/index.html dist/index.html + +.PHONY: BUILD +build: dist/index.html dist/entry.js + +.PHONY: serve +serve: + $(ESBUILD) src/entry.tsx \ + --bundle \ + --sourcemap \ + --metafile=dist/meta.json \ + --servedir=dist --serve=$(PORT) \ + --outfile=dist/entry.js diff --git a/sites/minimum-esm/README.md b/sites/minimum-esm/README.md new file mode 100644 index 000000000..6b1806bc7 --- /dev/null +++ b/sites/minimum-esm/README.md @@ -0,0 +1,9 @@ +# Sample Site + +This is a trival setup, exhibiting a minimal configuration. + +## Startup + +```bash +$ make serve +``` diff --git a/sites/minimum-esm/src/entry.tsx b/sites/minimum-esm/src/entry.tsx new file mode 100644 index 000000000..eae661dd0 --- /dev/null +++ b/sites/minimum-esm/src/entry.tsx @@ -0,0 +1,49 @@ +import { Builder } from '@tko/builder' + +import { ComponentProvider } from '@tko/provider.component' +import { MultiProvider } from '@tko/provider.multi' +import { + NativeProvider +} from '@tko/provider.native' + +import { bindings as coreBindings } from '@tko/binding.core' +import { bindings as componentBindings } from '@tko/binding.component' + +import { filters } from '@tko/filter.punches' + +import components from '@tko/utils.component' +import { createElement, Fragment } from '@tko/utils.jsx' + + +const builder = new Builder({ + filters, + provider: new MultiProvider({ + providers: [ + new ComponentProvider(), + new NativeProvider(), + ] + }), + bindings: [ + coreBindings, + componentBindings, + ], + extenders: [], + options: {}, +}) + +const tko = builder.create({ + jsx: { + createElement, + Fragment, + }, + components, + version: 'live', + Component: components.ComponentABC, +}) + +class TestComponent extends components.ComponentABC { + get template () { return hello ${new Date().toISOString()} } +} +TestComponent.register() + +tko.applyBindings() diff --git a/sites/minimum-esm/src/index.d.ts b/sites/minimum-esm/src/index.d.ts new file mode 100644 index 000000000..cf976b873 --- /dev/null +++ b/sites/minimum-esm/src/index.d.ts @@ -0,0 +1,7 @@ + +declare namespace JSX { + interface IntrinsicElements { + [elemName: string]: any; + } +} + diff --git a/sites/minimum-esm/src/index.html b/sites/minimum-esm/src/index.html new file mode 100644 index 000000000..397d62dda --- /dev/null +++ b/sites/minimum-esm/src/index.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/sites/minimum-esm/tsconfig.json b/sites/minimum-esm/tsconfig.json new file mode 100644 index 000000000..ef9e0dee0 --- /dev/null +++ b/sites/minimum-esm/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "downlevelIteration": true, + "target": "ES2015", + "module": "ES2015", + "moduleResolution": "node", + "allowJs": true, + "importHelpers": true, + "strict": true, + "jsx": "react", + "jsxFactory": "tko.jsx.createElement", + "jsxFragmentFactory": "tko.jsx.Fragment", + "baseUrl": ".", + "paths": { + "*": [ + "*", + "../../packages/*", + ] + } + } +} From 85ec21b8202626c9d17cae1467c63f36e9d6f90a Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Tue, 22 Jun 2021 21:52:59 -0400 Subject: [PATCH 02/15] sites) add `site.mk` for common site targets --- sites/minimum-esm/Makefile | 32 +--------------------------- sites/www.tko.io/Makefile | 2 ++ tools/site.mk | 43 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 31 deletions(-) create mode 100644 sites/www.tko.io/Makefile create mode 100644 tools/site.mk diff --git a/sites/minimum-esm/Makefile b/sites/minimum-esm/Makefile index 8db57ef36..8b7e4f345 100644 --- a/sites/minimum-esm/Makefile +++ b/sites/minimum-esm/Makefile @@ -1,32 +1,2 @@ -NODE_BIN := ../../node_modules/.bin -ESBUILD := $(NODE_BIN)/esbuild -PORT := 8080 - -dist := dist/entry.js dist/index.html - -all: build - -src/index.html: - -dist/entry.js: src/entry.tsx - $(ESBUILD) src/entry.tsx \ - --bundle \ - --sourcemap \ - --metafile=dist/meta.json \ - --outfile=dist/entry.js - -dist/index.html: src/index.html - cp src/index.html dist/index.html - -.PHONY: BUILD -build: dist/index.html dist/entry.js - -.PHONY: serve -serve: - $(ESBUILD) src/entry.tsx \ - --bundle \ - --sourcemap \ - --metafile=dist/meta.json \ - --servedir=dist --serve=$(PORT) \ - --outfile=dist/entry.js +include ../../tools/site.mk diff --git a/sites/www.tko.io/Makefile b/sites/www.tko.io/Makefile new file mode 100644 index 000000000..8b7e4f345 --- /dev/null +++ b/sites/www.tko.io/Makefile @@ -0,0 +1,2 @@ + +include ../../tools/site.mk diff --git a/tools/site.mk b/tools/site.mk new file mode 100644 index 000000000..34e99f37e --- /dev/null +++ b/tools/site.mk @@ -0,0 +1,43 @@ +# +# Site-related make targets +# + + +NODE_BIN := ../../node_modules/.bin +ESBUILD := $(NODE_BIN)/esbuild +PORT := 8080 + +dist := dist/entry.js dist/index.html + +all: build + +dist/: + mkdir -p dist + +src/index.html: + +dist/entry.js: src/entry.tsx dist/ + $(ESBUILD) src/entry.tsx \ + --bundle \ + --sourcemap \ + --metafile=dist/meta.json \ + --outfile=dist/entry.js + +dist/index.html: src/index.html dist/ + ln -sf ../src/index.html dist/index.html + +.PHONY: BUILD +build: dist/index.html dist/entry.js + +.PHONY: clean +clean: + rm -rf dist/* + +.PHONY: serve +serve: build + $(ESBUILD) src/entry.tsx \ + --bundle \ + --sourcemap \ + --metafile=dist/meta.json \ + --servedir=dist --serve=$(PORT) \ + --outfile=dist/entry.js From 04e8e9eb816198ae709e4f2532055865e5becdf9 Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Tue, 22 Jun 2021 21:54:17 -0400 Subject: [PATCH 03/15] sites) add rough-in for www.tko.io site --- sites/www.tko.io/src/TkoComponent.tsx | 5 +++ sites/www.tko.io/src/entry.tsx | 5 +++ sites/www.tko.io/src/index.html | 8 +++++ sites/www.tko.io/src/tko.ts | 48 +++++++++++++++++++++++++++ sites/www.tko.io/src/www-tko-io.tsx | 8 +++++ sites/www.tko.io/tsconfig.json | 21 ++++++++++++ 6 files changed, 95 insertions(+) create mode 100644 sites/www.tko.io/src/TkoComponent.tsx create mode 100644 sites/www.tko.io/src/entry.tsx create mode 100644 sites/www.tko.io/src/index.html create mode 100644 sites/www.tko.io/src/tko.ts create mode 100644 sites/www.tko.io/src/www-tko-io.tsx create mode 100644 sites/www.tko.io/tsconfig.json diff --git a/sites/www.tko.io/src/TkoComponent.tsx b/sites/www.tko.io/src/TkoComponent.tsx new file mode 100644 index 000000000..cdb7e4ea1 --- /dev/null +++ b/sites/www.tko.io/src/TkoComponent.tsx @@ -0,0 +1,5 @@ +import { tko } from './tko' + +export abstract class TkoComponent extends tko.components.ComponentABC { + get template () { return hello ${new Date().toISOString()} } +} diff --git a/sites/www.tko.io/src/entry.tsx b/sites/www.tko.io/src/entry.tsx new file mode 100644 index 000000000..ee09a0779 --- /dev/null +++ b/sites/www.tko.io/src/entry.tsx @@ -0,0 +1,5 @@ +import { tko } from './tko' + +import './www-tko-io' + +tko.applyBindings() diff --git a/sites/www.tko.io/src/index.html b/sites/www.tko.io/src/index.html new file mode 100644 index 000000000..602aead62 --- /dev/null +++ b/sites/www.tko.io/src/index.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/sites/www.tko.io/src/tko.ts b/sites/www.tko.io/src/tko.ts new file mode 100644 index 000000000..10068d52d --- /dev/null +++ b/sites/www.tko.io/src/tko.ts @@ -0,0 +1,48 @@ +import { Builder } from '@tko/builder' + +import { ComponentProvider } from '@tko/provider.component' +import { MultiProvider } from '@tko/provider.multi' +import { + NativeProvider +} from '@tko/provider.native' + +import { bindings as coreBindings } from '@tko/binding.core' +import { bindings as componentBindings } from '@tko/binding.component' + +import { filters } from '@tko/filter.punches' + +import components from '@tko/utils.component' +import { createElement, Fragment } from '@tko/utils.jsx' + + +const builder = new Builder({ + filters, + provider: new MultiProvider({ + providers: [ + new ComponentProvider(), + new NativeProvider(), + ] + }), + bindings: [ + coreBindings, + componentBindings, + ], + extenders: [], + options: {}, +}) + +export const tko = builder.create({ + jsx: { + createElement, + Fragment, + }, + components, + version: 'live', + Component: components.ComponentABC, +}) + +Object.assign(window, { + TF: tko.jsx.createElement, + TFF: tko.jsx.Fragment, +}) + diff --git a/sites/www.tko.io/src/www-tko-io.tsx b/sites/www.tko.io/src/www-tko-io.tsx new file mode 100644 index 000000000..e9f53fe3b --- /dev/null +++ b/sites/www.tko.io/src/www-tko-io.tsx @@ -0,0 +1,8 @@ +import {TkoComponent} from './TkoComponent' + +class WwwTkoIo extends TkoComponent { + get template () { return hello ${new Date().toISOString()} } +} + +WwwTkoIo.register() + diff --git a/sites/www.tko.io/tsconfig.json b/sites/www.tko.io/tsconfig.json new file mode 100644 index 000000000..55c6f98a1 --- /dev/null +++ b/sites/www.tko.io/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "downlevelIteration": true, + "target": "ES2015", + "module": "ES2015", + "moduleResolution": "node", + "allowJs": true, + "importHelpers": true, + "strict": true, + "jsx": "react", + "jsxFactory": "TF", + "jsxFragmentFactory": "TFF", + "baseUrl": ".", + "paths": { + "*": [ + "*", + "../../packages/*" + ] + } + } +} From 0131fbe4136291874cbcdd2001929646039dc034 Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Tue, 22 Jun 2021 21:54:37 -0400 Subject: [PATCH 04/15] remove unused tko.io/ files --- tko.io/.gitignore | 1 - tko.io/app.yaml | 42 -- tko.io/make.js | 110 ---- tko.io/package.json | 18 - tko.io/yarn.lock | 1311 ------------------------------------------- 5 files changed, 1482 deletions(-) delete mode 100644 tko.io/.gitignore delete mode 100644 tko.io/app.yaml delete mode 100755 tko.io/make.js delete mode 100644 tko.io/package.json delete mode 100644 tko.io/yarn.lock diff --git a/tko.io/.gitignore b/tko.io/.gitignore deleted file mode 100644 index 378eac25d..000000000 --- a/tko.io/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/tko.io/app.yaml b/tko.io/app.yaml deleted file mode 100644 index fd142e2ef..000000000 --- a/tko.io/app.yaml +++ /dev/null @@ -1,42 +0,0 @@ -# -# This is the Google App Engine standard config. -# -# Deploy with the `gcloud` tool using: -# -# $ gcloud app deploy --project tko-io . -# -# Test with `dev_appserver.py .` -# -runtime: python27 -api_version: 1 -threadsafe: true - -default_expiration: 30s - -handlers: - -- url: / - secure: always - static_files: build/index.html - upload: build/index.html - # http_headers: ... - -- url: /3to4 - secure: always - static_files: build/3to4.html - upload: build/3to4.html - -- url: /(.*\.js)$ - secure: always - static_files: src/\1 - upload: src/.*$ - -- url: / - secure: always - static_dir: build/ - - -skip_files: - - node_modules - - ".*.yaml" - - ".*.lock" diff --git a/tko.io/make.js b/tko.io/make.js deleted file mode 100755 index 02e0a3a85..000000000 --- a/tko.io/make.js +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs-extra') -const yaml = require('js-yaml') -const pug = require('pug') -const debounce = require('lodash.debounce') -const hljs = require('highlight.js') -const {spawn} = require('child_process') -const {argv} = process - -function highlight (str, lang) { - if (!lang) { return '' } - if (hljs.getLanguage(lang)) { - try { - return hljs.highlight(lang, str).value - } catch (__) {} - } - return '' -} - -const md = require('markdown-it')({ - html: true, - linkify: true, - typographer: true, - highlight -}) - -const ENC = {encoding: 'utf8'} - -function * genHtmlIncludes ({includes}, htmlSettings, config) { - for (const relPath of includes || []) { - const sourcePath = '../packages/' + relPath - console.log(' | ', sourcePath) - const source = fs.readFileSync(sourcePath, ENC) - if (sourcePath.endsWith('.md')) { - yield ` - ${md.render(source)}` - } else if (sourcePath.endsWith('.pug')) { - yield pug.render(source, Object.assign({}, htmlSettings, config)) - } else { - throw new Error(`Bad extension: ${sourcePath} (not .md or .pug)`) - } - } -} - -function * genSections (htmlConfig, config) { - for (const section of htmlConfig.sections) { - console.log(` |- ${section.title}`) - section.html = Array.from(genHtmlIncludes(section, htmlConfig, config)).join('\n') - yield section - } -} - -function makeHtml({htmlSettings, scripts, links, styles}, config) { - /** - * Make build/index.html - */ - console.log(` Making ${htmlSettings.dest}`) - Object.assign(htmlSettings, {scripts, links, styles}) // add links + scripts - const sections = Array.from(genSections(htmlSettings, config)) - const locals = Object.assign(htmlSettings, {sections}) - const html = pug.renderFile('src/index.pug', locals) - fs.writeFileSync(htmlSettings.dest, html) -} - -function make () { - console.log('👲 Starting at ', new Date()) - - /** - * Make build/ - */ - fs.mkdirs('build/') - - const styles = fs.readFileSync('src/tko.css') - const config = yaml.load(fs.readFileSync('./settings.yaml', ENC)) - const {scripts, links} = config - - makeHtml({ htmlSettings: config.index, styles, scripts, links }, config) - makeHtml({ htmlSettings: config['3to4'], styles, scripts, links }, config) - - console.log("🏁 Complete.", new Date()) - /** - * Make Legacy Javascript - */ - // console.log('Making build/tko-io.js') - // fs.copySync('src/tko-io.js', 'build/tko-io.js') -} - -if (argv.includes('-w')) { - const ignored = '' // /(^|[\/\\])(\..|build\/*)/ - require('chokidar') - .watch(['settings.yaml', 'src', '../packages'], {ignored}) - .on('all', debounce(make, 150)) -} else { - console.log(` - Usage: make.js [-w] [-s] - - -w Watch and rebuild on change - -s Start the server with 'dev_appserver.py .' (from Google Cloud) - - Deploy with: - - $ gcloud app deploy --project tko-io . - `) - make() -} - -if (argv.includes('-s')) { - spawn('dev_appserver.py', ['.'], {stdio: 'inherit'}) -} diff --git a/tko.io/package.json b/tko.io/package.json deleted file mode 100644 index 138f0ee4d..000000000 --- a/tko.io/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "tko.io", - "version": "1.0.0", - "description": "Landing page for tko.io", - "main": "index.js", - "author": "Knockout Team", - "license": "MIT", - "dependencies": { - "chokidar": "^1.7.0", - "fs-extra": "^4.0.2", - "gray-matter": "^3.1.1", - "highlight.js": "^9.12.0", - "js-yaml": "^3.10.0", - "lodash.debounce": "^4.0.8", - "markdown-it": "^8.4.0", - "pug": "^2.0.0-rc.4" - } -} diff --git a/tko.io/yarn.lock b/tko.io/yarn.lock deleted file mode 100644 index 587d2d0c5..000000000 --- a/tko.io/yarn.lock +++ /dev/null @@ -1,1311 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - -acorn-globals@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" - dependencies: - acorn "^4.0.4" - -acorn@^3.1.0, acorn@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^4.0.4, acorn@~4.0.2: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - -are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-flatten@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - -aws4@^1.2.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" - -binary-extensions@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - -brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -character-parser@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" - dependencies: - is-regex "^1.0.3" - -chokidar@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -clean-css@^3.3.0: - version "3.4.28" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff" - dependencies: - commander "2.8.x" - source-map "0.4.x" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - dependencies: - delayed-stream "~1.0.0" - -commander@2.8.x: - version "2.8.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" - dependencies: - graceful-readlink ">= 1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - -constantinople@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.0.tgz#7569caa8aa3f8d5935d62e1fa96f9f702cd81c79" - dependencies: - acorn "^3.1.0" - is-expression "^2.0.1" - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -debug@^2.2.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -decamelize@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -detect-libc@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.2.tgz#71ad5d204bf17a6a6ca8f450c61454066ef461e1" - -doctypes@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" - -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - -entities@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" - -esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extsprintf@1.3.0, extsprintf@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -for-in@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - dependencies: - for-in "^1.0.1" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -fs-extra@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.36" - -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -function-bind@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" - -glob@^7.0.5: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - -gray-matter@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-3.1.1.tgz#101f80d9e69eeca6765cdce437705b18f40876ac" - dependencies: - extend-shallow "^2.0.1" - js-yaml "^3.10.0" - kind-of "^5.0.2" - strip-bom-string "^1.0.0" - -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" - dependencies: - function-bind "^1.0.2" - -hawk@3.1.3, hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -highlight.js@^9.12.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" - -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-expression@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-2.1.0.tgz#91be9d47debcfef077977e9722be6dcfb4465ef0" - dependencies: - acorn "~3.3.0" - object-assign "^4.0.1" - -is-expression@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f" - dependencies: - acorn "~4.0.2" - object-assign "^4.0.1" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - -is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - -is-regex@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - dependencies: - has "^1.0.1" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -js-stringify@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" - -js-yaml@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -jstransformer@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" - dependencies: - is-promise "^2.0.0" - promise "^7.0.1" - -kind-of@^3.0.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -linkify-it@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" - dependencies: - uc.micro "^1.0.1" - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -markdown-it@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d" - dependencies: - argparse "^1.0.7" - entities "~1.1.1" - linkify-it "^2.0.0" - mdurl "^1.0.1" - uc.micro "^1.0.3" - -mdurl@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -mime-db@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" - -mime-types@^2.1.12, mime-types@~2.1.7: - version "2.1.17" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" - dependencies: - mime-db "~1.30.0" - -minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -"mkdirp@>=0.5 0", mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -nan@^2.3.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" - -node-pre-gyp@^0.6.36: - version "0.6.39" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" - dependencies: - detect-libc "^1.0.2" - hawk "3.1.3" - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-path@^2.0.0, normalize-path@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -once@^1.3.0, once@^1.3.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -promise@^7.0.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - dependencies: - asap "~2.0.3" - -pug-attrs@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.2.tgz#8be2b2225568ffa75d1b866982bff9f4111affcb" - dependencies: - constantinople "^3.0.1" - js-stringify "^1.0.1" - pug-runtime "^2.0.3" - -pug-code-gen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.0.tgz#96aea39a9e62f1ec5d2b6a5b42a29d528c70b43d" - dependencies: - constantinople "^3.0.1" - doctypes "^1.1.0" - js-stringify "^1.0.1" - pug-attrs "^2.0.2" - pug-error "^1.3.2" - pug-runtime "^2.0.3" - void-elements "^2.0.1" - with "^5.0.0" - -pug-error@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.2.tgz#53ae7d9d29bb03cf564493a026109f54c47f5f26" - -pug-filters@^2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-2.1.5.tgz#66bf6e80d97fbef829bab0aa35eddff33fc964f3" - dependencies: - clean-css "^3.3.0" - constantinople "^3.0.1" - jstransformer "1.0.0" - pug-error "^1.3.2" - pug-walk "^1.1.5" - resolve "^1.1.6" - uglify-js "^2.6.1" - -pug-lexer@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-3.1.0.tgz#fd087376d4a675b4f59f8fef422883434e9581a2" - dependencies: - character-parser "^2.1.1" - is-expression "^3.0.0" - pug-error "^1.3.2" - -pug-linker@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.3.tgz#25f59eb750237f0368e59c3379764229c0189c41" - dependencies: - pug-error "^1.3.2" - pug-walk "^1.1.5" - -pug-load@^2.0.9: - version "2.0.9" - resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.9.tgz#ee217c914cc1d9324d44b86c32d1df241d36de7a" - dependencies: - object-assign "^4.1.0" - pug-walk "^1.1.5" - -pug-parser@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-4.0.0.tgz#c9f52322e4eabe4bf5beeba64ed18373bb627801" - dependencies: - pug-error "^1.3.2" - token-stream "0.0.1" - -pug-runtime@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.3.tgz#98162607b0fce9e254d427f33987a5aee7168bda" - -pug-strip-comments@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.2.tgz#d313afa01bcc374980e1399e23ebf2eb9bdc8513" - dependencies: - pug-error "^1.3.2" - -pug-walk@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.5.tgz#90e943acbcf7021e6454cf1b32245891cba6f851" - -pug@^2.0.0-rc.4: - version "2.0.0-rc.4" - resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.0-rc.4.tgz#b7b08f6599bd5302568042b7436984fb28c80a13" - dependencies: - pug-code-gen "^2.0.0" - pug-filters "^2.1.5" - pug-lexer "^3.1.0" - pug-linker "^3.0.3" - pug-load "^2.0.9" - pug-parser "^4.0.0" - pug-runtime "^2.0.3" - pug-strip-comments "^1.0.2" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -rc@^1.1.7: - version "1.2.2" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - dependencies: - is-equal-shallow "^0.1.3" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - -resolve@^1.1.6: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" - dependencies: - path-parse "^1.0.5" - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - -rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - -safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -semver@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - -source-map@0.4.x: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - -source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - dependencies: - safe-buffer "~5.1.0" - -stringstream@~0.0.4: - version "0.0.6" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-bom-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - -tar-pack@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" - dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - -token-stream@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" - -tough-cookie@~2.3.0: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" - dependencies: - punycode "^1.4.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - -uc.micro@^1.0.1, uc.micro@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.3.tgz#7ed50d5e0f9a9fb0a573379259f2a77458d50192" - -uglify-js@^2.6.1: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - -universalify@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -uuid@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -void-elements@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - -wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" - dependencies: - string-width "^1.0.2" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -with@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe" - dependencies: - acorn "^3.1.0" - acorn-globals "^3.0.0" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" From 3438196f30595234678febf2cc83ebee718c050a Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Tue, 22 Jun 2021 22:05:38 -0400 Subject: [PATCH 05/15] sites/tko.io) add jss import --- sites/www.tko.io/src/TkoComponent.tsx | 3 +++ sites/www.tko.io/src/index.html | 2 +- tools/site.mk | 2 ++ tsconfig.json | 3 ++- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/sites/www.tko.io/src/TkoComponent.tsx b/sites/www.tko.io/src/TkoComponent.tsx index cdb7e4ea1..4643dc554 100644 --- a/sites/www.tko.io/src/TkoComponent.tsx +++ b/sites/www.tko.io/src/TkoComponent.tsx @@ -1,3 +1,6 @@ +import jss from 'https://cdn.jsdelivr.net/npm/jss@10.6.0/dist/jss.bundle.min.js' +import preset from "https://cdn.jsdelivr.net/npm/jss-preset-default@10.6.0/dist/jss-preset-default.bundle.js" + import { tko } from './tko' export abstract class TkoComponent extends tko.components.ComponentABC { diff --git a/sites/www.tko.io/src/index.html b/sites/www.tko.io/src/index.html index 602aead62..9b4effb5d 100644 --- a/sites/www.tko.io/src/index.html +++ b/sites/www.tko.io/src/index.html @@ -3,6 +3,6 @@ - + diff --git a/tools/site.mk b/tools/site.mk index 34e99f37e..ea77d6cc2 100644 --- a/tools/site.mk +++ b/tools/site.mk @@ -19,6 +19,7 @@ src/index.html: dist/entry.js: src/entry.tsx dist/ $(ESBUILD) src/entry.tsx \ --bundle \ + --format=esm \ --sourcemap \ --metafile=dist/meta.json \ --outfile=dist/entry.js @@ -37,6 +38,7 @@ clean: serve: build $(ESBUILD) src/entry.tsx \ --bundle \ + --format=esm \ --sourcemap \ --metafile=dist/meta.json \ --servedir=dist --serve=$(PORT) \ diff --git a/tsconfig.json b/tsconfig.json index 88fad2949..82a99106b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,6 +21,7 @@ "packages/*", "builds/*" ] - } + }, + "jsx": "preserve" } } From 80fcac0388d5a77cf4abf6305e556d78b169ea8c Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Tue, 22 Jun 2021 22:17:26 -0400 Subject: [PATCH 06/15] sites) remove balance of `tko.io` code --- tko.io/settings.yaml | 428 ------------------------------------------- tko.io/src/index.pug | 31 ---- tko.io/src/tko-io.js | 118 ------------ tko.io/src/tko.css | 285 ---------------------------- 4 files changed, 862 deletions(-) delete mode 100644 tko.io/settings.yaml delete mode 100644 tko.io/src/index.pug delete mode 100644 tko.io/src/tko-io.js delete mode 100644 tko.io/src/tko.css diff --git a/tko.io/settings.yaml b/tko.io/settings.yaml deleted file mode 100644 index f950678e4..000000000 --- a/tko.io/settings.yaml +++ /dev/null @@ -1,428 +0,0 @@ - -links: -- href: https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css - integrity: sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M - -- href: https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css - integrity: sha256-akwTLZec/XAFvgYgVH1T5/369lhA2Efr22xzCNl1nHs= - -- href: https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css - integrity: sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN - -scripts: -- src: https://unpkg.com/tko@4.0.0-alpha4a/dist/tko.js - integrity: sha384-MJ/drYzT5bwJWdFxjHRDTJHTNccRZb70G7rQ9GeBnrSW/ssr3+A0kA1Ul7IHBZ/Y - crossorigin: anonymous - -- src: https://production-assets.codepen.io/assets/embed/ei.js - async: async - -- src: tko-io.js - type: application/javascript - async: async - -3to4: - dest: build/3to4.html - sections: - - title: Knockout 3 to 4 Guide - includes: - - tko/docs/3to4.md - -index: - dest: build/index.html - sections: - - title: Introduction - includes: - - tko/docs/intro.md - - tko/docs/books.pug - # - tko/docs/amd-loading.md - # - tko/docs/animated.md - # - tko/docs/api.md - # - tko/docs/browser-support.md - # - tko/docs/docs.md - # - tko/docs/fn.md - # - tko/docs/installation.md - # - tko/docs/intro.md - # - tko/docs/links.md - # - tko/docs/plugins.md - - # - title: Binding DOM and Javascript - # includes: - # - tko.bind/docs/binding-syntax.md - # - tko.bind/docs/binding-context.md - # - tko.provider.databind/docs/databind-parser.md - # - tko.provider/docs/provider.md - # - tko.bind/docs/binding-preprocessing.md - # - tko.bind/docs/custom-bindings.md - # - tko.bind/docs/custom-bindings-for-virtual-elements.md - # - tko.bind/docs/custom-bindings-controlling-descendant-bindings.md - # - tko.bind/docs/custom-bindings-disposal.md - - # - title: Included bindings - # includes: - # - tko.binding.core/docs/attr-binding.md - # - tko.binding.core/docs/checked-binding.md - # - tko.binding.core/docs/click-binding.md - # - tko.binding.core/docs/css-binding.md - # - tko.binding.core/docs/disable-binding.md - # - tko.binding.core/docs/enable-binding.md - # - tko.binding.core/docs/event-binding.md - # - tko.binding.core/docs/hasfocus-binding.md - # - tko.binding.core/docs/html-binding.md - # - tko.binding.core/docs/options-binding.md - # - tko.binding.core/docs/selectedOptions-binding.md - # - tko.binding.core/docs/style-binding.md - # - tko.binding.core/docs/submit-binding.md - # - tko.binding.core/docs/text-binding.md - # - tko.binding.core/docs/textInput-binding.md - # - tko.binding.core/docs/uniqueName-binding.md - # - tko.binding.core/docs/unobtrusive-event-handling.md - # - tko.binding.core/docs/value-binding.md - # - tko.binding.core/docs/visible-binding.md - # - tko.binding.if/docs/if-binding.md - # - tko.binding.if/docs/ifnot-binding.md - # - tko.binding.if/docs/index.md - # - tko.binding.if/docs/with-binding.md - # - tko.binding.template/docs/foreach-binding.md - # - tko.binding.template/docs/template-binding.md - - # - title: Observables - # includes: - # - tko.observable/docs/arraychange.md - # - tko.observable/docs/observableArrays.md - # - tko.observable/docs/observables.md - # - tko.observable/docs/rateLimit-observable.md - # - tko.observable/docs/extenders.md - # - tko.observable/docs/throttle-extender.md - # - tko/docs/json-data.md - - - # - title: Computed Observables - # includes: - # - tko.computed/docs/computed-dependency-tracking.md - # - tko.computed/docs/computed-pure.md - # - tko.computed/docs/computed-reference.md - # - tko.computed/docs/computed-writable.md - # - tko.computed/docs/computedObservables.md - - # - title: Components & Custom Tags - # includes: - # - tko.utils.component/docs/component-binding.md - # - tko.utils.component/docs/component-custom-elements.md - # - tko.utils.component/docs/component-loaders.md - # - tko.utils.component/docs/component-overview.md - # - tko.utils.component/docs/component-registration.md - - - # - title: Life Cycles - # includes: - # - tko.lifecycle/docs/life-cycle.md - - # - title: Plugins - - # - title: API - - -# The following can be auto-generated from `volumeInfo` via -# https://www.googleapis.com/books/v1/volumes/${id} -books: - - - title: Knockout.js - subtitle: Building Dynamic Client-Side Web Applications - authors: - - Jamie Munro - publisher: Oreilly & Associates Incorporated - publishedDate: '2015-01-03' - description: "

Use Knockout.js to design and build dynamic client-side web applications - that are extremely responsive and easy to maintain. This example-driven book shows - you how to use this lightweight JavaScript framework and its Model-View-ViewModel - (MVVM) pattern. You’ll learn how to build your own data bindings, extend the framework - with reusable functions, and work with a server to enhance your client-side application - with persistence. In the final chapter, you’ll build a shopping cart to see how - everything fits together.

If you’re a web developer with experience in - JavaScript, HTML, and CSS, you’re ready for Knockout.

  • Learn how to - create a ViewModel
  • Bind HTML data and attributes, and CSS classes and - styles
  • Understand data binding in Knockout’s context hierarchy
  • Use - properties that change dynamically through user interaction
  • Work with - forms by using several different bindings
  • Bind multiple ViewModels on - a single page
  • Extend or attach custom functions to observables
  • Perform - server-side interactions with jQuery
  • Map a JavaScript object or apply - JSON data to a new object
" - industryIdentifiers: - - type: ISBN_10 - identifier: '1491914319' - - type: ISBN_13 - identifier: '9781491914311' - readingModes: - text: false - image: false - pageCount: 86 - printedPageCount: 86 - dimensions: - height: 23.30 cm - width: 17.80 cm - thickness: 0.50 cm - printType: BOOK - categories: - - Computers / Programming Languages / JavaScript - - Computers / Internet / Application Development - - Computers / Web / Web Programming - maturityRating: NOT_MATURE - allowAnonLogging: false - contentVersion: preview-1.0.0 - imageLinks: - smallThumbnail: https://books.google.ca/books/content?id=ZPDnoQEACAAJ&printsec=frontcover&img=1&zoom=5&imgtk=AFLRE73xh8xZACPIjOtB8rD5RE06-ElVbzgtH5e0nmkyo0UjgGwBZweLwET2ieAFeO_E6k4vI1gqVVxyRWIhOlXmxrprvBuMm-oQigjlTEfm9M9bABMXNcxwZKRTZvvdUBkP14nJ6MIp&source=gbs_api - thumbnail: https://books.google.ca/books/content?id=ZPDnoQEACAAJ&printsec=frontcover&img=1&zoom=1&imgtk=AFLRE717dECAVjOpJblfNu0EPHVMBQmgOOan5rn21GWN2OQhSbPiehsljCYRsxdJQ1wcejFwt0wBmNnRraYQUHHWPqjrHJW0kRSrXjobRrKukJDD-hhmn5DWwNGA--8nQVITS2vbv8t6&source=gbs_api - language: en - previewLink: https://books.google.ca/books?id=ZPDnoQEACAAJ&hl=&source=gbs_api - infoLink: https://books.google.ca/books?id=ZPDnoQEACAAJ&hl=&source=gbs_api - canonicalVolumeLink: https://books.google.ca/books/about/Knockout_js.html?hl=&id=ZPDnoQEACAAJ - - - title: Asp.net Mvc 5 With Bootstrap and Knockout.js - subtitle: Building Dynamic, Responsive Web Applications - authors: - - Jamie Munro - publisher: O'Reilly Media, Incorporated - publishedDate: '2015-03-25' - description: "

Bring dynamic server-side web content and responsive web design - together to build websites that work and display well on any resolution, desktop - or mobile. With this practical book, you’ll learn how by combining the ASP.NET - MVC server-side language, the Bootstrap front-end framework, and Knockout.js—the - JavaScript implementation of the Model-View-ViewModel pattern.

Author Jamie - Munro introduces these and other related technologies by having you work with - sophisticated web forms. At the end of the book, experienced and aspiring web - developers alike will learn how to build a complete shopping cart that demonstrates - how these technologies interact with each other in a sleek, dynamic, and responsive - web application.

  • Build well-organized, easy-to-maintain web applications - by letting ASP.NET MVC 5, Bootstrap, and Knockout.js do the heavy lifting
  • -
  • Use ASP.NET MVC 5 to build server-side web applications, interact with a database, - and dynamically render HTML
  • Create responsive views with Bootstrap that - render on a variety of modern devices; you may never code with CSS again
  • -
  • Add Knockout.js to enhance responsive web design with snappy client-side interactions - driven by your server-side web application
" - industryIdentifiers: - - type: ISBN_10 - identifier: '1491914394' - - type: ISBN_13 - identifier: '9781491914397' - readingModes: - text: false - image: false - pageCount: 278 - printedPageCount: 278 - dimensions: - height: 23.30 cm - width: 17.80 cm - thickness: 1.30 cm - printType: BOOK - categories: - - Computers / Programming Languages / ASP.NET - - Computers / Web / General - - Computers / Web / Web Programming - maturityRating: NOT_MATURE - allowAnonLogging: false - contentVersion: preview-1.0.0 - imageLinks: - smallThumbnail: https://books.google.ca/books/content?id=try8oQEACAAJ&printsec=frontcover&img=1&zoom=5&imgtk=AFLRE71NgZ3twak4WXm7mMrpPXQwM5LLeI3zeLgpf4CSBir_nKmU0mZJoh6Z5JPwwrMk_WjQE_j04VenoDv3PBQAY0yCp4w_tW5TM4BjdModKb6BhbGfnYR0Qt1Qmn6SmtV6WDNhsqd2&source=gbs_api - thumbnail: https://books.google.ca/books/content?id=try8oQEACAAJ&printsec=frontcover&img=1&zoom=1&imgtk=AFLRE71KQ8fmuM2sSfN0TOooxRRz51cBqbN-oSufwl2TKH6qSzuzhI_Sarc_I5dMWgvbKB1SmWvA3IREW1ByGHSRAnTsybrM8B4LxCKEjavv9Zq2VxVBR3pweSl2UWtLe4Oav0m5_S5G&source=gbs_api - language: en - previewLink: https://books.google.ca/books?id=try8oQEACAAJ&hl=&source=gbs_api - infoLink: https://books.google.ca/books?id=try8oQEACAAJ&hl=&source=gbs_api - canonicalVolumeLink: https://books.google.ca/books/about/Asp_net_Mvc_5_With_Bootstrap_and_Knockou.html?hl=&id=try8oQEACAAJ - - - title: Getting Started with Knockout.js for .NET Developers - authors: - - Andrey Akinshin - publisher: Packt Publishing Ltd - publishedDate: '2015-05-27' - description: This book is intended for .NET developers who want to use the MVVM - design pattern to create powerful client-side JavaScript linked to server-side - C# logic. Basic experience with ASP.NET, Razor, and creating web applications - is needed. - industryIdentifiers: - - type: ISBN_10 - identifier: '1783984015' - - type: ISBN_13 - identifier: '9781783984015' - readingModes: - text: true - image: true - pageCount: 188 - printedPageCount: 188 - printType: BOOK - categories: - - Computers / Programming Languages / JavaScript - - Computers / Internet / Application Development - - Computers / Programming Languages / ASP.NET - maturityRating: NOT_MATURE - allowAnonLogging: false - contentVersion: 0.1.1.0.preview.3 - imageLinks: - smallThumbnail: https://books.google.ca/books/content?id=A-iuCQAAQBAJ&printsec=frontcover&img=1&zoom=5&edge=curl&imgtk=AFLRE700Ur2bUx3-xG1lJ7dhXYNiVxT0TlvFTCLKBDmCgsc2s1pOb_YVZxtI6jUwv53hOOAMnvSH2j3GR2NKExvEev5ALEK68u7oLyrUTxA-4j5iwmH7jEV0USmCSJE8PE6Nke2aUWS2&source=gbs_api - thumbnail: https://books.google.ca/books/content?id=A-iuCQAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&imgtk=AFLRE72rh8mTdqUnmJDjLIi1wLaea_frTsNMmKGHxTa2lID6PyuW_qNH_XzvkxqDVn3QEa2LfnTsvAmj6Vq_Wd73Zl4Q9_gIQA0lmIwRfK0Zr17YFHAV9uSx-9q5bTOOepwmRpwG3fbG&source=gbs_api - small: https://books.google.ca/books/content?id=A-iuCQAAQBAJ&printsec=frontcover&img=1&zoom=2&edge=curl&imgtk=AFLRE71Y9WVxVSRTitqbcivBU-WgoXUCyyPTuNsjEn7uZ9oFTc7vKFCJekAx1vMoo_v4lV59_ehco3Lt8vcJTalPxGaIZj57lo1DPirPBwRhGu_kuQtALcu0khKaKimJdwj4Sp_kEIEj&source=gbs_api - medium: https://books.google.ca/books/content?id=A-iuCQAAQBAJ&printsec=frontcover&img=1&zoom=3&edge=curl&imgtk=AFLRE71n9MaRenbMt90bPtLsyELGmzZq6U4KEbYvVRl7e_kLBJD0QvZ36lTpLejO3BJ4i3WWHL-hzY10ThMf3Qg5vSGD4q3TFoHU62YmSImkw1obbyph6p04pfMutEekEHYXO6d-Yuc9&source=gbs_api - large: https://books.google.ca/books/content?id=A-iuCQAAQBAJ&printsec=frontcover&img=1&zoom=4&edge=curl&imgtk=AFLRE73BGDB8DqNQzhG2wE-jBgyb-JdjNtiNXeqazRtGxQUwrTnpjHSg2G5LSXaassUEItKLZbyrt8myz6fLL2dl5M_xvH-tZosq63njrzlZYkJuJqjhj2ZxNItqlkYShzh6C0jMklxu&source=gbs_api - extraLarge: https://books.google.ca/books/content?id=A-iuCQAAQBAJ&printsec=frontcover&img=1&zoom=6&edge=curl&imgtk=AFLRE72ntS5Ll1QmMWu-A2hwAdGAqTBeG9EEYgH4qlIvCZH3p5gaoPJO4XxPTCKfOZVpVzPN0gTVAoTclhd6v1Yrmk5dvyfX4032bvw9fEp9HP1AemUNgCh_Cjtgzcwma2HlyVG9n7jh&source=gbs_api - language: en - previewLink: https://books.google.ca/books?id=A-iuCQAAQBAJ&hl=&source=gbs_api - infoLink: https://books.google.ca/books?id=A-iuCQAAQBAJ&hl=&source=gbs_api - canonicalVolumeLink: https://books.google.ca/books/about/Getting_Started_with_Knockout_js_for_NET.html?hl=&id=A-iuCQAAQBAJ - - - title: Mastering KnockoutJS - authors: - - Timothy Moran - publisher: Packt Publishing Ltd - publishedDate: '2014-11-26' - description: If you are an experienced JavaScript developer who is looking for new - tools to build web applications and get an understanding of core elements and - applications, this is the book for you. A basic knowledge of DOM, JavaScript, - and KnockoutJS is assumed. - industryIdentifiers: - - type: ISBN_10 - identifier: '1783981016' - - type: ISBN_13 - identifier: '9781783981014' - readingModes: - text: true - image: true - pageCount: 270 - printedPageCount: 489 - printType: BOOK - categories: - - Computers / Web / Design - - Computers / Programming Languages / JavaScript - - Computers / Internet / Application Development - maturityRating: NOT_MATURE - allowAnonLogging: true - contentVersion: 1.1.1.0.preview.3 - imageLinks: - smallThumbnail: https://books.google.ca/books/content?id=BoqbBQAAQBAJ&printsec=frontcover&img=1&zoom=5&edge=curl&imgtk=AFLRE71OGVtK3R39HAA3YPPexcAfdqkhHpK2qY2aqN2VwnuRbzJ5pWfCdPP_5p0KuPpod7GvQPI8wHYLAO8zssun_5j31mq5DrjNHULX097DHieG55cZxoF3R3nX4po7w9urdhoH83CT&source=gbs_api - thumbnail: https://books.google.ca/books/content?id=BoqbBQAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&imgtk=AFLRE70GS42a68O_DBLirScLduiYOUbk80jGntqSuuykg8RU1usaN5xdHy5Gl13pgEb2LdZYZ7b5sYtt4qmedX1FiwDuhbprf-X1ADNLHolZCVletNeHvoUvy0gFKPplc4eopBGHQnPG&source=gbs_api - small: https://books.google.ca/books/content?id=BoqbBQAAQBAJ&printsec=frontcover&img=1&zoom=2&edge=curl&imgtk=AFLRE72HypPfd5WB7VNPF5ovT8veIkql_616DZvT64hc5QPN8HhYCwP3F_XuPKD5D3euB0qJSau7qlRgyrp7VjnOACjsF10v9PekqqAw7fnOakZVnLGBJ3_tWNTl-GByWWxzTDi1rXrQ&source=gbs_api - medium: https://books.google.ca/books/content?id=BoqbBQAAQBAJ&printsec=frontcover&img=1&zoom=3&edge=curl&imgtk=AFLRE72bJ_PJ9fydBJC1A4b8n-F1x_VHnyeBSp9uRJTFYxQVcIyEO-hCcU51x-TmUrH4JOblv0J2g2OzpwxQK2oELDtzlE7qzE0a_D-KsqSqoFFPXLlPrL45r8fLLXvTRUubJNJy31No&source=gbs_api - large: https://books.google.ca/books/content?id=BoqbBQAAQBAJ&printsec=frontcover&img=1&zoom=4&edge=curl&imgtk=AFLRE70OgKfn3_48ic1MFdtFGQyoOBg8JHQwln0q5M1fKTYREAuugBOOtf5Q7m6_yD-DEN_n933Y5labtoiq-KM_BEWWukCgkOeJvT1Xr-XuATJrtXX9N-cq1Z-1qbfO3ncRz0yMo-_c&source=gbs_api - extraLarge: https://books.google.ca/books/content?id=BoqbBQAAQBAJ&printsec=frontcover&img=1&zoom=6&edge=curl&imgtk=AFLRE71OClJjx-G3VrcH4lga7AKeiw0CGOSwyAvjxfZ8ns3TKv_o8SLzY_p3_e5Q8kJgiVXA1GWpNT-kWgwNwHa5BYsVHbF5DXlGpqyLGxOT8fOXBlsBr8e_H375DucdcSP-0v7L1jF8&source=gbs_api - language: en - previewLink: https://books.google.ca/books?id=BoqbBQAAQBAJ&hl=&source=gbs_api - infoLink: https://books.google.ca/books?id=BoqbBQAAQBAJ&hl=&source=gbs_api - canonicalVolumeLink: https://books.google.ca/books/about/Mastering_KnockoutJS.html?hl=&id=BoqbBQAAQBAJ - - - title: Web App Testing Using Knockout.JS - authors: - - Roberto Messora - publisher: Packt Publishing Ltd - publishedDate: '2014-11-17' - description: If you are a JavaScript developer, beginner, or an expert who wants - to improve quality standards in terms of solutions design and functional verification, - this book is for you. Basic understanding of web development, HTML, and JavaScript - is required. - industryIdentifiers: - - type: ISBN_10 - identifier: '1783982853' - - type: ISBN_13 - identifier: '9781783982851' - readingModes: - text: true - image: true - pageCount: 154 - printedPageCount: 237 - printType: BOOK - categories: - - Computers / Software Development & Engineering / Quality Assurance & Testing - - Computers / Programming Languages / JavaScript - - Computers / Web / Web Programming - averageRating: 5 - ratingsCount: 2 - maturityRating: NOT_MATURE - allowAnonLogging: false - contentVersion: 1.1.1.0.preview.3 - imageLinks: - smallThumbnail: https://books.google.ca/books/content?id=dZN1BQAAQBAJ&printsec=frontcover&img=1&zoom=5&edge=curl&imgtk=AFLRE70A3vdwml0dXDKn1YCWpz8n0p8IKHaCN6FnhytFUt7ZiwPTttCa3_2-Q6ZRyyeCrTzWd3AvkTSQwvO31hHUZjEbUVKlNij50crBaQerevytbQWF6ZMvTW6qxlFH-DfN-AvUv6e2&source=gbs_api - thumbnail: https://books.google.ca/books/content?id=dZN1BQAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&imgtk=AFLRE71zzDoAJ8_68JqPI9sZ3Tlvyhyqxiyi_z0QwpVpjChRp5YC3bKNGiUBlDLThbtmQ3uIdVes5uGumrDrmUPlvGA_3PSqev9ZbCwthmLIjwEisbAwI1z2nJNzqwSHb7b-8uEekpvB&source=gbs_api - small: https://books.google.ca/books/content?id=dZN1BQAAQBAJ&printsec=frontcover&img=1&zoom=2&edge=curl&imgtk=AFLRE71Bq-gmv0FqD2RAIGkqGsnAMEI2VSAlzOme8QiPTpwA09b16Xx9fwBL7WAHIONiyVnFu6iACEO9SVQqZDGf9l56_gTMChhENAXWnM_ZnV5l-K4ouOHjqhAzx61yzxdj2OgmS7Bl&source=gbs_api - medium: https://books.google.ca/books/content?id=dZN1BQAAQBAJ&printsec=frontcover&img=1&zoom=3&edge=curl&imgtk=AFLRE72glYr_QFUGY7Xc2cBVMa1kXnEaRIn5W2ULqSu6McZlyOZLXhZ1Aw2EYxWmfIzkpr9Le6d8D0AmMCP2YI8RRAAkmrrtQxTO3ow44Gf_kINC2GIrZtLywg9ul7tGgtJNdqMLyfWi&source=gbs_api - large: https://books.google.ca/books/content?id=dZN1BQAAQBAJ&printsec=frontcover&img=1&zoom=4&edge=curl&imgtk=AFLRE72x5vBQpMoPigr6fGa246ERfQvakIU7pB6PpTEUbktcoWhXxik5WF8TohPvbPuOGXqG0Lzh1JmSy6N7PIVpqCJXIyHV2UIzOxz1u1SeyfQNatsajdpQ16rGp6uaJxPhT31o0JUy&source=gbs_api - extraLarge: https://books.google.ca/books/content?id=dZN1BQAAQBAJ&printsec=frontcover&img=1&zoom=6&edge=curl&imgtk=AFLRE73xjKYwV0fwumEQIryeYX8vFDu7KUe8WgpYN-QvZU8ZMbVU5b5Ua8cYnD_FBBGpDTf22w_tiYOC8G9BpvSOkHaO07HRV-YDM51FaVQWlXywSXL7UVgOWUaI0iG5xbY3M6CJWMOz&source=gbs_api - language: en - previewLink: https://books.google.ca/books?id=dZN1BQAAQBAJ&hl=&source=gbs_api - infoLink: https://books.google.ca/books?id=dZN1BQAAQBAJ&hl=&source=gbs_api - canonicalVolumeLink: https://books.google.ca/books/about/Web_App_Testing_Using_Knockout_JS.html?hl=&id=dZN1BQAAQBAJ - - - title: KnockoutJS Essentials - authors: - - Jorge Ferrando - publisher: Packt Publishing Ltd - publishedDate: '2015-02-27' - description: If you are a JavaScript developer who has been using DOM manipulation - libraries such as Mootools or Scriptaculous, and you want go further in modern - JavaScript development with a simple and well-documented library, then this book - is for you. Learning how to use Knockout will be perfect as your next step towards - building JavaScript applications that respond to user interaction. - industryIdentifiers: - - type: ISBN_10 - identifier: '1784395285' - - type: ISBN_13 - identifier: '9781784395285' - readingModes: - text: true - image: true - pageCount: 232 - printedPageCount: 232 - printType: BOOK - categories: - - Computers / Internet / General - - Computers / Internet / Application Development - - Computers / Programming Languages / Java - maturityRating: NOT_MATURE - allowAnonLogging: false - contentVersion: 2.2.2.0.preview.3 - imageLinks: - smallThumbnail: https://books.google.ca/books/content?id=HEXfBgAAQBAJ&printsec=frontcover&img=1&zoom=5&edge=curl&imgtk=AFLRE73KcIEK76fLL4WMQf9A1CJTvx-SGdI5O2ezmLb54SZbJGzguyU7PjmjzBRqRYw0fFGHmcGBjfwozfYegr6gQ12u-c5vUhXf7szQkTjXEXWV5Y0KQcgDfg_OFQmKi9h-9cm-4zdb&source=gbs_api - thumbnail: https://books.google.ca/books/content?id=HEXfBgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&imgtk=AFLRE72iT2HkL3gawhD9TqH0Ozcj5SZW5bchxnpKvWAjxtYdxh8HcnIKbul_cXzv6zK-EDmZh5QY29qCYf-JQQEGU6sjiaaVSoeGbbezRI32UgWJNVpiPu6kd2aeMSZa5Vamelt0nAda&source=gbs_api - small: https://books.google.ca/books/content?id=HEXfBgAAQBAJ&printsec=frontcover&img=1&zoom=2&edge=curl&imgtk=AFLRE72qNwfz7Ar9qbXS_7Z_y2lsYAYpWy2pEy37MmEtZSajj0E7AMzXnEHIk2EG6otNwbELtO63zSSVjiAs3jvlerXq_N-uD227lrRMSDt8-N2-rZr0d396FW0F0oukatK3HcBwkBzc&source=gbs_api - medium: https://books.google.ca/books/content?id=HEXfBgAAQBAJ&printsec=frontcover&img=1&zoom=3&edge=curl&imgtk=AFLRE72m6oGoEwL5xAbLyuU4C_334JN-IgaHkW70a4mFNRW58iirrlcuJaZ8hDEPGcADH_Qd1HeLukT2e_1gxJUEqOVGAqdTJopfflSRdEFSy_d3R3TFxvTCvrWqw2b9RBsbgnWL-vu2&source=gbs_api - large: https://books.google.ca/books/content?id=HEXfBgAAQBAJ&printsec=frontcover&img=1&zoom=4&edge=curl&imgtk=AFLRE727dgJxfT9K-HpbDFySw0YytRHfJV1Nr8z87ClKXeljh02ZGsv-9KyehOnyFMH11gXgyN7Rks3adufGjMDwsMgxCVvvsFQgX2LHt1_jeB7EoPeoVgRdKllAd6TqnHSvPYG5dePq&source=gbs_api - extraLarge: https://books.google.ca/books/content?id=HEXfBgAAQBAJ&printsec=frontcover&img=1&zoom=6&edge=curl&imgtk=AFLRE70WdC_9qZ_FtUczIwDq4_4XBZMUl-HwNXyucuOI0v4OCtyRxQAgvDM3m7jJDeXcrm83b-Bi5-TdzSkjxZu4RbpTzW4NL8mPDRAFUlMGPViNw4xMw-ebSHRkgWYsMriAUYjYp_OZ&source=gbs_api - language: en - previewLink: https://books.google.ca/books?id=HEXfBgAAQBAJ&hl=&source=gbs_api - infoLink: https://books.google.ca/books?id=HEXfBgAAQBAJ&hl=&source=gbs_api - canonicalVolumeLink: https://books.google.ca/books/about/KnockoutJS_Essentials.html?hl=&id=HEXfBgAAQBAJ - - - title: KnockoutJS Blueprints - authors: - - Carlo Russo - publisher: Packt Publishing Ltd - publishedDate: '2015-02-25' - description: If you are a JavaScript developer and already know the basics of KnockoutJS - and you want to get the most out of it, then this book is for you. This book will - help in your transition from a small site to a large web application that is easily - maintainable. - industryIdentifiers: - - type: ISBN_10 - identifier: '1783980850' - - type: ISBN_13 - identifier: '9781783980857' - readingModes: - text: true - image: true - pageCount: 218 - printedPageCount: 218 - printType: BOOK - categories: - - Computers / General - - Computers / Programming Languages / JavaScript - maturityRating: NOT_MATURE - allowAnonLogging: false - contentVersion: 2.2.2.0.preview.3 - imageLinks: - smallThumbnail: https://books.google.ca/books/content?id=5ljTBgAAQBAJ&printsec=frontcover&img=1&zoom=5&edge=curl&imgtk=AFLRE73zg0-XBzMzQAcMQW_DYHtbhQovG3pLSICrTsQiuPtQjcoh0uUD8mixpJOoQ5Jyhx_Q39QcF8zNZW9vZxYpfOY2H-vNHZ1Q3F-RtZ4urPVrSSKQauMG9YeZOtFE_uyJhwPTkVmA&source=gbs_api - thumbnail: https://books.google.ca/books/content?id=5ljTBgAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&imgtk=AFLRE709pFQ7H1gOnU-LAndEX0z9bqHUPQAi5rRoYbighr68U9tTN7ONHq8sgiLrkmhFBO5isUK3dKydyNM1aWDgk4FqErfk2DSbjC2T_jd7nfsnQzXHcFCVEcD3rLNxV7n0pegmMoEy&source=gbs_api - small: https://books.google.ca/books/content?id=5ljTBgAAQBAJ&printsec=frontcover&img=1&zoom=2&edge=curl&imgtk=AFLRE70TIZJ2jb02xZbyrF-pi7rCkKtRbM9QNCKS-7PZfJcNhsqHXwROEZ1W6tasXaC0cOmDdIrUrgAVLgDmP6Yg6HGwxqeV_MyZdZeeJ8zbhL4R9M0jQpKGggoGGLzLzoJ39ID5dCIn&source=gbs_api - medium: https://books.google.ca/books/content?id=5ljTBgAAQBAJ&printsec=frontcover&img=1&zoom=3&edge=curl&imgtk=AFLRE714ZgU0oxMuFEtbSrhaZJwsYhvkBEr1D_wYVJsJyiy6NE80XQxdDKopHEcJtSOG-WVKnjsrgrvidnWoxo2kvauH97Nr4iE44nAJeTFsjlLOG0Xv8anJAMSd2_aA4KYAK5cXZ0u8&source=gbs_api - large: https://books.google.ca/books/content?id=5ljTBgAAQBAJ&printsec=frontcover&img=1&zoom=4&edge=curl&imgtk=AFLRE72zC_ZRz28WbKJAHvaFUB6LqLgItZOT3XobgdMZDn_fnYVVWIg8iv1gMPtNek1yrVlTFwWmWa061ZS5xZVFRxlkXRWPmxiroQjmhiAoCEQ7cjp2Gb6Tos7xcoH1rjVU7GCbMYhH&source=gbs_api - extraLarge: https://books.google.ca/books/content?id=5ljTBgAAQBAJ&printsec=frontcover&img=1&zoom=6&edge=curl&imgtk=AFLRE732FDrzmu-zRydUQ7jmyI9LnQxtWx49_kOuxlwgjW2jI95C_GWB_UWIg02hmKbYRHXbU7jtLw_VL38n-_DUntiCj_f9AG5Lswlq1KaXyjlwfCEXWTIsH82VkQeqnC77S3bqLkFV&source=gbs_api - language: en - previewLink: https://books.google.ca/books?id=5ljTBgAAQBAJ&hl=&source=gbs_api - infoLink: https://books.google.ca/books?id=5ljTBgAAQBAJ&hl=&source=gbs_api - canonicalVolumeLink: https://books.google.ca/books/about/KnockoutJS_Blueprints.html?hl=&id=5ljTBgAAQBAJ diff --git a/tko.io/src/index.pug b/tko.io/src/index.pug deleted file mode 100644 index 50cfa52ca..000000000 --- a/tko.io/src/index.pug +++ /dev/null @@ -1,31 +0,0 @@ -doctype html -html(lang="en") - head - title= "TKO" - meta(charset="UTF-8") - - each link in links - link(rel='stylesheet' href=link.href integrity=link.integrity crossorigin='anonymous') - - each script in scripts - script(src=script.src integrity=script.integrity crossorigin=script.crossorigin type=script.type || "application/javascript" async=script.async) - - style(type='text/css') - | #{styles} - - body - nav.top-bar(data-bind='highlightIfCurrent') - .tko TKO - a(href='/') Introduction - a(href='/3to4') Knockout 3 to 4 Guide - a.external(href='https://github.com/knockout/tko') Github - - nav.sidebar - #toc.toc(data-bind='each: contents') - a(href='#\{{ navId }}' class='nav flex-column' data-bind='template: { nodes: nodes }, class: css, click: click') - - main - each section in sections - .section - .section-title #{section.title} - .section-body !{section.html} diff --git a/tko.io/src/tko-io.js b/tko.io/src/tko-io.js deleted file mode 100644 index af7c2601d..000000000 --- a/tko.io/src/tko-io.js +++ /dev/null @@ -1,118 +0,0 @@ -const {ko} = window - -const GITHUB_ROOT = 'https://github.com/knockout/tko/blob/master/packages/' -const TITLE_QS = '.section-title, h1, h2' - -const titleNodeMap = new Map() - -ko.options.deferUpdates = true - -const titleObserver = new IntersectionObserver(entries => { - entries.forEach(e => titleNodeMap.get(e.target)(e.isIntersecting)) -}) - - -class Title { - constructor ({element, navIdNumber}) { - const navId = `toc-${navIdNumber}` - const depth = this.getDepth(element) - Object.assign(this, {element, navId, depth}) - element.setAttribute('id', this.navId) - - const viewportObservables = ko.observableArray([]) - - for (const node of this.generateSiblingNodes()) { - const nodeInViewport = ko.observable(false) - if (titleNodeMap.has(node)) { - viewportObservables.push(titleNodeMap.get(node)) - } else { - titleNodeMap.set(node, nodeInViewport) - titleObserver.observe(node) - } - viewportObservables.push(nodeInViewport) - } - - this.inViewport = ko.computed(() => viewportObservables().some(o => o())) - } - - * generateSiblingNodes () { - let atNode = this.element - yield atNode - while (atNode = atNode.nextSibling) { - if (atNode.nodeType !== atNode.ELEMENT_NODE) { continue } - if (this.getDepth(atNode) <= this.depth) { return } - yield atNode - } - } - - getDepth (node) { - if (node.classList.contains('section-title')) { return 0 } - if (node.tagName === 'H1') { return 1 } - if (node.tagName === 'H2') { return 2 } - return 3 - } - - get css () { - const css = { 'in-viewport': this.inViewport } - switch (this.element.tagName) { - case 'DIV': Object.assign(css, { section: true }); break - case 'H2': Object.assign(css, { subheading: true }); break - case 'H1': Object.assign(css, { heading: true }); break - } - return css - } - - get nodes () { - const node = document.createElement('span') - node.innerHTML = this.element.innerHTML - return [node] - } - - click (vm, evt) { - this.element.scrollIntoView({ behavior: 'smooth', block: 'start' }) - return false - } -} - -function * generateTitles () { - let navIdNumber = 0 - for (const element of document.querySelectorAll(TITLE_QS)) { - navIdNumber++ - yield new Title({element, navIdNumber}) - } -} - - -/** - * Rely on some convention to map the source file to its parts / github origin. - */ -ko.bindingHandlers.set({ - source (element) { - const origin = this.value // e.g. "../packages/tko/docs/intro.md" - const link = GITHUB_ROOT + origin - const [pkg, file] = origin.split('/docs/') - - element.classList.add('source') - element.setAttribute('title', `This part of the documentation comes from ${origin} on GitHub/knockout/tko`) - element.innerHTML = - ` - - ${pkg} - - ${file} - ` - }, - - highlightIfCurrent (element) { - for (const anchor of element.querySelectorAll('a[href]')) { - if (anchor.href === location.href) { - anchor.classList.add('current-page') - } - } - } -}) - -window.addEventListener("load", () => { - const contents = ko.observableArray(Array.from(generateTitles())) - ko.applyBindings({ contents }) -}) diff --git a/tko.io/src/tko.css b/tko.io/src/tko.css deleted file mode 100644 index b9fe13435..000000000 --- a/tko.io/src/tko.css +++ /dev/null @@ -1,285 +0,0 @@ -@import url('https://fonts.googleapis.com/css?family=Nunito|Pacifico|Source+Code+Pro'); - -html, -body { - /* Prevent scroll on narrow devices */ - overflow-x: hidden; - font-family: 'Nunito', sans-serif; -} - -body { - display: grid; - margin-top: 75px; - height: calc(100vh - 75px); - - grid-template-columns: minmax(200px, max-content) auto; - grid-template-areas: - 'sidebar main'; -} - -@media screen and (max-width: 991px) { - body { - grid-template-columns: auto; - grid-template-areas: - 'sidebar' - 'main'; - } -} - -a { - color: #590c12; - transition: 0.1s ease-in-out; -} - -a:focus, a:hover, a:active { - color: #8e383c; - cursor: pointer; - text-decoration: none; -} - -main a { - border-bottom: 1px dashed #590c12; -} - -td { - padding: 5px 1em; - border-bottom: 1px solid gray; -} - -th { - padding: 5px 1em; - border-bottom: 1px solid black; -} - - -/* Codepen iFrames */ -iframe { - padding: 0px 1em; -} - - -/* - * TOP - BAR - */ -.top-bar { - width: 100%; - display: grid; - grid-template-columns: auto; - grid-auto-flow: column; - justify-content: center; - grid-column-gap: 24px; - - top: 0; - left: 0; - position: fixed; - z-index: 1200; - padding: 12px; - - background-color: #931d0d; - font-family: Pacifico; -} - -.top-bar a { - border-radius: 12px; - text-align: center; - padding: 0.25em 0.4em; - color: white; - font-size: 1.4rem; - text-shadow: 0 0 5px black; - line-height: 2.4rem; - transition: 0.4s background-color ease-in-out; -} - -.top-bar a:hover { - background-color: #00000080; - text-shadow: 0 0 5px #931d0d, 0 0 10px #931d0d; - transition: 0.4s background-color ease-in-out; -} - -.top-bar .tko { - color: white; - font-size: 1.6rem; - padding: 0.25em 0.4em; - text-shadow: 0 0 5px #efff6c, 0 0 10px #efff6c; -} - -.current-page { - background-color: #00000040; -} - -/** - * SIDE-BAR - */ -.sidebar { - grid-area: sidebar; - - height: calc(100vh - 75px); - /* Scrollable contents if viewport is shorter than content */ - overflow-y: auto; - overflow-x: hidden; - left: 0; - bottom: 0; - z-index: 1000; - padding: 0; - background-color: #efebe9; - border-right: 1px solid #efebe9; - - padding: 4px 0.75em; -} - -.toc { - position: sticky; -} - -.sidebar a { - padding: 1ex 0.25rem; - color: #931d0d; - border-radius: 4px; -} - -.sidebar a:hover { - color: black; - background-color: #FFaFaFB0; - transition: 0.4s background-color ease-in-out; -} - -.sidebar .section { - font-size: 1.2rem; -} - -.sidebar .subheading { - padding: 0.6ex 8px; - font-weight: normal; - margin-left: 1rem; -} - - @keyframes popin { - from { transform: translateX(50%); } - to { transform: translateX(0%); } - } - -.sidebar .in-viewport::after { - position: absolute; - right: -22px; - background-color: #8F3F4F90; - width: 20px; - height: 20px; - border-radius: 12px; - content: ' '; - animation: 0.25s ease-in 0s popin; -} - -/** - * MAIN - */ -main { - grid-area: main; - height: calc(100vh - 75px); - background-color: #fcd4d4; - padding: 16px; - overflow: scroll; -} - -h2, h3, h4 { - margin-top: 1.3em; - margin-bottom: 0.6em; -} - -h2 { - font-weight: 800; -} - -h3, h4, h2 time { - font-weight: 400; -} - -h1 { - margin-top: 1.5em; -} - -h1 code { - background-color: transparent; - border: 3px solid #E8D8D8; - font-size: inherit; -} - -/** - * CODE - */ - -pre { - font-family: 'Source Code Pro', monospace; - background-color: #0a0909; - padding: 1ex 1em; - margin-left: 1em; - border-radius: 1px; - border: 1px black inset; -} - -code { - background-color: #080707; - color: #e6c07b; - font-size: 0.9rem; -} - -main code { - font-family: 'Source Code Pro', monospace; -} - -code, td code { - white-space: nowrap; - padding: 2px 8px; -} - -pre code { - color: #e6c07b; - white-space: pre; /* We want newlines to be newlines in code blocks */ -} - -/** - * - * TITLES - * - */ - -.section-title { - font-size: 3rem; - font-weight: bold; -} - - - - - -/** - * Source linking - */ -.source { - display: block; - text-align: right; - font-size: 0.9rem; - position: sticky; - top: 0px; -} - -.source a { - padding: 2px 0.62em; - background-color: #E8D8D8; - border: 1px solid gray; -} - -/** - * - * BOOKS - * - */ -.book-grid { - display: grid; - grid-template-columns: repeat(auto-fit, 250px); - grid-gap: 10px; - justify-content: space-around; -} - -.book-grid .card { - width: 250px; -} From 5b10b1689bcc593fa90ddf541fc785d7d4c6fd43 Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Wed, 23 Jun 2021 21:56:02 -0400 Subject: [PATCH 07/15] docs) move the docs to sites/www.tko.io/ --- {builds/reference => sites/www.tko.io}/docs/3to4.md | 0 .../www.tko.io}/docs/amd-loading.md | 0 .../reference => sites/www.tko.io}/docs/animated.md | 0 .../reference => sites/www.tko.io}/docs/books.pug | 0 {builds/reference => sites/www.tko.io}/docs/fn.md | 0 {builds/reference => sites/www.tko.io}/docs/intro.md | 0 .../reference => sites/www.tko.io}/docs/json-data.md | 0 {builds/reference => sites/www.tko.io}/docs/links.md | 0 .../reference => sites/www.tko.io}/docs/plugins.md | 0 sites/www.tko.io/package.json | 12 ++++++++++++ 10 files changed, 12 insertions(+) rename {builds/reference => sites/www.tko.io}/docs/3to4.md (100%) rename {builds/reference => sites/www.tko.io}/docs/amd-loading.md (100%) rename {builds/reference => sites/www.tko.io}/docs/animated.md (100%) rename {builds/reference => sites/www.tko.io}/docs/books.pug (100%) rename {builds/reference => sites/www.tko.io}/docs/fn.md (100%) rename {builds/reference => sites/www.tko.io}/docs/intro.md (100%) rename {builds/reference => sites/www.tko.io}/docs/json-data.md (100%) rename {builds/reference => sites/www.tko.io}/docs/links.md (100%) rename {builds/reference => sites/www.tko.io}/docs/plugins.md (100%) create mode 100644 sites/www.tko.io/package.json diff --git a/builds/reference/docs/3to4.md b/sites/www.tko.io/docs/3to4.md similarity index 100% rename from builds/reference/docs/3to4.md rename to sites/www.tko.io/docs/3to4.md diff --git a/builds/reference/docs/amd-loading.md b/sites/www.tko.io/docs/amd-loading.md similarity index 100% rename from builds/reference/docs/amd-loading.md rename to sites/www.tko.io/docs/amd-loading.md diff --git a/builds/reference/docs/animated.md b/sites/www.tko.io/docs/animated.md similarity index 100% rename from builds/reference/docs/animated.md rename to sites/www.tko.io/docs/animated.md diff --git a/builds/reference/docs/books.pug b/sites/www.tko.io/docs/books.pug similarity index 100% rename from builds/reference/docs/books.pug rename to sites/www.tko.io/docs/books.pug diff --git a/builds/reference/docs/fn.md b/sites/www.tko.io/docs/fn.md similarity index 100% rename from builds/reference/docs/fn.md rename to sites/www.tko.io/docs/fn.md diff --git a/builds/reference/docs/intro.md b/sites/www.tko.io/docs/intro.md similarity index 100% rename from builds/reference/docs/intro.md rename to sites/www.tko.io/docs/intro.md diff --git a/builds/reference/docs/json-data.md b/sites/www.tko.io/docs/json-data.md similarity index 100% rename from builds/reference/docs/json-data.md rename to sites/www.tko.io/docs/json-data.md diff --git a/builds/reference/docs/links.md b/sites/www.tko.io/docs/links.md similarity index 100% rename from builds/reference/docs/links.md rename to sites/www.tko.io/docs/links.md diff --git a/builds/reference/docs/plugins.md b/sites/www.tko.io/docs/plugins.md similarity index 100% rename from builds/reference/docs/plugins.md rename to sites/www.tko.io/docs/plugins.md diff --git a/sites/www.tko.io/package.json b/sites/www.tko.io/package.json new file mode 100644 index 000000000..bbd6ec121 --- /dev/null +++ b/sites/www.tko.io/package.json @@ -0,0 +1,12 @@ +{ + "name": "www.tko.io", + "version": "1.0.0", + "description": "www.tko.io", + "repository": "https://github.com/knockout/tko", + "author": "The Knockout Team", + "license": "MIT", + "dependencies": { + "jss": "^10.6.0", + "jss-preset-default": "^10.6.0" + } +} From ce6e505c721054bce1c3657689094b2569f93ded Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Wed, 23 Jun 2021 21:56:40 -0400 Subject: [PATCH 08/15] sites/tko.io) set up JSS styles --- sites/www.tko.io/src/TkoComponent.tsx | 118 +++++++++++++++++++++++++- sites/www.tko.io/src/www-tko-io.tsx | 17 +++- 2 files changed, 131 insertions(+), 4 deletions(-) diff --git a/sites/www.tko.io/src/TkoComponent.tsx b/sites/www.tko.io/src/TkoComponent.tsx index 4643dc554..44fddbe5a 100644 --- a/sites/www.tko.io/src/TkoComponent.tsx +++ b/sites/www.tko.io/src/TkoComponent.tsx @@ -1,8 +1,120 @@ -import jss from 'https://cdn.jsdelivr.net/npm/jss@10.6.0/dist/jss.bundle.min.js' -import preset from "https://cdn.jsdelivr.net/npm/jss-preset-default@10.6.0/dist/jss-preset-default.bundle.js" +import { default as jss, StyleSheet } from 'jss' +import preset from "jss-preset-default" import { tko } from './tko' +jss.setup(preset()) + +const JSS = Symbol('Memoized ViewComponent.jss') +const staticStyles: Record = {} + +/** + * TkoComponent is a Knockout web-component base-class for all view components. + * + * It has builtin JSS styles. + */ export abstract class TkoComponent extends tko.components.ComponentABC { - get template () { return hello ${new Date().toISOString()} } + private static customElementName: string + + dispose () { + super.dispose() + if (this._styles) { jss.removeStyleSheet(this._styles) } + } + + /** + * @return {object|null} containing JSS-style classes that are specific to + * the instance. + * + * This offers more dynamic options than `static get css`, but at a + * substantial performance cost. Use sparingly. + */ + get css () { return {} as const } + + /** + * @return {object} containing JSS-style classes that apply to every + * instance of this class. + * + * This is higher performance than `get css` + */ + static get css () { return {} as const } + + /** + * Lazy getter, so subclass constructors can refer to observables and + * computeds added to the class in the constructor + * after `super` has been called. + */ + get styles () : StyleSheet { + if (!this.css) { return { classes: {} } as StyleSheet } + const options = { + meta: `⚙️ Dynamic Classes for ${this.constructor.name}>`, + link: true, + classNamePrefix: `${this.constructor.name}--` + } + const sheet = jss.createStyleSheet(this.css, options).attach() + // sheet.update(window.app.jssThemeParams()) + // this.subscribe(window.app.jssThemeParams, v => sheet.update(v)) + return this._styles || (this._styles = sheet) + } + + /** + * Static styles are created for each class (not each instance). + */ + static get styles () : StyleSheet { + if (this.name in staticStyles) { return staticStyles[this.name] } + if (!this.css) { return { classes: {} } as StyleSheet } + const options = { + meta: `🎨 Static Classes for ${this.name}`, + classNamePrefix: `${this.name}__` + } + const sheet = jss.createStyleSheet(this.css, options).attach() + return (staticStyles[this.name] = sheet) + } + + /** + * Return the classes object for our JSS/CSS. + */ + get jss (): Record { + return this[JSS] || (this[JSS] = { + ...this.constructor.styles.classes, + ...this.styles.classes, + }) + } + + /** + * Called when the component is removed from the DOM. Must be on the + * prototype (for performance we don't add a callback for every component). + */ + disconnectedCallback? (node: HTMLElement): void + + get template () { return Symbol('No template') } + + /** + * We overload the Register to create a custom element that + * triggers a `disconnectedCallback`. This is simpler and faster + * than using MutationObserver to trigger when an element + * is removed from the DOM. + */ + static register (name = this.customElementName) { + const wantsCallback = 'disconnectedCallback' in this.prototype + if (wantsCallback) { this.defineCustomElementForDisconnectCallback(name) } + return super.register(name) + } + + /** + * Define customElement that triggers a disconnection callback when the + * element is removed from the DOM. + */ + private static defineCustomElementForDisconnectCallback (name: string) { + if (globalThis.customElements) { + customElements.define(name, class extends HTMLElement { + disconnectedCallback (this: HTMLElement) { + const component = tko.dataFor(this.children[0]) + if (component) { component.disconnectedCallback(this) } + } + }) + } else if (!globalThis.process) { + console.warn(`"window.customElements" is not available. Unable to + register life-cycle disconnection callback.`) + } + } } diff --git a/sites/www.tko.io/src/www-tko-io.tsx b/sites/www.tko.io/src/www-tko-io.tsx index e9f53fe3b..2cb0415af 100644 --- a/sites/www.tko.io/src/www-tko-io.tsx +++ b/sites/www.tko.io/src/www-tko-io.tsx @@ -1,7 +1,22 @@ import {TkoComponent} from './TkoComponent' class WwwTkoIo extends TkoComponent { - get template () { return hello ${new Date().toISOString()} } + get template () { + return ( +
+ hello ${new Date().toISOString()} +
+ ) + } + + static get css () { + return { + layout: { + padding: '25px', + backgroundColor: '#fcd4d4', + } + } + } } WwwTkoIo.register() From bf61ae14d1273e9cba2ef808723410fdeb86a4b5 Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Fri, 25 Jun 2021 22:32:26 -0400 Subject: [PATCH 09/15] tko.io) await document.fonts to avoid FOUT --- sites/www.tko.io/src/TkoComponent.tsx | 2 - sites/www.tko.io/src/index.html | 7 ++- sites/www.tko.io/src/www-tko-io.tsx | 71 +++++++++++++++++++++++++-- 3 files changed, 73 insertions(+), 7 deletions(-) diff --git a/sites/www.tko.io/src/TkoComponent.tsx b/sites/www.tko.io/src/TkoComponent.tsx index 44fddbe5a..59ae7de5d 100644 --- a/sites/www.tko.io/src/TkoComponent.tsx +++ b/sites/www.tko.io/src/TkoComponent.tsx @@ -51,8 +51,6 @@ export abstract class TkoComponent extends tko.components.ComponentABC { classNamePrefix: `${this.constructor.name}--` } const sheet = jss.createStyleSheet(this.css, options).attach() - // sheet.update(window.app.jssThemeParams()) - // this.subscribe(window.app.jssThemeParams, v => sheet.update(v)) return this._styles || (this._styles = sheet) } diff --git a/sites/www.tko.io/src/index.html b/sites/www.tko.io/src/index.html index 9b4effb5d..c1891e275 100644 --- a/sites/www.tko.io/src/index.html +++ b/sites/www.tko.io/src/index.html @@ -1,8 +1,13 @@ + TKO + + + + - + diff --git a/sites/www.tko.io/src/www-tko-io.tsx b/sites/www.tko.io/src/www-tko-io.tsx index 2cb0415af..c1811a6f0 100644 --- a/sites/www.tko.io/src/www-tko-io.tsx +++ b/sites/www.tko.io/src/www-tko-io.tsx @@ -1,19 +1,82 @@ import {TkoComponent} from './TkoComponent' +import { observable } from '@tko/observable' class WwwTkoIo extends TkoComponent { get template () { + return <>{this.afterFontsLoad(this.bodyHTML())} + } + + async afterFontsLoad (html /* : JSX */) { + await document.fonts?.ready + return html + } + + bodyHTML () { + const { jss } = this return ( -
- hello ${new Date().toISOString()} +
+
+
+ TKO +
+
+
+ How are you? +
) } + static get cssVars () { + return { + '--bg-color': '#aaa', + '--body-font': 'Roboto', + '--brand-font': 'Pacifico', + '--fg-color': 'black', + '--head-bg-color': '#931d0d', + '--head-fg-color': 'white', + '--head-height': '55px', + } + } + static get css () { + console.log(`getting CSS`) return { + '@global': { + body: { + padding: 0, + margin: 0, + ...this.cssVars, + }, + }, + layout: { - padding: '25px', - backgroundColor: '#fcd4d4', + display: 'grid', + gridTemplateRows: 'var(--head-height) 1fr', + // backgroundColor: '#fcd4d4', + backgroundColor: 'var(--bg-color)', + color: 'var(--fg-color)', + height: '100%', + fontFamily: 'var(--body-font)' + }, + + head: { + display: 'flex', + alignItems: 'center', + color: 'var(--head-fg-color)', + backgroundColor: 'var(--head-bg-color)', + padding: '0px 1rem', + }, + + brand: { + fontSize: '1.6rem', + padding: '0.25em 0.4em', + textShadow: '0 0 5px #efff6c, 0 0 10px #efff6c', + fontFamily: 'var(--brand-font)', + }, + + body: { + padding: '1rem', } } } From 016dba123d31da6b14ea1e8c6cc2c16dd4e3b67a Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Fri, 25 Jun 2021 23:12:10 -0400 Subject: [PATCH 10/15] tko.io) add a strut b/c document.fonts.ready only works for visible fonts --- sites/www.tko.io/src/index.html | 2 +- sites/www.tko.io/src/www-tko-io.tsx | 36 ++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/sites/www.tko.io/src/index.html b/sites/www.tko.io/src/index.html index c1891e275..8bb5a3d12 100644 --- a/sites/www.tko.io/src/index.html +++ b/sites/www.tko.io/src/index.html @@ -7,7 +7,7 @@ - + diff --git a/sites/www.tko.io/src/www-tko-io.tsx b/sites/www.tko.io/src/www-tko-io.tsx index c1811a6f0..191cc6553 100644 --- a/sites/www.tko.io/src/www-tko-io.tsx +++ b/sites/www.tko.io/src/www-tko-io.tsx @@ -7,8 +7,29 @@ class WwwTkoIo extends TkoComponent { } async afterFontsLoad (html /* : JSX */) { - await document.fonts?.ready - return html + const o = observable(this.fontStrutHTML) + console.log('bef', document.fonts.check('1em Roboto')) + document.fonts?.ready + .then(() => { + o(html) + console.log('aft', document.fonts.check('1em Roboto')) + }) + + return o + } + + /** + * Show text with the fonts, so document.fonts.ready + * queues + */ + get fontStrutHTML () { + const { jss } = this + return ( + <> +
.
+
.
+ + ) } bodyHTML () { @@ -40,7 +61,6 @@ class WwwTkoIo extends TkoComponent { } static get css () { - console.log(`getting CSS`) return { '@global': { body: { @@ -77,6 +97,16 @@ class WwwTkoIo extends TkoComponent { body: { padding: '1rem', + }, + + brandFontStrut: { + opacity: 0, + fontFamily: 'var(--brand-font)', + }, + + bodyFontStrut: { + opacity: 0, + fontFamily: 'var(--body-font)', } } } From c41f4fd4a8e2e7f51b496c369821aaf13c260d6d Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Sat, 26 Jun 2021 08:28:51 -0400 Subject: [PATCH 11/15] tko.io) move @import back to CSS ... try to use opacity: 0, but JSS is erroring on @global: { body }. --- sites/www.tko.io/src/TkoComponent.tsx | 1 + sites/www.tko.io/src/index.html | 3 +- sites/www.tko.io/src/www-tko-io.tsx | 45 ++++++++++++--------------- 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/sites/www.tko.io/src/TkoComponent.tsx b/sites/www.tko.io/src/TkoComponent.tsx index 59ae7de5d..462f97f2f 100644 --- a/sites/www.tko.io/src/TkoComponent.tsx +++ b/sites/www.tko.io/src/TkoComponent.tsx @@ -62,6 +62,7 @@ export abstract class TkoComponent extends tko.components.ComponentABC { if (!this.css) { return { classes: {} } as StyleSheet } const options = { meta: `🎨 Static Classes for ${this.name}`, + // link: true, // Warning: [JSS] Failed to execute 'insertRule' on 'CSSStyleSheet': Failed to insert the rule. classNamePrefix: `${this.name}__` } const sheet = jss.createStyleSheet(this.css, options).attach() diff --git a/sites/www.tko.io/src/index.html b/sites/www.tko.io/src/index.html index 8bb5a3d12..37c46f5f2 100644 --- a/sites/www.tko.io/src/index.html +++ b/sites/www.tko.io/src/index.html @@ -1,9 +1,8 @@ - TKO + TKO.io - diff --git a/sites/www.tko.io/src/www-tko-io.tsx b/sites/www.tko.io/src/www-tko-io.tsx index 191cc6553..416773c09 100644 --- a/sites/www.tko.io/src/www-tko-io.tsx +++ b/sites/www.tko.io/src/www-tko-io.tsx @@ -1,38 +1,29 @@ -import {TkoComponent} from './TkoComponent' +import { computed } from '@tko/computed' import { observable } from '@tko/observable' -class WwwTkoIo extends TkoComponent { - get template () { - return <>{this.afterFontsLoad(this.bodyHTML())} - } +import { TkoComponent } from './TkoComponent' - async afterFontsLoad (html /* : JSX */) { - const o = observable(this.fontStrutHTML) - console.log('bef', document.fonts.check('1em Roboto')) - document.fonts?.ready - .then(() => { - o(html) - console.log('aft', document.fonts.check('1em Roboto')) - }) +const fontsLoaded = observable(false) +const opacityUntilFontsLoaded = computed(() => fontsLoaded() ? 1 : 0) - return o +class WwwTkoIo extends TkoComponent { + get template () { + this.monitorFontsLoading() + return <>{this.bodyHTML()} } /** - * Show text with the fonts, so document.fonts.ready - * queues + * document.fonts.ready is a promise that resolves when all + * the fonts on the screen are loaded. */ - get fontStrutHTML () { - const { jss } = this - return ( - <> -
.
-
.
- - ) + private async monitorFontsLoading () { + const waitForRender = Promise.resolve() + await waitForRender + await document.fonts.ready + fontsLoaded(true) } - bodyHTML () { + private bodyHTML () { const { jss } = this return (
@@ -62,10 +53,14 @@ class WwwTkoIo extends TkoComponent { static get css () { return { + '@import': [ + `url('https://fonts.googleapis.com/css2?family=Roboto&family=Pacifico&display=swap')` + ], '@global': { body: { padding: 0, margin: 0, + // opacity: opacityUntilFontsLoaded, ...this.cssVars, }, }, From 67fb7c798c08b551ec47d3394cac047e4a1e1dc8 Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Sun, 27 Jun 2021 13:26:03 -0400 Subject: [PATCH 12/15] tko.io) break out WithFontsView.tsx --- sites/www.tko.io/package.json | 1 + sites/www.tko.io/src/TkoComponent.tsx | 2 +- sites/www.tko.io/src/WithFontsView.tsx | 44 ++++++++++++++++++++++++++ sites/www.tko.io/src/index.html | 1 + sites/www.tko.io/src/www-tko-io.tsx | 39 +++++++---------------- 5 files changed, 59 insertions(+), 28 deletions(-) create mode 100644 sites/www.tko.io/src/WithFontsView.tsx diff --git a/sites/www.tko.io/package.json b/sites/www.tko.io/package.json index bbd6ec121..f022c5525 100644 --- a/sites/www.tko.io/package.json +++ b/sites/www.tko.io/package.json @@ -6,6 +6,7 @@ "author": "The Knockout Team", "license": "MIT", "dependencies": { + "@types/css-font-loading-module": "^0.0.5", "jss": "^10.6.0", "jss-preset-default": "^10.6.0" } diff --git a/sites/www.tko.io/src/TkoComponent.tsx b/sites/www.tko.io/src/TkoComponent.tsx index 462f97f2f..e32ab24f5 100644 --- a/sites/www.tko.io/src/TkoComponent.tsx +++ b/sites/www.tko.io/src/TkoComponent.tsx @@ -62,7 +62,7 @@ export abstract class TkoComponent extends tko.components.ComponentABC { if (!this.css) { return { classes: {} } as StyleSheet } const options = { meta: `🎨 Static Classes for ${this.name}`, - // link: true, // Warning: [JSS] Failed to execute 'insertRule' on 'CSSStyleSheet': Failed to insert the rule. + link: true, // Warning: [JSS] Failed to execute 'insertRule' on 'CSSStyleSheet': Failed to insert the rule. classNamePrefix: `${this.name}__` } const sheet = jss.createStyleSheet(this.css, options).attach() diff --git a/sites/www.tko.io/src/WithFontsView.tsx b/sites/www.tko.io/src/WithFontsView.tsx new file mode 100644 index 000000000..da8ec131f --- /dev/null +++ b/sites/www.tko.io/src/WithFontsView.tsx @@ -0,0 +1,44 @@ +import { observable } from '@tko/observable' +import { computed } from '@tko/computed' + +import { TkoComponent } from './TkoComponent' + +export abstract class WithFontsView extends TkoComponent { + static fontsLoaded = observable(false) + + protected abstract bodyHTML: any + + /** + * document.fonts.ready is a promise that resolves when all + * the fonts on the screen are loaded. + */ + private async monitorFontsLoading () { + const waitForRender = Promise.resolve() + await waitForRender + console.log(`Fonts loading: ?`, document.fonts.check('1rem Pacifico')) + await document.fonts.ready + console.log(`Fonts ready: ?`, document.fonts.check('1rem Pacifico')) + WithFontsView.fontsLoaded(true) + } + + static get css () { + const { fontsLoaded } = this + const opacityUntilFontsLoaded = computed(() => fontsLoaded() ? 1 : 0) + + return { + ...super.css, + + + '@global': { + body: { + opacity: opacityUntilFontsLoaded, + }, + }, + } + } + + get template () { + this.monitorFontsLoading() + return <>{this.bodyHTML()} + } +} diff --git a/sites/www.tko.io/src/index.html b/sites/www.tko.io/src/index.html index 37c46f5f2..7085e898b 100644 --- a/sites/www.tko.io/src/index.html +++ b/sites/www.tko.io/src/index.html @@ -3,6 +3,7 @@ TKO.io + diff --git a/sites/www.tko.io/src/www-tko-io.tsx b/sites/www.tko.io/src/www-tko-io.tsx index 416773c09..ac591feae 100644 --- a/sites/www.tko.io/src/www-tko-io.tsx +++ b/sites/www.tko.io/src/www-tko-io.tsx @@ -1,29 +1,10 @@ import { computed } from '@tko/computed' import { observable } from '@tko/observable' -import { TkoComponent } from './TkoComponent' +import { WithFontsView } from './WithFontsView' -const fontsLoaded = observable(false) -const opacityUntilFontsLoaded = computed(() => fontsLoaded() ? 1 : 0) - -class WwwTkoIo extends TkoComponent { - get template () { - this.monitorFontsLoading() - return <>{this.bodyHTML()} - } - - /** - * document.fonts.ready is a promise that resolves when all - * the fonts on the screen are loaded. - */ - private async monitorFontsLoading () { - const waitForRender = Promise.resolve() - await waitForRender - await document.fonts.ready - fontsLoaded(true) - } - - private bodyHTML () { +class WwwTkoIo extends WithFontsView { + protected bodyHTML () { const { jss } = this return (
@@ -53,14 +34,19 @@ class WwwTkoIo extends TkoComponent { static get css () { return { - '@import': [ - `url('https://fonts.googleapis.com/css2?family=Roboto&family=Pacifico&display=swap')` - ], + ...super.css, + + // See: https://github.com/cssinjs/jss/issues/1524 + // Once this is fixed, we can use this in places of the similar + // '@import': [ + // 'url(https://fonts.googleapis.com/css2?family=Roboto&family=Pacifico&display=swap)', + // ], + '@global': { body: { + ...super.css['@global'].body, padding: 0, margin: 0, - // opacity: opacityUntilFontsLoaded, ...this.cssVars, }, }, @@ -68,7 +54,6 @@ class WwwTkoIo extends TkoComponent { layout: { display: 'grid', gridTemplateRows: 'var(--head-height) 1fr', - // backgroundColor: '#fcd4d4', backgroundColor: 'var(--bg-color)', color: 'var(--fg-color)', height: '100%', From fec88e3f33256a37f1c17b9800107119dbfd5d8a Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Sun, 27 Jun 2021 13:59:21 -0400 Subject: [PATCH 13/15] tko.io) clean up the fonts-monitoring --- sites/www.tko.io/src/WithFontsView.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/sites/www.tko.io/src/WithFontsView.tsx b/sites/www.tko.io/src/WithFontsView.tsx index da8ec131f..407640d7a 100644 --- a/sites/www.tko.io/src/WithFontsView.tsx +++ b/sites/www.tko.io/src/WithFontsView.tsx @@ -13,11 +13,9 @@ export abstract class WithFontsView extends TkoComponent { * the fonts on the screen are loaded. */ private async monitorFontsLoading () { - const waitForRender = Promise.resolve() - await waitForRender - console.log(`Fonts loading: ?`, document.fonts.check('1rem Pacifico')) + const waitForFontsToBeOnScreen = Promise.resolve() + await waitForFontsToBeOnScreen await document.fonts.ready - console.log(`Fonts ready: ?`, document.fonts.check('1rem Pacifico')) WithFontsView.fontsLoaded(true) } From 8b40e9003b77b29566fd91d0b2cedbed368e5a9b Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Sun, 27 Jun 2021 14:01:34 -0400 Subject: [PATCH 14/15] observable) stub `Symbol.observable` if it doesn't exist --- packages/observable/spec/subscribableBehaviors.ts | 6 ++++++ packages/observable/src/subscribable.ts | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/packages/observable/spec/subscribableBehaviors.ts b/packages/observable/spec/subscribableBehaviors.ts index 465e54f59..b84f1671c 100644 --- a/packages/observable/spec/subscribableBehaviors.ts +++ b/packages/observable/spec/subscribableBehaviors.ts @@ -17,6 +17,12 @@ describe('Subscribable', function () { expect(isSubscribable(null)).toEqual(false) }) + it('creates/has a Symbol.observable', () => { + const sub = new subscribable() + expect(Symbol.observable).toEqual(Symbol.for('@tko/Symbol.observable')) + expect(sub[Symbol.observable]()).toBe(sub) + }) + it('Should be able to notify subscribers', function () { var instance = new subscribable() var notifiedValue diff --git a/packages/observable/src/subscribable.ts b/packages/observable/src/subscribable.ts index d1747f54f..c908a482f 100644 --- a/packages/observable/src/subscribable.ts +++ b/packages/observable/src/subscribable.ts @@ -14,6 +14,10 @@ export { isSubscribable } from './subscribableSymbol' // subscribed. export const LATEST_VALUE = Symbol('Knockout latest value') +if (!Symbol.observable) { + Symbol.observable = Symbol.for('@tko/Symbol.observable') +} + export function subscribable () { Object.setPrototypeOf(this, ko_subscribable_fn) ko_subscribable_fn.init(this) From 81d57871c2adfb8024633c73235e8b7dbba254a8 Mon Sep 17 00:00:00 2001 From: Brian M Hunt Date: Tue, 29 Jun 2021 21:32:17 -0400 Subject: [PATCH 15/15] tko.io) add monaco and esbuild-wasm for playground --- packages/observable/package.json | 2 +- sites/www.tko.io/Makefile | 5 +++ sites/www.tko.io/package.json | 2 + sites/www.tko.io/src/EsbuildComponent.tsx | 42 +++++++++++++++++++ sites/www.tko.io/src/TkoComponent.tsx | 2 +- sites/www.tko.io/src/monacoHandler.ts | 25 ++++++++++++ sites/www.tko.io/src/play-ground.tsx | 49 +++++++++++++++++++++++ sites/www.tko.io/src/www-tko-io.tsx | 6 +-- sites/www.tko.io/tsconfig.json | 4 +- tools/site.mk | 2 +- 10 files changed, 131 insertions(+), 8 deletions(-) create mode 100644 sites/www.tko.io/src/EsbuildComponent.tsx create mode 100644 sites/www.tko.io/src/monacoHandler.ts create mode 100644 sites/www.tko.io/src/play-ground.tsx diff --git a/packages/observable/package.json b/packages/observable/package.json index 4391d61d7..18fb2a043 100644 --- a/packages/observable/package.json +++ b/packages/observable/package.json @@ -45,4 +45,4 @@ "url": "https://opensource.org/licenses/MIT" } ] -} \ No newline at end of file +} diff --git a/sites/www.tko.io/Makefile b/sites/www.tko.io/Makefile index 8b7e4f345..289c69c84 100644 --- a/sites/www.tko.io/Makefile +++ b/sites/www.tko.io/Makefile @@ -1,2 +1,7 @@ include ../../tools/site.mk + +dist/esbuild.wasm: node_modules + cp node_modules/esbuild-wasm/esbuild.wasm dist + +build:: dist/esbuild.wasm diff --git a/sites/www.tko.io/package.json b/sites/www.tko.io/package.json index f022c5525..6c95d59dd 100644 --- a/sites/www.tko.io/package.json +++ b/sites/www.tko.io/package.json @@ -6,7 +6,9 @@ "author": "The Knockout Team", "license": "MIT", "dependencies": { + "@monaco-editor/loader": "^1.1.1", "@types/css-font-loading-module": "^0.0.5", + "esbuild-wasm": "^0.12.12", "jss": "^10.6.0", "jss-preset-default": "^10.6.0" } diff --git a/sites/www.tko.io/src/EsbuildComponent.tsx b/sites/www.tko.io/src/EsbuildComponent.tsx new file mode 100644 index 000000000..d1c77592c --- /dev/null +++ b/sites/www.tko.io/src/EsbuildComponent.tsx @@ -0,0 +1,42 @@ + +import * as esbuild from 'esbuild-wasm' +import { observable, observableArray } from '@tko/observable' + +import {TkoComponent} from './TkoComponent' + + +const wasmURL = './esbuild.wasm' + +export class EsbuildComponent extends TkoComponent { + private esbuildInitialized: Promise + protected code = observable('') + protected warnings = observableArray([]) + protected errors = observableArray([]) + + constructor () { + super() + this.esbuildInitialized = Promise.resolve(this.initializeEsbuild()) + } + + async initializeEsbuild () { + await esbuild.initialize({ wasmURL }) + } + + protected async compile (code: string) { + try { + await this.esbuildInitialized + } catch (err) { + this.errors.push(err) + } + try { + const r = await esbuild.transform(code) + this.warnings(r.warnings) + this.errors([]) + return r + } catch (err: esbuild.TransformFailure) { + this.warnings(err.warnings) + this.errors(err.errors) + return { code: '' } + } + } +} diff --git a/sites/www.tko.io/src/TkoComponent.tsx b/sites/www.tko.io/src/TkoComponent.tsx index e32ab24f5..20365feeb 100644 --- a/sites/www.tko.io/src/TkoComponent.tsx +++ b/sites/www.tko.io/src/TkoComponent.tsx @@ -74,7 +74,7 @@ export abstract class TkoComponent extends tko.components.ComponentABC { */ get jss (): Record { return this[JSS] || (this[JSS] = { - ...this.constructor.styles.classes, + ...(this.constructor as typeof TkoComponent).styles.classes, ...this.styles.classes, }) } diff --git a/sites/www.tko.io/src/monacoHandler.ts b/sites/www.tko.io/src/monacoHandler.ts new file mode 100644 index 000000000..a03c4daa5 --- /dev/null +++ b/sites/www.tko.io/src/monacoHandler.ts @@ -0,0 +1,25 @@ + +import { BindingHandler } from '@tko/bind' +import loader from '@monaco-editor/loader' + +class MonacoHandler extends BindingHandler { + constructor (params: any) { + super(params) + this.initMonaco() + } + + async initMonaco () { + const monaco = await loader.init() + await new Promise(r => setTimeout(r, 200)) + const editor = monaco.editor.create(this.$element, { + value: '// some comment', + language: 'typescript', + }) + + editor.onDidChangeModelContent(console.info) + // temp1.getModel().getValue() + console.log(`editor`, editor) + } +} + +MonacoHandler.registerAs('monaco-handler') diff --git a/sites/www.tko.io/src/play-ground.tsx b/sites/www.tko.io/src/play-ground.tsx new file mode 100644 index 000000000..66a0150b1 --- /dev/null +++ b/sites/www.tko.io/src/play-ground.tsx @@ -0,0 +1,49 @@ +import { EsbuildComponent } from "./EsbuildComponent" +import { observable } from "@tko/observable" +import './monacoHandler' + +class PlayGround extends EsbuildComponent { + private input = observable('') + + async result () { + try { + const { code, warnings } = await this.compile(this.input()) + if (warnings.length) { + console.warn('WARNINGS', ...warnings) + } + return code + } catch (err) { + console.error + } + } + + get template () { + const { jss } = this + const result = this.computed(() => this.result()).extend({ deferred: true }) + return ( +
+
+
+
+ {result} +
+
+ {this.warnings} +
+
+ {this.errors} +
+
+ ) + } + + static get css () { + return { + layout: {}, + input: {}, + result: {}, + } + } +} + +PlayGround.register() diff --git a/sites/www.tko.io/src/www-tko-io.tsx b/sites/www.tko.io/src/www-tko-io.tsx index ac591feae..339c5e779 100644 --- a/sites/www.tko.io/src/www-tko-io.tsx +++ b/sites/www.tko.io/src/www-tko-io.tsx @@ -1,7 +1,6 @@ -import { computed } from '@tko/computed' -import { observable } from '@tko/observable' import { WithFontsView } from './WithFontsView' +import './play-ground' class WwwTkoIo extends WithFontsView { protected bodyHTML () { @@ -14,7 +13,8 @@ class WwwTkoIo extends WithFontsView {
- How are you? +

Playground

+
) diff --git a/sites/www.tko.io/tsconfig.json b/sites/www.tko.io/tsconfig.json index 55c6f98a1..3d5147e78 100644 --- a/sites/www.tko.io/tsconfig.json +++ b/sites/www.tko.io/tsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { "downlevelIteration": true, - "target": "ES2015", - "module": "ES2015", + "target": "ES2020", + "module": "ES2020", "moduleResolution": "node", "allowJs": true, "importHelpers": true, diff --git a/tools/site.mk b/tools/site.mk index ea77d6cc2..ec0fe5c8b 100644 --- a/tools/site.mk +++ b/tools/site.mk @@ -28,7 +28,7 @@ dist/index.html: src/index.html dist/ ln -sf ../src/index.html dist/index.html .PHONY: BUILD -build: dist/index.html dist/entry.js +build:: dist/index.html dist/entry.js .PHONY: clean clean: