From 1d224b0a1f061ace78ebc0e5eda473f420735a56 Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 13:57:16 +0700 Subject: [PATCH 01/22] refactor scripts --- CHANGELOG.md | 2 + docs/CNAME | 1 - docs/MockValidator.html | 140 ++++++ docs/dereference.html | 375 ---------------- docs/dereference.test.html | 173 ++++++++ docs/docco.css | 411 +++++++++++++----- docs/get.html | 204 --------- docs/get.test.html | 151 +++++++ docs/index.html | 303 ++++++------- docs/isPointer.html | 97 ----- docs/isPointer.test.html | 108 +++++ docs/mockResolve.html | 104 +++++ docs/public/fonts/fleurons.eot | Bin 35557 -> 0 bytes docs/public/fonts/fleurons.ttf | Bin 64772 -> 0 bytes docs/public/fonts/fleurons.woff | Bin 36284 -> 0 bytes docs/public/images/gray.png | Bin 56906 -> 0 bytes docs/set.html | 171 -------- docs/set.test.html | 125 ++++++ docs/typings.d.html | 125 ------ jest.config.js | 27 +- package.json | 12 +- scripts/benchmark | 4 +- scripts/build | 41 ++ scripts/package | 15 - scripts/release | 32 ++ {tests => src/__tests__}/MockValidator.ts | 16 +- {tests => src/__tests__}/dereference.test.ts | 18 +- .../__tests__/fixture}/address+v1.schema.json | 0 .../fixture}/address-override+v1.schema.json | 0 .../fixture}/circular-referenced.schema.json | 0 .../__tests__/fixture}/circular.schema.json | 0 .../fixture}/conditional.schema.json | 0 .../fixture}/credentials+v1.schema.json | 0 .../fixture}/edit-person+v1.schema.json | 0 .../__tests__/fixture}/person+v1.schema.json | 0 .../__tests__/fixture}/petstore.swagger.json | 0 .../__tests__/fixture}/profile+v1.schema.json | 0 .../__tests__/fixture}/temando.swagger.json | 0 {tests => src/__tests__}/get.test.ts | 8 +- src/__tests__/isPointer.test.ts | 21 + {tests => src/__tests__}/mockResolve.ts | 0 {tests => src/__tests__}/set.test.ts | 2 +- src/dereference.ts | 24 +- src/get.ts | 7 +- src/isPointer.ts | 4 +- src/set.ts | 7 +- src/types/index.ts | 26 ++ src/typings.d.ts | 25 -- tests/isPointer.test.ts | 21 - tsconfig.json | 1 + 50 files changed, 1423 insertions(+), 1378 deletions(-) delete mode 100644 docs/CNAME create mode 100644 docs/MockValidator.html delete mode 100644 docs/dereference.html create mode 100644 docs/dereference.test.html delete mode 100644 docs/get.html create mode 100644 docs/get.test.html delete mode 100644 docs/isPointer.html create mode 100644 docs/isPointer.test.html create mode 100644 docs/mockResolve.html delete mode 100644 docs/public/fonts/fleurons.eot delete mode 100644 docs/public/fonts/fleurons.ttf delete mode 100644 docs/public/fonts/fleurons.woff delete mode 100644 docs/public/images/gray.png delete mode 100644 docs/set.html create mode 100644 docs/set.test.html delete mode 100644 docs/typings.d.html create mode 100755 scripts/build delete mode 100755 scripts/package create mode 100755 scripts/release rename {tests => src/__tests__}/MockValidator.ts (59%) rename {tests => src/__tests__}/dereference.test.ts (84%) rename {resources => src/__tests__/fixture}/address+v1.schema.json (100%) rename {resources => src/__tests__/fixture}/address-override+v1.schema.json (100%) rename {resources => src/__tests__/fixture}/circular-referenced.schema.json (100%) rename {resources => src/__tests__/fixture}/circular.schema.json (100%) rename {resources => src/__tests__/fixture}/conditional.schema.json (100%) rename {resources => src/__tests__/fixture}/credentials+v1.schema.json (100%) rename {resources => src/__tests__/fixture}/edit-person+v1.schema.json (100%) rename {resources => src/__tests__/fixture}/person+v1.schema.json (100%) rename {resources => src/__tests__/fixture}/petstore.swagger.json (100%) rename {resources => src/__tests__/fixture}/profile+v1.schema.json (100%) rename {resources => src/__tests__/fixture}/temando.swagger.json (100%) rename {tests => src/__tests__}/get.test.ts (84%) create mode 100644 src/__tests__/isPointer.test.ts rename {tests => src/__tests__}/mockResolve.ts (100%) rename {tests => src/__tests__}/set.test.ts (96%) create mode 100644 src/types/index.ts delete mode 100644 src/typings.d.ts delete mode 100644 tests/isPointer.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 288f92c..3362dd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,11 +11,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Re-factored code to typescript. - use `isPointer` internally now. - Now exports an optimized `npm pack` with minimal file system foot-print. +- Refactor `typings.d.ts` to `./types/index.ts`, we now compile and package our types. ### Remove - Object manipulation functionality has been dropped from JST (the `merge`, `contains`, `iterate` functions). We now use `lodash` instead. - The `Validator` class has been removed, roll this out yourselves. +- Simplify package scripts without losing any functionality. ### Add - A changelog! diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index df3e90d..0000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -www.jwije.com \ No newline at end of file diff --git a/docs/MockValidator.html b/docs/MockValidator.html new file mode 100644 index 0000000..086db8e --- /dev/null +++ b/docs/MockValidator.html @@ -0,0 +1,140 @@ + + + + + MockValidator.ts + + + + + +
+
+ + + + +
+ + diff --git a/docs/dereference.html b/docs/dereference.html deleted file mode 100644 index ed3c05d..0000000 --- a/docs/dereference.html +++ /dev/null @@ -1,375 +0,0 @@ - - - - - dereference.ts - - - - - -
-
- -
- -

dereference.ts

- - - -
-

Table of Contents

-
    - - -
  1. - - dereference.ts - -
  2. - - -
  3. - - get.ts - -
  4. - - -
  5. - - index.ts - -
  6. - - -
  7. - - isPointer.ts - -
  8. - - -
  9. - - set.ts - -
  10. - - -
  11. - - typings.d.ts - -
  12. - -
-
- -
- - - -

The dereference function dereferences schema, that is it resolves all -$ref declarations in a schema and inlines those references into one logical -schema in accordance with the IETF json reference -draft-03 -specification.

-

Usage

-
import { dereference } from '@jdw/jst';
-
-const schema = {
-        foo: { $ref: '#/definitions/foo' },
-        definitions: { foo: 123 }
-      };
-
-dereference(schema); // { foo: 123, definitions: { foo: 123 }};
-
-

Arguments

-
    -
  • subject: Object|number|string|boolean|null A json value.
  • -
  • resolve: Jst.Resolver A function to resolve a schema by its id.
  • -
-

Returns

-
    -
  • any: The dereferenced object.
  • -
-

Throws

-
    -
  • {Error}: If something went wrong when dereferencing the schema.
  • -
-

Dependencies

- - -
-import * as forIn from 'lodash.forin';
-import * as isObject from 'lodash.isobject';
-import * as merge from 'lodash.merge';
-import { get, isPointer, set } from './index';
- - - -

Implementation

- - - - -

Here begins the implementation of the dereference function. This being -version 2 there are some specific goals being targeted.

-

Design Goals:

-
    -
  • JSON in JSON out. Any valid json value as defined by the spec will do.
  • -
  • More robust json pointer support, including circular references. Correctness -is paramount.
  • -
  • Caching of schema lookups.
  • -
  • Cleaner and more modular design of codebase. It is ok to sacrifice -performance for this.
  • -
- - -
-const isHttp: RegExp = /^http/;
-const isRemoteRef = (ref: string): boolean => isHttp.test(ref);
-
-export const dereference: Jst.dereference = (root, resolver) => {
- - - -

JSON In, JSON Out

-

The json specification section 2.1 -states:

- - - - -
-

A JSON value MUST be an object, array, number, or string, or one of - the following three literal names: false null true

-
- - - - -

Any other value should result in an TypeError being thrown.

- - -
-  if (!(typeof root).match(/object|string|number|boolean/)) {
-    throw new TypeError(
-      `@jst/dereference: argument not a valid json value: ${typeof root} | ${root}`);
-  }
-  const circularRefs = {};
-
-  const walk = (schema: any, resolve: Jst.resolve = null, path: string = '#'): any => {
- - - -

If schema is an array we dereference each schema and then merge them from -right-to-left.

- - -
    if (Array.isArray(schema)) {
- - - -

first validate our arguments assumption!

- - -
      schema.forEach((s) => {
-        if (typeof s !== 'object' && !Array.isArray(s)) {
-          throw new TypeError(`expect typeof object got: ${typeof s}`);
-        }
-      });
- - - -

then dereference each schema in the array before eventually merging them -from right to left using a reducer function.

- - -
      return schema
-        .map((scm, index) => walk(scm, resolve, `${path}/${index}`))
-        .reduce((acc, scm) => merge(acc, scm), {});
- - - -

If schema is not an array of json objects we expect a singlular json schema -be provided

- - -
    } else if (isObject(schema)) {
-      const schemaId = schema.id || undefined;
-      let isCircular = false;
- - - -

traverse is an internal recursive function that we bind to this lexical -scope in order to easily resolve to schema definitions whilst traversing -an objects nested properties. This is primarily for efficiency concerns.

- - -
      const traverse = (node, nodePath: string = '#') => {
-        let resolution = {};
-
-        if (typeof node !== 'object' || node === null) {
-          return node;
-        }
- - - -

if only one argument is provided and it is an array we must recursively -dereference it’s individual values

- - -
        if (Array.isArray(node)) {
-          return node.map((v, index) => traverse(v, `${nodePath}/${index}`));
-        }
- - - -

if we are here, the first argument is not an array or value and we expect -it to be a json schema.

- - -
        forIn(node, (value, key) => {
- - - -

Skip the following properties

- - -
          if (key === 'definitions') {
-            return;
-          }
- - - -

If value is not an array, object, or JSON schema reference we can -dereference it immediately. ‘typeof array’ equals ‘object’ in JS.

- - -
          if (typeof value !== 'object' && key !== '$ref') {
-            resolution[key] = value;
- - - -

If we have a schema reference we must fetch it, dereference it, then merge -it into the base schema object.

- - -
          } else if (key === '$ref') {
- - - -

We have two types of references - definitions which are defined -within the current schema and external schema references which we -have to query AJV for as such we must fetch the schema for the -reference appropriately.

- - -
            let reference = null;
- - - -

Here we resolve a JSON reference (uri). In order to do so -correctly we must make a distinction between external -references and internal (circular) references.

- - -
            if (isRemoteRef(value)) {
-              if (!resolve) {
-                throw new TypeError(
-                  'argument: resolver is required to dereference a json uri.');
-              }
-
-              if (value !== schemaId) {
-                reference = resolve(value);
-
-                if (!reference) {
-                  throw new Error(`unable to resolve URI reference: ${value}`);
-                }
-
-                resolution = merge(
-                  resolution,
-                  walk(reference, resolve, `${nodePath}/${key}`),
-                  true,
-                );
-              } else {
-                reference = resolution;
-                circularRefs[nodePath] = schema;
-                isCircular = true;
-              }
- - - -

de-reference a json pointer

- - -
            } else if (isPointer(value)) {
-              reference = get(schema, value);
-              resolution = merge(
-                resolution,
-                traverse(reference, `${nodePath}/${key}`),
-                true,
-              );
-            } else {
-              throw new Error(
-                `could not dereference value as a json pointer or uri: ${value}`);
-            }
-
-            if (!reference) {
-              throw new ReferenceError(`could not find a reference to ${value}`);
-            }
- - - -

Otherwise the value is an array or object and we need to traverse it -and dereference it’s properties.

- - -
          } else {
-            resolution[key] = traverse(value, `${nodePath}/${key}`);
-          }
-        });
-
-        return resolution;
-      };
-
-      return traverse(schema, path);
- - - -

if any other combination of arguments is provided we throw

- - -
    } else {
-      throw new TypeError(`expected first parameter to be object or array: ${schema}`);
-    }
-  };
-
-  const result = walk(root, resolver);
- - - -

We can now handle any circular references in the schema by iterating our -store of circular references encountered whilst processing the schema. We will -only dereference a circular schema once, I could write a monologue about -this topic but let it suffice to say JST does not make the decision what is -the correct amount of circular depth to dereference, we only do so -once. Users can simply call dereference again with the resultant schema -to get another level of nesting.

- - -
  forIn(circularRefs, (value, key) => {
-    set(result, key.split('$ref/').join(''), value);
-  });
-
-  return result;
-};
- - -
h
-
-
- - diff --git a/docs/dereference.test.html b/docs/dereference.test.html new file mode 100644 index 0000000..c1dc310 --- /dev/null +++ b/docs/dereference.test.html @@ -0,0 +1,173 @@ + + + + + dereference.test.ts + + + + + +
+
+ + + + +
+ + diff --git a/docs/docco.css b/docs/docco.css index 54ba14e..b60f6fa 100644 --- a/docs/docco.css +++ b/docs/docco.css @@ -30,132 +30,96 @@ font-style: normal; } -@font-face { - font-family: 'fleurons'; - src: url('public/fonts/fleurons.eot'); - src: url('public/fonts/fleurons.eot?#iefix') format('embedded-opentype'), - url('public/fonts/fleurons.woff') format('woff'), - url('public/fonts/fleurons.ttf') format('truetype'); - font-weight: normal; - font-style: normal; +/*--------------------- Layout ----------------------------*/ +html { height: 100%; } +body { + font-family: "aller-light"; + font-size: 14px; + line-height: 18px; + color: #30404f; + margin: 0; padding: 0; + height:100%; } +#container { min-height: 100%; } -/*--------------------- Base Styles ----------------------------*/ +a { + color: #000; +} -body { - font-family: "aller-light"; - background: url('public/images/gray.png') #fff; - background-size: 322px; - margin: 0; +b, strong { + font-weight: normal; + font-family: "aller-bold"; } -hr { - height: 1px; - background: #ddd; - border: 0; +p { + margin: 15px 0 0px; } + .annotation ul, .annotation ol { + margin: 25px 0; + } + .annotation ul li, .annotation ol li { + font-size: 14px; + line-height: 18px; + margin: 10px 0; + } h1, h2, h3, h4, h5, h6 { color: #112233; + line-height: 1em; font-weight: normal; font-family: "roboto-black"; text-transform: uppercase; - line-height: 1em; - margin-top: 50px; + margin: 30px 0 15px 0; } - h1 { - margin: 0; - text-align: center; - } - h2 { - font-size: 1.26em; - } - h1:after { - content: "8"; - display: block; - font-family: "fleurons"; - color: #999; - font-size: 80px; - padding: 10px 0 25px; - } -a { - color: #000; +h1 { + margin-top: 40px; } - -b, strong { - font-weight: normal; - font-family: "aller-bold"; +h2 { + font-size: 1.26em; } -blockquote { - border-left: 5px solid #ccc; - margin-left: 0; - padding: 1px 0 1px 1em; +hr { + border: 0; + background: 1px #ddd; + height: 1px; + margin: 20px 0; } - .page blockquote p { - font-family: Menlo, Consolas, Monaco, monospace; - font-size: 14px; line-height: 19px; - color: #999; - margin: 10px 0 0; - white-space: pre-wrap; - } pre, tt, code { - font-family: Menlo, Consolas, Monaco, monospace; - font-size: 12px; - display: inline-block; - border: 1px solid #EAEAEA; - background: #f8f8f8; - color: #555; - padding: 0 5px; - line-height: 20px; -} - .page pre { + font-size: 12px; line-height: 16px; + font-family: Menlo, Monaco, Consolas, "Lucida Console", monospace; + margin: 0; padding: 0; +} + .annotation pre { + display: block; margin: 0; - width: 608px; - padding: 10px 15px; + padding: 7px 10px; background: #fcfcfc; -moz-box-shadow: inset 0 0 10px rgba(0,0,0,0.1); -webkit-box-shadow: inset 0 0 10px rgba(0,0,0,0.1); box-shadow: inset 0 0 10px rgba(0,0,0,0.1); overflow-x: auto; } - .page pre code { + .annotation pre code { border: 0; padding: 0; background: transparent; } -.fleur { - font-family: "fleurons"; - font-size: 100px; - text-align: center; - margin: 40px 0; - color: #ccc; -} - -/*--------------------- Layout ----------------------------*/ -.container { - width: 760px; - margin: 0 auto; - background: #fff; - background: rgba(255,255,255, 0.4); - overflow: hidden; -} - .page { - width: 640px; - padding: 30px; - margin: 30px; - background: #fff; - font-size: 17px; - line-height: 26px; +blockquote { + border-left: 5px solid #ccc; + margin: 0; + padding: 1px 0 1px 1em; +} + .sections blockquote p { + font-family: Menlo, Consolas, Monaco, monospace; + font-size: 12px; line-height: 16px; + color: #999; + margin: 10px 0 0; + white-space: pre-wrap; } - .page p { - color: #30404f; - margin: 26px 0; - } ul.sections { list-style: none; @@ -163,39 +127,256 @@ ul.sections { margin:0; } -.page li p { - margin: 12px 0; +/* + Force border-box so that % widths fit the parent + container without overlap because of margin/padding. + + More Info : http://www.quirksmode.org/css/box.html +*/ +ul.sections > li > div { + -moz-box-sizing: border-box; /* firefox */ + -ms-box-sizing: border-box; /* ie */ + -webkit-box-sizing: border-box; /* webkit */ + -khtml-box-sizing: border-box; /* konqueror */ + box-sizing: border-box; /* css3 */ +} + + +/*---------------------- Jump Page -----------------------------*/ +#jump_to, #jump_page { + margin: 0; + background: white; + -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777; + -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; + font: 16px Arial; + cursor: pointer; + text-align: right; + list-style: none; +} + +#jump_to a { + text-decoration: none; +} + +#jump_to a.large { + display: none; +} +#jump_to a.small { + font-size: 22px; + font-weight: bold; + color: #676767; +} + +#jump_to, #jump_wrapper { + position: fixed; + right: 0; top: 0; + padding: 10px 15px; + margin:0; +} + +#jump_wrapper { + display: none; + padding:0; +} + +#jump_to:hover #jump_wrapper { + display: block; +} + +#jump_page_wrapper{ + position: fixed; + right: 0; + top: 0; + bottom: 0; +} + +#jump_page { + padding: 5px 0 3px; + margin: 0 0 25px 25px; + max-height: 100%; + overflow: auto; +} + +#jump_page .source { + display: block; + padding: 15px; + text-decoration: none; + border-top: 1px solid #eee; +} + +#jump_page .source:hover { + background: #f5f5ff; +} + +#jump_page .source:first-child { } -.toc { - max-height: 0; - overflow: hidden; - text-align: center; - font-size: 13px; - line-height: 20px; - -moz-transition: max-height 1s; - -webkit-transition: max-height 1s; - transition: max-height 1s; +/*---------------------- Low resolutions (> 320px) ---------------------*/ +@media only screen and (min-width: 320px) { + .pilwrap { display: none; } + + ul.sections > li > div { + display: block; + padding:5px 10px 0 10px; + } + + ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol { + padding-left: 30px; + } + + ul.sections > li > div.content { + overflow-x:auto; + -webkit-box-shadow: inset 0 0 5px #e5e5ee; + box-shadow: inset 0 0 5px #e5e5ee; + border: 1px solid #dedede; + margin:5px 10px 5px 10px; + padding-bottom: 5px; + } + + ul.sections > li > div.annotation pre { + margin: 7px 0 7px; + padding-left: 15px; + } + + ul.sections > li > div.annotation p tt, .annotation code { + background: #f8f8ff; + border: 1px solid #dedede; + font-size: 12px; + padding: 0 0.2em; + } } - .header:hover .toc { - max-height: 500px; + +/*---------------------- (> 481px) ---------------------*/ +@media only screen and (min-width: 481px) { + #container { + position: relative; + } + body { + background-color: #F5F5FF; + font-size: 15px; + line-height: 21px; + } + pre, tt, code { + line-height: 18px; + } + p, ul, ol { + margin: 0 0 15px; + } + + + #jump_to { + padding: 5px 10px; + } + #jump_wrapper { + padding: 0; + } + #jump_to, #jump_page { + font: 10px Arial; + text-transform: uppercase; + } + #jump_page .source { + padding: 5px 10px; + } + #jump_to a.large { + display: inline-block; + } + #jump_to a.small { + display: none; + } + + + + #background { + position: absolute; + top: 0; bottom: 0; + width: 350px; + background: #fff; + border-right: 1px solid #e5e5ee; + z-index: -1; } - .toc h3 { - margin-top: 20px; + + ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol { + padding-left: 40px; } - .toc ol { - margin: 0 0 20px 0; + + ul.sections > li { + white-space: nowrap; + } + + ul.sections > li > div { display: inline-block; + } + + ul.sections > li > div.annotation { + max-width: 350px; + min-width: 350px; + min-height: 5px; + padding: 13px; + overflow-x: hidden; + white-space: normal; + vertical-align: top; text-align: left; - list-style-type: upper-roman; } - .toc li { - font-family: 'roboto-black'; + ul.sections > li > div.annotation pre { + margin: 15px 0 15px; + padding-left: 15px; + } + + ul.sections > li > div.content { + padding: 13px; + vertical-align: top; + border: none; + -webkit-box-shadow: none; + box-shadow: none; + } + + .pilwrap { + position: relative; + display: inline; + } + + .pilcrow { + font: 12px Arial; + text-decoration: none; + color: #454545; + position: absolute; + top: 3px; left: -20px; + padding: 1px 2px; + opacity: 0; + -webkit-transition: opacity 0.2s linear; + } + .for-h1 .pilcrow { + top: 47px; } - .toc li a { - font-family: 'aller-light'; - } + .for-h2 .pilcrow, .for-h3 .pilcrow, .for-h4 .pilcrow { + top: 35px; + } + + ul.sections > li > div.annotation:hover .pilcrow { + opacity: 1; + } +} + +/*---------------------- (> 1025px) ---------------------*/ +@media only screen and (min-width: 1025px) { + + body { + font-size: 16px; + line-height: 24px; + } + #background { + width: 525px; + } + ul.sections > li > div.annotation { + max-width: 525px; + min-width: 525px; + padding: 10px 25px 1px 50px; + } + ul.sections > li > div.content { + padding: 9px 15px 16px 25px; + } +} /*---------------------- Syntax Highlighting -----------------------------*/ diff --git a/docs/get.html b/docs/get.html deleted file mode 100644 index 8357b98..0000000 --- a/docs/get.html +++ /dev/null @@ -1,204 +0,0 @@ - - - - - get.ts - - - - - -
-
- -
- -

get.ts

- - - -
-

Table of Contents

-
    - - -
  1. - - dereference.ts - -
  2. - - -
  3. - - get.ts - -
  4. - - -
  5. - - index.ts - -
  6. - - -
  7. - - isPointer.ts - -
  8. - - -
  9. - - set.ts - -
  10. - - -
  11. - - typings.d.ts - -
  12. - -
-
- -
- - - -

The get function dereferences json -pointers according to the IETF RFC6901 -specification. It takes a schema and a json pointer as its arguments and -then returns the value in schema described by pointer throwing an error -if the path described by the pointer was not found in the schema.

-

Usage:

-
import { get } from '@jdw/jst';
-
-const schema = { definitions: { foo: 123 }};
-get(schema, '#/definitions/foo'); // resolves value 123
-

Arguments

-
    -
  • schema {Object}: The object to query.
  • -
  • pointer {string}: The JSON pointer path of the property to get.
  • -
-

Returns

-
    -
  • {any}: The resolved pointer value.
  • -
-

Throws

-
    -
  • {Error}: If pointer cannot be resolved in schema.
  • -
-

Dependencies

- - -
-import * as has from 'lodash.has';
-import { isPointer } from './isPointer';
- - - -

Implementation

- - - - -

The get function implements the Jst.Getter signature as described in -typings.d.ts.

- - -
export const get: Jst.getPointer = (schema, pointer) => {
- - - -

A JSON pointer must begin with the symbols ‘#’, ‘/‘ or be an empty -string ‘’. So as a first step, we check that this assumption is true and -bail if not.

- - -
  if (!isPointer(pointer)) {
-    throw new Error(`invalid JSON pointer specified: '${pointer}'`);
-  }
- - - -

If this check passes we have a valid pointer. In order to dereference -its value, we will split the pointer into its orthogonal pieces and then -iterate schema checking from left to right that each piece of pointer -references a valid path in schema.

- - -
  const fragments = pointer.split('/');
-  return fragments.reduce((object, fragment) => {
- - - -

If fragment points to the root path of object we can just return -the object itself.

- - -
    if (fragment === '#' || fragment === '/' || fragment === '') {
-      return object;
-    }
- - - -

Here we decode fragment according to the JSON pointer -specification, replacing the character codes ‘~1’ and ‘~0’ with the -symbols ‘/‘ and ‘~’ respectively.

- - -
    const token = fragment.replace('~1', '/').replace('~0', '~');
-    let reference = null;
- - - -

If the ‘object’ is array assume that token indicates an index in -this array and try to resolve it appropriately.

- - -
    if (Array.isArray(object)) {
-      const index = parseInt(token, 10);
-
-      if (!object.indexOf(index)) {
-        throw new Error(
-          `could not dereference JSON pointer: ${pointer}. Array does not have`
-          + ` index: ${index}::${JSON.stringify(object)}`);
-      }
-
-      reference = object[index];
- - - -

Otherwise if object is not an Array we expect object to be of -type Object and that token references a valid path in object.

- - -
    } else {
-      if (!has(object, token)) {
-        throw new Error(
-          `could not dereference pointer '${pointer}'. The fragment ${token}`
-          + ` is not a valid property of object: ${JSON.stringify(object, null, 2)}`);
-      }
-      reference = object[token];
-    }
- - - -

Now return reference

- - -
    return reference;
-  }, schema);
-};
- - -
h
-
-
- - diff --git a/docs/get.test.html b/docs/get.test.html new file mode 100644 index 0000000..4625a8e --- /dev/null +++ b/docs/get.test.html @@ -0,0 +1,151 @@ + + + + + get.test.ts + + + + + +
+
+ + + + +
+ + diff --git a/docs/index.html b/docs/index.html index 0337693..b20cca2 100644 --- a/docs/index.html +++ b/docs/index.html @@ -2,214 +2,169 @@ - JST - JSON Schema Toolkit [![Build Status](https://travis-ci.org/jdwije/jst.svg?branch=master)](https://travis-ci.org/jdwije/jst) + index.ts - + -
- - - - - - - - -
-

A library for working with json schema.

-
- - - - -

JST is a utility library for working with json schema. It provides functions -for json pointers and json references.

- - - - -

Interface

- - - - -

dereference(schema: Object, resolve: (id) => Object)

- - - - -

A generic dereferencer function to resolve all $ref tags in a schema and -inline the results.

- - - - - - - -
-import { dereference } from './dereference';
- - - -

get(object: Object, pointer: String)

- - - - -

Retrieve a value from an object using a json pointer.

- +
  • +
    +

    index.ts

    +
    +
  • - - - - - -
    -import { get } from './get';
    - - - -

    set(object: Object, pointer: String, value: any)

    - - -

    Set a value on an object using a json pointer.

    - - - - - - - -
    -import { set } from './set';
    - - - -

    isPointer(string: string)

    - - - - -

    Checks of a string is a valid json pointer.

    - - - - - - - -
    -import { isPointer } from './isPointer';
    - - - -

    Usage

    +
  • +
    + +
    + +
    +

    JST Type Definitions

    +
    + +
  • - -

    Install JST via npm.

    -
    npm i --save @jdw/jst
    -
    +
  • +
    + +
    + +
    +

    JST is a library for working with JSON Schema. It aims to be both simple and +performant. We begin by covering JST internal data-structures and interfaces.

    +
    + +
  • - -

    Then use it.

    +
  • +
    + +
    + +
    +

    Interfaces

    +
    + +
  • - -
    import { get, set, isPointer, dereference } from '@jdw/jst'; // ES6
    -
    -var jst = require('@jdw/jst');                               // ES2015
    -
    +
  • +
    + +
    + +
    +

    A Resolver function takes a schema ID as its argument and looks it +up, returning them schema as an Object if found or undefined if not.

    +
    + +
    export type Resolver = (schemaId: string) => Object | undefined;
    + +
  • -
    -export {
    -  dereference,
    -  get,
    -  isPointer,
    -  set,
    -};
    - -
    h
    -
    +
  • +
    + +
    + +
    +

    A Dereferencer function takes a schema and a resolver function +and then dereferences schema in accordance with the IETF JSON +Reference Draft v3 +Specification.

    + +
    + +
    export type Dereferencer =
    +  (schema: Object | Array<any>, resolve: Resolver) => Object | Array<any>;
    + +
  • + + +
  • +
    + +
    + +
    +

    A Getter function dereferences a JSON pointer in accordance with the +IETF RFC6901 specification +returning its value if path is found in schema or throw an error +otherwise.

    + +
    + +
    export type GetPointer = (schema: Object, path: string) => any;
    +export type SetPointer = (schema: Object, path: string, value: any) => void;
    +
    +export type IsPointer = (input: any) => boolean;
    + +
  • + + diff --git a/docs/isPointer.html b/docs/isPointer.html deleted file mode 100644 index 6287c39..0000000 --- a/docs/isPointer.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - isPointer.ts - - - - - -
    -
    - -
    - -

    isPointer.ts

    - - - -
    -

    Table of Contents

    -
      - - -
    1. - - dereference.ts - -
    2. - - -
    3. - - get.ts - -
    4. - - -
    5. - - index.ts - -
    6. - - -
    7. - - isPointer.ts - -
    8. - - -
    9. - - set.ts - -
    10. - - -
    11. - - typings.d.ts - -
    12. - -
    -
    - -
    - - - -

    A JSON pointer must begin with the symbols ‘#’, ‘/‘ or be an empty string ‘’.

    - - -
    export const isPointer = (input: string): boolean => {
    -  if (typeof input !== 'string') {
    -    return false;
    -  }
    -
    -  if (input === '') {
    -    return true;
    -  }
    -
    -  if (/^#|^\//.test(input)) {
    -    return true;
    -  }
    -
    -  return false;
    -};
    - - -
    h
    -
    -
    - - diff --git a/docs/isPointer.test.html b/docs/isPointer.test.html new file mode 100644 index 0000000..26bdf2d --- /dev/null +++ b/docs/isPointer.test.html @@ -0,0 +1,108 @@ + + + + + isPointer.test.ts + + + + + +
    +
    + + + + +
    + + diff --git a/docs/mockResolve.html b/docs/mockResolve.html new file mode 100644 index 0000000..dc96126 --- /dev/null +++ b/docs/mockResolve.html @@ -0,0 +1,104 @@ + + + + + mockResolve.ts + + + + + +
    +
    + + + + +
    + + diff --git a/docs/public/fonts/fleurons.eot b/docs/public/fonts/fleurons.eot deleted file mode 100644 index 26189bb4016b70af8ab0ed01c4864270d22905fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35557 zcmb4qV{j!v)9yL3ZQHhUV%yv}C$??db~fIa8{2j^wy{XE!ME>Qb?a7r_t)*Grh4X? z>7JP%^JAuaPGSLomKXp4;vb*@|IzKa0002+`>i@L$zrO#Bcm2mm z0<`}zuK%_C&uB6LJAehi_Fs?zIR0t&e<1tk*YRI*|5r@^*^>R&<9}xP&#eFPEcE}i z60-ki9RPs1hK%a}-XA33*c%WN0f>nMSO{UwUc}EYp>LMac@R#;3jx_AkHlGZk?)l6 z5TgMS5|_r~&`7Qh>Ktx%lhdm56x@uNM_XMQ$~E6xC*oJ|XW2Bw`IfvaEA-E5yS(KSw$06Na>}ByMbc}Mgt{V zWJMn}sfd@QIZ-VPS}GV>Y_b$+FxrAH#JBVK9!r|vUDQ1i@jt4V4!8!tEonck&=EX( zV*iFg-;RdQg6xhwN~b!vi@;38#9aX7!R^QX9c<5h+HAKFhfF^fBjP5*M69GbYhdZ* zn|_wur^UgpjtBPqNn|M}EY*`3h?qVbwrSB>cD~lRF1Bvvj^y(rc65qdcEu_1_di|W zpuk#b2Khq@r<_IBP}e7Lfx2+I1D#)MUAA9V15GDZ{2H(3Z6U6qRp)`C*#msl|EnT<#ux?<~eE33Gew+5TfBi8U z9@(?j%=eGh{F}oC+A9!bl~o^$SC>?eNehXH{RY8MKSe z-vQB{#eQ^?A|e42(jTwU^e=~flHo&#O6u0JMG|T^Uf-w=4)#A&!Ad4J&4YJom)Y7~ z!oSDOvaZ*7vJOIOK?rZ%I_$DNi}r}*{PE%5J2(WgjnaKqo#fV8F!zQqIMZzQl4yqC z7T77QiMDrDR}D^-Yg$<-ENlF0INDW7DVCeRFd3+vvbb2Gxm_S!)>i$BFu#Oj7(}5@ zBMjWfsW`>b5U-JA(IyL9@o|19_C9B7=1~$u9P4NbPxLPCTMkh!rzjmQ#O}0{qLC9K z?4vFot@NFQ|B@YH>MR18(GUje401?kyX1y1@?If+NM=|)jPa_IixdY_#pn~TZ8h8Oi;q4nxzy33vyh6Mu{_$kmq3turQvaAW%cuXA^3^UZM9ynsSP9POHVtB@(qTz9X zUGm?|v3~FX_EI5IPQIx6t|;L+-8xpiLgeO_asBp2Ir=WQHfVW59y6%i96Tu9Q?idG zu6-@7Zoe3o`imb?6@oLjt~*;&65&!@JZ-;p2$|rv1ePzJ+Oz_w7fI$?+%t56S18-s zrKF=9=%=|R^mg$aKCj#6QY`Kcb&;0J3XWWene1|YU z3`)Jd98h}lr)$6`f+x_1`JGAsJ*EPa zlUaA2alE&~W76Y&83lR+=T$ky6Koe;(S29%%nhXxxTT9mDPSR|hc`lDSoTNTr#NlW zsf*%F1%7yQ_Z4?U@t59vmTIoQw$!mGezwu|K28% zw(V|z6g1wC@UP0{#X>DNrJghi>J+aujrWEzWc7n%f5^ix|Jkicu8EB}_XP9Oe>5{9p}E9PM6H-$3j4cj*<8&OENU@CXFEi-1R+>}7Q@Q0ry zJ7mhEd(_`Fk|%1+W}mL$HKVoAAMC@u2z`J3-F_{H*!e=XcxdEs3U>W)MPrEi>Gx9c8j_XzM`H4-~Q~ z6m>LcRRc4b#^X#}D&ikv-NSNMdBv5>(;<4D`tjtmBXT4zYD-!JV_wlSU&vZ5V#!E| za655hzrBD(d}~|9l8s*Zt3xH2*>Lc-`!GvqEmaYgQ>V*-R{Sz(*c(C!h5Vt-G`hl+ z4D^bSV}wMA`%m84tbQ_-tRVhwo3@O$d-+F3A67p?~1DLNMBhA8NyGfPv~JByCIMY0GdVLgNEH+aXLk)1D9&l%W4HF+)66t5r)Ji1X`>T$2 z_G}>RwCJ1JXVWL_m(3GkYWNqGxWY-mq3&lVs905j^Y;6q9IajB6R#}*!f?o!*}aPr zn`=i4QDB7r*!<2rv{bp`lDPb8YAy|_FsC||D2DcPZXI^bVjRjP@N77v#fo~k2faEi zx#9Jir$VWz8iK%`8|$@`6~2wrOo85HSu#ISZ&ncdyY^4ta6o=TGP1*QL>*zluX@3N zTD8mxlICqv+7*bI*FCZ|0{G#%>H`9viElN=?U`(vy0~*+86M!qe}_G#m8*2W`?eJ) zS)jbwJGPf9M^IRjWq2SecYL)L}$tUn@RJOx~DZxeTX$)Y!|rGxRGMJPg`i#;Mw z55hIP#vHki1@ZNTkrd<6$_h-Bo#x`m9vXS|cj7^yA)n&8WYPX{6<1f4F3DRn3Z(U= zLMSp26=I|lB(?!&zhWqWxgg{i!-hy2!$BG8CzSg`VeuVnbUlw!BzpE6w0_SfJv-?9 z;1Df;X(mRGMEl!FqywxI>zGiRo{ouX)=0J!W9-RJ90S}pDCPaZLv?&|R)Ta3Mc&#v z_g4Y&1FB8R6uYS4$-nxtGLmfjS%o)e%Eanye+z=AVd&!s*vWvPD_ui&fx|lCB?(V$ zfrq)?x6V(Bq77k()lc-D=)^Ul zx<&&dx}``|U%4?JgG~vz)FjfAI?x_Mt%YvzV6-J28Z`s{am<(~G}2dZ=R&7mH6FSu`m^rh+Q`9`z$NTw;7V zNY}^C^X5$~Ux`kQi;2jw1UUl8p)aljxRa}e651zG{4SZy9Yew?dOJF$KxLljj@ww* z?%JnSt-*OlhFU1yVS)`E5B;5ooY;LHh2ki>k}(sKA$H>OXxSF7N2sQjZGyi)-wIV;1k^CtH)4H{2jz@NrXuboKIahquW z7_@-&18i1!7Gl^$vb;?#4@ZuTQ7l$HAo_@c)QNBKd&p5g`X2~A{7^Zx3!UgCk?FxK z1?$>nk$zSL)^Z8J>{4vtG{a_XsVB52Ivt0@OScY{#u-p>#A~IZU5^0LT94DY z^=GEn5yK=Y45v67AI2`RIMD-^tro+t_&TpsP;BcjKgc9} z>N?)_K;zZ}9ioY)wP}xwDpWL!kZ|Vx2!Wcjx*sR(`$%w(QRRB#Gx-a$(vA zi^}(dxf6OEOuc+{=CmX;OZb{Rjbj=_#S1I=6Em;QP_EZ$y6pbyCB%}kna~EZs>9hm z5@M(M$joz?3?NJxXc(>F#HbB({&uf)ZQ>8bu4^fDra6%XD^vEVEAukGI{M?|8}45) z&(VQv&@|6iZZJWtibCXbvTnF0;RYqCWK=UW<)Uaq$Kp@NG%rw(ABsFdNDbk7TvvAE zqvgMon{sGd4rE+)1UAvcn*~0U6$wFVpY2$u7$LVN$_Sp3zgenyU}3y9ry)t{L}_S_ zRDN^4L`z))pqnJc>=Lr?;6ux<-*2&%E6Tudbp?~anPmjuP%mE!ViMXOuRzu^s8ppP z;GI4xescx=3RHly?(m}wX-m!b0hqlB)Orq407mB-y_y(HEBaU7JtA6&ua+GU1CTPA zdT5GM?@?|X>Tn~WXMqQqi|S%j7gc7%fK|o(V1jPe2yqBko;?)_9qTn2brIZrLsfo9 zI@1}9KrZS4;?T;xzv#SEz|1Hyv5`OV=?xJ?WuZn$sa?G!+zeVaKvAfpe492Rve2~= z3$|d1ZL$fxF%2xNm)vZrYLpe9ZG7%Mq7nm=C{IZpEsMm@QzVJ{$4JO~7KlO3T0=Ls zoWkhA`(a4DC_YE!e4x^BOVZc7g0lnC%r<&Dh=SV~AHL=Iio^K)fu?aT zXdkNnc^JOWpI8IWV&Yk_)R3RDx_Yv33Xoj&W|t=KQL2rMk&T#!CP;EaV**xn0Q8|*=w0GLzy6V@B}De$45Wn=5CE<{F~lMc6+W&YagW0MDJSXV2)$rY4 z65ps&axT%X{A~TOSB<(pjOBT~x{9YM-0WvSkvoN(;~^LtQm}R2)=9_QNV3P&doZq703-ooD0Xj?!k@ z4&^Yk7n$im^c69I*jI7_YC>|pRrP9ZG5QM?w-vfaLv1x^J-TSY2c&LyJ;9CtX_!36 zyR>Sww{uOJhW%A4V^(GW_4yq0+HS38uQhu*OcWjUXFUj0IKTo(6ZXs`9s$|utxu#- zbxO`~?6ZP(|I7wvXi1Ryk$!fRc7217Y0nPm4eKWOMLbaeNkN%aEYQQ3T=Gq`?Q7Q1 zuA5=#Qvby*=3Nl-fW`%(v}6h=0cP9?1zK1-+d>+Iv9r?~h(m_!W<-U~5vm|!Cq{!N z!i)b$nNOs<&h!MPfvbj0six@1OogSM037_~Fl0#X+(2kBK7Bx<7^cT7*qpF1$WH*f z^o&m>fV~pe#X4PKZm^}_Qd1`D%j2x|utfdUgS4y_#J-8=%qN5Sgp|06hjXP~m0vn; zIp?Y=E4^f9=t+LVw=S{0%`qK=?fr){w~(aY-GTe8YX~SVeYGGF{nduetEl24SCcOa zUrnkPhaB^Xj{BOAs3;rHh!xRkCRWC1t15WU;d<}c{4$A6mJW$6jn;Qm`jK>a3QcvB&(`SMU7)~b5 z^-9kZMfWE^5qN*CQ+lhXkhj{2J=kiCpYiyVZ~P)zHI6$f{?3kP=Lw>hB10^)u$AM#&6l97(T2!U z+mEiU#L8Ug>oJs^qL(CWLP1A_v(K9QW-ve)v!qcKD?Qq1u2by8I5pSt|tsG#n+s_CenlyR_|hnl!YAs zBGH7c`EbmAsi$(0RmiSoU__54Xaof)YN{?Bv(}h8_>&#YZp?r7c$4`Tq$na?+!AXn z(tHm&h!wYhUY+FJ_vnFh8x`J*u>~V8Tu>?Dpc8NhKhn~aON4A+ioTGAPOy}X`ZaM8dGyf?L^0lOnLa*`U`!ESfdF-NWuimjfr$T)g@@H6kjyipR^C1VO98f$ZH^MJ#zdD%22;>trJR zs$H&d72h$qcXDy5vZ>1%VDi0PV}@XTkd?8(!;ze>DYZ>7HAsq3-QA-dKUyg=GWLG? zo-#rcW5D4x@f0$SMxPPem{JEX1R(Pe*A>HrLN@~4Y<@)Z7Re@#aW?UN>*;FUOc@e+ zA%Vnzr58)lU{7q4*!i1-HkhNXAgkDtXK1byt+l}PB8gYK8_t}&$&H1F?-Bfc7V%0G z?1^9cWLXUA5CTBIOe3l2awxj5@g&E(WmNsqi)~og-ejr1h^f8$j(KH~Lsh8irV1IJs|Vlc{s{E%h}u z_Cv9hI<3?~oTAxOQ{tnoTrB`08!-gB%=29T)LQ?pq~F}67)8@RN^eID%zmz>(1vWa z-k+|VD4?N-aM^e|$<*})+0;?0ZEi96D-xAqf_(b9#Y#9uIL{dge$CdD`p}m{=*{Kw zTC3!SJYFzb@;D|PRUwf+SK*Br6!6C0%d3z@l&RGe;X<8_7Nl)08FWMk>w1ta7gy8d zEcEY-Nn|ztg46YW6K8_T9%7tGpd<(#=`0zgZKCgxMDJw@qzuVldi|rvz!K0Gj zE_aX!mD%t;*q%#&0YG}T)?hyKv${|e9D(Q7 zCnwA~XcG?sK?A2>&b%b6o2bo!KfSDB4l;l*sdVaZDl(VkisYIbA9~Q+o$QwH%kS~7 zDy7!iJANilYXB`OUF58=IJvZNH2lag@}NLpZ+SWv^{|iuhC`tc#WJhc*PWJWqs()G zRKcncwA5}VWw5Ie?dNHOSP@$uc4>9=xP;1b{5^vFAoX5TAS@&U?1x&A9ig{xYM1G| zjs%>A-%y256tn^hzhl()5L$l%M5T-$29C?i2)26mI@L0Q)yVO5cf>YX9Y?PXhWkNl zQPec#-vagd%5Ob%Vt4d+Xl#}z!EO0RqQQ-}78(Z6WkD-pK&p?NC*P%P)823MmSGPg z3%~8C((g|3qPX950H$j9Khmh>J!EALwK7wUo~ zr085?LWMrGjjle3XqgxAtbXQl%}(u-E?6>iRd6Cl86EBYn0B>b2k#!jW9i7CV{P?_ z$CO1NWAhrIk8Q72Qt`i7d!WDv)@S`>qXdjP`~E}(S=+77{&IUOI(AoM62z9 z>BwD_Kru}87#{?}egC=zM6PmX1nuHOmMDFZJGF&+;=84l@|rj#EP(b_VvheJocU`m z2H&bbXqC45BEA!pb#-nadPHA_RtCLA-Hg7a==(UU@83g*jQX{L%Z%GRKipAQpA2lY z(eE|i^hSG0ge@xYi^3j{Xq0b2h9^C)>R=dX6gXS{^&Pv=v&Tm+>Wd^0?1ZEyd+qGcO6t3a@pDks$^vn6orhJ z52vN54_b+51hyhz4vV}4)K;&z^dl9Fjy;v19UIsTu!gWh4wr-{A|+=Q3DD}ptvs(0 zeHRI_Nd1(BpkJPShUWFI3Nw<&>XFXW7mb&yrQ9iMdWBM_t7GC8u12J!m!VGZ4pI&@ z3tbw#1`2Q3r;!l|C>Cdz66%#0B%j(&%GrH3L;ITjsbva>(fqV`Fs`zU{rawfp2VP# z%T{`;slCtl{SF1fGU+a4gsM;}f@hjID(uNI>aa-s zH2}`l1ref)+$`3CKA@}^#^X<3efwPGbti4O2R>@tluA>{l&e=LSu9K~2yUW;R5YQ8 z(l7~zz0AK7MFq(>rMXluRP)rdKm&nG!JO?z{!T4eRf4+ETC`+tltILqxzZ+q`o{f& zimJP;kLQ(Xuk4n)>}``xrga;Qk+Cm9wY(Fv(sUPkkq!|OAT5uMgQfBXlk@Tzn4ah1 z3*(LbZU6_5=RgCYun(Nt*47syXq zzSB>o*=I5QnO99$KGvnHR-fL0qTG=%*=DJJbUMt9IG`z3CMC-tzx8l#>{T&AJcKUK zFx3NYf%5847SZ=^PcF?W0ZmU_=adcmcqS~qOT2|nNFz*${D@Kfz!v|Q_Qfm>Z@Q}y zEfOCze@q}xvNZ0kqW|tm<@04%DSiA0kadWrHzuP?t~>-capsFf|-t`D#)tmja71MQhr`EQ`H(=f>9i;evvPyZLcPFs-#ie zh$0vDZNjhO8a$vbmqzqA`sfYc12IeWTDLID)D!)sq7714ZycHu?qgtOYFHL1TCXL> z#E3bAQ1|h$CT48FS_@+_d7Jr*wbb#^r17XR-$;Z@%q6t5Zzy<2x`?q{yEPUw-oaGv zt(oXWnH*lgK8wah-fBHtW~sbKtofH8S)Mg%n3(~nQ=Sv-)_FDj(5m`Dkc?=*fJo=* z4`6?^)aQrgdPwa97*J?Y23o-l@pC#zr9(@hMecHCCVqxVFuibuu9S*BbXQ3Rr2Cin z=28Hpk(5^H5HKlmB^ni=b`%SumWrpGqp@IljKgx4uahWkhN4vLsm6Sh(Xk_$bhsi4 z@0t1^2VT?i&yABI&pU&N+$Z>Acbr8d5F!cGJ84a=oLWfK-056G1)s_{&wGe?V-j`{ zpnj?WFgWQ9$NZ9!k+s9=s!9aYY#ZYxTOit_bBoM=VBV@m=3i;+?RJxxiT-;8yW>mj z;!fT{Pz)IurQtkYM18w&A6?BuNKU!y3+1ioD-0OYV{nG!z@ictfs7IT8O?#(Bm0xO zw^Rv_U?!XoA&>wCZdl`ywJ1g+^2|#u6aarV1kunu;)R#v~X+(4-Rv zPdO!G_;l}^au7@2RYpO@N2H1Q;pSAZfjc%LbY=)>hiJ->O}L;S3l(jQjcil;DN5Vk(9A0bpouXGUp~+f( z2*i5JCDU9>PMNR9XfwtpYb~9smTy{i-TFSmX!=eKD@mY{=XI?u zgqZup<~cX2k(`M_<(nYCMRXRhxXF^OV8C4VPCP>Fs+65q1kse<$CZ}TB{b{|!nlb+ zlpMelEHSpa?r$P;j1~2^(P(jDkTIfNuc02oI1Lpn!U4Er z1KPnej(l7=hkUnGp!@vNF~uoztRkRAIThEam@^0SAD1yXeCI%3XnY#HOc5sqy4n;b zm+af#5CL_~3vvo^(db+b%Xo7o-(duFrv@g}Uu!xu6)X}6#esv=I51PTdKrq>5|vDi zJz-E_vdL)fQt?c5aj=BY)lqlpGF;k;phvbHSJe_wOZ*NoS4Waat&t ziBhc;Iz%bcbLup(`oB`EH(%vA)dkbPkg*Ad9 z)j~?DCxr{H##ZsiVvQS!V6il2|N9fWcr1ya9lEh+g99}JY5_KQJkW!5KD$DA!eR%um{Y}?$aJFF7F~RmhlOiP`j?}Srmu;H`9F8I|CTh)z z=`r)ql;#h}L;MZCHR>(_>#Tdke;GNXs3wEcQpJu91=>U=Bkx4|vMj1o3dqw7G99g1 z$-P?-1`2-tNh8(ItR7zSB{{?t5Dex}UsLC8^0BJWX4Z*NN(e?uRP|!o3NIhUc}ToY z4^Dm7E*%(0P{9ag5w;wa=YH)QfNoaBt>%L>G0T2EAWW}-Uc5&cf!#z`MVxr}8+}9dyhuH*Y!BA2so2~yw|Fx>KyQfqkhdwAC0o+;ypx@EtCFu<2E)t1=heb`; zlUlgwqJ~|N-uQs2=C9pHp$kETc}PRa>p1A z?o)P_hW;1Da5LQRn-o7{Pi(b$;ahteW>CoDE&+I4rBcfc^=+8G&_`<^O6$uNe({l6@WKXDta!- z#$W3YjRW~@e&Fo}H6&=Qh7HA6+=Y7#C0Hf!mJCLDviv8KtS(dFpwljUm!_C4AssAe z*C1ReCe0Kx1G#!%;=2m175*_A#KI&c#znFpM9+u~$_+ZunSj0GO8W9xP{Ivqe`C%B zX(Nea#A;syiZXC&>x3+4QTT(Uu_bghR5pOe=NQk9nTQ`K69cc@k(G%za)iMhk6Aig z+sfc&D|vHL5QF}j0bUG?!Pycy?JXkRj?tjE9@C&tz52Dvy9P(r?F;0mq@ez-PQ$H5 z5_h^v?WgLp7ZbY>SU|6{#1e_NCXtY3Jv&)B`Bl{sDz)v5fS-V|y{`QWw(sxL@Q;D2 zgz6qD+qCz~$tiUA=0Y2cir^$y(=4;T?8mTg`^Gl5NjNxPPx~Z(vq>*2@{#h})OiDQ zAL-SDFTdiI&?5Bn>s*p;2<@a^L#o_g%Z*L+J#n-~!T5_~{cHo+sU|cH#k&~h_7X`E zDn`=phZ=5K#ROAl)5_JG`Tnxw1x@Xag}o+R*_Ba7B|v#aQMA^}b!Sw?#^Yl+Whw>e zQ|8E7%414=D*KFJXrQL)@rlk9d0TLaO^9Md#LR`^6)NY|LJ-dIxrX%44$0O?J#Rn- zIGYXUm$5ddF_Tpk|Gl$K3&mT^hI6{w+#a4=po>trR0@Sbtx>Ntrh4Wk)Y7229dTgG7<0U667`6TH{&yBNejnUl>_(U2^*VpT6-FW;rgFH6zDs$f?o%NLo2 zMu(8Eh#lyq`5r`%Tn757aV+S87v|7ARaJK5Ck4r0OvxwioXlr#UYp_?DSC?+!iE?l z5aQ2-mL!k=Jsgr0s^4uutt<}00V1xq6W*M!xMNw%i-t_D8l_3fmc=d z=8doS3cIeTH5oZojN~U~zlDlg;bI}cw1e!a$?r#Fy}><^IHm{P)NKf1N??K!5voWa zbKf*rcAe-}aPTGt_oG-hlf<)%3NAWQJe-|>a(poAQqqTeaWL3GrB1Cc%=?H+wvlzp zh0fT;GZdL@*;9I7-pF0Dp*1wzw@YZ-?$FE9;27&e22UYU@>D^|nO6E=Mrq7hbyNhA zIbHlg0Ck-8?cIjvnq5C7ENWqQ*y9vNXH75nuXaRHGWpI2tgh50CyMd!H(#iFoxBDM z9*l^GQQb*-XN~ei%wr7l;A)4geSUVb7a3S|7eruXdu*cClWr+B%g}a`&>mF1s{2;zR4`BNA~Ca^5cHch*>c*EMnm;Wv(HuqgQyRqkb5M8XH;* zTvllTHkEe52=X4{-L4UdrKsuEBwOpjtzn5gv8KZ}XXhY1{_C2O zV8`)1Hdet6mzx~3rLJwop&f14FFX#k;2pL^7!N+EBQ!!? z@SP0sD8i?#r0zkPHP>?2wEnb45_yxeOG9Fxy|6I4!Rszaje%E)iMjQkgpVpz{K+*t z3goz^I++SPLc)^lvuUN>lB7{Ly=FWdM7*yu5?LJfkYrt1mkN_evtZvtheZm;wJl6D zgj#33n;%o!-n2lGmj98ha3?9AapBx>jiw&v7dz&j>~r_*PmdrfnCONob5b&V=xChAYo{iNEn{6aCFzw^2W(S{qws zyjdY}T4}FaK)zHjEsUkzA-r+)2{PBs8F@ zBJW@-dfky&cQlt1x15;JYkZ){jn2B$vMrQ2+=WGxY~uD)jK1*k_Pt3Agfy+q1FUHh z8TrHSq#7cCog%M#q-?>3Y?$fg%-%1is)ntdl|8Y8O+#YlIvVOxuH%S()nY^(JvIhd z+$y||j$}lHOhgf7^+bT>@$F*evjpUbzVYqQ2MTDLz1173fc14DRowgOYxr^LK7wiT zPKYI~dQ9%N78#BP^yKe-jV&7o#??OHv>b~QX2@S)3n50% zg9-QJkrI^85|fW^%T>jTk*KCjVTbO#TqR#WJ2q+3A-I*B@Q|mH9i7!%2-ETKD2wU# z|DY!*ZbO*^;>&@-intKg_zrs~o;x6VB>z^rMs%FuNIAp4&U7$MRE7Rq@CQ&(r)mGW zMj2X;ud;!%w~kZ^wy7fD5I|~Mez;hpstot1+3}4di4lx{#$KGW4@qDjo%%BycnHSW z3BP^M*th?)#3f)&1EJ@Fr;_^3#;4$s(9h)E*ufA2LFU+0vs!3^fCPx*YSokSdk`%H!MoVM#Q$?LX0DWmc-^86?s{Vjt?Oty{5pBP{Svb}zD}p|%M2L< zFUgTmyeIH@BjrrVFE@fcgxy`=@O{{O3p5f%4R7?N$!TG+%6L;IOiw&X&8E&P_Z`%9 zkT`TD4pWEwmK&vFg~Rfa6Gw+>35CR@&OL4v=QRTnm-VJYbg_QvpVeYY6th8N#QLvr zv>bD1;YUMYgF%J>K9s1eNU)C~5iy~M#QXijbAq2^PK2i20*vwzkdXQG zvKsuGR&X&V|I4p7VRdF%k&k5jNEkHbGnRToK8JJqKN$jTM7uTN*#^os{4#q?)-wip zZYtgrZq@cZ5TuebLfN@(%liQi<`4zuOUrl`ASDr4lUS1HnYp-HDAbfor=ap|(=P&> zRsEJ(XmX(3?A~E~X@i5P&yi}oZ0*5dJ)Xig`v^wd!OdbE_<9c*=E}kz^-1XK64OT8 zmUHq$kjq!_mG7AyL!VvI5PKMdoPSnLN`Oa7*ng3O--JtS`uCBShHc)@Z%0${X&rP$8!b|FI}K`pLtz(rWTt*kh&d&_P<#|TU+fTv1dm=3emOa^-J zRI|tK$~Kq&q3x~MecHoSDAp*)_shzy^Na*aNs*mkoSjMuUe4WqVj4wV{lufOU=Ki_ zgc3Nci>C?>-)m-AA-(h}<=GUpJ;ME&9-$tCW1o6L@k+C(vNAhIK~HL-Io+}opaHA$ z81p^*3_K@4@LFT~aFgS#aM-!i1V39yuT2V@B-&TVgiefrI1^*a#MzrZxv0L-vHfuD zoAEF6@c|J6E&p!8DuV>f;nuRg%+801)7yT(NXH)>*B|~Pob`57NHkqV!DfUfhFn}q zVW_F3Rv+Pb;ht0dXzyah$BbSipooq_O0$s`;G!e*+dXo}*SMT`sC-yFwo`(GhKY`{ zRXT;(;z8tJ+`*T@vq@bqpQ>N8lEVl?7W)`;Hj&r&eUyFF`FP9HeTYAF(Sv8&RU*k2 z3&HNI<~zCn6qy^q_gX{gU1I3Qcf%RUbO1E5Bd)w9zS&UI4wP}PW`%QKUgUM{_$&6l zd!p-eA}*KUjQpa={5mFLBi-^XyGd5^I;GkM6!W8z^DV#FJSxOhzJX)YBvty~ZS%5z z^WQsfW$Usm7}Bg0NytLjjw#8l`uf*h&r**$+oNw2su(?^>;zBnqxuW-c+w)N64qCQ z4|@{?r~Abf5Fq*3telhy0UmgA z^R44HfW`@Y&Y1xYHS#}wBQDvEE_|cL4m;KGjm1JZny!E1gXIYhDk60-i- z^SU}+iMu?518vcytTD)i=+^_foVr>Sp4|L0?=`w{pR*k41h|a$@e$ZC?6uHJ&m+~%zu%wVwT~;j#V{6rKeMuvepxk7* zWlLAW340z?O9Ii7Jq~Bxif}L3i!)3Ac;emB=CA*YD=E#8@g>%5rZWypEWJRy+$B09 zDTxAf^R!UvRdU?CDovW{$MbOCC}hH_iPZCB7cH3HsZZ4u@RFt7`BtDmw$R z&>tW!B&9bMVTGf4F%x9ZF&!De`F1xFX2TGX#fybQb|JSihGPx z%{g`P$ti{tlPkTlfcVCAWsBj81%Fe?6vCb%6nz^KxfyR%i^?P)!l?no3w5YRVYd4r z9;sE=wO@C#3jP%}$sJJQE}H2k#mz~wY*FnJan27D6=qhht2!7OUN|bh5Kww_>W0Qt zn~zp`9EOD0S+14iiw|L7CMg%k2it4jq)mQC!1#TD|Ddt+aJ>3UR4ySs9Gq=e<$QgM zrytGGwKGhjXCrmW$20oMs6~SC(g2h(Y*Y-DP-O~u+i43*_IlrF6xN!{BhF}O)V^5 zs%u^h?gVXI&>pe}cr?LT!Kq%54&^eiq3#IH+yN#`w&BT@LD=`K!T^;cI(5`LdYWS@ zmoDW5#rmO_XUwQtq$kQzLl|%sn*X-l4+FP~oJo`cq@+2N=8deAW1_n+bE_T?w!#}pF(?(8(3!~!YB6Z!>QH!-zv zY3k5_Q^W-&heRho|GrYtF}s#H)u3c^E|QKXHy_~(Sjujsloeit^uXOX>fElqbQ&r< zvm=NSE((=sFDoLe98BVc;H#mCrrML5v(XM?YEf*_>76Ey}ZQ;Z#^{rkk%ocd6{ zfa8L3l)KfUVVoyu4~ICEpUgTppZ#& z`WGiKa!(bXFl$RjW>oLpCkNP|@p;n}lJTm>Sb!Kq^!IF{Gl&%qX6^vLxy55Cz9<%; zR-My?E-XlK`L%sw9j$BfV4PkRC_J6-Z zl(>1j!T!Yk=JDdG?E^0jsSMBRWWkm0+&^}4Jj#A)--RI7+Lx~9XeqzF|F<5GB`h3C zwz$Eqbhm^f_`FFZ`|>0@eG~s4C0DJZ3N#GoHq68aP%Y)JjnL=pU!!>O-_$_(MA_m$ z(-EkHPuel*>16wPTYhev7$ICM(aP{1Z_$9K5(~GM9SlPwG#*i~77S+hP^=1i5E0O0 zq&FE=HKiJY7E8`#AIZZKx4k4TK3Y%V%0nJmA=#6hI%>=wdSGJe^Je20ji?@th98eU z;u2I64T)-uD{0wMnqyXpGW6jineZMRc)iKC@A_R|HU8Yc$ND|Rd3}Ze`-c}<|Q+QH;-r_m-HW76jh?4({ z>6?{gDJ(PGS{PoNL`Z01A8Q?bBBhA*o5FEfO(#@ydG2z->HR{J&y$=CD8$@4f z2wL{ZrgqW_%USp*Y?NSF-M{o+i_%QDmt5@K=we-dlmj$GoIB+{`|JD9icDwrr_l)> z2ct|1N#TKY^zx^W+ScC>0SV}YhdmoHuNQ8st~JKWYyo1ey>YN8~vn!00o@`9ZpFlG_LnjJdQd1eC_CJye5nt4|85!l=) zSj#djmF<^Y5`95~1LUk6i3*52WjN4TD4h6g%mBxs?5G0fGg6Cjm$F0>aXGnZVnn-! zUfBKAm2-_Dtr)quXfoE&ywN1Yd#q);C$JVpJANbG+oWlh)DmLZ1+rnKQx$yCBzz+8xP!LZ{#d8-jo z2eyVBwV?%?2+(?1l((p!^a~cRN_i!kic&#?#CWcmt=)?bC3r@FJuJbv+0@K1R!2OV)#J{gfVyo%4#;Y98Pqki(faHsY2(OmLL!knO z6R8K3Aw#8rxPt0N2G>XW0KM~!CMff+g2Mp}6RvDW=Pp71WU!6@ii!uQ+K}`dmc{%q z7nQRuoYK!81RX#bSCEw5H~I0#62twd=28>iV|I?{nup@*bSMBE zO>zJ@9}&qC2O?i9c@0mw=?osXsq7kJ5`zdVl9|H;LES%+H7pcj_k^P@A{I>_$%XLE zHwgXE-oSe7Lh|y|=*t78fj5dj%Tcc>k$F6Tm{Arb(484VB8&i2^@} z`iG)K8F?fPZUZ5)g7xlD1iV07TYS5iAB}B~4>et~w&F?4Ss?~0gNR(!dLqSyC<NIZw8m(-fW_{7D83&0@q}=ST7LrP@kgK75oUtjmfZV#UGmB*L^^?c29IikuOAWE? z&?rIdv54Ta5rNi6x@|%j6kp!xV?Lv7ijqDXIINWz7wZTez3$L)li>vj0M=V_Bo?FD zkzI>AzNUeJ$uMjm)9ON8<4nyjY$IBM*pjxhoO&hVtxU`%WHnHGU$FF zK|6re?v7?IfX;@YCc*%oM;LM(Q4k0X(sPjTwq~7)l`|>Zz#(^x<8|*;kFQ@CQI5eO zSb&`fO0`ono3w4*1mRqVA6y`VHLGj^C-6X0fy0R$5}B`|n5`&^8ru2QKonz3%<9dN zm%HG*Uq)!|IWg;cOBjwLvv80QGhYZtNsq|258-N0T zCx?ybslh75#GBC)S#aH#f|K9rV}f0PCzeAr2t(ZXq?T zC3AuS6M*8z@NWUB<4VVa1%gUgtnOnveZWN20%LjO3Lz$uSi04LNR*r3mGt&#E=2g6 z6^Ss;K~3P+$vO{wM{FR}g5U6oSxv5z7Ss90CwTUWcivkmP<@U@*vV zdU?nqknFa@wo8GUu<|pL9c`wsWHB)hA{rmlBN}vnS!W1DYixF9+hd_*M^rKU>RF!A zq(etZIn*^b13SeAcVxPy>dH?tW=832`rREQGj~7DGT_F8Mn6qHgCl{=M3x-wftzZJ z!pE(vufUd&*Q78>b2cDt3PT7#(7ln%48pL;zyFpNo=e(k8nyQLWl~n zWI$chxG&?ytms(5Awh>X5X^gM$~LI#GnZ<4r4k4waDr%dRO7Tl9EM>{N1_q{K4`u^ zb^Z#|wu(OwS=p9B zpRE?(CAH+75gz(-T5XT~Pu`~+#oTa`PaJHA(pZ1RKQLsDSUo--rRegKfMUHx~EKTv>>hBns@g5+*Kre1{)Nfd+b_n)8^o~PpoWhH5=Fi3-BCx%y3oO=ByWS z3%qL%%%wcyz$BeT_&y29`ZUB$C_d*~+@lu`8J~|dcDDn?2z+W7+pt@ZiwMy`&pi6~ zfC`teOa@Fy#Q`Y#a5V1dIC`7BK~(8@`MiTsCD(MS0a80o5D)^Bap$lS0}-!2q)UKQ zMRo~EiE^ePp^sPAt~L&apfv@xi~#qv}@tkhZN25WKVHfWA!hk4_;9@`b#(=pMYc~Wa8iov>uM7*QC}sph>`N$a@J3qeTgsmW0||1MPW)UN ztA8VJ4i})iT_24=1E5OjyKT5Xed$KIDT;UA&`_Ip9FgBe>9|F^qvEIxtV+u&G0`o& znY@5nyWcup7vb$G8HKCyu270X=?!JHKY+=y0w(zE&uMzBa8!A=x{BGYM= z8F(`y=CzS*B}rTN&CDiy3RF8^LRW%j(4JzWU4e0X(kci!TSh^aRJvHxF7#sl5ppGG zZOTUhme@4ZX!<2>&=eKGj~o8@DZx&E{ifEJ^_H-wKjEi!k&!36p4WAR&_!^Oy(i8v z24t`+TLNNzH&)s;V}K$<{}yFGCJ`#>J(D>m)nxV$DreP4ElGZYMR8lCy+>erE$P37w)l)Q7leE7D)y`kmc0L*! zGlWOiXz4P(iA_P=!%95Te_U9?0Sq~wG*mq&)u;C)3zG_jH&F(f(Gn^|MAy)eTdy*S zfe2*D#Pe_?8Nf5{TvFHRZ!2a=@0VsE@A5&2B$5q*Nk{8~m>Hf{$uDN-p#PvTilE1w&#f5K?I1g}z>jeKWXC{a11juo?YB%z{_kjCbRC7OreU(U=YKZJXB7igJe< zMssp?Y@ZP4YxEZ^fl)^^bDs=SC~Xv-VM)*`KtQwgl9BL2JZTJmpdg`qUYd-~8f{8& zqc8eNBdLe8>aBpgycDc(23c?oP6sHVxI5UUA>2nLaz5O+Y2Y~fcH=6hN|!Rq+8I_< zXs&u??23TPIMNk40%dVycZdzpT3$I=$#Er<(z_XdrZ`gIb3i+ae+jd#gjE~yX->oW zl-lscz{e40x3pUn)07CCUX)YoBwcYl;0$?6G;f5`Tn)?OqWP&+UWGoXOHa$oz_eL!_LrTPu>@506`Tr8u=JRPvoUnF_+)a*4OTmkD&Qz{h&9|U_0`jo{QW^bd7oupcTM%-|c4>Dr zJHjZCeXBl+N%cfR0)n`x1VguF8w4?zK=8Q8jFMo5mqMrvBA87~W695V6sMUA-;@Q| zC{j%>W?B9fHg-|0;2IlHJnJWsPI1yxzuRjb&T#5pPMl8=rg??>Y6yeDAY;48{n|`T zKrN~c3DanF6P93eHC@vu-w+A!_aG*~n3Am+z)D4G#IC%?3_K#W7y*S0A;63C7`_?y z#a5ZfDvYPl_{5Labbw0{Nck&l3+n$Qr647VGN2^!9&{)r679V1OgAPO*=N1WQyKva z<^KU>Z~-UeMBZ9nUwPaSAKcA@P5(%A`h@4AuYa9#!J9j7`1ArTAT&OB7#_Q~IYteS zwcwkfUVf{L;n4PopgTVsY#$&xyh)K`Mi>Mv`SfC5fqJ5S94?!pRj1=`x&aT4`?N z3g=UW2TX}_)Co7te{D>o5E3_BB1qF^F;}$_vCL?ZfC@qv;DSjw63BG=`z;wAX@k)5 zL-;2EO!y=a^rK1HDmW^t5>8epbW&}q^DnU{TQ>q_kE+>SxEVqB2!jy%1Uclc(Yztk8eY0vAoVN8PN;`AKsU18 zCSzbnK~sScFR0t#_;C-iP+J7an<~3BSwMeag^>vsUEXZwEjaf%EIOQdK(!1sSy7v`njr-~s4k=+Hdj6(i%xB0{q_P|l?T za=Qhsa_Z|af`m{XqT^;VEb5^Ri5N00N;NoDn2r)D4jRqkijz=$c2xLR=`g zmvc&j889G%rrNs)#6f@DSRKe1dc0dB$N9<_9(b;wS?&haLfkjbKiP&;f^IhC5ROX}sp@ zeCfC$_HAKWAyCRv9a>TdHY2sB2H z5NlQ0LePx@2AjW5T0eNG~&P?s-ys1uUvszsA*ah5Qsd#OgskB zE5ZdW8v<1AU{(^9xKS)nSi#qi`fNazK6eNwFfR0mVnxm>owfBEmqN$Z`xWcwPVa75e)k_~TMpfx;L z#F~8|F%o(>l`6@}x6AkchZ0)wW0&-iW4_bWtuvB7krn^Iq|6rB5zzAR7(U_D70B^~ zB-l8y$(5H-w<=DmQ-g^*L9U+_(x6sBeJyf0Bn|+u=@F~+A|b5>7$2uhn*qopCCN=D z@yL;7Siq{7p-^2JsgDbk;KGXTTNeQ&ID%%|5{3*d^A`(h7>&iNfu2@4p_9I8o^;`g z9s#+dk+=!Q%qdK(C`2nlP6@_+4(=5b9#nh$ zVI>!(Mj~k}!nJf3DUNUnkP^yNIa-%IK{CJ%Oyt1eMR*+V<}(&B7qR6V7Z_0^I3zmp z`K8Rq6GJ7O9}1mm6}ZXx;7d~PCnlED<(!1GTromuIzK}JSHIGGWiFppcrtpg=8`e- z-k=Axv{s5n)^WW@Q{XlGew=wal8vXSUJ zY?cq2O;~KXU^Q`I`c92@_2edeil16GAYmnS&6`1F6yvN|DTX{J4MYeVKxHrW=(+*p zD5YW!s<=IltE_;MGJQ1r0$h^vda(FF;>3>Wp! zY-sNMS*{=ko*u$CPZnRq9DwV@4u}9p7&oJP8h}resho8PGo0V^1ptL}IECe$9jd%M zHq-PW1vZ58kIi5YZ@H3Ycwr6u5npgSek~cyC{R!m2wQycTlvC+Iu6iD zAaJjz#gp<*meJgPNOc&xpvbqxt`>A=GQbh;df;{Lf@eI|Og;|FgcN%`n=OUowpv|WseW@s3E1t!d2AFTS^~Phn321fT z!37&ta{n3(v+~fLd$c|b$&bx65icHMa7*rPA8e-QPc~>d5WtE+c=msI=S!1*ZL;!oBl zHs99_bpd)xXZsiuM;>;xs0Sj;Me%PKSg&D>Crd~SkcvV=fFW26-mkbwPAD%-iX#BF zOR3~+ZA;nI`ht{zY>6|N1DSp(oH5vfawj2&NCzCtl0jD{4Uyp=`T`9ski6{aL`HxK zbySmPn>5Wq3PXWO;C&H;P`!_)f@UTH=fu`IP2#c#Euh@#kf~LsS`9JG2ag%dk7~O7 zLDnP(JEH1IA#`h(2D@gsYE3@o3$wF0*w>k$xrZbW%dYA}oLHp|G}I{(%5U+TdKJ}8 zXLKgMw1vY31Lne#Ym115xNZs z2tr3jo8lC;Re1dRBD z6*ORdxOmIRpsw{QR?+nHNA|9h?3~)S$AU-_G5@5ja#t4eh=y#q5{`4w^`9ppRFj z%mM4BqaXjOB^Ka)LMK*bj^Vm@R69orD5Oky(S zBvF$b0^{Q}OrRViBLV`*s+Y!;OxMq7!cgt2W)FL9mu_OMlaK?{UegkgYmLEVjaVz?-x!W;!4@ z7O+RIF&JWyO=Q9-u!MOjHV%SU>k;;bP%};otX!ls5ei^|#)B@z>Jof)R;0m>58%$$ z@!m)cD44*Y;z4+7znEfE9k|3JEV;9N%c6Dw%bW!@MYkzKv;93R!~r#|8qgBx;}7UU z`!M!Z5z6C7at!Xv4AjO12Mxi>)iz8FE8o)l7qwvNDXNLA!?z~|>>BPRdXPh1cqIC= zhGQWzJ2kxkX6Z~D!6|QIfv?Wgv=&~tNc1!@a_6CF0;=-5pl9?oi~^#riMt^Yq%&!8 zBu(uj;^=;naMnU+;LV~7$jWHNfJEr>1!_?h5Kb^u#qlA=IzlPF`54kV_7#*QeW zKqpQDaj+<`78S1&FO~tbOf+T9aF)!G-Zz;jQMG{ zdb$X(G@QjMA1sH4=Mostw)9a5n!%z}xrtRxb1Im=YjI^|7l*GWNSg?7)=8L=cs z24}w?lmf)-&r#;1NsM0CR~jK8kKyM_BSu}KVfu+9r67#1Aw83nn6yLyz*c@LbMzS+ z(T>T&n&mhOnlf%HQiG^9U!t6?I=?d^DUMALF7CBzLFSeziGr-RXSyymr$=ef49)$5 z?N5}pc%pr}E+xd-PAv6AVCE!`=0ZUHq|{)uA!J+H(VM(%K}p5FZ!V%2`Lb-s^n#ZA zjTQxTSF^D_S!1TGLtw#*KFEQf$VQp}L}7GiQ7ef=`4HM5?hi4*y09{2fGHU9NpXgc zYG*NJ&D()M5gnaWBM0qoQg9)cVPO(x(j(5%gjO?1*3y+{#i|yiUy&T(S$R~yCPOU+cJ6es}ZlG+ASTgkQuL3Hx=u5NJbqzs@8PLghllc7`{|;7FgCoQUF`hKsJH9 zM+XhkR!44)0d_ z3z?#VAa-)tOH7{Zp~?T-XG1W7267AQ@M$UYvTWn5XbeN^YTq>jDrUzW;_~+z{ku~d zWX9G$Q~$f2TA1rYT7XwHijYXG*^dKZ1y-7$wqh3Sb(a4kv0;#EmO>rAu(ZW~88AE- zxo}j*6QbG=+)b_trc#EVLGJe5b9cIvW?vDz7Z!?}mUMyL9_i2c+wS_f?Sj_;b0LT7 zk-2au5Jtv&e7%zfHuv%r!L*3l$*(zC?T9PI{>V{D+A!tv{Fyh3c&%U{M>a=XM*;N zv+isZi5GqVyXmoMf{FRHT)Ir>F(400*f?!A_=|QoqJhWH`4mRP6 zs1O$b0DMf7ZO#i878DT~iR*JV7d%2%198F-tT7ndp5`nj7BpcowBy7>+3CjaZSvC% zKwrJXCi7Lxuotzja%U;=1Z;VT}2fp&if37eY7B@FxB?d*Ev@e zW1YA#I{O$ltsh#H0J?HlAtk(#fwWtpsn}ap4^7usBTxmmA*~U)L1fUTzDRFr#>GQM zsTp~t zAHDC+1A$ux0LsJXxfIH^mbyS--#FQ0ej84eR-2#&RLbhUXEk&&M{!{)1@z0+slcYg zs{=1NP`H5M{&Sz@ChrTA<+fHbq{VS7qou3Wjk>Dbyc#ylv$=*8->;ZPEdx_J*mXQ8 zNZizJ)(JXfW+csJq7j|88<<#DbQZAWwTIY3EcKoCTyxc#RQ8VRQA1XL4goAoRlAGg z4Bu?VMt56Y3}_=dy3D;8(Q9QGy10T{;*jfoD2*ArIe=eHYV@;5qR;~;c^=JL;eOv(NT1J zKarVVL;Zm(!H@g~YiXNC{Mtgpg1cPqh0|?0m zc{D&-m{poFYaKxj3qU&B(Zmo3hY!VLzW63iH1|DuavU?NNi5h_EJ>hSLC`_ukV8cZ zEpm7e1FO*VGLM*%?EnEe-86wrNf~nVQe2vJGhW&|Oq_3~0*E+I?BqHgWukNs!Kj-X z=V7_;K*v3XKu|pr{-@^EiCddEg6c)!Diq)z^TBVj4rYKzSLa6B#pd_sWDi$vAD|1- zu;SI?lYc9khQJj=4N#=HmP3Q>M|$v7FfA4VxPbEiaP{ET$96mbpAfMSSp`#}D)>8_ zAVw`UAC@h+xE$kXS2|eMkD_M)xN}Nmjz6HaC)iVoAaN}zrfjVv;w_DZ$rNDXQI@6% z>J4MM1cZPRhRk~~cgx}AlpD!A#A0%Mol#FIU#uB=v>j#NMJTU~GXwlo0F637puD7E z&Lsz5mGuCligVQ`)u45Q;27_~fbFshc)DsG1_$P<)F8D7a#_ZmD_frc0$vA~v0BGX zg=X+@mHc2>z(hEn0qx*Qz6^(s9$yy&r!#su7_O)v(uuK?3cA^0s*OAJ0ZyGu+{=ls z&yrD5!*(yN;g{vZK5NqHiom3bBp5UcyhrF0Q5oc!)bxzeL|muM9Z=woL-XA3t1>cI&Em z#?!{=S?R$I;EGpLg~EsypC1w|)|sl)FB4A4Ks0g6;7$0b68-5B1e&jSliTdnmW>1y zhCLG-(m+B;^M=GH#t(2`!%`aUQL&=b&q*9Xe+~};&jk+vw2oOS~1)%bO zRj{?J1w3EHKrJ##Ca~dbm&(S$O+>6DORQF(cr|pB=*Y$y*Lx*pPz79vB4OQtg~9_W z4J1X37o0*uqXJwpWL{f0HhHuXN~Trfc)hE}d}QmO0%dONuqtjAYb3!E$CA`#Aji=L zH^PIgln$O9DXc&9VB7YJJRlxlQ5yEVFgP+Yk}#f+PJtkl_d`mi^iwO+z@m*Z95ZF5 z6m@mYlHW2w3Gz%7ux){F^!q>st_Kqmian4EtLckW74)<}h~X1mfMuXVmN(So)1?=H z->m4vdoVQ_C0LdKCRK=z(rRES-%;hFJ#-wzJS>pqIs3({3jk9AKK?I9*W}E8O=&xm zfcgY|ST3gAnyl`m{6L&RB5hxN?502vy;Nm5pi2Fc2bzd7@{8jtiFo21lA$N zL4@iPW%TS6O;(L!>R?X279g49%*M@t2QzKtN(7S%PiL?s5(0uuf_KDOq5=tG;V^JG zFd$Q~5Qhq$Y)Y8Jsbx-rOEG8jEa!xK1ekDlAO(k{C4iPV0&xTNO!fofk^$q18wMo0 zT1w4x58}c?F_?x* z+6TiYzXk_eN)bE&h!FzJTRq$Z`;^oiQA2&iaRpU!2cpn_XA1!F4rs>=6k4os1;Z=% zX54rAzr6a#DjE?f-oDBN^zB%ERtbtvqecd-MSssSqyVd2(j=9Lq=zazT2ygV+(ILi zK(ej{8ng&6=&D!jJ~QvatsTg61dwT%Pz@xt@r>kaMIDNvAjxE-E2A|StTMu(Su{?v zBH%S%hI?ZW&9{RPgHs+eWETNE8;YSuGTxDPeymd(s#4wo67TTMDmNe<_)@4u3h9-J zd=1~gFhCn#kO;%N3|6v4X2SGX6!k(P4tLOJD6gs%9$)OIM!b07}dtv1RdZ2`(#@_$7cBY8d*l0mJ$5 z==&hdKxm#!NJK4F<;1!%_a)bpDmlBzk}#yh{W)&B*G#|tssq~ER4c?q(CFvb)<2#V zD7`FxP;ydwA-xxDq+Zj)3dlN*zfJjruDGnquLg8$hYCb77Eu45v?I9>z}DX5Sx5m; ztLg^1>!t9gtGK7es^#BS{A3Z8S3iI;pMwvF;H|z=71Xnta8wHs0Bp&%!S}Nn9Sb!* zK-K&ss|f=P@DdFlDP=MC031+~c@fqno(ny}7{@$* zg*by6MV)d_K@S}^M3N>E{cS5=#*T2u+aWPY1xxsk*(8f{f#l76Fa%scF|hx*R#b`6 zN0vjNB}@zE3H=t1EZv94`nT0@XrMsPl>XqD&CBYULsyAsViN@?nMknxR3!BeP?fcW zh%4N7Uktsu6-JbhI%Q)N1OJ-(39KrM*u6>RSv??a11$K&Z<#~7S}nFoqK+O>@o^Anz=6NZ5JnZA#O7`nxcT%I z$v#v?xkci&%#4{b&u3N~IFVh`f)DwrENYTnm4B05bAwE>;gnD>0vvpbu%r?{CE}Qh z@!$`yat_QB^@Ls)QG|D#0W`b%Mb=+{%(y!rm0ua!sGB{VHH|QIwQ1C^P#2P*=DlM& zB2%0~F}?a&3UD|vf(%D~5>!!4(E$W{j?yR_Ap<5X4G~;^=A2x4`V=6J0QZp8gE)NA zL?lwHG@TT`@KUULwc82R7uQn;=`1(9@dIc-FxnMtZ^77k2LKxXH&XP4bHef!zc?AqtZ&v+Tel3&mx&>SO5b?A?Yq94PK=k7?hLcNv_oq8XEyyU6=j<)meQn z6{&IEdNh23>4Fd|Ig46kb(}fW5I>g(=#5`B$)dsOson*z+gn(HNa4mK@0grR-m62l zw#tXjfTtu0IH}*1r0DF8Hkh>{EI|Oa+Acl*=@qRf>Hu1ih?Z0*jywhEL4YkZBIH5| zYbU0J@PL@fb*xn`bBxtVlr8Yk?XNPW%L2IVyib=VZGzv z^5}m?{iM28YZbEx*UckvO!ksj4o*zAEwgazXPvdNfB+q=vxEY`Gy~)Yws>oATZ$B) z-Bp%kMJu{4h~s^&FP~d%)kqWid=9FG;=pZ1biJci7ByvFN^|ZInnZps!G<)|j1E)q zYYhdwI`nb1iX(Ti6{;DjEnv-5ZU<@v>rPgR3{-$o#*v~$g#4en1<)QXR^>qm?j$D8 zGbYG)i^4t1$b|QdAj}k}xsniSgfkT_X9rCSCJEtT@XO&ALiNmy!4?rLSsQfW=TPv) zOBL8^$BsL-!#A!h)%%S0)CXZPY6poIc6sQQ*D1;J{>%I@u<;p~Xf;Gp399SnDhGspP`NvD$ zNlK66Xh9>qFaa?+tMG#NSu~WUR&~hz>+kx7cI~7p2C#SY!yV9nw+_x#C%&6F; z20J_s^ha2&;19raI~$Im4`Djux0YqMJ6MBU647LR zVFnBr@1yparTKVmD3$v48l1m%qFoDUk3lpR@^D0H(d3*fDFTyKHcg_cvXsrGBxN2+ zBolOvk4vGt>-k?226N5!Cy|1!VETj)bVAE7MFM3l=dP(lF|;9~1uQfpFQ#dF10)wV z7>WI+iy6Do7bfphBJhRZ=IEah&R_!Ip+%@H+-xG2zl8O6d_za$K{8Y8 z?GZ5KM)re}NJ~%UzL>F51WavZ(ut`p{Z~T(=-68GGwuR_d9yfGe*vcI3#3TUqdjWC z&(bTOl# zD1o6@q(%o@;`g`_s6!3D5=jJ&M!i3BTTD^ix2T+J5`;Y-0uu$7%wb|jsz8FP5l-EW z(d&HjLkJTZg^wd&069&QLK7Sz4iCR!fNORn#@}2J2OS7|)*UYoLW_H<0$+9zzg&gW zlE6fcMbxqYPZmbSk)z%>Use!PI+5_gaORLh-X*yKj4~d1lc>LBCF2+<;@ut)4iWe3 zAXvN{y{}LXNe6k6m}B@cGJiMG0oILl)O?1MupOOzrkI^z=k6{2x6IpVXh(bUZd*&C zadpWe)2Dz#J#(kLqCW>Try9pkZn_E*^o1=~j?Q={n47waZ*kOBTS@4kGZRg|Gu(=2 zLX)B^Wn2&}ZC&%hBIfnRpMlRSQYhWw^Wermf($Tn!s-b+-z_rm-G1-*I_p`vd67BV^%jxZS9w~QnrJ8O&|l{ z%s5~npES}A=>i1g+d~z<1qw1nXX^wk1B~`N(7={9#l;mZ#3u}t^u0>=Xcicl9`dV~ zr6~$wzAa6|>Uyv{N`8-!*4J9mC<+q^&ODly*#c0ZKM-OQTFtEhXMl9oDS%n0(Y5+8 zk)?}rV`o)-7;)2@6v*aK>WGE1tbwo$zxA$hueH=?QScZyj;lABbm(yEp3$h>s;%#` zc<$Q(XTf&gpQ8!OK3|w~+U<@$&MR&VKqOt(IH26iD@lDCZyxYlZY#zdq|z@lN6`t; zbZniza|joL3drrxs)i``0Ie%9CS={p@mt_SQ$(d}>ak;cDVj=nbA!Y{rUs)Z=$mt* z)VL=9IGFkSQ-f8raY^-XRf#Lr^C`QNA?jhmx-ygPOJM!416h?03bRr^{(|?yN=B5!Tq=X%D2!IhJlf~C{FhouilHm!yd?V&BrpLc{@gKYd`twZx{~5Rk{l@1r{+2_ zuN2z&C?V`gyj)LBc%MW33EH993d(|HWFWW%fC-&_0Zex9P%lh+FKe?>&*6;w@Cf6J z3sD7>2=f}XV52u5d2cXe^?~aPwv!eXJ|d!^Fe~hSP~=Gr!v z5e}7fZ#+ybX&1U5E0^Hf>~avhT~$o}bQw_E%AbwcQm_}wPNG7d!7XVC1~#k}b)YB)1QM+C z2sqBiW-I2**NGm*M3MDP>7!Jv`<5^f$&NhQ$l@^_$gT<*BFrWPTZ-H zZ|!WKt-rEAMZP{_bkU@=*+qS0J?e@t+Y^jeLk)m2`%Saybk`cViJ@D4hG`;eh@Y}) zmb1)!{ zZ%kgDJP$VML)CSNQoKFlFFlmXuSO`Bh4WlNAMqkP+;?i%XA9$40>K0$neUN@v1%%R zjy`>h^E?|bxFK6! z5d>`arCm8^i?vFZrwx{ZM|hCQ3eyj1E@8|sQ-MPueE?e<%&ALWiScuSVM8W^W)US2 zzqzRoO;=3zO|+!-KBZ}9!WxC2?;xl~P@JcEPbqo1)+5manJ7yOu{qxa5XO)N%al2T zbRZwGT2@XJ90b7(9iiF5jQ3KlBnBQH1@JP!DpA5t3!f;PSP)~~_&~{MCJu}oF&YXJ1L2sA!Lp{Pr2v1EZCX95mV4`lurLqS9_C zdLs3Hu|qGj{QwI`_QKmKpR;7hzynOQ`lJb+JECxiz&#-J!hPL&JM2}9y2Jdq_B4qj zLsus4p+NKi2^n)~mBLpMq=1CAthH?~{v;SXoSHMA*v=gi4eW!#C!mDdyz@+SOg9zB#8eMSd$AfhpFj{v{V_h^^l%U6+F4K zSd`8r#)r(R;D?~5odF5ou@Y%amN>{GNa9?~L%OCb*a(XDE0igNW%tBI6eHsG@%1L6 zIr7xBm@<>pJg93@aloR2$e6xTSfp~&<>j^N^z?PLZjG50^o1~KXa5;HUPCoxkS-Z2 zb|{fK8)R7vK8>nszVb4_BtZRW0$IGE7;BTOP{KoDH(Q)wTtv5rIn zz&1cllYFu#V**rUjD;S6u51pMMl|ot_LW%QCmGg)o2^{Ei2%86*2H0}+o;lZ1PR}f zS|^YyVX?I4G$cqpnZzxI{($9-))70L1#1NjpsERkZ?Rw;SXDb|1h^%M0^Iou0;?CH z8xogwEyPGi5i{b6n-f7`N%g_WFIuQF1U@m*=^5(aBQB8`bhcPQ*Fe!KA!P#sxe1x! zx3SJ2lqRBG#%}nK68}I7QFE*TWw-)mA$jW4Lh(-~bIaF*jW=SaFiFHs5ggF)`T)l^ zDyHz5A&HetN|sDvaEPv32AANWvcpJ&IKlu%j)Fa*ys8xstp&xH5hErJ9iXU4zzCzI zuqgNuyYkG7Q-ad*G;}XT_7ND+>Vc3+ z*n!o8W55%FgJW{40t@DaLtN#Tg4xkhNup(nh%QATD6*$oV&v}_w&=?yLM01`Kn&T~ zC@)4Xo4896oH05g;{K}&Z^-He2!ebe={XqKmLIqzr(4j`7HEM!Q4nZCX*IMNk@Yk_ zqZs}8h#&%wUur1^NdkSvCi}QVtX+gM7NA`r8`$B z#Y^PgGE{+N#Ybszj=`=g{HiP(;IVKRabt-$L9pZyMBsjqYsMF&uI*K(T3;B_cv8O* z;sD}6h?q6D!66l7dzMCr;7ktkK!jM)cV`P%wjE)vXGvux=!+)kXo`2_p91 z6CMFDGbmt5ugUCZrvlJ6z-FQTE~*K4cDZ?X2PQ|~_y(tJMaU(_d z(CHcTkzc1s7fX4;35D7%=}oygEDBMVpRv-g>9e$a)MQbmtQQ=x_i!Q~*4V zp+mxRcv4aGA^or}>wHH?rPAb7_j{&~C%H0dO^$6y9+OpQyxlr zfY%^CTD17AuX7e&5i}&Sa4$#8!3P!4w$Z|FQXU>S%@i8ooSJ1{*hzUOw<}OX*TM-);ZM@+ZlKmJ zdk1_#a&D8#7WK`;MjoNncu}ql9w8gm#acHBBnfag44m?jN=Hr6*q3V{n-Z@TuZUPAJVr|N|Q$HA=%K35x9pV8eP zL(LH)*v`BZLFn=czv3Rc(#;J>us=;~rhG9yI0*6GAhd38mQrK(Q%amA(TZ?_XdrG3 zZmZp4G&QVqrdw*>v(L+(*}7#NYLGQGcR+U=AvnBgSb+ZMnFCt(TSEeQwH;d7Jpg&7J9E05E@a<1FSRghjdmxA2;>HoqngoNWSBgW@4mXNbas>e zS<&?i0Z0}uj5#3_dS-KpR7QriIwISGgZAaZ9u<@xgLOLHjV)Cp(kM9!mZuE%q0g~` zcgu-bBvA0ia_-B{G;y$9adYzSluIdxA?e}zS|JKC&z8!JhMGd_uDcg;(w!{mB1iz@ zuRnAC_m~*}sW8h&+#f0^FPUfxNPL|D+YEu#b@WISe$MFFEE~m0qqUbT!D*h>BwxCB z3!x8&RX!*+nydnB%I+nV7hfPWtqKCehwUBwOEW-4YpC41B^3|)EDCV;lQbasE~E{; zamb7Ge%q+r?@k{oPlPW@@e-r}?Ax#8Ylu$}eN}Jm$RCf5uQ5}+@vUzUhem%nyRg!P z@kDSR$6CoFPz>otL{wqpxQrrsho*$k#F|u3OT*RDI`w^vsyS$iytQwqgQ9&S;5}`6 z9-*<0gPym=x>5TYBB8xtInEY;?Ao~L8WTtH z2EK*ZyQ`~KIB2c#a(4BhU^lgSXd>2PYjB%GQLmA;CTnDQ&%gYgI-4xCGn{ZtTUD)O$oJ~wT5AByTpQ-RN*rBpIgO*o^C8a`?F~snn z+0cj_Ip}w0lNsO9x9jaHU5DEZ{Y5OkTj@xCCuex`Sh)5OB~}Ke))8+TdrT-hFeG$^ zRG9ogL|I;0*|LTfU^PuOCy~|~i+4;g&++qgq4Gy!Q``49I$d;S?hX;zC(_{&sOm7W z{|$3^zV6h)eq{G;ne4}<>;6Yb*psVl^drPU#p%j*=08*dd~uQlFPE7t zoJ_7TsffDFT}!6Ra&kg>GC!k})h=`ZPlOfyVS-R&*&UHKT+P1u>~ly80TCWSlH#3( zBS-dXJq#JgbV>sj9F&ANxd1b@z%l0$heqI8Q>=9k+vzVC9N{rk@dwLt*O+GpH53e|k6&ITa8a6z z4plm5xh-H8^=V)EHN@Wt6GJFvG<< z?kkX4b@sbG2QI} zf2YtWwciiVK7hAwaVe;erE}dtUApZmtr3g{hECSt8#8OSi5GAI!?4Er9zCP}nEve= zPI3#SS?F-mV|wSBf;dQ-l)!x8mbUyj-tG*UzGSqkJG8t3R`Hr6#W(igx5#%A^q&97 ztS+O6oHtUP7k44TSHjPV{v#Itxsr+NpV{%&eE=Bh+MX{>6|da~Xi%oRu}2so``Qrs&LD`RM_y4uQ&apEcLP zwGByQHcY%YsVqy0ve`g%{ige!kK0?KeJk{7dm9e#?Z=f9EE);=$Ik5DM~ixlw#uMQ!E{}|zQCW< z4??cfZ>;)O+XG3o_RAz!_gX=fx`6}!y-r*l3uh}b5M8%ZhSUDF-vGpsL0tFXAWQ>g zMUJd%#iq1kCECRHQNOJBPXA&nwhlfAz5cTPlkQyA*P48i-UAd)Wlc^T~h~np+q2OH-z=-+QF=@G8VAE{Jk`gP9P`}bI{-&)_be!sotwzjqgTR*%Nwm$vJEAM;fM?UwN z=XmE;zIWdC@>^fodiz$~+HwnCAAIY3&o4gy>%a7)ynde7-}#YGe)!YB|Ftjv9Q}c+6wRE^Z2n3f9BKtZh8G3{4PHBiGS&Pe(%5j{(qg<-?_E*wQu_P zcYpY!*`NQ(|9NZc_y0PdKlnIrOnmv>y#5NWZ+-lepZ$R!{j>gfYwPQbVe8YM_|!)} z{P+Hy&%c4!pXK%IKl$Mw`1ICK?EVU`f0ow=-}m89e)l{7_V>M+*Z+V%UitK=KJ(dM z_&@&Pf5db&{@?yn-~C+3j{gmRAK0tFU;5tZKHK_vUg@eG#sIyyj<_ybyM6w8 ze(OzJ@80^r)^}}veCzwR{`A&Q9aIPB2Os*%){`e(yR~(5&A0wj*K9q##y$BbPyVMT zzw+d7J^4?b{LGWT_T)=X{?e0w>&Yj-()`v}f9pRz(9Hi|{BzLs=0f*RlcBqt4>hI# zr+*@>{mX9tu-_?v`m)&kRod^$e)gVzy0umRvA_TS__P22wGrt6@&e@t@aJWi|IzII zOg!JZ_j7LR{0(2u%o`f z_36>cnL9l>_xDfl@%!rj$<^sYcmMkS^-IovJaYFRTs?AEynN_&;nB&OE050IiSEc# zo~HS9Hr;d6`JS84`03}9ea9cWo{t(ga7T^H)4K7~fje`$bFEwNpQ^L_ClCFDs|Q#2 zuOD2~(=}fY-O1Ixa31ct^=Vq?N8IYx6M9-7r8AeW^EK}>@b$_1=ya{$yg0StoUHGk zyY(P(Ap_+jI=ZqR?mu!bxkv8e`oZP(i*7cb?fcpMQnTdi!S%)U1s_~qJh+(g>Aqts z7qd%!+oUcwucsIL?vl$NJaSNpVL~&gcF!}L&19H`CSupn)FpSQiTMN?`F*$RCTR-M zAe#u{ce}3Udx4f;qH#v)A3~jzE6qtHy5}{8`w#RVO1d5El`V~$P5xG3Ig@|tls>-}uk(Xf~N4g8ry)+H+l z@cI-jlVPYSo+07)3}$yH7rD?X~9(9B;`D!)M!D+Z&6Xi zlzJdy%=egyOF~RgOchNVU-YsLooF#aGg3@N1BBB2f*gnvlFILa+mD-hKzQb2V(CsW z5s-YSnbZ(C+qOAH7(QJ0z z3>z=G+jYmfNb|G<&^~KeLN6{>qq;a!;82z70GE0Iq&}Sks1_*-4 z07q+Sb}60iCMv5YwUmfMKvOXLQ*%G!B{p9zMa?O*!A+UGS)hmTh)F|BzNW{tuD&j% z0jF@W)77gJ2_-tk9J$tufihRNOgy+0HJAgP*-*`#LNJ>s)Or|g4X`DMIYF!GAxiY% znklg4K$q^n8LnNJYHEB!*GDom=fRfZaTTOhK1+uH|WDiX(uVf{S009m% zC|i4MxydHe`)Ys%RIHdy#WgSOi&!QouH}(AiTy$AhmKt>F7AtS$-IM z=DF3zX9Pr?S(_N4Y^+9!KGA^eC``tov(-r4J$FUT#yPalcN{7tSvR+{!Tg)K|W& zBYhO!wTuSAsIoStUSv#FPP4RFaaA1#kzb4=WVQE2+izpxW52F^3`fy1$2!*hs=b^0 z#>MSn;pUFPGIAI90v+}Al9@)I=0)OeSG!oor;|%Q_3NzP^ee7NqMGIt0>9|7V&2Tm za}({mnNh_f1#al>@_9b#mpK#@6(Cnb2cwc{_&M{Mq^weJ$@ddebPO~3NNc=TM0ZRV zeaGDu)9@Ls*13aMiQBntKFWQn6J+mkS>aR6ASw66tZ1t&_5;jeg74^iul~8B7kb1W z+(7%9b*@qIBXXA$@p*St_g$Gg2y49K`XaBy3@#}dkkmBsBE(+b7i(n25Bk0=7}09f z?=yxX^(K{{NpSp_#`#|{f}}>^lBA4}pk_3(_>9+K;Hy5umE1(PO<-yCyje0(2IU87 z6bGV2(-*1xJy$eg>Z*n**1mQ1IHr=J`X%=vG|9SPFrqqCt;FBFs;g4GFK8%txtNkt zRU)+rb6U2w#>(9>6}u6c$rzfiBjj=kw)iUbs>amB*S?1yG<7|MdR*7ro+6VjhC!&? zL7kSdU z$VU3i=OOr>c%d#tqc$zazKSVBf}{U8tYZeQe?|@c@pquFmr&_VZbR*3eC@YGM9LTu z(ghV@Z!R%|KRt;-Um`34gvH@Q+zKoyqVqq^c6$@MEJ@$OPob3e&^ zxE3j0iM~bP5)l|dDKJJ7roxS(J)Kpt?!{`_PjG4MR;kKG9!M~mLID&JQvmVlAoq3p z!!LT&qfTLvho*2NUqFDN>-PiJvPDekvGSuV285uF0Ykt9CSf~dP47mFZ8Fwjqj_9J*@Vby?OTOsWjhngb@vAa8&=ICcz8HaTSvH8Lu;xAJSHzO# zB&Szhg6a6fpTf|4`a=AWcp1Hsv!x`p$ggZ5|6A-R!Gl(XU&GvHk{NWm>M_R1@Lzqz zAEr-?N_JsTF+@yU;RYyXg^kaA_&g2PVK+p-6R^b^<5=dzL({@dhR9d+*TFA7<8!p% z54u%tm?mM@K{nrS8>~Cxgn&lg%d)clbLhqo$@+%|q3A;oK8HA(6H*fpoI)}u(;;>3 zwA~&1L+PQbS(amiO@w_S0j`WQB_yr=VH9$74W?-fDn5AFrZY_FwkENxO>S9QXIAjtsgUFw* zv^A!vv1Uw>(IGS?O>_Cb>%)E-64R&WjKN^^SyrHH-bXVU2(Ig}%H8r4rEaM_LU>?l zw~pEvG;RM?OeIFa!(;wChA+;_RJ-B>?`DoErZLhZQDG+4upJbL-JCwMab~n<+^96I z>tDg$BP@&`2fxA=sZ~i34QO$M0TpET^HdCFHCVJ0E13o$RvNW}-e{OuPqxhWunSO- znOu`PWSdRs7A;|rhD0`h7D4N^Ut+z?YhimS>{A93Te4iiC3X zaHU{X+#jJRuv){F0q+GjF~VSn8a$nd>>@vVv!&!YPFgo*R<2V{VX%R9d!JOz00cz}Ib`3EB#R zF$%aw4VqbE;kb#x*|1p?%2v~2g<*}R4Sq2zR`*oYHO9@Sm>Iw%m!=q_2<`{drVim!QQYhha+*>)e)$9NxZB|GjLN!82YZy7N z!aR&1wX{Hlg6KW&l)E_^;24`piPeY!h-b3<2uaPF%vB>8vQri;3iujJ*4*vbK<Ddj%wWvZ7fem;y^mhxB} z$B`LUT*$$wkvM8S$Hq<|?i^X|*M0?i`@^A|W(*=`_)8TALL&8MH6@=OTN&R|?PEnn zTioqI2-8KtcAriNJy;>DGz<7L2{O<}O3ww%H1p&=tzU6K2*zSA+s*v7u)X3}+Yx#& zahXm!rPox5jA*i^LqifeJiR1|$A+N!axyS-<}%1bl+D5O$7w>F&8SKwMI+Wp2!;d1 zy%ubyLBQWFomi#D`O3l~#4~>@U}rs1?_4g(3;h&`{a8jT`ImhOZ|}kwy}~nqd|5aS z4zE34NDEf4oTOck^$L)o&6=vxv_165s?^?z ze-Wn{aYfwc_?&%KKP{U`-WV~$azYzE!{ew%un_M?hJkVRKkJn0;yIW>R>$(+H35<9`2?Ec>Q>nJ#=URY$WRkTLN|FixQVy~>JUXhjpi~kb(~}< zp!o^XRW0r;XAB)<#HG<6!-+B9%A>Bf-t**f_Pf~^x4zfEC;o%1B47Dk*~hb=%Ki$0 z!atL~l>Sa$<{!=feEwVcKg$1cai@4#{Alsx#c!9>@|(-Qu(fq9#E#?~0P0I#P}xJL zS*&Sz-`4Rd}bs)eS;?G!V3>Re`h$S)tQ0P#nOT zWdijl*qY@QES+Xa24S26{)I$qG@Ebk`NkXFd-fWf`UaH~RBc1hAcW@&VpjLUs*jTW zP-4ZvX~u-d4T9;FzX1J{u@{PGc<8{bZD<;y&_m0v30>6d%})XSkjw_lZ{-KN5q4Cx z(Hovl3d6FKU0TJ^X+xQzV~4(XxG58dEWpc`qLq?dHo`7zU>LgP!boizRBm9UWlUyD z;Ou&XAa8Ol`psncVs=QXrV65{*EZ26sP!Wd(2ho378mLXu?F|&r>ID_RX;(h$tdv) zaB_p`T3$fV?v=8f)0yQpC$s%r$g>HIC0i_k2o9zDpeK1r~*e)26$S-&m0qtV#_5wDKL!ji@AU9#f_&T8fo1jJP!K9kZ6g-x57 zN=7Y}C_GqX5$Poj`j6x)2R9|T!AQE%cAOI9jp1baG(#m*Hn_VO1Q9kg+2Ge5>ASXR z@kTmWjNG;~>$)D+h+%)V&E1Q^Pq zRAix%y%!N&CDk_wyr{r%BoAveR=S{{2uqS^iM^I8HMY{X(lCrh?A+)rqkPF5QVy$x zyBl{*Sdbyf3TDEL1JhG!feltHv2P=aDV|i2KX_v!zq^=f#FD0@iF6_sbQ8L|zMPYP zRC*LbKnk)*n!IL3n&Vi&JH2nHC?%9U*u_=@ApOI(F}F+jw=c!y3#%q&IF%j4s-2ui zfcr>p<@#uHd2#<(eT$ae7aIG>%XZulOX(0;Z?+K@Y9Qe)=+*v+lZVw3I=$BQAp*X1?c`20FD&Kaxt1 zj9m5?+DR`E@-A!tRC12g_bCD*Gq92ii8qQjP&U-B!%Zn zd)`z!3=W0lP8hEAfzaM@xd{mni|Jf(}L#}a8J&ZH@flD}T`HY_8V zQi|(i#{Tqu+%0-g;56M40uTMQEu9dK@&#sr_9HQ!^q-k_7`u;6z;0bkj!riM zF6B4tM=PZ9W&R-K<-RhI%9C4O%$6=QQ)!Z)K5}ygI0!c?0&N*1KQ)U^(Kq%@P06lk zm6aGmhK+P}^#&R(4WR^Z>6VgxWM zJt;t^q*tfMTuJAujF75H->#&JGmS$Da+@NI4*KZaA4^b_kz^`J!t74Kp8`IFw;+?R4c-*#O{MJTDb3JhQ+XKHMNW_6`LV1AKJa&^&oZoY0 zNx(D+JK!_8@k6<;eFA`bMF8ta^~7Pdt)$R+R1`xdIswflN;!;x3WQI43xd?aAP}g! zZJhixY+t;dCXgx|WSrNTd!`>puFc<<_W@GoW53Q~QKma_Hps~o7*Yu82)rO16z_iK zGlI8F=yeZn_6f59%2Nb=XR}zI1D^JJA%F9bsC6-ASkqBl#lvL{?}k9sMIZ9QUeQ$nk2;RP zLIB)D=a!1pt9}fvSX=nBA`&MNeF{pi2#ZtGBgvNoCQU)Fo6vxPySKd~G);PmneXI- zMfJ?sRe)aG0jy^N3|=OBP=awl;J@$BCiSh`&Mf;H*+c0XUAB z&drN)T_B~9l?!-}_z3)@tYU9M6sy!_Atam#p4g61vL4jrGlm)hP5LoY9ugh3!H-8o!Hd3oxy~h6r*~34Rj7AM%Re3?zpn9XTiPeufBu-Xk{% zSBanp0)Bh1{x3w<+#(799RTUlS_>e#BoyVwdBzCc4Lx*c+j2K0kKaX@OFsJp?SJpN@83Kt^~t6l~g zNq2%!dKf0mQw~@|n6K!R41}KqB2xo#vr>62vR#N!Ks*}oY@m{HFV7}DrtEL^v0s7M z90YQArwacSP*D=EcpG+sxAoBdg{uZ-{w!oEThOe8*vvso>LExnVxed|dlkwR%UHEA zyHUo37??4s6B1&KcUe~h&;v3{g-RA?q>XDhV41#okeUfhI(ieRw z0y&FusG)K@9m&i>v?PH70F@&783Kr~34$R_CEfWp6RQmCCrKodFat!Rv2p#Pl+#iTP1d1oO3DBB%%7L0A|tj3eiL+ARbc6|4>^J^lsf!mGauA`+ExMPuMUH_H;v z?-r6i2;__BfS0h6@jomWNopzX=u?XEmtZ`mtdIUMVsJJVqg}|`qrd}`%aT$%5^I3} zfG*N5kct50Jwm@|^zm;(u1O->2wMdeF?xniQ6##sJ| zCMgQ6LHb%y8_?2-D@Tn75=eq|sJ!TuiH}$pLG!>}Xq#M!kYKtlU;819wN%}b04zkz z2y*y_;t_t4L)S}i+*kmW|CcQc8xBF{K*kGlIsiggJM3742do?Dz6EF>GH}vjdo_5M za$V|#ynmGz^B&m>5FY_^4a<#EF;I``;R`J3yedgf&?zXJFhC5gv4X`5RSu-VE7DB< zd|l#8Jlbr8vKbbfye(0Y>9xC>L3I3J0|s zF>LriofEf#g(?#6pz*!*AxV#>IOnA$zo zzOrH@cqJ{90#838>y(X#IWccB6uijt1%D7=1Pk+nG~#A4t21TXXwUCp)>f&vC{D4s zXx5vCMKz?Z1CS9ydsa}*B0ZN?#q$X(2|(yhr(xI!ngbZ4^o(NjL)ZaC=ypVLjBn3= z5B(^>qpBC{_6ix57sBFFW)t_I!rvG|fyPQr`T-pSFNM1~DGXOsXlk4zh4ajpVH&P7 z@_o0nx_BYDJ46!isOY61XJZ6^Hx~OfDCx0@ZF zjt~s|C0v~`)Y zA^up)tWf&87`JAONtM;ZKq5Aj{6ME57-cF{PwnCKpl3KUD^TLs*Yy%Hjrf<1oGE_0 z6L&T)Fh@|zYo%a)tVsfmFe!tvJ7K+9EU-*Nx4qmBM^Qc`X>GFIcvf{Hf5f68X$HtI z$y8C}Fkv^ut^Ne#GucIgSvk?htUCfeHzH3dPgKUE#`|pC_Cb!>TdUY&`|*!3 zQY^&)>P{CfzYbH91i{}1*1vV<2UoidN;aev3%O#=U_qe%;oAYq;~>pOd4C{pt@we$HY?!2F3d%DAGPx;U$-KTafr>!5cuPp( z7b7j2tZ&SUzK{y6mHQH}K)_pM-YhV_w3H;A`0%d4qLm+)b-#?^f-?IVF!jD{2c9G` z2WgDSRWn);Tdu|>n?Za}si)A}s=5D84qyh&eu@c0VrHz#wgI+LNEM-*g zkvZbiA=ES61U#@<$Xg^3CKtASf}0Gpmbd}^B_u*+N1POH8r*XU13mHg$w1@IE=i#yzf@q# z9G|14l`jr=k?S(f-m?tPF-6J|(;FEx7J=<8Bqqtgl7u5Ufc-8NBxy$Sy_FEhlO+$Y zDmVHk*ie!M7elEgh$C)%GG0}rbyx|wpr$SYY7w<)yod%Xgz{^YQpvk1khf8w6oCtA z3tuNa5~H9DkpM{}t>UD{3yid9X+mt^ApcS`WsP7prI>=LAp?-U!G$w#mg*-)-^1&| z_Jsxh(_f%Vd2eKBvHy{5Cgo1dhk`qaGvj8!ELZIPdiRsBr#kyW_)`4l?EMLNJO3-i zsrFs5y#`PKyhsSRFr;+{c6R``qdZvnh(V+5+v#vPz#VP@E}%|d8#%f(1Q!bY6ZRp9 zOyDL2SyrtEBu+w6o$VEDixf)&JB43 zYBSWz?gPvah{dlCArTC#f^dFlNFB;5R9o;WJ2Du4yzY2*YHCts0Th02WFZP zdrW{*gCXGpyo7hzr1ie0El!Inp!NEtABLw2zSY}?I(JDDUh;yXtLG8c^n=Zikx2qnd_Ei+IQsb6=w76{Cz>KLV@BZ1s!kQ$AH<(7mQC`Tbuc7oSQ zQJ1~3BnJ?^$&z{&c}@-+ii4W0xG@59D49u zHb}i>do?;`gVi0GC4Ka^%Rr405}(a~NyE)FWie1PHa0+8u>cb#>Yc+NB|0R}46YMc zerB-bg6l}C7G?wlE_b*x#8{u(78V=SCVNbK9njDCfU-@aq-&NP>9kFH$!;v+_;h}B zo+;@k;gQTrP&HUl9SN89IFgv_4@G2aWtMC=2*|OK(=^=jNHA9ex0IFYEHLy?r6a3t zozY&jX>PK)X6LSCQwxH9OZ~Jo@Y4`#MlP!&`rN31hA2Iopy))2Us&OU3 zRS)9Xt_^i#H^h9=^#s*qR+@`tK21#MOK(U#?UP)Dhp*Ny> zlpm*&CAI-QjtfOj1g})@;QR!E7wnY~KzgU8%4Y}kf*-|b1jaR@1QskG92h)~$y4=p z!4$X#rxQpZl^@cUo}orZg$XYEgnc}FA$xsRRrxaD=gq-DC^&?fW7C z#KqkwHUolIxf(Gjvyq<&8cHcEF(aO#dmV_w>3EVZxnNj?b+~gE*KU+DB^0Q3g9MY^ z7)Ml&O+bzn4AhtGiV?BB~)CgGf=dNPV2wQ&;R)e%wrY zVd>d3R+D?_$G1`M3&&?TgZ(Ce`jJ{7v^=Y*Y@}*Z#gQJ21!%n?1Xl5KNmV6;&bS(y z5GGaSQP`&%j;iOF_dyBUUXDXQW%EN>X2>Ei7u0A6G0S@)+om3gD0t|o^-DuH9+IA* zHV^0<4;0tBnD6@R0LD`V#Mt^Rl-P$}@OQyg?jZW-vmQMneRp3+ad5cxOpXky@SFW7 zRO5%^JWPVyNw-QMbmf4^1^phhmh9D4-Zn#Oge<(?XX6Fsn_%j5;x^a>atXefv8M;J z6_m%_C5)nsuPLVBBYkuSEdiUK86sJ#cB>?&YI+B2RaW&gKy15aNQ6mkCXo`ZK6U8Q z2WC9YsABj2w-CXSie81m<9<;SUJ5TK_?5^A6zn0`^2`wufoLjTQdBC;18k2Q^^-&p zssoTfkfIoXbO3a>e3ECE7qC`UzYgLcz72y@jG+tzLt$txogonjl5+?CuA-T|NzZ1p zi0YJO7?H2yGD_SO9{_0qa8{G}0tvM=OY_lGVHnYjkwS%heQL!i!1aIhtArbbXH295 z?Jm%Ic762Str^G_6eM_^gsMlnh+Rw|VYjk@$|eyK0wZw$V>Z)Zniw&dnQDJ2*VKXDjfhz)s!)T-w1IG3l5QLQ2QA1EXsNMu5iNF%4 z!VjVJ6y9Uo2(GqsGDW<>@wb5nXD+>ixZh=iM%g_g%ORER-E7 z!4S)Smc0OKFAGRG4#baAVQ&;}0{@dv!f1W|EXpc#2E zKe7Q&{cE2bfk{8h{zXO3#|mzNtO<*$$VBPcW)V} zx_aebfg$oHEK|5oaV%J&Hq)^uu_jHxE(h`I(*MRP>w#M_!$3N(B<3#(#Ao1#Bjt(^ z)tDh~GEdN^49X&)Gl(tvSdrWs?eAA4colzxt4u#I`v@tA+7Av6#}U}0=}*|iN7``a z*IW{*LT8r`WRr?k)w-{U$XhoqM3LnJK7otW?7PWF zTqCm%$QIgaF9Tz<6g1LAMJZX5Fz<6G<52CSObqug331qJr>#{0@5dyq zCO+Om6=c5(zk38oi~Y%<8nyJ`@tF|yYBnI-5~#aos<9eUP(K=j!R>ffmr0}`x7o!> zLCq0U5(RsteV3XAduu#zpyt3rC_uc5ck_ju4AxU}jyckdtTQ8~RswO7%*RLJ0*1g_ zTqib*sO%P-P(4tL7!eo>+7V0EtA4%6sVL|(5714>*DJA}*bmBkUAz-{zr5GKO7;9K zz9Iv$=i{^4G``8-&dJJdhvL%Mj?P-9h|2T0@BN))SecjSa+vTa(8{(!a9P7a_CPV? z7*hxQW7dd~D*45DklUf{j2wsEn(Ybzy34=CK7hoo6D^^bOmZoR3H;xu#ucvvuFt_{ z1G_%(zSyilGRKiApr!!q=PtrL!1z^D7L6{=kD5|uV8mf{5=68TVoISEqQTO*lzky( zt@J)w^s?O^ZeyfS_frASSX=xPrsL_~gy z@u-TiU_nwus!QZGpV30NUpYpqy}NfDl=8&^H`uIlAOnYup{}VPc(TZ~CdowEfjCK%^z)<=H1CLuda{G&HF-!%_NzE|46w^KU zhYQ@mK*j@{d>5gr{Hgo~WO{#(P{L0U1tb8Fo(eO(m4$m_&-K{rx`6D~WMuEKGG)44J zzpMt2u<@oovn%7Zvc9-!rvm_Wx9`9dV1+9cds!KtutXsl8^o{!4hT$DwJ2CkFrxkv zbSd1!zWA$)_IX8EO$;m8)@syg$jXf`AI0uYK^h>hUHHyitx{|=X&n!xHNe7jfwsOo z#erCs%K(vynGIA@D2dgD)n3_95L z=|IF|flL~W5GmjlAe0U$Go(P+sTeD`w1ZpiC*^sJ031`Ndvpb#=V62S7?x`kQVFk$ zAq^%K_|hRIhL&t7*nxD0WC{!cC9pbDO`JjU1ya$`%fO;zju7jZ+(EJ$m0hQCf|>}V zrEK-|%D@Xr$3|K}49|h77?AKNk#|E~Yg}i7(KX#Ok{c`nDqQH0lCFZXD?NW`mu=+3 zpy1hYci@^-23s_U)6KbCR%}U?qCsB5vs6S15+}S2u!HXS(hra-hG}GFHa9p;cX)|` zDPoNz<7Uh@R~9?k*Z?Yq9s`eF+bJv^IITlsu1)hE1t!5XGy+a>fv-S8I>$tOg|j-% zrK2M_T9?6)@&g+gSZFvg09eNwNu}U)i72ZxNLhzrO6)aAgZr*XMyLa7o_T}CK@-ql z6zm$~H`xpd8x0JX%nHUcW?}{|1Q7*99G!l|foCw1?olp?tg>4)*1iS~krEYW#y^zR zL`Ws0yuGg+2b5>_k2+bBgh*T&Sceo^0)>8rEq9i|phB_}XwM^eN#+BczmW*U361J_ zNnz~?XZLtGB#~QN?JEPcfdHzbNk^u*`b^slPWVGOrt#8#41knLVr*nYn#ssa=7Ha> zn)j(W5!EnOIv>f5PG%*-Len}>O)})Q4Fw(tYf^cjja@--kSgm&B4`*hJ#}BG_X9hG z3Kjs(Z6s>ncMv1jgGL$zX?*WyV%#?Y=s0eM3;i@JLZvtIO*=~TDE+b7=fNRzyOI^I z6P3_5(;wp#S2H`I_@<;nTrmT{qL$ORSq6+jsy}C_e5ux({}5X9JoD0YQ!)nqDDan5 z&m_M)g-Uiwyfh%RlQz*?-?W3MN|Yox)DGuZ0f?VT5b1uy8+eTwP#Cj{vV}Zi4j00k82CH*8Q?z@5Uj5Jk+vG+anB53g^%HdfXCDN&k(M{JXJJg zwMs1rf85LG>}F*bVaQ$w`iKui_^*1as;P)`!E=Ug2Fj>?mpE<&yHuG`prRV9a*q&$ zop=-xfq9TVR)D}iMc&%9N4XSWAJMAHiL3c2o0$)ny-|2k`+^oTyhdt0C^T{Tx8>W_ zq@*pJKSmq29sit0JP?O(zXKf zsAD3=#yg|BfVj3%0fpx*ha~Jq;cXfpSK&61wi>&u4XAk@a9I1)JhBT3RD&(0RIjx| zQAp7xctv9H#H#tTJ&;$Rj2hq;D2h^m)fl()x?j)mkEszrRHy_ejgJ2=kD7RCG>iAa z@DvN}Q7Xi&D0-kqgsM5bRd8VH(m^m=%t{Y}K#FR})=d)fIdMC~W)mi8hi}2C@dN%+ME5mFJSvT}k?00aV&a1X>waAOLRC}vtv=~YvF_y>ec6uVK(M9AmY zl;Qvi0rd#uqghBdW@9c9X9bH8M1m1jW^!B$#eZNnR1QKeq73S)m;r?>97Z%o=jvgv z9E1T9PoOj*OsA?6*`^9Dv}mB}0&9b5-I1gT*pR9bfF`9LfZNzjN@xRdI66st#l!9V zAbWR4d1>K~>j9PX`7;oQVlU8k5QP#{oqhofvOl7_7f=v7$W4cw17bLxRzg_Gj%LCr zYAk`2R6i+7p;rlfa1^$u@Dm*dj)N3Hb0rbZ82;)E5Rg0iJ4TQ=GmMKRSVhaZG&907 z^j-o>aLK z6#~%n-^*!J>^fLd3@LNd^lrwI8m&GN3a4lgoLy?Tt{?;?qOMY0k&2Ut{;?PcRM3T zkVvb+RWLa;R!9a(5JZe>oUDn>P5>l8m5^bWlTf0e+4qdvdCGREtOXN5HNmw23S9La zpyhv+X;FiTtPIIXal!;OZP0E6tyxNd&?XK7c@8SedbTjEo~jpr91Ek0ekJ=Q;bs0ppN>n8d*^BWEMOUAz~s5oDSy z4h5Q|3RFTk6GB(H6X0Y9k9-Zw1DvH|v|{@c^}jE3>W%DxB>s_`Mu>ni_ zFo0c=APx|aPEh47T!}3$WOucslTf2Ju5uhi!Rj&a`Lh^*oDhyok_}02x?+hPa%jO6 zplt28=jNn*tGpLHC6zqqFXGYwbZM2+t=V``1gfMk;08(>>roZ*5h@CWwTO+C9wG-IF+3|q6zo!;2p-DVQ@=&JNXkP{>Q?dLsYtIx zB(amJc!qk%bH>*;8ETcsq6;;fgGP`=XFAGRyu;3wBi`ponqJyNvDvluOk}@<`xa&d zxdP+H=gO%wXCCbMNpW2vo8of869sxzOW43Yai_oC8`lj-Y&cw9a`Yp#R0uaIe_ysb z+C+t{{y9X%q+~G+D`*O5HEyVZ)z*fFbV$7^3jJcZ?VFKyFhDE(IiOWm&F$ri{Ngx8 z@K{`rBHU8ZDDDeX6bp4YMm+g8ssBW|9B74;!xjMSWLEUq%1C;UO6S?h4*JKrlY?;A z0bmYrKCrae;%YWW$F?d|iIY<>mXIHK8m?>oMATLo^y7xC7Y1=AKc+{PMm}WI zQa7FX6-Ub=kJ)mmZFE=`91DzvyjW@u+>2x+#*26w!#?NT&DmT8Kq}kT!%it5t3wcd zpQXQOc1q6IfZb4yRSipr;{r7l87TX@HQ8D}`M=6l_*(e>^iAoV>0e0yV*0`KL+RJ@ zgZx&0JHMA--QmqTo-L*D}3SCoJ2Czcp zMOdkl#G4>p=SiP~B&`Yb4Uw@3->?9~u7srs&oF?1AX6|Yv9#elD(C5oUInnoArz<=ZX44@zx=qzh^dNYKmo%rA zG-6=@+|5r;SqEfPK`6A~PFg2Vwzr)*FZkB5g+2L2ZWr` zc0fs9nbl&XXVQIyPGU@HA=_xX8B25#{;oLzZX72MLv(Dn>PShikW!EhGJ`ACzxiSo zqL^*z7sv+f>|AZywd3=Zt`QQdY|kEAI-kg>=uT}^38yW5YANA z+M|ju0eZyYjJRqz+bqR$rQ|Nk;c!E{1h132$>`sk;g_&ChG1E~%}{5JSAl&~_)K`j zpbB`TY-8l4E-)$`iNHodE^gL<3%H1aTN;ks!!HfMD+Cjx^kBMZ!e}sNr{fMz4gE6) zy2oFlRsQn=Cy<*IR^qW*#d>#F8*9_5#hYO^`4Lehd)x}b7+?m3 zS9`{(^5WnzB0|+|u}6jGh@^-p$%vD}o=~u(7#v@m6EQ^$dJE48@4!`B6cn)y+99|{ zO@^JrW+^-%XX9twKsxx599c%87YX33no;%1s304AsR07U)W3=B3uZ(K zH+#pagvsfS$pVQ|i-fO4tOTA)V9a!YfmF{XN0RDD)f^C!$Svk1L198n1rVwa_9M(< zOqt2zKzM8)_d6_S97q7L!wHd;?9q#MiGxX0I^CEV+VQ(WF?mHTjm}jQ|5e7QW8P`S ztqJe(6-mVdL9ktpY8K=M(@U~`oG2*S1KXjb=MLB*@nL~YCX63Af+;n{nY8j_Np*8F zDoK7OMoBG^(oqIlaS?L%^!py?9x^@s(?3885AI3l*mvzcJv3 zHmf-z&;-_KMf21hY9}HhLjIm9F`GBQ)TrHm);zZp@yzo;kuhgOaBK!sWc#kX^(AM9 z6P6IR6E^@lhL(sn4WK&OGA7)NoB;K6R9?XJ zg$miU$qwj@qdkP#ihRr;QiE#F)u{AOVlUIfLGrZCf0b6YiE|&BqqtY}fW>u6FYuXy zn2HlesJsM-0X`LeG;N7bu_7chWN8F5a^fyCq*(~3y{v@rI#2izX}cZ52~f8V%FikA zEY3g|=munhzQrDtL`p+SMAWL%3-0|G3{mS3UL&4S1cbOVrko4`httDIjxI$(C|ibw zY^7!kC@B~pb^&Hua3G7l2&Rjfo2^IyP%lEAOs`I_(jzqq;BmNw3|C;cj)x8IJk@g)Pz_{0~$`IRCp8puhG<;qiMJv-``z z{kRUVrFKUrXc#7o@IsS?-+iqwtWh8k$RxNpvW6h>*#v56D>WyNu;bHRQ(dzRALKUV zlAoj}bdo91I$aymjNJpcLU%nt8a1q{Xd%4-?Z8zin`XN)EI{v2YZ1Gr_O;Iy&Ba!> z`zR$H!z`}hXT7Fo5QPCQVi26)+D~_cMYZDU`9Yc)SGf{B!YlmLFaIa71vNWh(K60_?M-WnN4yFbU3Cy8O4Y*VQ^`JE( zCqrirDzN2{2NPEY2#`*T?5)*ds4S<Zd)tF6pXS@UiX1yO(k*n+*Vtlsz#QapO& zG~PRm8k+*FtmYA2M#8B9R9pLY&OyWy7&y!3-$aEZhx2n-FgOAz7PAt{57hui7?K%r z9S}l&9X@)fNrP>cN#56SLY9O?V8)btRrQKu z(Zrff8FHrMb%0JlJb-3FcdKmSS>3r;z?csDNyWaIAW08}vDNDs*$zAO?}+Lk7?LPN zM%z{-ntH&2l9OzA7SqriDrgzD$R^5(rp1|BYU$p@fKWWkh2Wcf!D5FlV7 zod7|r)b;TXK}U4(HN+Nel;zBAe(UrK6iLQGYN29#c&^(9i6Y37hki&>_!t|>%D^>< zE0osBxH&5_y9YS?SSku22mLt14qZT`ux0##Omo?oLAnhEsXdRB#=;bIo3$MW zPd-Xb^*Cl-vT7&vOG9`e>kV?o(vgN`Ni4*?mC;{$nV$&(Z_fI zn`@|$hB{kojm9}v29csZ6C#POh^l&#qGZB}nF(3u>J*RZOz^25fglFRL&B=if-+p1 zow6pXJ_nU7s{I9v8!iMH8amxafH~7)$ts09qr81$^s(8!x(_h?zhOpy1_iVBWY!oG zhmyzM>=u31x3T*e@%XL?^6EIBD(CDkNS2W!row$(%{a(GX8^FKOi~zMyR@gZp9yK5 zWB}r@|5;58LDBH%xMgIZU>7QY11@QoJSB)GIU++tr8Evue~Cfn2%D7FvIa^}_;=^P zZ5$S?5!1FUr^q3{`{ednxr{1#X0D}JExPOUT0Hixa_jDsAIslCS8qvgOW&S8mOh_; zI{jzq@1?I%ZwMv>45SbakcPC=t`ph_2IlGZ!ryZuexXnTo~9Pm+xAR~{0JwlS-=Du*CZYphNd5z zNS`V});IkqFtcr>n>d>x^ToWFf&mr8x+;3jxVH7-KZ6p=C?s0gfM z5x$PR<7yS|Xc$7#gsR+!s6q~SPXRCWC>E^}q>9oOTXLXahZ2e#luB8>4>3QqV}AC0 zK#`b18T}0tRP~FlThok1kXA60uT{S$%&ZG>JFHF&6zw5_esgjlyM9j?fu`Dh^V1sI zM55wGcj&0_1tbNeio+S1A8fUL#S%S`PZ);+XqCGO2<2kM>K8&2y2_djUtlQP-hm{! z0Y>r}^)>()@PIP=x{nO?@_fQb z1g!z?&>|PW0I@}=AwYz%B0(ua+$15|8_H|075-s0m>Vt{C)vGfg-0*J$x}wNLD;Sy zMerxvP_0uTxLrf(umuA&C2S&jM}3vG0)%SSWzHtZ!eOpe0A}YuZty!!QbuUJaY#}k zjWi}RSY(Eu1RZoFnoA}hNtKarN#Z=0>PmzY*D@y1q7Lu^SA@{KWB4MRXBHdDGxe7; zKW!dKmZV@OpbOGr0)kf1yrv;Hrg?8bUHU15CfFQis2&2Hbxy+I9 zsHb4fraq0v4MakSARLCGdrDsi=^9-zT(AeUTR5}WyODH{Y0;_K%*CqiL>UQM+zeDD zvEukz6M-BIoO)uWh`2L*1Mf|(5c0K&iPaxNSe1+cbjyf{!QwGZ15(n^Q)4H6)PL+4 zKWRh9g^H#kPiLy&k}0(^5E`d#<3$~W2?Gr=6HN(X%CO3|ir?I?KGddwPdf#a_ayk8 zS!VyR!^9yNd8B>%f5{=bX7tR;S#vzx=Yyp8VxS!1mi)d^pRyP#s1mVAUA(@Q zKdVX$mfF~``-gxve1bKaWfRwd%ymD!KF(*jBRqJ^Kg%vt+&p41Dk-Xl8a3P^4!C(3 zIsUP&$9_9<9Ld6QIu+hQ;+(!g!M4+)-yHCi7Qeqs*vPR-hlD*{KAZXl{3vQZczot+ zdsuT;9$paP1yL&@-$OP~aYzwokHt}yjab5Q-#8-$uaM+E?od|T8tv*JI}WH}L*r~5 z#=ry` z45GU0IX&y8Y>I|woLzWyi!oph_=`=w@szx!lGZu%p-PQI4{h^WLkuK3aP$nv;nmcx z5n?ed%>$Q;9@w=t-Q$rtY)Cm`OZaq|jpK<}>OT@EYD-#$AIM z$b)wH&fJgX?<5W!hJ76_NllxIBwz6TZQ>Bl)5FEYztTBp?ES_;15jg&2$9bqKo0wd z&uROe1T#?8#N);Ms+jIDSWOCal480YKW~S4irP6%<}Yw+>73ymQy8i6FS4gE?h|K( zfd5LXc?)qG5oB<*Jgi&Wj{?gg&(5QyCgXft-;8DDC6fqS|m9QXrnhA&hoTP0SDYc8Q4yF4`c<3=EsbTxzm281G==)J7ot1aOEjQ zh#b)+-yhgfyCu^L)oN7I6~e3v*Fjm1<8ZoW0~yDmvNH;T!Y|Iu?8j}MuEG&;r2dy+ z%;Kw_JhKv~kt=2=$xlP{sE#2r80bnNKh4p_h!9 z<$yA;eRQDC(qHFv233oxw7_UcO;Ieq{}wP95fP_lrFSY^K@YHA%=u;T0uVQ*20a)u zCs-m4mA_`|H*FyJl$~*oD-SnC>{P?3C-o@^@q3&Gr8}j>nl{9RZJ^;mw+dMr_jU*l z3KHi#zzh_tRFmEth_cx0DSO2Dh+%8$Zjpl)^d$O2ATyqcqbi~t4dF5%Q$At0?SS2_ z*f>Nf0M^eaw}`tu&S=W~Xi8WnV#YCh;x&cWQ>rtytB@iE9UR=B%~jRI!E9`oqzac3 zmxf?_=8ox-Bji%JlS>njM9zB_s>ajn636ZV79z_KbU@Jq1OlBX3Ezk^S4BRn)6UMV z!)dzvx@vEm+MB?E6;}*^no324x5M}_Ai-=4O{g^BF{mNz&@sVa#o>UJkOfSYHr2Bs z@`RJv-=5P@wGUg0f_0L;aVQ4C_Zv-bRhh&|hgquvJ`xlRmVRVjph5=a4*^OjIOi>7 zH7Ket;%IkHX(xd`4=rtmwJaPQGgC4gt!A^F0w6SnYAnw1U^ogSso>Ip{aWX}1us*8hp;vQw~;Bkb&Ma@Hwbs(afj{T1n-$cZmrY&Wg)P+aY-);A?P}9*E z%PhFJCRX0Xe2|P{A9>A{u~=~>HB3B>)MxiIT4e2KIY#Od>yI6xvEUeAOumc^d|}I8Q#Hd8 z$Th~5=fA*@As=ZsX~mJ%01lY_WP{MtRXBU_F2QZ!F9gR z!<{IUiX=wpMaMAnA?NmT!~sbG5D_-{HpkT|Y!gs~M1t⁡kozbdFM2)d(|jFd|=` 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 diff --git a/docs/public/fonts/fleurons.woff b/docs/public/fonts/fleurons.woff deleted file mode 100644 index 10b7e1a1dc83779f20ad9987a5bb2220c9f4f5f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36284 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 bvUJ*`Gw-aLpC3A3DHs3%00B`wc;5g3syVV0 diff --git a/docs/public/images/gray.png b/docs/public/images/gray.png deleted file mode 100644 index 6eb6669147761f589d64bea10d3d2e6d87082615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56906 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 X$aFtydHQxA&FL`IHN8@%;}rQn^>STY diff --git a/docs/set.html b/docs/set.html deleted file mode 100644 index 4fd5bef..0000000 --- a/docs/set.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - set.ts - - - - - - - - diff --git a/docs/set.test.html b/docs/set.test.html new file mode 100644 index 0000000..87a623a --- /dev/null +++ b/docs/set.test.html @@ -0,0 +1,125 @@ + + + + + set.test.ts + + + + + +
    +
    + + + +
      + +
    • +
      +

      set.test.ts

      +
      +
    • + + + +
    • +
      + +
      + +
      + +
      + +
      import { expect } from 'chai';
      +import { set } from './../index';
      +
      +describe('@jdw/jst/set', () => {
      +  const fixture = {
      +    array: [1, 2, null],
      +    object: {
      +      foo: null,
      +      array: [{ foo: null }, null]
      +    },
      +    foo: null,
      +  };
      +
      +  it('can set an property on an object', () => {
      +    set(fixture, '#/foo', 'bar');
      +    expect(fixture.foo).to.eq('bar');
      +  });
      +
      +  it('can set an index on an array', () => {
      +    set(fixture, '#/array/2', 3);
      +    expect(fixture.array[2]).to.eq(3);
      +  });
      +
      +  it('can set an property on a nested object', () => {
      +    set(fixture, '#/object/foo', 'bar');
      +    expect(fixture.object.foo).to.eq('bar');
      +  });
      +
      +  it('can set an property on a nested array', () => {
      +    set(fixture, '#/object/array/1', 'bar');
      +    expect(fixture.object.array[1]).to.eq('bar');
      +  });
      +
      +  it('can set an property on an object in an array', () => {
      +    set(fixture, '#/object/array/0/foo', 'bar');
      +    expect(fixture.object.array[0].foo).to.eq('bar');
      +  });
      +});
      + +
    • + +
    +
    + + diff --git a/docs/typings.d.html b/docs/typings.d.html deleted file mode 100644 index 29d9938..0000000 --- a/docs/typings.d.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - typings.d.ts - - - - - -
    -
    - -
    - -

    typings.d.ts

    - - - -
    -

    Table of Contents

    -
      - - -
    1. - - dereference.ts - -
    2. - - -
    3. - - get.ts - -
    4. - - -
    5. - - index.ts - -
    6. - - -
    7. - - isPointer.ts - -
    8. - - -
    9. - - set.ts - -
    10. - - -
    11. - - typings.d.ts - -
    12. - -
    -
    - -
    - - - -

    JST Type Definitions

    - - - - -

    JST is a library for working with JSON Schema. It aims to be both simple and -performant. We begin by covering JST internal data-structures and interfaces.

    - - -
    declare module Jst {
    - - - -

    Interfaces

    - - - - -

    A Resolver function takes a schema ID as its argument and looks it -up, returning them schema as an Object if found or undefined if not.

    - - -
      export type resolve = (schemaId: string) => Object | undefined;
    - - - -

    A Dereferencer function takes a schema and a resolver function -and then dereferences schema in accordance with the IETF JSON -Reference Draft v3 -Specification.

    - - -
      export type dereference =
    -    (schema: Object | Array<any>, resolver: resolve) => Object | Array<any>;
    - - - -

    A Getter function dereferences a JSON pointer in accordance with the -IETF RFC6901 specification -returning its value if path is found in schema or throw an error -otherwise.

    - - -
      export type getPointer = (schema: Object, path: string) => any;
    -  export type setPointer = (schema: Object, path: string, value: any) => void;
    -}
    - - -
    h
    -
    -
    - - diff --git a/jest.config.js b/jest.config.js index da091f8..23ef374 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,10 +1,23 @@ module.exports = { - verbose: true, - transform: { '.(ts|tsx)': '/node_modules/ts-jest/preprocessor.js' }, - moduleFileExtensions: [ 'ts', 'tsx', 'js'], - testMatch: ["**/*.test.ts"], - testPathIgnorePatterns: [ - '/node_modules/', - 'd.ts', + "verbose": true, + "transform": { + ".(ts|tsx)": "/node_modules/ts-jest/preprocessor.js" + }, + "testMatch": [ + "**/*.(spec|test).(t|j)s?(x)" + ], + "testEnvironment": "node", + "moduleFileExtensions": [ + "ts", + "tsx", + "js" + ], + "coverageDirectory": ".coverage", + "coverageReporters": ['text', 'text-summary'], + "coverageThreshold": { + "global": { statements: 76, lines: 80, functions: 72 } + }, + "testPathIgnorePatterns": [ + "/node_modules/" ] }; diff --git a/package.json b/package.json index 57afa8f..7059752 100644 --- a/package.json +++ b/package.json @@ -16,13 +16,13 @@ "main": "dist/index.js", "scripts": { "benchmark": "./scripts/benchmark", - "build": "npm run build:source && npm run build:docs", - "build:source": "./scripts/package", - "build:docs": "docco --layout linear src/*.ts", - "clean": "rm -rf dist", + "build": "./scripts/build", "lint": "tslint -p tsconfig.json --type-check", - "test": "jest --verbose", - "test:watch": "yarn run test -- -o --watch" + "release": "./scripts/release", + "test": "jest src --verbose --coverage", + "test:dist": "jest dist --verbose", + "test:watch": "yarn run test -- -o --watch", + "trash": "rm -rf dist docs" }, "repository": { "type": "git", diff --git a/scripts/benchmark b/scripts/benchmark index 7553f07..9004a43 100755 --- a/scripts/benchmark +++ b/scripts/benchmark @@ -1,4 +1,6 @@ #!/bin/bash -node_modules/.bin/ts-node benchmarks/index.benchmark.ts +# This script runs jst's internal benchmarks. + +yarn ts-node benchmarks/index.benchmark.ts # evaluate entry point diff --git a/scripts/build b/scripts/build new file mode 100755 index 0000000..b68f6ad --- /dev/null +++ b/scripts/build @@ -0,0 +1,41 @@ +#!/bin/bash + +# This script builds the jst package. + +## Constants + +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +## build the package + +printf "\n${CYAN}COMPILE${NC}\n" + +yarn trash # remove build artifacts +yarn tsc --verbose # compile source code +cp -rv src/__tests__/fixture dist/__tests__ # copy test fixture +yarn docco --layout linear src/**/*.ts # compile documentation + +## copy copy distributable material +printf "\n${CYAN}COPY ARTIFACTS${NC}\n" + +declare -a filemap + +filemap=( "./README.md" + "./LICENSE.md" + "./CHANGELOG.md" + "./docs" + "./package.json" ) + +for file in "${!filemap[@]}"; do + cp -rv "${filemap[$file]}" ./dist +done + + + + + + + + + diff --git a/scripts/package b/scripts/package deleted file mode 100755 index 2de4fda..0000000 --- a/scripts/package +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -# Clean -rm -rf dist -mkdir dist - -# Copy latent files into ./dist -#cp * dist 2>&1 | grep -v 'omitting directory' -#cp .* dist 2>&1 | grep -v 'omitting directory' - -# Build typescript -yarn tsc - -# Copy latent files from source, recursively -# cp -rp src/__tests__/schema dist/__tests__/schema diff --git a/scripts/release b/scripts/release new file mode 100755 index 0000000..86939c1 --- /dev/null +++ b/scripts/release @@ -0,0 +1,32 @@ +#!/bin/bash + +# This script is used to release the package + +## Constants + +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +printf "${BLUE}@jdw/jst release script${NC}\n\n" +sleep 1 + +## Sanity checks + +printf "${CYAN}RUNNING TESTS${NC}\n" +yarn test + +printf "\n${CYAN}BUILD DISTRIBUTION${NC}\n" +yarn build + +printf "\n${CYAN}TEST DISTRIBUTION${NC}\n" +yarn test:dist + +printf "\n${CYAN}PUBLISH${NC}\n" +cd dist +npm publish + + + + + diff --git a/tests/MockValidator.ts b/src/__tests__/MockValidator.ts similarity index 59% rename from tests/MockValidator.ts rename to src/__tests__/MockValidator.ts index ba94f8a..890eee5 100644 --- a/tests/MockValidator.ts +++ b/src/__tests__/MockValidator.ts @@ -1,13 +1,13 @@ import * as Ajv from 'ajv'; -const address = require('./../resources/address+v1.schema.json'); -const addressOverride = require('./../resources/address-override+v1.schema.json'); -const circular = require('./../resources/circular.schema.json'); -const conditional = require('./../resources/conditional.schema.json'); -const credentials = require('./../resources/credentials+v1.schema.json'); -const editPerson = require('./../resources/edit-person+v1.schema.json'); -const person = require('./../resources/person+v1.schema.json'); -const profile = require('./../resources/profile+v1.schema.json'); +const address = require('./fixture/address+v1.schema.json'); +const addressOverride = require('./fixture/address-override+v1.schema.json'); +const circular = require('./fixture/circular.schema.json'); +const conditional = require('./fixture/conditional.schema.json'); +const credentials = require('./fixture/credentials+v1.schema.json'); +const editPerson = require('./fixture/edit-person+v1.schema.json'); +const person = require('./fixture/person+v1.schema.json'); +const profile = require('./fixture/profile+v1.schema.json'); /** * A validation helper for our test schema. diff --git a/tests/dereference.test.ts b/src/__tests__/dereference.test.ts similarity index 84% rename from tests/dereference.test.ts rename to src/__tests__/dereference.test.ts index 80d8139..11ef92d 100644 --- a/tests/dereference.test.ts +++ b/src/__tests__/dereference.test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; -import { dereference } from './../src/index'; +import { dereference } from './../index'; import resolve from './mockResolve'; describe('dereference schema utility function', () => { it('dereferences referenced schema correctly', () => { - const ast = dereference(resolve('http://footown.com/generic/address#'), resolve); + const ast: any = dereference(resolve('http://footown.com/generic/address#'), resolve); expect(ast.properties).to.have.property('addressLines'); expect(ast.properties).to.have.property('contact'); expect(ast.properties.contact).to.have.property('properties'); @@ -18,7 +18,7 @@ describe('dereference schema utility function', () => { resolve('http://footown.com/generic/address#'), resolve('http://footown.com/generic/address-override#'), ]; - const ast = dereference(schema, resolve); + const ast: any = dereference(schema, resolve); expect(ast.properties).to.have.property('addressLines'); expect(ast.properties).to.have.property('country'); @@ -33,7 +33,7 @@ describe('dereference schema utility function', () => { it('can dereference circular schema references', () => { const schema = resolve('http://footown.com/generic/edit-person+v1#'); - const ast = dereference(schema, resolve); + const ast: any = dereference(schema, resolve); expect(ast).to.have.property('allOf'); expect(ast.allOf.length).to.eq(1); @@ -42,19 +42,19 @@ describe('dereference schema utility function', () => { it('dereferences null values correctly', () => { const schema = resolve('http://footown.com/generic/edit-person+v1#'); - const ast = dereference(schema, resolve); + const ast: any = dereference(schema, resolve); expect(ast.foo).to.eq(null); }); it('dereferences circular references correctly', () => { const schema = resolve('http://footown.com/generic/circular#'); - const ast = dereference(schema, resolve); + const ast: any = dereference(schema, resolve); expect(ast).to.be.an('object'); }); it('dereferences conditional allOf references correctly', () => { const schema = resolve('http://footown.com/generic/conditional#'); - const ast = dereference(schema, resolve); + const ast: any = dereference(schema, resolve); expect(ast).to.be.an('object'); expect(ast.allOf[0]).deep.eq({ type: 'object', @@ -76,9 +76,9 @@ describe('dereference schema utility function', () => { }); it('can dereference referenced circular schema correctly', () => { - const schema = require('./../resources/circular-referenced.schema.json'); + const schema = require('./fixture/circular-referenced.schema.json'); - const ast = dereference(schema, resolve); + const ast: any = dereference(schema, resolve); expect(ast).to.be.an('object'); expect(ast.properties.circular.properties.circle.id).to.eq('http://footown.com/generic/circular#'); diff --git a/resources/address+v1.schema.json b/src/__tests__/fixture/address+v1.schema.json similarity index 100% rename from resources/address+v1.schema.json rename to src/__tests__/fixture/address+v1.schema.json diff --git a/resources/address-override+v1.schema.json b/src/__tests__/fixture/address-override+v1.schema.json similarity index 100% rename from resources/address-override+v1.schema.json rename to src/__tests__/fixture/address-override+v1.schema.json diff --git a/resources/circular-referenced.schema.json b/src/__tests__/fixture/circular-referenced.schema.json similarity index 100% rename from resources/circular-referenced.schema.json rename to src/__tests__/fixture/circular-referenced.schema.json diff --git a/resources/circular.schema.json b/src/__tests__/fixture/circular.schema.json similarity index 100% rename from resources/circular.schema.json rename to src/__tests__/fixture/circular.schema.json diff --git a/resources/conditional.schema.json b/src/__tests__/fixture/conditional.schema.json similarity index 100% rename from resources/conditional.schema.json rename to src/__tests__/fixture/conditional.schema.json diff --git a/resources/credentials+v1.schema.json b/src/__tests__/fixture/credentials+v1.schema.json similarity index 100% rename from resources/credentials+v1.schema.json rename to src/__tests__/fixture/credentials+v1.schema.json diff --git a/resources/edit-person+v1.schema.json b/src/__tests__/fixture/edit-person+v1.schema.json similarity index 100% rename from resources/edit-person+v1.schema.json rename to src/__tests__/fixture/edit-person+v1.schema.json diff --git a/resources/person+v1.schema.json b/src/__tests__/fixture/person+v1.schema.json similarity index 100% rename from resources/person+v1.schema.json rename to src/__tests__/fixture/person+v1.schema.json diff --git a/resources/petstore.swagger.json b/src/__tests__/fixture/petstore.swagger.json similarity index 100% rename from resources/petstore.swagger.json rename to src/__tests__/fixture/petstore.swagger.json diff --git a/resources/profile+v1.schema.json b/src/__tests__/fixture/profile+v1.schema.json similarity index 100% rename from resources/profile+v1.schema.json rename to src/__tests__/fixture/profile+v1.schema.json diff --git a/resources/temando.swagger.json b/src/__tests__/fixture/temando.swagger.json similarity index 100% rename from resources/temando.swagger.json rename to src/__tests__/fixture/temando.swagger.json diff --git a/tests/get.test.ts b/src/__tests__/get.test.ts similarity index 84% rename from tests/get.test.ts rename to src/__tests__/get.test.ts index a9290bf..2b74e9b 100644 --- a/tests/get.test.ts +++ b/src/__tests__/get.test.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import { get } from './../src/index'; +import { get } from './../index'; describe('@jdw/jst/get', () => { const fixture = { @@ -26,7 +26,7 @@ describe('@jdw/jst/get', () => { ['', fixture], ]; cases.forEach((t) => { - expect(get(fixture, t[0])).to.eq(t[1]); + expect(get(fixture, t[0].toString())).to.eq(t[1]); }); }); @@ -36,7 +36,7 @@ describe('@jdw/jst/get', () => { ['#/~1/bar/~0', 10], ]; cases.forEach((t) => { - expect(get(fixture, t[0])).to.eq(t[1]); + expect(get(fixture, t[0].toString())).to.eq(t[1]); }); }); @@ -46,7 +46,7 @@ describe('@jdw/jst/get', () => { ['#/arr/1', 30], ]; cases.forEach((t) => { - expect(get(fixture, t[0])).to.eq(t[1]); + expect(get(fixture, t[0].toString())).to.eq(t[1]); }); }); diff --git a/src/__tests__/isPointer.test.ts b/src/__tests__/isPointer.test.ts new file mode 100644 index 0000000..67e9408 --- /dev/null +++ b/src/__tests__/isPointer.test.ts @@ -0,0 +1,21 @@ +import { expect } from 'chai'; +import { isPointer } from './../index'; + +describe('@jdw/jst/isPointer', () => { + const cases = { + success: ['#', '/', '', '#/foo/bar/baz', '/bar/baz'], + failure: ['yolo', 123, {}, false, true, null, undefined], // '#adasd'] + }; + + cases.success.forEach((testCase) => { + it(`can recognize ${JSON.stringify(testCase)} as a pointer`, () => { + expect(isPointer(testCase)).to.eq(true); + }); + }); + + cases.failure.forEach((testCase) => { + it(`can recognize ${JSON.stringify(testCase)} is NOT a pointer`, () => { + expect(isPointer(testCase)).to.eq(false); + }); + }); +}); diff --git a/tests/mockResolve.ts b/src/__tests__/mockResolve.ts similarity index 100% rename from tests/mockResolve.ts rename to src/__tests__/mockResolve.ts diff --git a/tests/set.test.ts b/src/__tests__/set.test.ts similarity index 96% rename from tests/set.test.ts rename to src/__tests__/set.test.ts index 379593b..50b2122 100644 --- a/tests/set.test.ts +++ b/src/__tests__/set.test.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import { set } from './../src/index'; +import { set } from './../index'; describe('@jdw/jst/set', () => { const fixture = { diff --git a/src/dereference.ts b/src/dereference.ts index c444406..ed57b65 100644 --- a/src/dereference.ts +++ b/src/dereference.ts @@ -19,7 +19,7 @@ // // **Arguments** // - `subject: Object|number|string|boolean|null` A json value. -// - `resolve: Jst.Resolver` A function to resolve a schema by its id. +// - `resolve: `Resolver` A function to resolve a schema by its id. // // **Returns** // - `any`: The dereferenced object. @@ -33,7 +33,7 @@ import * as forIn from 'lodash.forin'; import * as isObject from 'lodash.isobject'; import * as merge from 'lodash.merge'; import { get, isPointer, set } from './index'; - +import { Dereferencer, Resolver } from './types'; // ## Implementation // Here begins the implementation of the `dereference` function. This being @@ -51,7 +51,7 @@ import { get, isPointer, set } from './index'; const isHttp: RegExp = /^http/; const isRemoteRef = (ref: string): boolean => isHttp.test(ref); -export const dereference: Jst.dereference = (root, resolver) => { +export const dereference: Dereferencer = (root, resolver) => { // ### JSON In, JSON Out // // The [json specification](http://www.ietf.org/rfc/rfc4627.txt) section 2.1 @@ -68,7 +68,7 @@ export const dereference: Jst.dereference = (root, resolver) => { } const circularRefs = {}; - const walk = (schema: any, resolve: Jst.resolve = null, path: string = '#'): any => { + const walk = (schema: any, resolve: Resolver = null, path: string = '#'): any => { // If schema is an array we dereference each schema and then merge them from // right-to-left. if (Array.isArray(schema)) { @@ -85,8 +85,8 @@ export const dereference: Jst.dereference = (root, resolver) => { .map((scm, index) => walk(scm, resolve, `${path}/${index}`)) .reduce((acc, scm) => merge(acc, scm), {}); - // If schema is not an array of json objects we expect a singlular json schema - // be provided + // If schema is not an array of json objects we expect a singlular json schema + // be provided } else if (isObject(schema)) { const schemaId = schema.id || undefined; let isCircular = false; @@ -119,8 +119,8 @@ export const dereference: Jst.dereference = (root, resolver) => { if (typeof value !== 'object' && key !== '$ref') { resolution[key] = value; - // If we have a schema reference we must fetch it, dereference it, then merge - // it into the base schema object. + // If we have a schema reference we must fetch it, dereference it, then merge + // it into the base schema object. } else if (key === '$ref') { // We have two types of references - definitions which are defined // within the current schema and external schema references which we @@ -155,7 +155,7 @@ export const dereference: Jst.dereference = (root, resolver) => { isCircular = true; } - // de-reference a json pointer + // de-reference a json pointer } else if (isPointer(value)) { reference = get(schema, value); resolution = merge( @@ -172,8 +172,8 @@ export const dereference: Jst.dereference = (root, resolver) => { throw new ReferenceError(`could not find a reference to ${value}`); } - // Otherwise the value is an array or object and we need to traverse it - // and dereference it's properties. + // Otherwise the value is an array or object and we need to traverse it + // and dereference it's properties. } else { resolution[key] = traverse(value, `${nodePath}/${key}`); } @@ -184,7 +184,7 @@ export const dereference: Jst.dereference = (root, resolver) => { return traverse(schema, path); - // if any other combination of arguments is provided we throw + // if any other combination of arguments is provided we throw } else { throw new TypeError(`expected first parameter to be object or array: ${schema}`); } diff --git a/src/get.ts b/src/get.ts index 131918c..d2ce713 100644 --- a/src/get.ts +++ b/src/get.ts @@ -27,12 +27,13 @@ import * as has from 'lodash.has'; import { isPointer } from './isPointer'; +import { GetPointer } from './types'; // #### Implementation // The `get` function implements the `Jst.Getter` signature as described in // [typings.d.ts](typings.d.html). -export const get: Jst.getPointer = (schema, pointer) => { +export const get: GetPointer = (schema, pointer) => { // A JSON `pointer` must begin with the symbols '#', '/' or be an empty // string ''. So as a first step, we check that this assumption is true and // bail if not. @@ -70,8 +71,8 @@ export const get: Jst.getPointer = (schema, pointer) => { } reference = object[index]; - // Otherwise if `object` *is not* an Array we expect `object` to be of - // type Object and that `token` references a valid path in `object`. + // Otherwise if `object` *is not* an Array we expect `object` to be of + // type Object and that `token` references a valid path in `object`. } else { if (!has(object, token)) { throw new Error( diff --git a/src/isPointer.ts b/src/isPointer.ts index b926c7d..d719d1f 100644 --- a/src/isPointer.ts +++ b/src/isPointer.ts @@ -1,5 +1,7 @@ +import { IsPointer } from './types'; + // A JSON `pointer` must begin with the symbols '#', '/' or be an empty string ''. -export const isPointer = (input: string): boolean => { +export const isPointer: IsPointer = (input) => { if (typeof input !== 'string') { return false; } diff --git a/src/set.ts b/src/set.ts index bb7996d..c0af7eb 100644 --- a/src/set.ts +++ b/src/set.ts @@ -1,7 +1,8 @@ import * as has from 'lodash.has'; import { isPointer } from './isPointer'; +import { SetPointer } from './types'; -export const set: Jst.setPointer = (obj, pointer, value) => { +export const set: SetPointer = (obj, pointer, value) => { // A JSON `pointer` must begin with the symbols '#', '/' or be an empty // string ''. So as a first step, we check that this assumption is true and @@ -45,8 +46,8 @@ export const set: Jst.setPointer = (obj, pointer, value) => { } ref = ref[i]; - // Otherwise if `object` *is not* an Array we expect `object` to be of - // type Object and that `token` references a valid path in `object`. + // Otherwise if `object` *is not* an Array we expect `object` to be of + // type Object and that `token` references a valid path in `object`. } else { if (!has(ref, token)) { throw new Error( diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..53c0501 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,26 @@ +// ## JST Type Definitions + +// JST is a library for working with JSON Schema. It aims to be both simple and +// performant. We begin by covering JST internal data-structures and interfaces. + +// ### Interfaces + +// A **Resolver** function takes a schema ID as its argument and looks it +// up, returning them schema as an `Object` if found or `undefined` if not. +export type Resolver = (schemaId: string) => Object | undefined; + +// A **Dereferencer** function takes a `schema` and a `resolver` function +// and then dereferences `schema` in accordance with the [IETF JSON +// Reference Draft v3 +// Specification](https://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03). +export type Dereferencer = + (schema: Object | Array, resolve: Resolver) => Object | Array; + +// A **Getter** function dereferences a JSON pointer in accordance with the +// [IETF RFC6901 specification](https://tools.ietf.org/html/rfc6901) +// returning its value if `path` is found in `schema` or throw an error +// otherwise. +export type GetPointer = (schema: Object, path: string) => any; +export type SetPointer = (schema: Object, path: string, value: any) => void; + +export type IsPointer = (input: any) => boolean; diff --git a/src/typings.d.ts b/src/typings.d.ts deleted file mode 100644 index 9ec293d..0000000 --- a/src/typings.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -// ## JST Type Definitions - -// JST is a library for working with JSON Schema. It aims to be both simple and -// performant. We begin by covering JST internal data-structures and interfaces. -declare module Jst { - // ### Interfaces - - // A **Resolver** function takes a schema ID as its argument and looks it - // up, returning them schema as an `Object` if found or `undefined` if not. - export type resolve = (schemaId: string) => Object | undefined; - - // A **Dereferencer** function takes a `schema` and a `resolver` function - // and then dereferences `schema` in accordance with the [IETF JSON - // Reference Draft v3 - // Specification](https://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03). - export type dereference = - (schema: Object | Array, resolver: resolve) => Object | Array; - - // A **Getter** function dereferences a JSON pointer in accordance with the - // [IETF RFC6901 specification](https://tools.ietf.org/html/rfc6901) - // returning its value if `path` is found in `schema` or throw an error - // otherwise. - export type getPointer = (schema: Object, path: string) => any; - export type setPointer = (schema: Object, path: string, value: any) => void; -} diff --git a/tests/isPointer.test.ts b/tests/isPointer.test.ts deleted file mode 100644 index 5cbe7e2..0000000 --- a/tests/isPointer.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { expect } from 'chai'; -import { isPointer } from './../src/index'; - -describe('@jdw/jst/isPointer', () => { - const cases = { - success: ['#', '/', '', '#/foo/bar/baz', '/bar/baz'], - failure: ['yolo', 123, {}, false, true, null, undefined], // '#adasd'] - }; - - cases.success.forEach((testCase) => { - it(`can recognize ${JSON.stringify(testCase)} as a pointer`, () => { - expect(isPointer(testCase)).to.eq(true); - }); - }); - - cases.failure.forEach((testCase) => { - it(`can recognize ${JSON.stringify(testCase)} is NOT a pointer`, () => { - expect(isPointer(testCase)).to.eq(false); - }); - }); -}); diff --git a/tsconfig.json b/tsconfig.json index 79b487c..efabd5f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,7 @@ "outDir": "./dist", "declaration": true, "sourceMap": true, + "listFiles": true, "allowSyntheticDefaultImports": false, "noUnusedLocals": true, "lib": [ From 8caacbf5ff1744c62690ee0457ebb9ff54a9023c Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 13:59:06 +0700 Subject: [PATCH 02/22] updae version and travis publish --- .travis.yml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2c59434..6e3cdaa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,6 +28,6 @@ jobs: provider: script skip_cleanup: true script: - - npm publish + - yarn release on: tags: true diff --git a/package.json b/package.json index 7059752..030019d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jdw/jst", - "version": "2.0.0-beta.9", + "version": "2.0.0-beta.10", "engines": { "node": ">=4" }, From a4600577924a999844a2372d50ae7b13196425e0 Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 15:36:48 +0700 Subject: [PATCH 03/22] update scripts --- scripts/benchmark | 5 +++++ scripts/build | 6 +++--- scripts/constants | 4 ++++ scripts/release | 21 +++------------------ 4 files changed, 15 insertions(+), 21 deletions(-) create mode 100755 scripts/constants diff --git a/scripts/benchmark b/scripts/benchmark index 9004a43..9d8a65d 100755 --- a/scripts/benchmark +++ b/scripts/benchmark @@ -2,5 +2,10 @@ # This script runs jst's internal benchmarks. +. ./constants + +printf "${BLUE}@jdw/jst benchmarks${NC}\n\n" +sleep 1 + yarn ts-node benchmarks/index.benchmark.ts # evaluate entry point diff --git a/scripts/build b/scripts/build index b68f6ad..1c63e17 100755 --- a/scripts/build +++ b/scripts/build @@ -2,10 +2,10 @@ # This script builds the jst package. -## Constants +. ./scripts/constants -CYAN='\033[0;36m' -NC='\033[0m' # No Color +printf "${BLUE}@jdw/jst build script${NC}\n\n" +sleep 1 ## build the package diff --git a/scripts/constants b/scripts/constants new file mode 100755 index 0000000..c4caaaa --- /dev/null +++ b/scripts/constants @@ -0,0 +1,4 @@ +## Constants +export BLUE='\033[0;34m' +export CYAN='\033[0;36m' +export NC='\033[0m' # No Color diff --git a/scripts/release b/scripts/release index 86939c1..d5afacd 100755 --- a/scripts/release +++ b/scripts/release @@ -2,27 +2,12 @@ # This script is used to release the package -## Constants +. ./scripts/constants -BLUE='\033[0;34m' -CYAN='\033[0;36m' -NC='\033[0m' # No Color - -printf "${BLUE}@jdw/jst release script${NC}\n\n" +printf "${BLUE}@jdw/jst release script${NC}\n" sleep 1 -## Sanity checks - -printf "${CYAN}RUNNING TESTS${NC}\n" -yarn test - -printf "\n${CYAN}BUILD DISTRIBUTION${NC}\n" -yarn build - -printf "\n${CYAN}TEST DISTRIBUTION${NC}\n" -yarn test:dist - -printf "\n${CYAN}PUBLISH${NC}\n" +printf "\n${CYAN}PUBLISHING${NC}\n" cd dist npm publish From 38f79ee51c47170d45249e4f6a0546dd56905cb9 Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 16:08:17 +0700 Subject: [PATCH 04/22] fix up linting --- CHANGELOG.md | 1 + package.json | 4 +++- src/__tests__/MockValidator.ts | 30 +++++++++++++++--------------- src/__tests__/dereference.test.ts | 12 ++++++------ src/__tests__/get.test.ts | 14 +++++++------- src/__tests__/mockResolve.ts | 12 +++++++----- src/__tests__/set.test.ts | 2 +- src/types/index.ts | 9 ++++----- src/types/typings.d.ts | 4 ++++ tslint.json | 8 +++++++- yarn.lock | 4 ++++ 11 files changed, 59 insertions(+), 41 deletions(-) create mode 100644 src/types/typings.d.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 3362dd5..97fc44d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - use `isPointer` internally now. - Now exports an optimized `npm pack` with minimal file system foot-print. - Refactor `typings.d.ts` to `./types/index.ts`, we now compile and package our types. +- Improved package scripts, now cleaner and more verbose. ### Remove - Object manipulation functionality has been dropped from JST (the `merge`, diff --git a/package.json b/package.json index 030019d..289bbda 100644 --- a/package.json +++ b/package.json @@ -51,12 +51,14 @@ "ts-node": "^3.1.0", "tslint": "^5.4.3", "tslint-config-temando": "^1.1.4", + "tslint-strict-null-checks": "^1.0.0", "typescript": "^2.3.3" }, "dependencies": { "lodash.forin": "^4.4.0", "lodash.has": "^4.5.2", "lodash.isobject": "^3.0.2", - "lodash.merge": "^4.6.0" + "lodash.merge": "^4.6.0", + "self": "^1.0.0" } } diff --git a/src/__tests__/MockValidator.ts b/src/__tests__/MockValidator.ts index 890eee5..94a1279 100644 --- a/src/__tests__/MockValidator.ts +++ b/src/__tests__/MockValidator.ts @@ -1,22 +1,22 @@ import * as Ajv from 'ajv'; -const address = require('./fixture/address+v1.schema.json'); -const addressOverride = require('./fixture/address-override+v1.schema.json'); -const circular = require('./fixture/circular.schema.json'); -const conditional = require('./fixture/conditional.schema.json'); -const credentials = require('./fixture/credentials+v1.schema.json'); -const editPerson = require('./fixture/edit-person+v1.schema.json'); -const person = require('./fixture/person+v1.schema.json'); -const profile = require('./fixture/profile+v1.schema.json'); +import * as address from './fixture/address+v1.schema.json'; +import * as addressOverride from './fixture/address-override+v1.schema.json'; +import * as circular from './fixture/circular.schema.json'; +import * as conditional from './fixture/conditional.schema.json'; +import * as credentials from './fixture/credentials+v1.schema.json'; +import * as editPerson from './fixture/edit-person+v1.schema.json'; +import * as person from './fixture/person+v1.schema.json'; +import * as profile from './fixture/profile+v1.schema.json'; /** * A validation helper for our test schema. */ -export default class MockValidator { - public schema: Array = []; +export class MockValidator { + public schema: object[] = []; private ajv; - constructor(config: Object = {}) { + constructor(config: object = {}) { const schema = [ address, addressOverride, @@ -30,22 +30,22 @@ export default class MockValidator { const cnf = { extendRefs: true, allErrors: true, - ...config + ...config, }; this.ajv = new Ajv(cnf); this.load(schema); } - load(schema: Array) { + load(schema: object[]) { schema.map((scm) => { - this.ajv.addSchema(scm) + this.ajv.addSchema(scm); this.schema.push(scm); }); return this; } - getSchema(id: string): Object | undefined { + getSchema(id: string): object | undefined { const lookup = this.ajv.getSchema(id); return !lookup ? undefined : lookup.schema; diff --git a/src/__tests__/dereference.test.ts b/src/__tests__/dereference.test.ts index 11ef92d..a783e01 100644 --- a/src/__tests__/dereference.test.ts +++ b/src/__tests__/dereference.test.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { dereference } from './../index'; -import resolve from './mockResolve'; +import { mockResolve as resolve } from './mockResolve'; describe('dereference schema utility function', () => { it('dereferences referenced schema correctly', () => { @@ -61,17 +61,17 @@ describe('dereference schema utility function', () => { properties: { foobar: { type: 'string', - minLength: 1 - } - } + minLength: 1, + }, + }, }); expect(ast.allOf[1]).deep.eq({ type: 'object', properties: { barfoo: { type: 'number', - } - } + }, + }, }); }); diff --git a/src/__tests__/get.test.ts b/src/__tests__/get.test.ts index 2b74e9b..e971e29 100644 --- a/src/__tests__/get.test.ts +++ b/src/__tests__/get.test.ts @@ -3,20 +3,20 @@ import { get } from './../index'; describe('@jdw/jst/get', () => { const fixture = { - foo: { + 'foo': { bar: 20, }, '/': { '~': 400, - bar: { - '~': 10 - } + 'bar': { + '~': 10, + }, }, - arr: [{ + 'arr': [{ arr: [{ foo: 100, - }] - }, 30] + }], + }, 30], }; it('should resolve valid JSON pointers', () => { diff --git a/src/__tests__/mockResolve.ts b/src/__tests__/mockResolve.ts index 47a639a..6899801 100644 --- a/src/__tests__/mockResolve.ts +++ b/src/__tests__/mockResolve.ts @@ -1,4 +1,4 @@ -import Validator from './MockValidator'; +import { MockValidator as Validator } from './MockValidator'; const validator = new Validator(); @@ -7,11 +7,13 @@ const validator = new Validator(); * that schema as an object literal or throw an error if it can't find it. */ const mockResolve = (id) => { - const result = validator.getSchema(id); + const result = validator.getSchema(id); - if (!result) throw new Error(`could not resolve schema with id: ${id}`); + if (!result) { + throw new Error(`could not resolve schema with id: ${id}`); + } - return result; + return result; }; -export default mockResolve; +export { mockResolve }; diff --git a/src/__tests__/set.test.ts b/src/__tests__/set.test.ts index 50b2122..57658af 100644 --- a/src/__tests__/set.test.ts +++ b/src/__tests__/set.test.ts @@ -6,7 +6,7 @@ describe('@jdw/jst/set', () => { array: [1, 2, null], object: { foo: null, - array: [{ foo: null }, null] + array: [{ foo: null }, null], }, foo: null, }; diff --git a/src/types/index.ts b/src/types/index.ts index 53c0501..cfe8ab1 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -7,20 +7,19 @@ // A **Resolver** function takes a schema ID as its argument and looks it // up, returning them schema as an `Object` if found or `undefined` if not. -export type Resolver = (schemaId: string) => Object | undefined; +export type Resolver = (schemaId: string) => object | undefined; // A **Dereferencer** function takes a `schema` and a `resolver` function // and then dereferences `schema` in accordance with the [IETF JSON // Reference Draft v3 // Specification](https://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03). export type Dereferencer = - (schema: Object | Array, resolve: Resolver) => Object | Array; + (schema: object | any[], resolve: Resolver) => object | any[]; // A **Getter** function dereferences a JSON pointer in accordance with the // [IETF RFC6901 specification](https://tools.ietf.org/html/rfc6901) // returning its value if `path` is found in `schema` or throw an error // otherwise. -export type GetPointer = (schema: Object, path: string) => any; -export type SetPointer = (schema: Object, path: string, value: any) => void; - +export type GetPointer = (schema: object, path: string) => any; +export type SetPointer = (schema: object, path: string, value: any) => void; export type IsPointer = (input: any) => boolean; diff --git a/src/types/typings.d.ts b/src/types/typings.d.ts new file mode 100644 index 0000000..f3f5966 --- /dev/null +++ b/src/types/typings.d.ts @@ -0,0 +1,4 @@ +declare module "*.json" { + const value: any; + export default value; +} diff --git a/tslint.json b/tslint.json index 7835ed1..c714561 100644 --- a/tslint.json +++ b/tslint.json @@ -2,7 +2,13 @@ "extends":[ "tslint-config-temando" ], + "rulesDirectory": [ + "node_modules/tslint-strict-null-checks/rules" + ], "rules": { - "no-console": [false] + "space-before-function-paren": false, + "no-console": [false], + "strict-type-predicates": false, + "no-uninitialized": true } } diff --git a/yarn.lock b/yarn.lock index 4454dac..b27f56d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2202,6 +2202,10 @@ sax@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" +self@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/self/-/self-1.0.0.tgz#6355f6f6502507cfc788811e0cc1c6d6269e16b8" + "semver@2 || 3 || 4 || 5", semver@^5.3.0: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" From 1f5d7ef42e1c3f3ba7239b06f2f93e17dffd9b8e Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 16:10:22 +0700 Subject: [PATCH 05/22] update ci --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6e3cdaa..51d399c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,7 @@ language: node_js install: - yarn - - yarn build:source - - yarn build:docs + - yarn build jobs: include: @@ -28,6 +27,7 @@ jobs: provider: script skip_cleanup: true script: + - yarn test:dist - yarn release on: tags: true From 8369aedc3f8844680ef1269351ba287e79bddfd8 Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 16:19:48 +0700 Subject: [PATCH 06/22] update benchmarks and gitignore --- .gitignore | 3 +- .../dereference-address-schema.benchmark.ts | 32 +++++------ .../dereference-petstore-swagger.benchmark.ts | 54 +++++++++---------- .../dereference-temando-swagger.benchmark.ts | 52 +++++++++--------- benchmarks/traversal-shallow-benchmark.ts | 2 +- scripts/benchmark | 2 +- 6 files changed, 73 insertions(+), 72 deletions(-) diff --git a/.gitignore b/.gitignore index 00f6d3c..2765334 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules dist/ *log -.DS_Store \ No newline at end of file +.DS_Store +.coverage \ No newline at end of file diff --git a/benchmarks/dereference-address-schema.benchmark.ts b/benchmarks/dereference-address-schema.benchmark.ts index 2dfcdfe..70c7808 100755 --- a/benchmarks/dereference-address-schema.benchmark.ts +++ b/benchmarks/dereference-address-schema.benchmark.ts @@ -1,28 +1,28 @@ import * as derefSync from 'json-schema-deref-sync'; import { dereference } from './../dist/index'; -import resolve from './../tests/mockResolve'; +import { mockResolve as resolve } from './../src/__tests__/mockResolve'; import benchmark from './benchmark'; const title = 'jst/dereference comparision: http://footown.com/generic/address#'; const description = - 'This benchmark tests the performance of the jst/dereference function using ' + - 'a basic schema of our own invention and a variety of other similar open source ' + - 'tools.'; + 'This benchmark tests the performance of the jst/dereference function using ' + + 'a basic schema of our own invention and a variety of other similar open source ' + + 'tools.'; const tests = [ - { - id: 'jst/dereference', - deferred: false, - exec: () => { - dereference(resolve('http://footown.com/generic/address#'), resolve); - }, + { + id: 'jst/dereference', + deferred: false, + exec: () => { + dereference(resolve('http://footown.com/generic/address#'), resolve); }, - { - id: 'json-schema-deref-sync', - deferred: false, - exec: () => { - derefSync(resolve('http://footown.com/generic/address#')); - } + }, + { + id: 'json-schema-deref-sync', + deferred: false, + exec: () => { + derefSync(resolve('http://footown.com/generic/address#')); } + } ]; benchmark(title, description, tests); diff --git a/benchmarks/dereference-petstore-swagger.benchmark.ts b/benchmarks/dereference-petstore-swagger.benchmark.ts index 15532bb..bea1dc0 100755 --- a/benchmarks/dereference-petstore-swagger.benchmark.ts +++ b/benchmarks/dereference-petstore-swagger.benchmark.ts @@ -1,42 +1,42 @@ import * as derefSync from 'json-schema-deref-sync'; import * as $RefParser from 'json-schema-ref-parser'; import { dereference } from './../dist/index'; -import resolve from './../tests/mockResolve'; +import { mockResolve as resolve } from './../src/__tests__/mockResolve'; import benchmark from './benchmark'; const title = 'jst/dereference comparision - petstore.swagger.json'; const description = - 'This benchmark tests the performance of the jst/dereference function using ' + - 'the demo Petstore API swagger from the open api homepage. This is a medium ' + - 'sized json payload.'; + 'This benchmark tests the performance of the jst/dereference function using ' + + 'the demo Petstore API swagger from the open api homepage. This is a medium ' + + 'sized json payload.'; const refParser = new $RefParser(); const tests = [ - { - id: 'jst/dereference', - deferred: false, - exec: () => { - dereference(require('./../resources/petstore.swagger.json'), resolve) - }, + { + id: 'jst/dereference', + deferred: false, + exec: () => { + dereference(require('./../src/__tests__/fixture/petstore.swagger.json'), resolve) }, - { - id: 'json-schema-deref-sync', - deferred: false, - exec: () => { - derefSync(require('./../resources/petstore.swagger.json')); + }, + { + id: 'json-schema-deref-sync', + deferred: false, + exec: () => { + derefSync(require('./../src/__tests__/fixture/petstore.swagger.json')); + } + }, + { + id: 'json-schmea-ref-parser', + deferred: true, + exec: (defer) => { + refParser.dereference( + require('./../src/__tests__/fixture/petstore.swagger.json'), + (err, x) => { + defer.resolve(); } + ); }, - { - id: 'json-schmea-ref-parser', - deferred: true, - exec: (defer) => { - refParser.dereference( - require('./../resources/petstore.swagger.json'), - (err, x) => { - defer.resolve(); - } - ); - }, - }, + }, ]; benchmark(title, description, tests); diff --git a/benchmarks/dereference-temando-swagger.benchmark.ts b/benchmarks/dereference-temando-swagger.benchmark.ts index bb7da5f..0a8ee9f 100755 --- a/benchmarks/dereference-temando-swagger.benchmark.ts +++ b/benchmarks/dereference-temando-swagger.benchmark.ts @@ -1,41 +1,41 @@ import * as derefSync from 'json-schema-deref-sync'; import * as $RefParser from 'json-schema-ref-parser'; import { dereference } from './../dist/index'; -import resolve from './../tests/mockResolve'; +import { mockResolve as resolve } from './../src/__tests__/mockResolve'; import benchmark from './benchmark'; const title = 'jst/dereference comparision - temando.swagger.json'; const description = - 'This benchmark tests the performance of the jst/dereference function using ' + - 'the Temando Phoenix API swagger payload. This is a large json payload.'; + 'This benchmark tests the performance of the jst/dereference function using ' + + 'the Temando Phoenix API swagger payload. This is a large json payload.'; const refParser = new $RefParser(); const tests = [ - { - id: 'jst/dereference', - deferred: false, - exec: () => { - dereference(require('./../resources/temando.swagger.json'), resolve) - }, + { + id: 'jst/dereference', + deferred: false, + exec: () => { + dereference(require('./../src/__tests__/fixture/temando.swagger.json'), resolve) }, - { - id: 'json-schema-deref-sync', - deferred: false, - exec: () => { - derefSync(require('./../resources/temando.swagger.json')); + }, + { + id: 'json-schema-deref-sync', + deferred: false, + exec: () => { + derefSync(require('./../src/__tests__/fixture/temando.swagger.json')); + } + }, + { + id: 'json-schmea-ref-parser', + deferred: true, + exec: (defer) => { + refParser.dereference( + require('./../src/__tests__/fixturetemando.swagger.json'), + (err, x) => { + defer.resolve(); } + ); }, - { - id: 'json-schmea-ref-parser', - deferred: true, - exec: (defer) => { - refParser.dereference( - require('./../resources/temando.swagger.json'), - (err, x) => { - defer.resolve(); - } - ); - }, - }, + }, ]; benchmark(title, description, tests); diff --git a/benchmarks/traversal-shallow-benchmark.ts b/benchmarks/traversal-shallow-benchmark.ts index 023d7b0..9ed89b8 100755 --- a/benchmarks/traversal-shallow-benchmark.ts +++ b/benchmarks/traversal-shallow-benchmark.ts @@ -1,7 +1,7 @@ import * as forIn from 'lodash.forin'; import benchmark from './benchmark'; -const schema = require('./../resources/temando.swagger.json'); +const schema = require('./../src/__tests__/fixture/temando.swagger.json'); const title = 'jst/experimental: Basic object traversal'; const description = 'This benchmark tests various methods for iterating and walking an objects top level properties.'; diff --git a/scripts/benchmark b/scripts/benchmark index 9d8a65d..c62a53f 100755 --- a/scripts/benchmark +++ b/scripts/benchmark @@ -2,7 +2,7 @@ # This script runs jst's internal benchmarks. -. ./constants +. ./scripts/constants printf "${BLUE}@jdw/jst benchmarks${NC}\n\n" sleep 1 From 9953e0328292ae61f86404281c1c6876bf006290 Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 16:24:42 +0700 Subject: [PATCH 07/22] fix path --- benchmarks/dereference-temando-swagger.benchmark.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/dereference-temando-swagger.benchmark.ts b/benchmarks/dereference-temando-swagger.benchmark.ts index 0a8ee9f..806af0c 100755 --- a/benchmarks/dereference-temando-swagger.benchmark.ts +++ b/benchmarks/dereference-temando-swagger.benchmark.ts @@ -29,7 +29,7 @@ const tests = [ deferred: true, exec: (defer) => { refParser.dereference( - require('./../src/__tests__/fixturetemando.swagger.json'), + require('./../src/__tests__/fixture/temando.swagger.json'), (err, x) => { defer.resolve(); } From cd1251ab2b6ed20f01e2901ae7252ea2916ba38f Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 16:31:24 +0700 Subject: [PATCH 08/22] change entry path --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 289bbda..c2409e0 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "contributors": [ "Brendan Abbott " ], - "main": "dist/index.js", + "main": "index.js", "scripts": { "benchmark": "./scripts/benchmark", "build": "./scripts/build", From 612388ed392438c6359177ccd7680a950ed2b710 Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 16:43:32 +0700 Subject: [PATCH 09/22] update docs and build --- .gitignore | 2 +- docs/MockValidator.html | 150 ++++++------ docs/dereference.test.html | 132 +++++----- docs/docco.css | 411 +++++++++----------------------- docs/get.test.html | 134 ++++++----- docs/index.html | 197 +++++++-------- docs/isPointer.test.html | 120 +++++----- docs/mockResolve.html | 128 +++++----- docs/public/fonts/fleurons.eot | Bin 0 -> 35557 bytes docs/public/fonts/fleurons.ttf | Bin 0 -> 64772 bytes docs/public/fonts/fleurons.woff | Bin 0 -> 36284 bytes docs/public/images/gray.png | Bin 0 -> 56906 bytes docs/set.test.html | 122 +++++----- docs/typings.d.html | 99 ++++++++ scripts/build | 12 +- 15 files changed, 722 insertions(+), 785 deletions(-) create mode 100644 docs/public/fonts/fleurons.eot create mode 100644 docs/public/fonts/fleurons.ttf create mode 100644 docs/public/fonts/fleurons.woff create mode 100644 docs/public/images/gray.png create mode 100644 docs/typings.d.html diff --git a/.gitignore b/.gitignore index 2765334..117eca5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ node_modules dist/ *log .DS_Store -.coverage \ No newline at end of file +.coverage diff --git a/docs/MockValidator.html b/docs/MockValidator.html index 086db8e..c2c5497 100644 --- a/docs/MockValidator.html +++ b/docs/MockValidator.html @@ -4,99 +4,107 @@ MockValidator.ts - + - - - - -
      -
    • -
      -

      MockValidator.ts

      -
      -
    • + + + -
    • -
      - -
      - -
      - -
      - -
      import * as Ajv from 'ajv';
      +          
      import * as Ajv from 'ajv';
       
      -const address = require('./fixture/address+v1.schema.json');
      -const addressOverride = require('./fixture/address-override+v1.schema.json');
      -const circular = require('./fixture/circular.schema.json');
      -const conditional = require('./fixture/conditional.schema.json');
      -const credentials = require('./fixture/credentials+v1.schema.json');
      -const editPerson = require('./fixture/edit-person+v1.schema.json');
      -const person = require('./fixture/person+v1.schema.json');
      -const profile = require('./fixture/profile+v1.schema.json');
      +import * as address from './fixture/address+v1.schema.json';
      +import * as addressOverride from './fixture/address-override+v1.schema.json';
      +import * as circular from './fixture/circular.schema.json';
      +import * as conditional from './fixture/conditional.schema.json';
      +import * as credentials from './fixture/credentials+v1.schema.json';
      +import * as editPerson from './fixture/edit-person+v1.schema.json';
      +import * as person from './fixture/person+v1.schema.json';
      +import * as profile from './fixture/profile+v1.schema.json';
       
       /**
        * A validation helper for our test schema.
        */
      -export default class MockValidator {
      -  public schema: Array<Object> = [];
      +export class MockValidator {
      +  public schema: object[] = [];
         private ajv;
       
      -  constructor(config: Object = {}) {
      +  constructor(config: object = {}) {
           const schema = [
             address,
             addressOverride,
      @@ -110,31 +118,31 @@ 

      MockValidator.ts

      const cnf = { extendRefs: true, allErrors: true, - ...config + ...config, }; this.ajv = new Ajv(cnf); this.load(schema); } - load(schema: Array<Object>) { + load(schema: object[]) { schema.map((scm) => { - this.ajv.addSchema(scm) + this.ajv.addSchema(scm); this.schema.push(scm); }); return this; } - getSchema(id: string): Object | undefined { + getSchema(id: string): object | undefined { const lookup = this.ajv.getSchema(id); return !lookup ? undefined : lookup.schema; } -}
      - -
    • +} -
    + +
    h
    + diff --git a/docs/dereference.test.html b/docs/dereference.test.html index c1dc310..2910a4a 100644 --- a/docs/dereference.test.html +++ b/docs/dereference.test.html @@ -4,83 +4,91 @@ dereference.test.ts - + - - - - -
      -
    • -
      -

      dereference.test.ts

      -
      -
    • + + + -
    • -
      - -
      - -
      - -
      - -
      import { expect } from 'chai';
      +          
      import { expect } from 'chai';
       import { dereference } from './../index';
      -import resolve from './mockResolve';
      +import { mockResolve as resolve } from './mockResolve';
       
       describe('dereference schema utility function', () => {
         it('dereferences referenced schema correctly', () => {
      @@ -141,17 +149,17 @@ 

      dereference.test.ts

      properties: { foobar: { type: 'string', - minLength: 1 - } - } + minLength: 1, + }, + }, }); expect(ast.allOf[1]).deep.eq({ type: 'object', properties: { barfoo: { type: 'number', - } - } + }, + }, }); }); @@ -163,11 +171,11 @@

      dereference.test.ts

      expect(ast).to.be.an('object'); expect(ast.properties.circular.properties.circle.id).to.eq('http://footown.com/generic/circular#'); }); -});
      - -
    • +}); -
    + +
    h
    + diff --git a/docs/docco.css b/docs/docco.css index b60f6fa..54ba14e 100644 --- a/docs/docco.css +++ b/docs/docco.css @@ -30,96 +30,132 @@ font-style: normal; } -/*--------------------- Layout ----------------------------*/ -html { height: 100%; } -body { - font-family: "aller-light"; - font-size: 14px; - line-height: 18px; - color: #30404f; - margin: 0; padding: 0; - height:100%; +@font-face { + font-family: 'fleurons'; + src: url('public/fonts/fleurons.eot'); + src: url('public/fonts/fleurons.eot?#iefix') format('embedded-opentype'), + url('public/fonts/fleurons.woff') format('woff'), + url('public/fonts/fleurons.ttf') format('truetype'); + font-weight: normal; + font-style: normal; } -#container { min-height: 100%; } -a { - color: #000; -} +/*--------------------- Base Styles ----------------------------*/ -b, strong { - font-weight: normal; - font-family: "aller-bold"; +body { + font-family: "aller-light"; + background: url('public/images/gray.png') #fff; + background-size: 322px; + margin: 0; } -p { - margin: 15px 0 0px; +hr { + height: 1px; + background: #ddd; + border: 0; } - .annotation ul, .annotation ol { - margin: 25px 0; - } - .annotation ul li, .annotation ol li { - font-size: 14px; - line-height: 18px; - margin: 10px 0; - } h1, h2, h3, h4, h5, h6 { color: #112233; - line-height: 1em; font-weight: normal; font-family: "roboto-black"; text-transform: uppercase; - margin: 30px 0 15px 0; + line-height: 1em; + margin-top: 50px; } + h1 { + margin: 0; + text-align: center; + } + h2 { + font-size: 1.26em; + } + h1:after { + content: "8"; + display: block; + font-family: "fleurons"; + color: #999; + font-size: 80px; + padding: 10px 0 25px; + } -h1 { - margin-top: 40px; +a { + color: #000; } -h2 { - font-size: 1.26em; + +b, strong { + font-weight: normal; + font-family: "aller-bold"; } -hr { - border: 0; - background: 1px #ddd; - height: 1px; - margin: 20px 0; +blockquote { + border-left: 5px solid #ccc; + margin-left: 0; + padding: 1px 0 1px 1em; } + .page blockquote p { + font-family: Menlo, Consolas, Monaco, monospace; + font-size: 14px; line-height: 19px; + color: #999; + margin: 10px 0 0; + white-space: pre-wrap; + } pre, tt, code { - font-size: 12px; line-height: 16px; - font-family: Menlo, Monaco, Consolas, "Lucida Console", monospace; - margin: 0; padding: 0; -} - .annotation pre { - display: block; + font-family: Menlo, Consolas, Monaco, monospace; + font-size: 12px; + display: inline-block; + border: 1px solid #EAEAEA; + background: #f8f8f8; + color: #555; + padding: 0 5px; + line-height: 20px; +} + .page pre { margin: 0; - padding: 7px 10px; + width: 608px; + padding: 10px 15px; background: #fcfcfc; -moz-box-shadow: inset 0 0 10px rgba(0,0,0,0.1); -webkit-box-shadow: inset 0 0 10px rgba(0,0,0,0.1); box-shadow: inset 0 0 10px rgba(0,0,0,0.1); overflow-x: auto; } - .annotation pre code { + .page pre code { border: 0; padding: 0; background: transparent; } - -blockquote { - border-left: 5px solid #ccc; - margin: 0; - padding: 1px 0 1px 1em; +.fleur { + font-family: "fleurons"; + font-size: 100px; + text-align: center; + margin: 40px 0; + color: #ccc; } - .sections blockquote p { - font-family: Menlo, Consolas, Monaco, monospace; - font-size: 12px; line-height: 16px; - color: #999; - margin: 10px 0 0; - white-space: pre-wrap; + +/*--------------------- Layout ----------------------------*/ + +.container { + width: 760px; + margin: 0 auto; + background: #fff; + background: rgba(255,255,255, 0.4); + overflow: hidden; +} + .page { + width: 640px; + padding: 30px; + margin: 30px; + background: #fff; + font-size: 17px; + line-height: 26px; } + .page p { + color: #30404f; + margin: 26px 0; + } ul.sections { list-style: none; @@ -127,256 +163,39 @@ ul.sections { margin:0; } -/* - Force border-box so that % widths fit the parent - container without overlap because of margin/padding. - - More Info : http://www.quirksmode.org/css/box.html -*/ -ul.sections > li > div { - -moz-box-sizing: border-box; /* firefox */ - -ms-box-sizing: border-box; /* ie */ - -webkit-box-sizing: border-box; /* webkit */ - -khtml-box-sizing: border-box; /* konqueror */ - box-sizing: border-box; /* css3 */ -} - - -/*---------------------- Jump Page -----------------------------*/ -#jump_to, #jump_page { - margin: 0; - background: white; - -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777; - -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; - font: 16px Arial; - cursor: pointer; - text-align: right; - list-style: none; -} - -#jump_to a { - text-decoration: none; -} - -#jump_to a.large { - display: none; -} -#jump_to a.small { - font-size: 22px; - font-weight: bold; - color: #676767; -} - -#jump_to, #jump_wrapper { - position: fixed; - right: 0; top: 0; - padding: 10px 15px; - margin:0; -} - -#jump_wrapper { - display: none; - padding:0; -} - -#jump_to:hover #jump_wrapper { - display: block; -} - -#jump_page_wrapper{ - position: fixed; - right: 0; - top: 0; - bottom: 0; -} - -#jump_page { - padding: 5px 0 3px; - margin: 0 0 25px 25px; - max-height: 100%; - overflow: auto; -} - -#jump_page .source { - display: block; - padding: 15px; - text-decoration: none; - border-top: 1px solid #eee; -} - -#jump_page .source:hover { - background: #f5f5ff; -} - -#jump_page .source:first-child { +.page li p { + margin: 12px 0; } -/*---------------------- Low resolutions (> 320px) ---------------------*/ -@media only screen and (min-width: 320px) { - .pilwrap { display: none; } - - ul.sections > li > div { - display: block; - padding:5px 10px 0 10px; - } - - ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol { - padding-left: 30px; - } - - ul.sections > li > div.content { - overflow-x:auto; - -webkit-box-shadow: inset 0 0 5px #e5e5ee; - box-shadow: inset 0 0 5px #e5e5ee; - border: 1px solid #dedede; - margin:5px 10px 5px 10px; - padding-bottom: 5px; - } - - ul.sections > li > div.annotation pre { - margin: 7px 0 7px; - padding-left: 15px; - } - - ul.sections > li > div.annotation p tt, .annotation code { - background: #f8f8ff; - border: 1px solid #dedede; - font-size: 12px; - padding: 0 0.2em; - } +.toc { + max-height: 0; + overflow: hidden; + text-align: center; + font-size: 13px; + line-height: 20px; + -moz-transition: max-height 1s; + -webkit-transition: max-height 1s; + transition: max-height 1s; } - -/*---------------------- (> 481px) ---------------------*/ -@media only screen and (min-width: 481px) { - #container { - position: relative; - } - body { - background-color: #F5F5FF; - font-size: 15px; - line-height: 21px; - } - pre, tt, code { - line-height: 18px; - } - p, ul, ol { - margin: 0 0 15px; - } - - - #jump_to { - padding: 5px 10px; - } - #jump_wrapper { - padding: 0; - } - #jump_to, #jump_page { - font: 10px Arial; - text-transform: uppercase; - } - #jump_page .source { - padding: 5px 10px; - } - #jump_to a.large { - display: inline-block; - } - #jump_to a.small { - display: none; - } - - - - #background { - position: absolute; - top: 0; bottom: 0; - width: 350px; - background: #fff; - border-right: 1px solid #e5e5ee; - z-index: -1; + .header:hover .toc { + max-height: 500px; } - - ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol { - padding-left: 40px; + .toc h3 { + margin-top: 20px; } - - ul.sections > li { - white-space: nowrap; - } - - ul.sections > li > div { + .toc ol { + margin: 0 0 20px 0; display: inline-block; - } - - ul.sections > li > div.annotation { - max-width: 350px; - min-width: 350px; - min-height: 5px; - padding: 13px; - overflow-x: hidden; - white-space: normal; - vertical-align: top; text-align: left; + list-style-type: upper-roman; } - ul.sections > li > div.annotation pre { - margin: 15px 0 15px; - padding-left: 15px; - } - - ul.sections > li > div.content { - padding: 13px; - vertical-align: top; - border: none; - -webkit-box-shadow: none; - box-shadow: none; - } - - .pilwrap { - position: relative; - display: inline; - } - - .pilcrow { - font: 12px Arial; - text-decoration: none; - color: #454545; - position: absolute; - top: 3px; left: -20px; - padding: 1px 2px; - opacity: 0; - -webkit-transition: opacity 0.2s linear; - } - .for-h1 .pilcrow { - top: 47px; + .toc li { + font-family: 'roboto-black'; } - .for-h2 .pilcrow, .for-h3 .pilcrow, .for-h4 .pilcrow { - top: 35px; - } - - ul.sections > li > div.annotation:hover .pilcrow { - opacity: 1; - } -} - -/*---------------------- (> 1025px) ---------------------*/ -@media only screen and (min-width: 1025px) { - - body { - font-size: 16px; - line-height: 24px; - } + .toc li a { + font-family: 'aller-light'; + } - #background { - width: 525px; - } - ul.sections > li > div.annotation { - max-width: 525px; - min-width: 525px; - padding: 10px 25px 1px 50px; - } - ul.sections > li > div.content { - padding: 9px 15px 16px 25px; - } -} /*---------------------- Syntax Highlighting -----------------------------*/ diff --git a/docs/get.test.html b/docs/get.test.html index 4625a8e..9e7a9b3 100644 --- a/docs/get.test.html +++ b/docs/get.test.html @@ -4,99 +4,107 @@ get.test.ts - + - - - - -
      -
    • -
      -

      get.test.ts

      -
      -
    • + + + -
    • -
      - -
      - -
      - -
      - -
      import { expect } from 'chai';
      +          
      import { expect } from 'chai';
       import { get } from './../index';
       
       describe('@jdw/jst/get', () => {
         const fixture = {
      -    foo: {
      +    'foo': {
             bar: 20,
           },
           '/': {
             '~': 400,
      -      bar: {
      -        '~': 10
      -      }
      +      'bar': {
      +        '~': 10,
      +      },
           },
      -    arr: [{
      +    'arr': [{
             arr: [{
               foo: 100,
      -      }]
      -    }, 30]
      +      }],
      +    }, 30],
         };
       
         it('should resolve valid JSON pointers', () => {
      @@ -141,11 +149,11 @@ 

      get.test.ts

      expect(() => get(fixture, t)).to.throw(); }); }); -});
      - -
    • +}); -
    + +
    h
    + diff --git a/docs/index.html b/docs/index.html index b20cca2..85dd28c 100644 --- a/docs/index.html +++ b/docs/index.html @@ -4,167 +4,134 @@ index.ts - + - - - - -
      - -
    • -
      -

      index.ts

      -
      -
    • - + + + -
    • -
      - -
      - -
      -

      JST Type Definitions

      +

      JST Type Definitions

      -
      - -
    • + -
    • -
      - -
      - -
      -

      JST is a library for working with JSON Schema. It aims to be both simple and +

      JST is a library for working with JSON Schema. It aims to be both simple and performant. We begin by covering JST internal data-structures and interfaces.

      -
      - -
    • + -
    • -
      - -
      - -
      -

      Interfaces

      +

      Interfaces

      -
      - -
    • + -
    • -
      - -
      - -
      -

      A Resolver function takes a schema ID as its argument and looks it +

      A Resolver function takes a schema ID as its argument and looks it up, returning them schema as an Object if found or undefined if not.

      -
      - -
      export type Resolver = (schemaId: string) => Object | undefined;
      - -
    • +
      export type Resolver = (schemaId: string) => object | undefined;
      -
    • -
      - -
      - -
      -

      A Dereferencer function takes a schema and a resolver function + + +

      A Dereferencer function takes a schema and a resolver function and then dereferences schema in accordance with the IETF JSON Reference Draft v3 Specification.

      -
      - -
      export type Dereferencer =
      -  (schema: Object | Array<any>, resolve: Resolver) => Object | Array<any>;
      - -
    • +
      export type Dereferencer =
      +  (schema: object | any[], resolve: Resolver) => object | any[];
      -
    • -
      - -
      - -
      -

      A Getter function dereferences a JSON pointer in accordance with the + + +

      A Getter function dereferences a JSON pointer in accordance with the IETF RFC6901 specification returning its value if path is found in schema or throw an error otherwise.

      -
      - -
      export type GetPointer = (schema: Object, path: string) => any;
      -export type SetPointer = (schema: Object, path: string, value: any) => void;
      -
      -export type IsPointer = (input: any) => boolean;
      - -
    • -
    +
    export type GetPointer = (schema: object, path: string) => any;
    +export type SetPointer = (schema: object, path: string, value: any) => void;
    +export type IsPointer = (input: any) => boolean;
    + + +
    h
    + diff --git a/docs/isPointer.test.html b/docs/isPointer.test.html index 26bdf2d..60d4a46 100644 --- a/docs/isPointer.test.html +++ b/docs/isPointer.test.html @@ -4,81 +4,89 @@ isPointer.test.ts - + - - - - -
      -
    • -
      -

      isPointer.test.ts

      -
      -
    • + + + -
    • -
      - -
      - -
      - -
      - -
      import { expect } from 'chai';
      +          
      import { expect } from 'chai';
       import { isPointer } from './../index';
       
       describe('@jdw/jst/isPointer', () => {
      @@ -98,11 +106,11 @@ 

      isPointer.test.ts

      expect(isPointer(testCase)).to.eq(false); }); }); -});
      - -
    • +}); -
    + +
    h
    + diff --git a/docs/mockResolve.html b/docs/mockResolve.html index dc96126..a5449a2 100644 --- a/docs/mockResolve.html +++ b/docs/mockResolve.html @@ -4,81 +4,89 @@ mockResolve.ts - + - - - - -
      -
    • -
      -

      mockResolve.ts

      -
      -
    • + + + -
    • -
      - -
      - -
      - -
      - -
      import Validator from './MockValidator';
      +          
      import { MockValidator as Validator } from './MockValidator';
       
       const validator = new Validator();
       
      @@ -87,18 +95,20 @@ 

      mockResolve.ts

      * that schema as an object literal or throw an error if it can't find it. */ const mockResolve = (id) => { - const result = validator.getSchema(id); + const result = validator.getSchema(id); - if (!result) throw new Error(`could not resolve schema with id: ${id}`); + if (!result) { + throw new Error(`could not resolve schema with id: ${id}`); + } - return result; + return result; }; -export default mockResolve;
      - -
    • +export { mockResolve }; -
    + +
    h
    + diff --git a/docs/public/fonts/fleurons.eot b/docs/public/fonts/fleurons.eot new file mode 100644 index 0000000000000000000000000000000000000000..26189bb4016b70af8ab0ed01c4864270d22905fa GIT binary patch literal 35557 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⁡kozbdFM2)d(|jFd|=` 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 literal 0 HcmV?d00001 diff --git a/docs/public/fonts/fleurons.woff b/docs/public/fonts/fleurons.woff new file mode 100644 index 0000000000000000000000000000000000000000..10b7e1a1dc83779f20ad9987a5bb2220c9f4f5f3 GIT binary patch literal 36284 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 bvUJ*`Gw-aLpC3A3DHs3%00B`wc;5g3syVV0 literal 0 HcmV?d00001 diff --git a/docs/public/images/gray.png b/docs/public/images/gray.png new file mode 100644 index 0000000000000000000000000000000000000000..6eb6669147761f589d64bea10d3d2e6d87082615 GIT binary patch literal 56906 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 X$aFtydHQxA&FL`IHN8@%;}rQn^>STY literal 0 HcmV?d00001 diff --git a/docs/set.test.html b/docs/set.test.html index 87a623a..0280ac6 100644 --- a/docs/set.test.html +++ b/docs/set.test.html @@ -4,81 +4,89 @@ set.test.ts - + - - - - -
      -
    • -
      -

      set.test.ts

      -
      -
    • + + + -
    • -
      - -
      - -
      - -
      - -
      import { expect } from 'chai';
      +          
      import { expect } from 'chai';
       import { set } from './../index';
       
       describe('@jdw/jst/set', () => {
      @@ -86,7 +94,7 @@ 

      set.test.ts

      array: [1, 2, null], object: { foo: null, - array: [{ foo: null }, null] + array: [{ foo: null }, null], }, foo: null, }; @@ -115,11 +123,11 @@

      set.test.ts

      set(fixture, '#/object/array/0/foo', 'bar'); expect(fixture.object.array[0].foo).to.eq('bar'); }); -});
      - -
    • +}); -
    + +
    h
    + diff --git a/docs/typings.d.html b/docs/typings.d.html new file mode 100644 index 0000000..fca6b4e --- /dev/null +++ b/docs/typings.d.html @@ -0,0 +1,99 @@ + + + + + typings.d.ts + + + + + +
    +
    + +
    + +

    typings.d.ts

    + + + + + +
    + + + + + +
    declare module "*.json" {
    +  const value: any;
    +  export default value;
    +}
    + + +
    h
    +
    +
    + + diff --git a/scripts/build b/scripts/build index 1c63e17..a9cd7e9 100755 --- a/scripts/build +++ b/scripts/build @@ -11,10 +11,12 @@ sleep 1 printf "\n${CYAN}COMPILE${NC}\n" -yarn trash # remove build artifacts -yarn tsc --verbose # compile source code -cp -rv src/__tests__/fixture dist/__tests__ # copy test fixture -yarn docco --layout linear src/**/*.ts # compile documentation + +mkdir -p ./dist/__tests__/fixture # create directory structure +yarn trash # remove build artifacts +yarn tsc # compile source code +cp -rv ./src/__tests__/fixture ./dist/__tests__ # copy test fixture +yarn docco --layout linear src/**/*.ts # compile documentation ## copy copy distributable material printf "\n${CYAN}COPY ARTIFACTS${NC}\n" @@ -28,7 +30,7 @@ filemap=( "./README.md" "./package.json" ) for file in "${!filemap[@]}"; do - cp -rv "${filemap[$file]}" ./dist + cp -rv "${filemap[$file]}" ./dist/ done From bb67972b565d37d9cd75e123d03da0f50236ddfb Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 16:44:33 +0700 Subject: [PATCH 10/22] add back cname --- docs/CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/CNAME diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 0000000..df3e90d --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +www.jwije.com \ No newline at end of file From d531547dd36fa4c151e4c51315a3b6c1cc4abcf9 Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 16:46:31 +0700 Subject: [PATCH 11/22] update doc build --- docs/CNAME | 2 +- scripts/build | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/CNAME b/docs/CNAME index df3e90d..63c891a 100644 --- a/docs/CNAME +++ b/docs/CNAME @@ -1 +1 @@ -www.jwije.com \ No newline at end of file +www.jwije.com diff --git a/scripts/build b/scripts/build index a9cd7e9..d4f00ad 100755 --- a/scripts/build +++ b/scripts/build @@ -17,7 +17,8 @@ yarn trash # remove build artifacts yarn tsc # compile source code cp -rv ./src/__tests__/fixture ./dist/__tests__ # copy test fixture yarn docco --layout linear src/**/*.ts # compile documentation - +touch ./docs/CNAME \ + && echo www.jwije.com > ./docs/CNAME # add CNAME to docs output ## copy copy distributable material printf "\n${CYAN}COPY ARTIFACTS${NC}\n" From 87fd9c82a1f551bdca651871f75133e4e972805c Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 16:47:47 +0700 Subject: [PATCH 12/22] update git ignore --- .gitignore | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/.gitignore b/.gitignore index 117eca5..8a3b126 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,50 @@ +# -*- mode: gitignore; -*- +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +auto-save-list +tramp +.\#* + +# Org-mode +.org-id-locations +*_archive + +# flymake-mode +*_flymake.* + +# eshell files +/eshell/history +/eshell/lastdir + +# elpa packages +/elpa/ + +# reftex files +*.rel + +# AUCTeX auto folder +/auto/ + +# cask packages +.cask/ +dist/ + +# Flycheck +flycheck_*.el + +# server auth directory +/server/ + +# projectiles files +.projectile + +# directory configuration +.dir-locals.el + +# The rest... node_modules dist/ *log From 6234ab2c10eb147295d1e53a772d2a3739ac73e6 Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 17:31:47 +0700 Subject: [PATCH 13/22] update release step --- .travis.yml | 2 +- CHANGELOG.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 51d399c..565c99a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,7 @@ jobs: script: - yarn lint - yarn test + - yarn test:dist - stage: benchmark node_js: - "6" @@ -27,7 +28,6 @@ jobs: provider: script skip_cleanup: true script: - - yarn test:dist - yarn release on: tags: true diff --git a/CHANGELOG.md b/CHANGELOG.md index 97fc44d..e10914d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,12 +13,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Now exports an optimized `npm pack` with minimal file system foot-print. - Refactor `typings.d.ts` to `./types/index.ts`, we now compile and package our types. - Improved package scripts, now cleaner and more verbose. +- Simplify package scripts without losing any functionality. ### Remove - Object manipulation functionality has been dropped from JST (the `merge`, `contains`, `iterate` functions). We now use `lodash` instead. - The `Validator` class has been removed, roll this out yourselves. -- Simplify package scripts without losing any functionality. ### Add - A changelog! From e8480d25a2e3aa1e2652d59362b93abd4ec8c09d Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 17:32:40 +0700 Subject: [PATCH 14/22] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c2409e0..5260932 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jdw/jst", - "version": "2.0.0-beta.10", + "version": "2.0.0-beta.11", "engines": { "node": ">=4" }, From 8647f11a3c4b5ac24e41f658f07b356274ee31cc Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 17:42:39 +0700 Subject: [PATCH 15/22] update release step and bump version --- .travis.yml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 565c99a..c23bf9f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,6 +28,6 @@ jobs: provider: script skip_cleanup: true script: - - yarn release + - ./scripts/release on: tags: true diff --git a/package.json b/package.json index 5260932..7916729 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jdw/jst", - "version": "2.0.0-beta.11", + "version": "2.0.0-beta.12", "engines": { "node": ">=4" }, From a93b05fe9ce4f8b166044be77d3a1342398a0f40 Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Tue, 12 Sep 2017 18:19:18 +0700 Subject: [PATCH 16/22] update docs --- src/isPointer.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/isPointer.ts b/src/isPointer.ts index d719d1f..3f0b7ed 100644 --- a/src/isPointer.ts +++ b/src/isPointer.ts @@ -1,7 +1,25 @@ +// The `isPointer` function determines if its argument is a valid json pointer +// or not returning a boolean indicating the result of the operation. + +// ## Usage + +// ```javascript +// import { isPointer } from '@jdw/jst'; +// +// isPointer('#/foo'); // true +// isPointer({}) // false +// ``` + +// ## Dependencies + import { IsPointer } from './types'; -// A JSON `pointer` must begin with the symbols '#', '/' or be an empty string ''. +// ## Implementation + export const isPointer: IsPointer = (input) => { + // A JSON `pointer` must begin with the symbols '#', '/' or be an empty string + // ''. + if (typeof input !== 'string') { return false; } @@ -13,6 +31,6 @@ export const isPointer: IsPointer = (input) => { if (/^#|^\//.test(input)) { return true; } - + // If it is not one of these values then `input` is not a json pointer. return false; }; From 121f66ed1f908adaae2bd4e9c5d6c6bdfe1d2945 Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Wed, 13 Sep 2017 00:34:40 +0700 Subject: [PATCH 17/22] modify json def --- docs/MockValidator.html | 4 ++-- docs/dereference.test.html | 4 ++-- docs/get.test.html | 4 ++-- docs/index.html | 4 ++-- docs/isPointer.test.html | 4 ++-- docs/{typings.d.html => json.d.html} | 8 ++++---- docs/mockResolve.html | 4 ++-- docs/set.test.html | 4 ++-- src/types/{typings.d.ts => json.d.ts} | 0 9 files changed, 18 insertions(+), 18 deletions(-) rename docs/{typings.d.html => json.d.html} (94%) rename src/types/{typings.d.ts => json.d.ts} (100%) diff --git a/docs/MockValidator.html b/docs/MockValidator.html index c2c5497..91a2ee3 100644 --- a/docs/MockValidator.html +++ b/docs/MockValidator.html @@ -72,8 +72,8 @@

    Table of Contents

  • - - typings.d.ts + + json.d.ts
  • diff --git a/docs/dereference.test.html b/docs/dereference.test.html index 2910a4a..763d4a6 100644 --- a/docs/dereference.test.html +++ b/docs/dereference.test.html @@ -72,8 +72,8 @@

    Table of Contents

  • - - typings.d.ts + + json.d.ts
  • diff --git a/docs/get.test.html b/docs/get.test.html index 9e7a9b3..fe31b43 100644 --- a/docs/get.test.html +++ b/docs/get.test.html @@ -72,8 +72,8 @@

    Table of Contents

  • - - typings.d.ts + + json.d.ts
  • diff --git a/docs/index.html b/docs/index.html index 85dd28c..9ac9f67 100644 --- a/docs/index.html +++ b/docs/index.html @@ -72,8 +72,8 @@

    Table of Contents

  • - - typings.d.ts + + json.d.ts
  • diff --git a/docs/isPointer.test.html b/docs/isPointer.test.html index 60d4a46..5348c43 100644 --- a/docs/isPointer.test.html +++ b/docs/isPointer.test.html @@ -72,8 +72,8 @@

    Table of Contents

  • - - typings.d.ts + + json.d.ts
  • diff --git a/docs/typings.d.html b/docs/json.d.html similarity index 94% rename from docs/typings.d.html rename to docs/json.d.html index fca6b4e..5fec6f3 100644 --- a/docs/typings.d.html +++ b/docs/json.d.html @@ -2,7 +2,7 @@ - typings.d.ts + json.d.ts @@ -13,7 +13,7 @@
    -

    typings.d.ts

    +

    json.d.ts

    @@ -72,8 +72,8 @@

    Table of Contents

  • - - typings.d.ts + + json.d.ts
  • diff --git a/docs/mockResolve.html b/docs/mockResolve.html index a5449a2..de323cc 100644 --- a/docs/mockResolve.html +++ b/docs/mockResolve.html @@ -72,8 +72,8 @@

    Table of Contents

  • - - typings.d.ts + + json.d.ts
  • diff --git a/docs/set.test.html b/docs/set.test.html index 0280ac6..70a9322 100644 --- a/docs/set.test.html +++ b/docs/set.test.html @@ -72,8 +72,8 @@

    Table of Contents

  • - - typings.d.ts + + json.d.ts
  • diff --git a/src/types/typings.d.ts b/src/types/json.d.ts similarity index 100% rename from src/types/typings.d.ts rename to src/types/json.d.ts From edc5ca935a141df632fd2283d5f30efac9cd1ce7 Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Wed, 13 Sep 2017 00:54:01 +0700 Subject: [PATCH 18/22] cleanup doc output --- docs/MockValidator.html | 148 ------- docs/dereference.html | 369 ++++++++++++++++++ docs/dereference.test.html | 181 --------- docs/get.html | 198 ++++++++++ docs/get.test.html | 159 -------- docs/index.html | 177 ++++++--- docs/isPointer.html | 132 +++++++ docs/isPointer.test.html | 116 ------ docs/json.d.html | 99 ----- docs/mockResolve.html | 114 ------ docs/set.html | 165 ++++++++ docs/set.test.html | 133 ------- scripts/benchmark | 2 +- scripts/build | 2 +- .../__benchmarks__}/benchmark.ts | 0 .../dereference-address-schema.benchmark.ts | 4 +- .../dereference-petstore-swagger.benchmark.ts | 10 +- .../dereference-temando-swagger.benchmark.ts | 10 +- .../__benchmarks__}/index.benchmark.ts | 0 .../traversal-shallow-benchmark.ts | 2 +- src/__tests__/MockValidator.ts | 53 --- src/__tests__/dereference.test.ts | 2 +- src/__tests__/lib/Validator.ts | 53 +++ src/__tests__/lib/index.ts | 7 + src/__tests__/lib/resolve.ts | 19 + src/__tests__/mockResolve.ts | 19 - 26 files changed, 1083 insertions(+), 1091 deletions(-) delete mode 100644 docs/MockValidator.html create mode 100644 docs/dereference.html delete mode 100644 docs/dereference.test.html create mode 100644 docs/get.html delete mode 100644 docs/get.test.html create mode 100644 docs/isPointer.html delete mode 100644 docs/isPointer.test.html delete mode 100644 docs/json.d.html delete mode 100644 docs/mockResolve.html create mode 100644 docs/set.html delete mode 100644 docs/set.test.html rename {benchmarks => src/__benchmarks__}/benchmark.ts (100%) rename {benchmarks => src/__benchmarks__}/dereference-address-schema.benchmark.ts (86%) rename {benchmarks => src/__benchmarks__}/dereference-petstore-swagger.benchmark.ts (71%) rename {benchmarks => src/__benchmarks__}/dereference-temando-swagger.benchmark.ts (70%) rename {benchmarks => src/__benchmarks__}/index.benchmark.ts (100%) rename {benchmarks => src/__benchmarks__}/traversal-shallow-benchmark.ts (93%) delete mode 100644 src/__tests__/MockValidator.ts create mode 100644 src/__tests__/lib/Validator.ts create mode 100644 src/__tests__/lib/index.ts create mode 100644 src/__tests__/lib/resolve.ts delete mode 100644 src/__tests__/mockResolve.ts diff --git a/docs/MockValidator.html b/docs/MockValidator.html deleted file mode 100644 index 91a2ee3..0000000 --- a/docs/MockValidator.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - MockValidator.ts - - - - - -
    -
    - -
    - -

    MockValidator.ts

    - - - - - -
    - - - - - -
    import * as Ajv from 'ajv';
    -
    -import * as address from './fixture/address+v1.schema.json';
    -import * as addressOverride from './fixture/address-override+v1.schema.json';
    -import * as circular from './fixture/circular.schema.json';
    -import * as conditional from './fixture/conditional.schema.json';
    -import * as credentials from './fixture/credentials+v1.schema.json';
    -import * as editPerson from './fixture/edit-person+v1.schema.json';
    -import * as person from './fixture/person+v1.schema.json';
    -import * as profile from './fixture/profile+v1.schema.json';
    -
    -/**
    - * A validation helper for our test schema.
    - */
    -export class MockValidator {
    -  public schema: object[] = [];
    -  private ajv;
    -
    -  constructor(config: object = {}) {
    -    const schema = [
    -      address,
    -      addressOverride,
    -      circular,
    -      conditional,
    -      credentials,
    -      editPerson,
    -      person,
    -      profile,
    -    ];
    -    const cnf = {
    -      extendRefs: true,
    -      allErrors: true,
    -      ...config,
    -    };
    -    this.ajv = new Ajv(cnf);
    -    this.load(schema);
    -  }
    -
    -  load(schema: object[]) {
    -    schema.map((scm) => {
    -      this.ajv.addSchema(scm);
    -      this.schema.push(scm);
    -    });
    -
    -    return this;
    -  }
    -
    -  getSchema(id: string): object | undefined {
    -    const lookup = this.ajv.getSchema(id);
    -
    -    return !lookup ? undefined : lookup.schema;
    -  }
    -}
    - - -
    h
    -
    -
    - - diff --git a/docs/dereference.html b/docs/dereference.html new file mode 100644 index 0000000..7cf98cd --- /dev/null +++ b/docs/dereference.html @@ -0,0 +1,369 @@ + + + + + dereference.ts + + + + + +
    +
    + +
    + +

    dereference.ts

    + + + +
    +

    Table of Contents

    +
      + + +
    1. + + dereference.ts + +
    2. + + +
    3. + + get.ts + +
    4. + + +
    5. + + index.ts + +
    6. + + +
    7. + + isPointer.ts + +
    8. + + +
    9. + + set.ts + +
    10. + +
    +
    + +
    + + + +

    The dereference function dereferences schema, that is it resolves all +$ref declarations in a schema and inlines those references into one logical +schema in accordance with the IETF json reference +draft-03 +specification.

    +

    Usage

    +
    import { dereference } from '@jdw/jst';
    +
    +const schema = {
    +        foo: { $ref: '#/definitions/foo' },
    +        definitions: { foo: 123 }
    +      };
    +
    +dereference(schema); // { foo: 123, definitions: { foo: 123 }};
    +
    +

    Arguments

    +
      +
    • subject: Object|number|string|boolean|null A json value.
    • +
    • resolve:Resolver` A function to resolve a schema by its id.
    • +
    +

    Returns

    +
      +
    • any: The dereferenced object.
    • +
    +

    Throws

    +
      +
    • {Error}: If something went wrong when dereferencing the schema.
    • +
    +

    Dependencies

    + + +
    +import * as forIn from 'lodash.forin';
    +import * as isObject from 'lodash.isobject';
    +import * as merge from 'lodash.merge';
    +import { get, isPointer, set } from './index';
    +import { Dereferencer, Resolver } from './types';
    + + + +

    Implementation

    + + + + +

    Here begins the implementation of the dereference function. This being +version 2 there are some specific goals being targeted.

    +

    Design Goals:

    +
      +
    • JSON in JSON out. Any valid json value as defined by the spec will do.
    • +
    • More robust json pointer support, including circular references. Correctness +is paramount.
    • +
    • Caching of schema lookups.
    • +
    • Cleaner and more modular design of codebase. It is ok to sacrifice +performance for this.
    • +
    + + +
    +const isHttp: RegExp = /^http/;
    +const isRemoteRef = (ref: string): boolean => isHttp.test(ref);
    +
    +export const dereference: Dereferencer = (root, resolver) => {
    + + + +

    JSON In, JSON Out

    +

    The json specification section 2.1 +states:

    + + + + +
    +

    A JSON value MUST be an object, array, number, or string, or one of + the following three literal names: false null true

    +
    + + + + +

    Any other value should result in an TypeError being thrown.

    + + +
    +  if (!(typeof root).match(/object|string|number|boolean/)) {
    +    throw new TypeError(
    +      `@jst/dereference: argument not a valid json value: ${typeof root} | ${root}`);
    +  }
    +  const circularRefs = {};
    +
    +  const walk = (schema: any, resolve: Resolver = null, path: string = '#'): any => {
    + + + +

    If schema is an array we dereference each schema and then merge them from +right-to-left.

    + + +
        if (Array.isArray(schema)) {
    + + + +

    first validate our arguments assumption!

    + + +
          schema.forEach((s) => {
    +        if (typeof s !== 'object' && !Array.isArray(s)) {
    +          throw new TypeError(`expect typeof object got: ${typeof s}`);
    +        }
    +      });
    + + + +

    then dereference each schema in the array before eventually merging them +from right to left using a reducer function.

    + + +
          return schema
    +        .map((scm, index) => walk(scm, resolve, `${path}/${index}`))
    +        .reduce((acc, scm) => merge(acc, scm), {});
    + + + +

    If schema is not an array of json objects we expect a singlular json schema +be provided

    + + +
        } else if (isObject(schema)) {
    +      const schemaId = schema.id || undefined;
    +      let isCircular = false;
    + + + +

    traverse is an internal recursive function that we bind to this lexical +scope in order to easily resolve to schema definitions whilst traversing +an objects nested properties. This is primarily for efficiency concerns.

    + + +
          const traverse = (node, nodePath: string = '#') => {
    +        let resolution = {};
    +
    +        if (typeof node !== 'object' || node === null) {
    +          return node;
    +        }
    + + + +

    if only one argument is provided and it is an array we must recursively +dereference it’s individual values

    + + +
            if (Array.isArray(node)) {
    +          return node.map((v, index) => traverse(v, `${nodePath}/${index}`));
    +        }
    + + + +

    if we are here, the first argument is not an array or value and we expect +it to be a json schema.

    + + +
            forIn(node, (value, key) => {
    + + + +

    Skip the following properties

    + + +
              if (key === 'definitions') {
    +            return;
    +          }
    + + + +

    If value is not an array, object, or JSON schema reference we can +dereference it immediately. ‘typeof array’ equals ‘object’ in JS.

    + + +
              if (typeof value !== 'object' && key !== '$ref') {
    +            resolution[key] = value;
    + + + +

    If we have a schema reference we must fetch it, dereference it, then merge +it into the base schema object.

    + + +
              } else if (key === '$ref') {
    + + + +

    We have two types of references - definitions which are defined +within the current schema and external schema references which we +have to query AJV for as such we must fetch the schema for the +reference appropriately.

    + + +
                let reference = null;
    + + + +

    Here we resolve a JSON reference (uri). In order to do so +correctly we must make a distinction between external +references and internal (circular) references.

    + + +
                if (isRemoteRef(value)) {
    +              if (!resolve) {
    +                throw new TypeError(
    +                  'argument: resolver is required to dereference a json uri.');
    +              }
    +
    +              if (value !== schemaId) {
    +                reference = resolve(value);
    +
    +                if (!reference) {
    +                  throw new Error(`unable to resolve URI reference: ${value}`);
    +                }
    +
    +                resolution = merge(
    +                  resolution,
    +                  walk(reference, resolve, `${nodePath}/${key}`),
    +                  true,
    +                );
    +              } else {
    +                reference = resolution;
    +                circularRefs[nodePath] = schema;
    +                isCircular = true;
    +              }
    + + + +

    de-reference a json pointer

    + + +
                } else if (isPointer(value)) {
    +              reference = get(schema, value);
    +              resolution = merge(
    +                resolution,
    +                traverse(reference, `${nodePath}/${key}`),
    +                true,
    +              );
    +            } else {
    +              throw new Error(
    +                `could not dereference value as a json pointer or uri: ${value}`);
    +            }
    +
    +            if (!reference) {
    +              throw new ReferenceError(`could not find a reference to ${value}`);
    +            }
    + + + +

    Otherwise the value is an array or object and we need to traverse it +and dereference it’s properties.

    + + +
              } else {
    +            resolution[key] = traverse(value, `${nodePath}/${key}`);
    +          }
    +        });
    +
    +        return resolution;
    +      };
    +
    +      return traverse(schema, path);
    + + + +

    if any other combination of arguments is provided we throw

    + + +
        } else {
    +      throw new TypeError(`expected first parameter to be object or array: ${schema}`);
    +    }
    +  };
    +
    +  const result = walk(root, resolver);
    + + + +

    We can now handle any circular references in the schema by iterating our +store of circular references encountered whilst processing the schema. We will +only dereference a circular schema once, I could write a monologue about +this topic but let it suffice to say JST does not make the decision what is +the correct amount of circular depth to dereference, we only do so +once. Users can simply call dereference again with the resultant schema +to get another level of nesting.

    + + +
      forIn(circularRefs, (value, key) => {
    +    set(result, key.split('$ref/').join(''), value);
    +  });
    +
    +  return result;
    +};
    + + +
    h
    +
    +
    + + diff --git a/docs/dereference.test.html b/docs/dereference.test.html deleted file mode 100644 index 763d4a6..0000000 --- a/docs/dereference.test.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - dereference.test.ts - - - - - -
    -
    - -
    - -

    dereference.test.ts

    - - - - - -
    - - - - - -
    import { expect } from 'chai';
    -import { dereference } from './../index';
    -import { mockResolve as resolve } from './mockResolve';
    -
    -describe('dereference schema utility function', () => {
    -  it('dereferences referenced schema correctly', () => {
    -    const ast: any = dereference(resolve('http://footown.com/generic/address#'), resolve);
    -    expect(ast.properties).to.have.property('addressLines');
    -    expect(ast.properties).to.have.property('contact');
    -    expect(ast.properties.contact).to.have.property('properties');
    -    expect(ast.properties.contact.properties).to.have.property('firstname');
    -    expect(ast.properties.contact.properties).to.have.property('lastname');
    -    expect(ast.properties.contact.properties).to.have.property('title');
    -  });
    -
    -  it('dereferences schema correctly with multiple arguments', () => {
    -    const schema = [
    -      resolve('http://footown.com/generic/address#'),
    -      resolve('http://footown.com/generic/address-override#'),
    -    ];
    -    const ast: any = dereference(schema, resolve);
    -
    -    expect(ast.properties).to.have.property('addressLines');
    -    expect(ast.properties).to.have.property('country');
    -    expect(ast.properties.country).to.have.property('enum');
    -    expect(ast.properties.country.enum).to.deep.eq(['AU', 'GB', 'VN', 'DE', 'CH']);
    -    expect(ast.properties).to.have.property('contact');
    -    expect(ast.properties.contact).to.have.property('properties');
    -    expect(ast.properties.contact.properties).to.have.property('firstname');
    -    expect(ast.properties.contact.properties).to.have.property('lastname');
    -    expect(ast.properties.contact.properties).to.have.property('title');
    -  });
    -
    -  it('can dereference circular schema references', () => {
    -    const schema = resolve('http://footown.com/generic/edit-person+v1#');
    -    const ast: any = dereference(schema, resolve);
    -
    -    expect(ast).to.have.property('allOf');
    -    expect(ast.allOf.length).to.eq(1);
    -    expect(ast.allOf[0]).to.have.property('properties');
    -  });
    -
    -  it('dereferences null values correctly', () => {
    -    const schema = resolve('http://footown.com/generic/edit-person+v1#');
    -    const ast: any = dereference(schema, resolve);
    -    expect(ast.foo).to.eq(null);
    -  });
    -
    -  it('dereferences circular references correctly', () => {
    -    const schema = resolve('http://footown.com/generic/circular#');
    -    const ast: any = dereference(schema, resolve);
    -    expect(ast).to.be.an('object');
    -  });
    -
    -  it('dereferences conditional allOf references correctly', () => {
    -    const schema = resolve('http://footown.com/generic/conditional#');
    -    const ast: any = dereference(schema, resolve);
    -    expect(ast).to.be.an('object');
    -    expect(ast.allOf[0]).deep.eq({
    -      type: 'object',
    -      properties: {
    -        foobar: {
    -          type: 'string',
    -          minLength: 1,
    -        },
    -      },
    -    });
    -    expect(ast.allOf[1]).deep.eq({
    -      type: 'object',
    -      properties: {
    -        barfoo: {
    -          type: 'number',
    -        },
    -      },
    -    });
    -  });
    -
    -  it('can dereference referenced circular schema correctly', () => {
    -    const schema = require('./fixture/circular-referenced.schema.json');
    -
    -    const ast: any = dereference(schema, resolve);
    -
    -    expect(ast).to.be.an('object');
    -    expect(ast.properties.circular.properties.circle.id).to.eq('http://footown.com/generic/circular#');
    -  });
    -});
    - - -
    h
    -
    -
    - - diff --git a/docs/get.html b/docs/get.html new file mode 100644 index 0000000..cdf1418 --- /dev/null +++ b/docs/get.html @@ -0,0 +1,198 @@ + + + + + get.ts + + + + + +
    +
    + +
    + +

    get.ts

    + + + +
    +

    Table of Contents

    +
      + + +
    1. + + dereference.ts + +
    2. + + +
    3. + + get.ts + +
    4. + + +
    5. + + index.ts + +
    6. + + +
    7. + + isPointer.ts + +
    8. + + +
    9. + + set.ts + +
    10. + +
    +
    + +
    + + + +

    The get function dereferences json +pointers according to the IETF RFC6901 +specification. It takes a schema and a json pointer as its arguments and +then returns the value in schema described by pointer throwing an error +if the path described by the pointer was not found in the schema.

    +

    Usage:

    +
    import { get } from '@jdw/jst';
    +
    +const schema = { definitions: { foo: 123 }};
    +get(schema, '#/definitions/foo'); // resolves value 123
    +

    Arguments

    +
      +
    • schema {Object}: The object to query.
    • +
    • pointer {string}: The JSON pointer path of the property to get.
    • +
    +

    Returns

    +
      +
    • {any}: The resolved pointer value.
    • +
    +

    Throws

    +
      +
    • {Error}: If pointer cannot be resolved in schema.
    • +
    +

    Dependencies

    + + +
    +import * as has from 'lodash.has';
    +import { isPointer } from './isPointer';
    +import { GetPointer } from './types';
    + + + +

    Implementation

    + + + + +

    The get function implements the Jst.Getter signature as described in +typings.d.ts.

    + + +
    export const get: GetPointer = (schema, pointer) => {
    + + + +

    A JSON pointer must begin with the symbols ‘#’, ‘/‘ or be an empty +string ‘’. So as a first step, we check that this assumption is true and +bail if not.

    + + +
      if (!isPointer(pointer)) {
    +    throw new Error(`invalid JSON pointer specified: '${pointer}'`);
    +  }
    + + + +

    If this check passes we have a valid pointer. In order to dereference +its value, we will split the pointer into its orthogonal pieces and then +iterate schema checking from left to right that each piece of pointer +references a valid path in schema.

    + + +
      const fragments = pointer.split('/');
    +  return fragments.reduce((object, fragment) => {
    + + + +

    If fragment points to the root path of object we can just return +the object itself.

    + + +
        if (fragment === '#' || fragment === '/' || fragment === '') {
    +      return object;
    +    }
    + + + +

    Here we decode fragment according to the JSON pointer +specification, replacing the character codes ‘~1’ and ‘~0’ with the +symbols ‘/‘ and ‘~’ respectively.

    + + +
        const token = fragment.replace('~1', '/').replace('~0', '~');
    +    let reference = null;
    + + + +

    If the ‘object’ is array assume that token indicates an index in +this array and try to resolve it appropriately.

    + + +
        if (Array.isArray(object)) {
    +      const index = parseInt(token, 10);
    +
    +      if (!object.indexOf(index)) {
    +        throw new Error(
    +          `could not dereference JSON pointer: ${pointer}. Array does not have`
    +          + ` index: ${index}::${JSON.stringify(object)}`);
    +      }
    +
    +      reference = object[index];
    + + + +

    Otherwise if object is not an Array we expect object to be of +type Object and that token references a valid path in object.

    + + +
        } else {
    +      if (!has(object, token)) {
    +        throw new Error(
    +          `could not dereference pointer '${pointer}'. The fragment ${token}`
    +          + ` is not a valid property of object: ${JSON.stringify(object, null, 2)}`);
    +      }
    +      reference = object[token];
    +    }
    + + + +

    Now return reference

    + + +
        return reference;
    +  }, schema);
    +};
    + + +
    h
    +
    +
    + + diff --git a/docs/get.test.html b/docs/get.test.html deleted file mode 100644 index fe31b43..0000000 --- a/docs/get.test.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - get.test.ts - - - - - -
    -
    - -
    - -

    get.test.ts

    - - - - - -
    - - - - - -
    import { expect } from 'chai';
    -import { get } from './../index';
    -
    -describe('@jdw/jst/get', () => {
    -  const fixture = {
    -    'foo': {
    -      bar: 20,
    -    },
    -    '/': {
    -      '~': 400,
    -      'bar': {
    -        '~': 10,
    -      },
    -    },
    -    'arr': [{
    -      arr: [{
    -        foo: 100,
    -      }],
    -    }, 30],
    -  };
    -
    -  it('should resolve valid JSON pointers', () => {
    -    const cases = [
    -      ['/foo/bar', 20],
    -      ['#/foo/bar', 20],
    -      ['', fixture],
    -    ];
    -    cases.forEach((t) => {
    -      expect(get(fixture, t[0].toString())).to.eq(t[1]);
    -    });
    -  });
    -
    -  it('can resolve the encoded values of the / and ~ symbols correctly', () => {
    -    const cases = [
    -      ['#/~1/~0', 400],
    -      ['#/~1/bar/~0', 10],
    -    ];
    -    cases.forEach((t) => {
    -      expect(get(fixture, t[0].toString())).to.eq(t[1]);
    -    });
    -  });
    -
    -  it('can resolve JSON pointers that reference array indexes correctly', () => {
    -    const cases = [
    -      ['#/arr/0/arr/0/foo', 100],
    -      ['#/arr/1', 30],
    -    ];
    -    cases.forEach((t) => {
    -      expect(get(fixture, t[0].toString())).to.eq(t[1]);
    -    });
    -  });
    -
    -  it('should throw an error up-front when providing an invalid json pointer', () => {
    -    const cases = [
    -      'abcd',
    -      '~#/foo/bar',
    -      'foo/bar',
    -    ];
    -
    -    cases.forEach((t) => {
    -      expect(() => get(fixture, t)).to.throw();
    -    });
    -  });
    -});
    - - -
    h
    -
    -
    - - diff --git a/docs/index.html b/docs/index.html index 9ac9f67..ffdc761 100644 --- a/docs/index.html +++ b/docs/index.html @@ -2,7 +2,7 @@ - index.ts + JST - JSON Schema Toolkit [![Build Status](https://travis-ci.org/jdwije/jst.svg?branch=master)](https://travis-ci.org/jdwije/jst) @@ -13,7 +13,10 @@
    -

    index.ts

    + +

    JST - JSON Schema Toolkit Build Status

    + + @@ -23,57 +26,36 @@

    Table of Contents

  • - - MockValidator.ts - -
  • - - -
  • - - dereference.test.ts - -
  • - - -
  • - - get.test.ts - -
  • - - -
  • - - isPointer.test.ts + + dereference.ts
  • - - mockResolve.ts + + get.ts
  • - - set.test.ts + + index.ts
  • - - index.ts + + isPointer.ts
  • - - json.d.ts + + set.ts
  • @@ -84,50 +66,139 @@

    Table of Contents

    -

    JST Type Definitions

    + + + + +
    +

    A library for working with json schema.

    +
    + + + + +

    JST is a utility library for working with json schema. It provides functions +for json pointers and json references.

    + + + + +

    Interface

    + + + + +

    dereference(schema: Object, resolve: (id) => Object)

    -

    JST is a library for working with JSON Schema. It aims to be both simple and -performant. We begin by covering JST internal data-structures and interfaces.

    +

    A generic dereferencer function to resolve all $ref tags in a schema and +inline the results.

    -

    Interfaces

    + +
    +import { dereference } from './dereference';
    + -

    A Resolver function takes a schema ID as its argument and looks it -up, returning them schema as an Object if found or undefined if not.

    +

    get(object: Object, pointer: String)

    -
    export type Resolver = (schemaId: string) => object | undefined;
    + + +

    Retrieve a value from an object using a json pointer.

    + -

    A Dereferencer function takes a schema and a resolver function -and then dereferences schema in accordance with the IETF JSON -Reference Draft v3 -Specification.

    + -
    export type Dereferencer =
    -  (schema: object | any[], resolve: Resolver) => object | any[];
    +
    +import { get } from './get';
    -

    A Getter function dereferences a JSON pointer in accordance with the -IETF RFC6901 specification -returning its value if path is found in schema or throw an error -otherwise.

    +

    set(object: Object, pointer: String, value: any)

    + + + + +

    Set a value on an object using a json pointer.

    + + + + + + + +
    +import { set } from './set';
    + + + +

    isPointer(string: string)

    + + + + +

    Checks of a string is a valid json pointer.

    + + + + + + + +
    +import { isPointer } from './isPointer';
    + + + +

    Usage

    + + + + +

    Install JST via npm.

    +
    npm i --save @jdw/jst
    +
    + + + + +

    Then use it.

    + + + + +
    import { get, set, isPointer, dereference } from '@jdw/jst'; // ES6
    +
    +var jst = require('@jdw/jst');                               // ES2015
    +
    -
    export type GetPointer = (schema: object, path: string) => any;
    -export type SetPointer = (schema: object, path: string, value: any) => void;
    -export type IsPointer = (input: any) => boolean;
    +
    +export {
    +  dereference,
    +  get,
    +  isPointer,
    +  set,
    +};
    h
    diff --git a/docs/isPointer.html b/docs/isPointer.html new file mode 100644 index 0000000..2836e0b --- /dev/null +++ b/docs/isPointer.html @@ -0,0 +1,132 @@ + + + + + isPointer.ts + + + + + +
    +
    + +
    + +

    isPointer.ts

    + + + +
    +

    Table of Contents

    +
      + + +
    1. + + dereference.ts + +
    2. + + +
    3. + + get.ts + +
    4. + + +
    5. + + index.ts + +
    6. + + +
    7. + + isPointer.ts + +
    8. + + +
    9. + + set.ts + +
    10. + +
    +
    + +
    + + + +

    The isPointer function determines if its argument is a valid json pointer +or not returning a boolean indicating the result of the operation.

    + + + + +

    Usage

    + + + + +
    import { isPointer } from '@jdw/jst';
    +
    +isPointer('#/foo');   // true
    +isPointer({})         // false
    +
    + + + + +

    Dependencies

    + + +
    +import { IsPointer } from './types';
    + + + +

    Implementation

    + + +
    +export const isPointer: IsPointer = (input) => {
    + + + +

    A JSON pointer must begin with the symbols ‘#’, ‘/‘ or be an empty string +‘’.

    + + +
    +  if (typeof input !== 'string') {
    +    return false;
    +  }
    +
    +  if (input === '') {
    +    return true;
    +  }
    +
    +  if (/^#|^\//.test(input)) {
    +    return true;
    +  }
    + + + +

    If it is not one of these values then input is not a json pointer.

    + + +
      return false;
    +};
    + + +
    h
    +
    +
    + + diff --git a/docs/isPointer.test.html b/docs/isPointer.test.html deleted file mode 100644 index 5348c43..0000000 --- a/docs/isPointer.test.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - isPointer.test.ts - - - - - -
    -
    - -
    - -

    isPointer.test.ts

    - - - - - -
    - - - - - -
    import { expect } from 'chai';
    -import { isPointer } from './../index';
    -
    -describe('@jdw/jst/isPointer', () => {
    -  const cases = {
    -    success: ['#', '/', '', '#/foo/bar/baz', '/bar/baz'],
    -    failure: ['yolo', 123, {}, false, true, null, undefined], //  '#adasd']
    -  };
    -
    -  cases.success.forEach((testCase) => {
    -    it(`can recognize ${JSON.stringify(testCase)} as a pointer`, () => {
    -      expect(isPointer(testCase)).to.eq(true);
    -    });
    -  });
    -
    -  cases.failure.forEach((testCase) => {
    -    it(`can recognize ${JSON.stringify(testCase)} is NOT a pointer`, () => {
    -      expect(isPointer(testCase)).to.eq(false);
    -    });
    -  });
    -});
    - - -
    h
    -
    -
    - - diff --git a/docs/json.d.html b/docs/json.d.html deleted file mode 100644 index 5fec6f3..0000000 --- a/docs/json.d.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - json.d.ts - - - - - -
    -
    - -
    - -

    json.d.ts

    - - - - - -
    - - - - - -
    declare module "*.json" {
    -  const value: any;
    -  export default value;
    -}
    - - -
    h
    -
    -
    - - diff --git a/docs/mockResolve.html b/docs/mockResolve.html deleted file mode 100644 index de323cc..0000000 --- a/docs/mockResolve.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - mockResolve.ts - - - - - -
    -
    - -
    - -

    mockResolve.ts

    - - - - - -
    - - - - - -
    import { MockValidator as Validator } from './MockValidator';
    -
    -const validator = new Validator();
    -
    -/**
    - * A resolve function must simply take a schema id as an argument and return
    - * that schema as an object literal or throw an error if it can't find it.
    - */
    -const mockResolve = (id) => {
    -  const result = validator.getSchema(id);
    -
    -  if (!result) {
    -    throw new Error(`could not resolve schema with id: ${id}`);
    -  }
    -
    -  return result;
    -};
    -
    -export { mockResolve };
    - - -
    h
    -
    -
    - - diff --git a/docs/set.html b/docs/set.html new file mode 100644 index 0000000..d420ca2 --- /dev/null +++ b/docs/set.html @@ -0,0 +1,165 @@ + + + + + set.ts + + + + + +
    +
    + +
    + +

    set.ts

    + + + +
    +

    Table of Contents

    +
      + + +
    1. + + dereference.ts + +
    2. + + +
    3. + + get.ts + +
    4. + + +
    5. + + index.ts + +
    6. + + +
    7. + + isPointer.ts + +
    8. + + +
    9. + + set.ts + +
    10. + +
    +
    + +
    + + + + + +
    import * as has from 'lodash.has';
    +import { isPointer } from './isPointer';
    +import { SetPointer } from './types';
    +
    +export const set: SetPointer = (obj, pointer, value) => {
    + + + +

    A JSON pointer must begin with the symbols ‘#’, ‘/‘ or be an empty +string ‘’. So as a first step, we check that this assumption is true and +bail if not.

    + + +
      if (!isPointer(pointer)) {
    +    throw new Error(`invalid JSON pointer specified: '${pointer}'`);
    +  }
    + + + +

    If this check passes we have a valid pointer. In order to dereference +its value, we will split the pointer into its orthogonal pieces and then +iterate schema checking from left to right that each piece of pointer +references a valid path in schema.

    + + +
      const fragments = pointer.split('/');
    +  let ref = obj;
    +  return fragments.forEach((fragment, index) => {
    + + + +

    If fragment points to the root path of object we can just return +the object itself.

    + + +
        if (fragment === '#' || fragment === '/' || fragment === '') {
    +      return;
    +    }
    + + + +

    Here we decode fragment according to the JSON pointer +specification, replacing the character codes ‘~1’ and ‘~0’ with the +symbols ‘/‘ and ‘~’ respectively.

    + + +
        const token = fragment.replace('~1', '/').replace('~0', '~');
    + + + +

    If the ‘object’ is array assume that token indicates an index in +this array and try to resolve it appropriately.

    + + +
        if (Array.isArray(ref)) {
    +      const i = parseInt(token, 10);
    +
    +      if (!ref.indexOf(i)) {
    +        throw new Error(
    +          `could not dereference JSON pointer: ${pointer}. Array does not have`
    +          + ` index: ${index}::${JSON.stringify(obj)}`);
    +      }
    +
    +      if ((index + 1) === fragments.length) {
    +        ref[i] = value;
    +        return;
    +      }
    +
    +      ref = ref[i];
    + + + +

    Otherwise if object is not an Array we expect object to be of +type Object and that token references a valid path in object.

    + + +
        } else {
    +      if (!has(ref, token)) {
    +        throw new Error(
    +          `could not dereference pointer '${pointer}'. The fragment ${token}`
    +          + ` is not a valid property of object: ${JSON.stringify(obj, null, 2)}`);
    +      }
    +
    +      if ((index + 1) === fragments.length) {
    +        ref[token] = value;
    +        return;
    +      }
    +      ref = ref[token];
    +    }
    +  });
    +};
    + + +
    h
    +
    +
    + + diff --git a/docs/set.test.html b/docs/set.test.html deleted file mode 100644 index 70a9322..0000000 --- a/docs/set.test.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - set.test.ts - - - - - -
    -
    - -
    - -

    set.test.ts

    - - - - - -
    - - - - - -
    import { expect } from 'chai';
    -import { set } from './../index';
    -
    -describe('@jdw/jst/set', () => {
    -  const fixture = {
    -    array: [1, 2, null],
    -    object: {
    -      foo: null,
    -      array: [{ foo: null }, null],
    -    },
    -    foo: null,
    -  };
    -
    -  it('can set an property on an object', () => {
    -    set(fixture, '#/foo', 'bar');
    -    expect(fixture.foo).to.eq('bar');
    -  });
    -
    -  it('can set an index on an array', () => {
    -    set(fixture, '#/array/2', 3);
    -    expect(fixture.array[2]).to.eq(3);
    -  });
    -
    -  it('can set an property on a nested object', () => {
    -    set(fixture, '#/object/foo', 'bar');
    -    expect(fixture.object.foo).to.eq('bar');
    -  });
    -
    -  it('can set an property on a nested array', () => {
    -    set(fixture, '#/object/array/1', 'bar');
    -    expect(fixture.object.array[1]).to.eq('bar');
    -  });
    -
    -  it('can set an property on an object in an array', () => {
    -    set(fixture, '#/object/array/0/foo', 'bar');
    -    expect(fixture.object.array[0].foo).to.eq('bar');
    -  });
    -});
    - - -
    h
    -
    -
    - - diff --git a/scripts/benchmark b/scripts/benchmark index c62a53f..15279b7 100755 --- a/scripts/benchmark +++ b/scripts/benchmark @@ -7,5 +7,5 @@ printf "${BLUE}@jdw/jst benchmarks${NC}\n\n" sleep 1 -yarn ts-node benchmarks/index.benchmark.ts # evaluate entry point +yarn ts-node src/__benchmarks__/index.benchmark.ts # evaluate entry point diff --git a/scripts/build b/scripts/build index d4f00ad..75afd12 100755 --- a/scripts/build +++ b/scripts/build @@ -16,7 +16,7 @@ mkdir -p ./dist/__tests__/fixture # create directory structur yarn trash # remove build artifacts yarn tsc # compile source code cp -rv ./src/__tests__/fixture ./dist/__tests__ # copy test fixture -yarn docco --layout linear src/**/*.ts # compile documentation +yarn docco --layout linear src/*.ts # compile documentation touch ./docs/CNAME \ && echo www.jwije.com > ./docs/CNAME # add CNAME to docs output ## copy copy distributable material diff --git a/benchmarks/benchmark.ts b/src/__benchmarks__/benchmark.ts similarity index 100% rename from benchmarks/benchmark.ts rename to src/__benchmarks__/benchmark.ts diff --git a/benchmarks/dereference-address-schema.benchmark.ts b/src/__benchmarks__/dereference-address-schema.benchmark.ts similarity index 86% rename from benchmarks/dereference-address-schema.benchmark.ts rename to src/__benchmarks__/dereference-address-schema.benchmark.ts index 70c7808..7a31071 100755 --- a/benchmarks/dereference-address-schema.benchmark.ts +++ b/src/__benchmarks__/dereference-address-schema.benchmark.ts @@ -1,6 +1,6 @@ import * as derefSync from 'json-schema-deref-sync'; -import { dereference } from './../dist/index'; -import { mockResolve as resolve } from './../src/__tests__/mockResolve'; +import { dereference } from './../index'; +import { resolve } from './../__tests__/lib/'; import benchmark from './benchmark'; const title = 'jst/dereference comparision: http://footown.com/generic/address#'; diff --git a/benchmarks/dereference-petstore-swagger.benchmark.ts b/src/__benchmarks__/dereference-petstore-swagger.benchmark.ts similarity index 71% rename from benchmarks/dereference-petstore-swagger.benchmark.ts rename to src/__benchmarks__/dereference-petstore-swagger.benchmark.ts index bea1dc0..3008670 100755 --- a/benchmarks/dereference-petstore-swagger.benchmark.ts +++ b/src/__benchmarks__/dereference-petstore-swagger.benchmark.ts @@ -1,7 +1,7 @@ import * as derefSync from 'json-schema-deref-sync'; import * as $RefParser from 'json-schema-ref-parser'; -import { dereference } from './../dist/index'; -import { mockResolve as resolve } from './../src/__tests__/mockResolve'; +import { dereference } from './../index'; +import { resolve } from './../__tests__/lib/'; import benchmark from './benchmark'; const title = 'jst/dereference comparision - petstore.swagger.json'; @@ -15,14 +15,14 @@ const tests = [ id: 'jst/dereference', deferred: false, exec: () => { - dereference(require('./../src/__tests__/fixture/petstore.swagger.json'), resolve) + dereference(require('./../__tests__/fixture/petstore.swagger.json'), resolve) }, }, { id: 'json-schema-deref-sync', deferred: false, exec: () => { - derefSync(require('./../src/__tests__/fixture/petstore.swagger.json')); + derefSync(require('./../__tests__/fixture/petstore.swagger.json')); } }, { @@ -30,7 +30,7 @@ const tests = [ deferred: true, exec: (defer) => { refParser.dereference( - require('./../src/__tests__/fixture/petstore.swagger.json'), + require('./../__tests__/fixture/petstore.swagger.json'), (err, x) => { defer.resolve(); } diff --git a/benchmarks/dereference-temando-swagger.benchmark.ts b/src/__benchmarks__/dereference-temando-swagger.benchmark.ts similarity index 70% rename from benchmarks/dereference-temando-swagger.benchmark.ts rename to src/__benchmarks__/dereference-temando-swagger.benchmark.ts index 806af0c..ac4b4e5 100755 --- a/benchmarks/dereference-temando-swagger.benchmark.ts +++ b/src/__benchmarks__/dereference-temando-swagger.benchmark.ts @@ -1,7 +1,7 @@ import * as derefSync from 'json-schema-deref-sync'; import * as $RefParser from 'json-schema-ref-parser'; -import { dereference } from './../dist/index'; -import { mockResolve as resolve } from './../src/__tests__/mockResolve'; +import { dereference } from './../index'; +import { resolve } from './../__tests__/lib/'; import benchmark from './benchmark'; const title = 'jst/dereference comparision - temando.swagger.json'; @@ -14,14 +14,14 @@ const tests = [ id: 'jst/dereference', deferred: false, exec: () => { - dereference(require('./../src/__tests__/fixture/temando.swagger.json'), resolve) + dereference(require('./../__tests__/fixture/temando.swagger.json'), resolve) }, }, { id: 'json-schema-deref-sync', deferred: false, exec: () => { - derefSync(require('./../src/__tests__/fixture/temando.swagger.json')); + derefSync(require('./../__tests__/fixture/temando.swagger.json')); } }, { @@ -29,7 +29,7 @@ const tests = [ deferred: true, exec: (defer) => { refParser.dereference( - require('./../src/__tests__/fixture/temando.swagger.json'), + require('./../__tests__/fixture/temando.swagger.json'), (err, x) => { defer.resolve(); } diff --git a/benchmarks/index.benchmark.ts b/src/__benchmarks__/index.benchmark.ts similarity index 100% rename from benchmarks/index.benchmark.ts rename to src/__benchmarks__/index.benchmark.ts diff --git a/benchmarks/traversal-shallow-benchmark.ts b/src/__benchmarks__/traversal-shallow-benchmark.ts similarity index 93% rename from benchmarks/traversal-shallow-benchmark.ts rename to src/__benchmarks__/traversal-shallow-benchmark.ts index 9ed89b8..cbe3dcd 100755 --- a/benchmarks/traversal-shallow-benchmark.ts +++ b/src/__benchmarks__/traversal-shallow-benchmark.ts @@ -1,7 +1,7 @@ import * as forIn from 'lodash.forin'; import benchmark from './benchmark'; -const schema = require('./../src/__tests__/fixture/temando.swagger.json'); +const schema = require('./../__tests__/fixture/temando.swagger.json'); const title = 'jst/experimental: Basic object traversal'; const description = 'This benchmark tests various methods for iterating and walking an objects top level properties.'; diff --git a/src/__tests__/MockValidator.ts b/src/__tests__/MockValidator.ts deleted file mode 100644 index 94a1279..0000000 --- a/src/__tests__/MockValidator.ts +++ /dev/null @@ -1,53 +0,0 @@ -import * as Ajv from 'ajv'; - -import * as address from './fixture/address+v1.schema.json'; -import * as addressOverride from './fixture/address-override+v1.schema.json'; -import * as circular from './fixture/circular.schema.json'; -import * as conditional from './fixture/conditional.schema.json'; -import * as credentials from './fixture/credentials+v1.schema.json'; -import * as editPerson from './fixture/edit-person+v1.schema.json'; -import * as person from './fixture/person+v1.schema.json'; -import * as profile from './fixture/profile+v1.schema.json'; - -/** - * A validation helper for our test schema. - */ -export class MockValidator { - public schema: object[] = []; - private ajv; - - constructor(config: object = {}) { - const schema = [ - address, - addressOverride, - circular, - conditional, - credentials, - editPerson, - person, - profile, - ]; - const cnf = { - extendRefs: true, - allErrors: true, - ...config, - }; - this.ajv = new Ajv(cnf); - this.load(schema); - } - - load(schema: object[]) { - schema.map((scm) => { - this.ajv.addSchema(scm); - this.schema.push(scm); - }); - - return this; - } - - getSchema(id: string): object | undefined { - const lookup = this.ajv.getSchema(id); - - return !lookup ? undefined : lookup.schema; - } -} diff --git a/src/__tests__/dereference.test.ts b/src/__tests__/dereference.test.ts index a783e01..f1147ee 100644 --- a/src/__tests__/dereference.test.ts +++ b/src/__tests__/dereference.test.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { dereference } from './../index'; -import { mockResolve as resolve } from './mockResolve'; +import { resolve } from './lib'; describe('dereference schema utility function', () => { it('dereferences referenced schema correctly', () => { diff --git a/src/__tests__/lib/Validator.ts b/src/__tests__/lib/Validator.ts new file mode 100644 index 0000000..2805860 --- /dev/null +++ b/src/__tests__/lib/Validator.ts @@ -0,0 +1,53 @@ +import * as Ajv from 'ajv'; + +import * as address from './../fixture/address+v1.schema.json'; +import * as addressOverride from './../fixture/address-override+v1.schema.json'; +import * as circular from './../fixture/circular.schema.json'; +import * as conditional from './../fixture/conditional.schema.json'; +import * as credentials from './../fixture/credentials+v1.schema.json'; +import * as editPerson from './../fixture/edit-person+v1.schema.json'; +import * as person from './../fixture/person+v1.schema.json'; +import * as profile from './../fixture/profile+v1.schema.json'; + +/** + * A validation helper for our test schema. + */ +export class Validator { + public schema: object[] = []; + private ajv; + + constructor(config: object = {}) { + const schema = [ + address, + addressOverride, + circular, + conditional, + credentials, + editPerson, + person, + profile, + ]; + const cnf = { + extendRefs: true, + allErrors: true, + ...config, + }; + this.ajv = new Ajv(cnf); + this.load(schema); + } + + load(schema: object[]) { + schema.map((scm) => { + this.ajv.addSchema(scm); + this.schema.push(scm); + }); + + return this; + } + + getSchema(id: string): object | undefined { + const lookup = this.ajv.getSchema(id); + + return !lookup ? undefined : lookup.schema; + } +} diff --git a/src/__tests__/lib/index.ts b/src/__tests__/lib/index.ts new file mode 100644 index 0000000..c3f99db --- /dev/null +++ b/src/__tests__/lib/index.ts @@ -0,0 +1,7 @@ +import { Validator } from './Validator'; +import { resolve } from './resolve'; + +export { + Validator, + resolve, +}; diff --git a/src/__tests__/lib/resolve.ts b/src/__tests__/lib/resolve.ts new file mode 100644 index 0000000..55b0c6e --- /dev/null +++ b/src/__tests__/lib/resolve.ts @@ -0,0 +1,19 @@ +import { Validator } from './index'; + +const validator = new Validator(); + +/** + * A resolve function must simply take a schema id as an argument and return + * that schema as an object literal or throw an error if it can't find it. + */ +const resolve = (id) => { + const result = validator.getSchema(id); + + if (!result) { + throw new Error(`could not resolve schema with id: ${id}`); + } + + return result; +}; + +export { resolve }; diff --git a/src/__tests__/mockResolve.ts b/src/__tests__/mockResolve.ts deleted file mode 100644 index 6899801..0000000 --- a/src/__tests__/mockResolve.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { MockValidator as Validator } from './MockValidator'; - -const validator = new Validator(); - -/** - * A resolve function must simply take a schema id as an argument and return - * that schema as an object literal or throw an error if it can't find it. - */ -const mockResolve = (id) => { - const result = validator.getSchema(id); - - if (!result) { - throw new Error(`could not resolve schema with id: ${id}`); - } - - return result; -}; - -export { mockResolve }; From ffe06f8aab1f49c7e2f5fd24f36d288d4534dd97 Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Wed, 13 Sep 2017 01:00:51 +0700 Subject: [PATCH 19/22] modify config --- .gitignore | 2 +- jest.config.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 8a3b126..30f2690 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,4 @@ node_modules dist/ *log .DS_Store -.coverage +coverage diff --git a/jest.config.js b/jest.config.js index 23ef374..09c9fff 100644 --- a/jest.config.js +++ b/jest.config.js @@ -12,7 +12,6 @@ module.exports = { "tsx", "js" ], - "coverageDirectory": ".coverage", "coverageReporters": ['text', 'text-summary'], "coverageThreshold": { "global": { statements: 76, lines: 80, functions: 72 } From 237cb2c1ae0b17f23873aeffd22e408b00813f5e Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Wed, 13 Sep 2017 01:14:04 +0700 Subject: [PATCH 20/22] refactor benchmarks to be more conventional --- CHANGELOG.md | 1 + package.json | 2 +- scripts/benchmark | 5 +++-- src/__benchmarks__/index.benchmark.ts | 4 ---- ...l-shallow-benchmark.ts => traversal-shallow.benchmark.ts} | 0 5 files changed, 5 insertions(+), 7 deletions(-) delete mode 100644 src/__benchmarks__/index.benchmark.ts rename src/__benchmarks__/{traversal-shallow-benchmark.ts => traversal-shallow.benchmark.ts} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index e10914d..39f38de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - `dereference` circular schema dereferencing. - fixed linting - `lodash` imports, build size reduced. +- benchmark messages returning out of sync with test run. ## [1.0.0] - 2017-06-25 diff --git a/package.json b/package.json index 7916729..fb9cfdf 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "test": "jest src --verbose --coverage", "test:dist": "jest dist --verbose", "test:watch": "yarn run test -- -o --watch", - "trash": "rm -rf dist docs" + "trash": "rm -rf dist docs coverage" }, "repository": { "type": "git", diff --git a/scripts/benchmark b/scripts/benchmark index 15279b7..4aab282 100755 --- a/scripts/benchmark +++ b/scripts/benchmark @@ -7,5 +7,6 @@ printf "${BLUE}@jdw/jst benchmarks${NC}\n\n" sleep 1 -yarn ts-node src/__benchmarks__/index.benchmark.ts # evaluate entry point - +for file in src/__benchmarks__/*benchmark.ts; do + yarn ts-node "${file}" # evaluate entry point +done diff --git a/src/__benchmarks__/index.benchmark.ts b/src/__benchmarks__/index.benchmark.ts deleted file mode 100644 index 1103bbc..0000000 --- a/src/__benchmarks__/index.benchmark.ts +++ /dev/null @@ -1,4 +0,0 @@ -require('./traversal-shallow-benchmark'); -require('./dereference-address-schema.benchmark'); -require('./dereference-petstore-swagger.benchmark'); -require('./dereference-temando-swagger.benchmark'); diff --git a/src/__benchmarks__/traversal-shallow-benchmark.ts b/src/__benchmarks__/traversal-shallow.benchmark.ts similarity index 100% rename from src/__benchmarks__/traversal-shallow-benchmark.ts rename to src/__benchmarks__/traversal-shallow.benchmark.ts From 0853f5367d0e139bd659a8c76498604291bf5f76 Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Mon, 30 Oct 2017 18:38:00 +0700 Subject: [PATCH 21/22] fix up linting --- package.json | 2 +- src/__benchmarks__/benchmark.ts | 67 +++++++++---------- .../dereference-address-schema.benchmark.ts | 6 +- .../dereference-petstore-swagger.benchmark.ts | 11 +-- .../dereference-temando-swagger.benchmark.ts | 13 ++-- .../traversal-shallow.benchmark.ts | 2 +- src/__tests__/dereference.test.ts | 1 - src/__tests__/lib/Validator.ts | 64 +++++++++--------- src/__tests__/lib/resolve.ts | 10 +-- src/dereference.ts | 1 + tslint.json | 4 +- yarn.lock | 4 ++ 12 files changed, 97 insertions(+), 88 deletions(-) diff --git a/package.json b/package.json index fb9cfdf..6a71252 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jdw/jst", - "version": "2.0.0-beta.12", + "version": "2.0.0-beta.13", "engines": { "node": ">=4" }, diff --git a/src/__benchmarks__/benchmark.ts b/src/__benchmarks__/benchmark.ts index d7ca24d..5c97acb 100644 --- a/src/__benchmarks__/benchmark.ts +++ b/src/__benchmarks__/benchmark.ts @@ -1,43 +1,40 @@ import { Suite } from 'benchmark'; -import * as chalk from 'chalk'; -type Test = { - id: string, - deferred: boolean, - exec: any, -}; - -const benchmark = (title: string, description: string, tests: Test[]) => { - const suite = new Suite(); - const h1 = chalk.bgBlack.white; - const h2 = chalk.white; +// tslint:disable +export interface ITest { + id: string; + deferred: boolean; + exec: any; +} - tests.forEach((t) => { - if (!t.deferred) { - suite.add(t.id, t.exec); - } else { - suite.add(t.id, { - defer: true, - fn: function(deferred) { - t.exec(deferred); - } - }); - } - }); +const benchmark = (title: string, description: string, tests: ITest[]) => { + const suite = new Suite(); + tests.forEach((t) => { + if (!t.deferred) { + suite.add(t.id, t.exec); + } else { + suite.add(t.id, { + defer: true, + fn(deferred) { + t.exec(deferred); + }, + }); + } + }); - suite.on('cycle', function(event) { - console.log(String(event.target)); - }).on('complete', function() { - const fastest = this.filter('fastest').map('name'); - console.log('\n', chalk.white(`Fastest: ${chalk.green(fastest)}`), '\n'); - }); + suite.on('cycle', function(event) { + console.log(String(event.target)); + }).on('complete', function() { + const fastest = this.filter('fastest').map('name'); + console.log('\n', `Fastest: ${fastest}`, '\n'); + }); - console.log(h1('\n', `Benchmark: ${title}`), '\n'); - console.log(h2(description), '\n', '\n', chalk.blue.bold('-------'), '\n'); + console.log('\n', `Benchmark: ${title}`, '\n'); + console.log(description, '\n', '\n', '-------', '\n'); - return suite.run({ - async: false, - }); + return suite.run({ + async: false, + }); }; -export default benchmark; +export { benchmark }; diff --git a/src/__benchmarks__/dereference-address-schema.benchmark.ts b/src/__benchmarks__/dereference-address-schema.benchmark.ts index 7a31071..4cf9c8e 100755 --- a/src/__benchmarks__/dereference-address-schema.benchmark.ts +++ b/src/__benchmarks__/dereference-address-schema.benchmark.ts @@ -1,7 +1,7 @@ import * as derefSync from 'json-schema-deref-sync'; import { dereference } from './../index'; import { resolve } from './../__tests__/lib/'; -import benchmark from './benchmark'; +import { benchmark } from './benchmark'; const title = 'jst/dereference comparision: http://footown.com/generic/address#'; const description = @@ -21,8 +21,8 @@ const tests = [ deferred: false, exec: () => { derefSync(resolve('http://footown.com/generic/address#')); - } - } + }, + }, ]; benchmark(title, description, tests); diff --git a/src/__benchmarks__/dereference-petstore-swagger.benchmark.ts b/src/__benchmarks__/dereference-petstore-swagger.benchmark.ts index 3008670..3b11534 100755 --- a/src/__benchmarks__/dereference-petstore-swagger.benchmark.ts +++ b/src/__benchmarks__/dereference-petstore-swagger.benchmark.ts @@ -2,7 +2,7 @@ import * as derefSync from 'json-schema-deref-sync'; import * as $RefParser from 'json-schema-ref-parser'; import { dereference } from './../index'; import { resolve } from './../__tests__/lib/'; -import benchmark from './benchmark'; +import { benchmark } from './benchmark'; const title = 'jst/dereference comparision - petstore.swagger.json'; const description = @@ -15,7 +15,7 @@ const tests = [ id: 'jst/dereference', deferred: false, exec: () => { - dereference(require('./../__tests__/fixture/petstore.swagger.json'), resolve) + dereference(require('./../__tests__/fixture/petstore.swagger.json'), resolve); }, }, { @@ -23,7 +23,7 @@ const tests = [ deferred: false, exec: () => { derefSync(require('./../__tests__/fixture/petstore.swagger.json')); - } + }, }, { id: 'json-schmea-ref-parser', @@ -32,8 +32,11 @@ const tests = [ refParser.dereference( require('./../__tests__/fixture/petstore.swagger.json'), (err, x) => { + if (err) { + throw err; + } defer.resolve(); - } + }, ); }, }, diff --git a/src/__benchmarks__/dereference-temando-swagger.benchmark.ts b/src/__benchmarks__/dereference-temando-swagger.benchmark.ts index ac4b4e5..915ff5d 100755 --- a/src/__benchmarks__/dereference-temando-swagger.benchmark.ts +++ b/src/__benchmarks__/dereference-temando-swagger.benchmark.ts @@ -1,8 +1,8 @@ -import * as derefSync from 'json-schema-deref-sync'; import * as $RefParser from 'json-schema-ref-parser'; +import * as derefSync from 'json-schema-deref-sync'; +import { benchmark } from './benchmark'; import { dereference } from './../index'; import { resolve } from './../__tests__/lib/'; -import benchmark from './benchmark'; const title = 'jst/dereference comparision - temando.swagger.json'; const description = @@ -14,7 +14,7 @@ const tests = [ id: 'jst/dereference', deferred: false, exec: () => { - dereference(require('./../__tests__/fixture/temando.swagger.json'), resolve) + dereference(require('./../__tests__/fixture/temando.swagger.json'), resolve); }, }, { @@ -22,7 +22,7 @@ const tests = [ deferred: false, exec: () => { derefSync(require('./../__tests__/fixture/temando.swagger.json')); - } + }, }, { id: 'json-schmea-ref-parser', @@ -31,8 +31,11 @@ const tests = [ refParser.dereference( require('./../__tests__/fixture/temando.swagger.json'), (err, x) => { + if (err) { + throw err; + } defer.resolve(); - } + }, ); }, }, diff --git a/src/__benchmarks__/traversal-shallow.benchmark.ts b/src/__benchmarks__/traversal-shallow.benchmark.ts index cbe3dcd..23887d2 100755 --- a/src/__benchmarks__/traversal-shallow.benchmark.ts +++ b/src/__benchmarks__/traversal-shallow.benchmark.ts @@ -1,5 +1,5 @@ import * as forIn from 'lodash.forin'; -import benchmark from './benchmark'; +import { benchmark } from './benchmark'; const schema = require('./../__tests__/fixture/temando.swagger.json'); const title = 'jst/experimental: Basic object traversal'; diff --git a/src/__tests__/dereference.test.ts b/src/__tests__/dereference.test.ts index f1147ee..d5292fc 100644 --- a/src/__tests__/dereference.test.ts +++ b/src/__tests__/dereference.test.ts @@ -19,7 +19,6 @@ describe('dereference schema utility function', () => { resolve('http://footown.com/generic/address-override#'), ]; const ast: any = dereference(schema, resolve); - expect(ast.properties).to.have.property('addressLines'); expect(ast.properties).to.have.property('country'); expect(ast.properties.country).to.have.property('enum'); diff --git a/src/__tests__/lib/Validator.ts b/src/__tests__/lib/Validator.ts index 2805860..f7ca76b 100644 --- a/src/__tests__/lib/Validator.ts +++ b/src/__tests__/lib/Validator.ts @@ -13,41 +13,41 @@ import * as profile from './../fixture/profile+v1.schema.json'; * A validation helper for our test schema. */ export class Validator { - public schema: object[] = []; - private ajv; + public schema: object[] = []; + private ajv; - constructor(config: object = {}) { - const schema = [ - address, - addressOverride, - circular, - conditional, - credentials, - editPerson, - person, - profile, - ]; - const cnf = { - extendRefs: true, - allErrors: true, - ...config, - }; - this.ajv = new Ajv(cnf); - this.load(schema); - } + constructor(config: object = {}) { + const schema = [ + address, + addressOverride, + circular, + conditional, + credentials, + editPerson, + person, + profile, + ]; + const cnf = { + extendRefs: true, + allErrors: true, + ...config, + }; + this.ajv = new Ajv(cnf); + this.load(schema); + } - load(schema: object[]) { - schema.map((scm) => { - this.ajv.addSchema(scm); - this.schema.push(scm); - }); + load(schema: object[]) { + schema.map((scm) => { + this.ajv.addSchema(scm); + this.schema.push(scm); + }); - return this; - } + return this; + } - getSchema(id: string): object | undefined { - const lookup = this.ajv.getSchema(id); + getSchema(id: string): object | undefined { + const lookup = this.ajv.getSchema(id); - return !lookup ? undefined : lookup.schema; - } + return !lookup ? undefined : lookup.schema; + } } diff --git a/src/__tests__/lib/resolve.ts b/src/__tests__/lib/resolve.ts index 55b0c6e..2155c6d 100644 --- a/src/__tests__/lib/resolve.ts +++ b/src/__tests__/lib/resolve.ts @@ -7,13 +7,13 @@ const validator = new Validator(); * that schema as an object literal or throw an error if it can't find it. */ const resolve = (id) => { - const result = validator.getSchema(id); + const result = validator.getSchema(id); - if (!result) { - throw new Error(`could not resolve schema with id: ${id}`); - } + if (!result) { + throw new Error(`could not resolve schema with id: ${id}`); + } - return result; + return result; }; export { resolve }; diff --git a/src/dereference.ts b/src/dereference.ts index ed57b65..3db973a 100644 --- a/src/dereference.ts +++ b/src/dereference.ts @@ -90,6 +90,7 @@ export const dereference: Dereferencer = (root, resolver) => { } else if (isObject(schema)) { const schemaId = schema.id || undefined; let isCircular = false; + // traverse is an internal recursive function that we bind to this lexical // scope in order to easily resolve to schema definitions whilst traversing // an objects nested properties. This is primarily for efficiency concerns. diff --git a/tslint.json b/tslint.json index c714561..ad5f32b 100644 --- a/tslint.json +++ b/tslint.json @@ -9,6 +9,8 @@ "space-before-function-paren": false, "no-console": [false], "strict-type-predicates": false, - "no-uninitialized": true + "no-uninitialized": true, + "no-var-requires": false, + "ordered-imports": false } } diff --git a/yarn.lock b/yarn.lock index b27f56d..0637faa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2500,6 +2500,10 @@ tslint-eslint-rules@^4.0.0, tslint-eslint-rules@^4.1.1: tslib "^1.0.0" tsutils "^1.4.0" +tslint-strict-null-checks@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tslint-strict-null-checks/-/tslint-strict-null-checks-1.0.0.tgz#6563ba646abe76236ad4266657de48aa49ff8842" + tslint@^5.4.3: version "5.6.0" resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.6.0.tgz#088aa6c6026623338650b2900828ab3edf59f6cf" From 0b60dffa6b759b643d2768efb160585f264a2287 Mon Sep 17 00:00:00 2001 From: Jason Wijegooneratne Date: Mon, 30 Oct 2017 19:30:51 +0700 Subject: [PATCH 22/22] fix up floating promise --- src/__benchmarks__/dereference-petstore-swagger.benchmark.ts | 4 +++- src/__benchmarks__/dereference-temando-swagger.benchmark.ts | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/__benchmarks__/dereference-petstore-swagger.benchmark.ts b/src/__benchmarks__/dereference-petstore-swagger.benchmark.ts index 3b11534..b211521 100755 --- a/src/__benchmarks__/dereference-petstore-swagger.benchmark.ts +++ b/src/__benchmarks__/dereference-petstore-swagger.benchmark.ts @@ -37,7 +37,9 @@ const tests = [ } defer.resolve(); }, - ); + ).catch((reason) => { + defer.reject(reason); + }); }, }, ]; diff --git a/src/__benchmarks__/dereference-temando-swagger.benchmark.ts b/src/__benchmarks__/dereference-temando-swagger.benchmark.ts index 915ff5d..87ce7bc 100755 --- a/src/__benchmarks__/dereference-temando-swagger.benchmark.ts +++ b/src/__benchmarks__/dereference-temando-swagger.benchmark.ts @@ -36,7 +36,9 @@ const tests = [ } defer.resolve(); }, - ); + ).catch((reason) => { + defer.reject(reason); + }); }, }, ];
    -
    - - - - - - - -
    import * as has from 'lodash.has';
    -import { isPointer } from './isPointer';
    -
    -export const set: Jst.setPointer = (obj, pointer, value) => {
    - - - -

    A JSON pointer must begin with the symbols ‘#’, ‘/‘ or be an empty -string ‘’. So as a first step, we check that this assumption is true and -bail if not.

    - - -
      if (!isPointer(pointer)) {
    -    throw new Error(`invalid JSON pointer specified: '${pointer}'`);
    -  }
    - - - -

    If this check passes we have a valid pointer. In order to dereference -its value, we will split the pointer into its orthogonal pieces and then -iterate schema checking from left to right that each piece of pointer -references a valid path in schema.

    - - -
      const fragments = pointer.split('/');
    -  let ref = obj;
    -  return fragments.forEach((fragment, index) => {
    - - - -

    If fragment points to the root path of object we can just return -the object itself.

    - - -
        if (fragment === '#' || fragment === '/' || fragment === '') {
    -      return;
    -    }
    - - - -

    Here we decode fragment according to the JSON pointer -specification, replacing the character codes ‘~1’ and ‘~0’ with the -symbols ‘/‘ and ‘~’ respectively.

    - - -
        const token = fragment.replace('~1', '/').replace('~0', '~');
    - - - -

    If the ‘object’ is array assume that token indicates an index in -this array and try to resolve it appropriately.

    - - -
        if (Array.isArray(ref)) {
    -      const i = parseInt(token, 10);
    -
    -      if (!ref.indexOf(i)) {
    -        throw new Error(
    -          `could not dereference JSON pointer: ${pointer}. Array does not have`
    -          + ` index: ${index}::${JSON.stringify(obj)}`);
    -      }
    -
    -      if ((index + 1) === fragments.length) {
    -        ref[i] = value;
    -        return;
    -      }
    -
    -      ref = ref[i];
    - - - -

    Otherwise if object is not an Array we expect object to be of -type Object and that token references a valid path in object.

    - - -
        } else {
    -      if (!has(ref, token)) {
    -        throw new Error(
    -          `could not dereference pointer '${pointer}'. The fragment ${token}`
    -          + ` is not a valid property of object: ${JSON.stringify(obj, null, 2)}`);
    -      }
    -
    -      if ((index + 1) === fragments.length) {
    -        ref[token] = value;
    -        return;
    -      }
    -      ref = ref[token];
    -    }
    -  });
    -};
    - - -
    h
    -
    -