Compare commits
29 Commits
Author | SHA1 | Date | |
---|---|---|---|
4478b7588a | |||
9bac6e5809 | |||
cbc7e4ebce | |||
097f54a74c | |||
807624d157 | |||
9d7e2e03d9 | |||
9686caff18 | |||
9260d653a1 | |||
28cd849d0d | |||
89a399bf42 | |||
16048fe96d | |||
04d60333a9 | |||
c30f1f4ab9 | |||
fc91dd3171 | |||
55f8951732 | |||
92f212e9d3 | |||
1a22db26da | |||
0d3bcab40f | |||
e11ace6a23 | |||
f29b632bd2 | |||
25f80b6b59 | |||
176ac34504 | |||
2707542234 | |||
ee025d094c | |||
9bc1c4bf93 | |||
5176a34575 | |||
fe9f9299fc | |||
62cf2fd262 | |||
65e581d48b |
4
.gitignore
vendored
4
.gitignore
vendored
@ -15,8 +15,6 @@ node_modules/
|
||||
|
||||
# builds
|
||||
dist/
|
||||
dist_web/
|
||||
dist_serve/
|
||||
dist_ts_web/
|
||||
dist_*/
|
||||
|
||||
# custom
|
114
.gitlab-ci.yml
114
.gitlab-ci.yml
@ -3,14 +3,17 @@ image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||
|
||||
cache:
|
||||
paths:
|
||||
- .npmci_cache/
|
||||
key: "$CI_BUILD_STAGE"
|
||||
- .npmci_cache/
|
||||
key: '$CI_BUILD_STAGE'
|
||||
|
||||
stages:
|
||||
- security
|
||||
- test
|
||||
- release
|
||||
- metadata
|
||||
- security
|
||||
- test
|
||||
- release
|
||||
- metadata
|
||||
|
||||
before_script:
|
||||
- npm install -g @shipzone/npmci
|
||||
|
||||
# ====================
|
||||
# security stage
|
||||
@ -18,60 +21,75 @@ stages:
|
||||
mirror:
|
||||
stage: security
|
||||
script:
|
||||
- npmci git mirror
|
||||
- npmci git mirror
|
||||
only:
|
||||
- tags
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
- lossless
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
snyk:
|
||||
auditProductionDependencies:
|
||||
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||
stage: security
|
||||
script:
|
||||
- npmci npm prepare
|
||||
- npmci command npm install -g snyk
|
||||
- npmci command npm install --ignore-scripts
|
||||
- npmci command snyk test
|
||||
- npmci command npm install --production --ignore-scripts
|
||||
- npmci command npm config set registry https://registry.npmjs.org
|
||||
- npmci command npm audit --audit-level=high --only=prod --production
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
- docker
|
||||
allow_failure: true
|
||||
|
||||
auditDevDependencies:
|
||||
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||
stage: security
|
||||
script:
|
||||
- npmci npm prepare
|
||||
- npmci command npm install --ignore-scripts
|
||||
- npmci command npm config set registry https://registry.npmjs.org
|
||||
- npmci command npm audit --audit-level=high --only=dev
|
||||
tags:
|
||||
- docker
|
||||
allow_failure: true
|
||||
|
||||
# ====================
|
||||
# test stage
|
||||
# ====================
|
||||
|
||||
testLTS:
|
||||
testStable:
|
||||
stage: test
|
||||
script:
|
||||
- npmci npm prepare
|
||||
- npmci node install lts
|
||||
- npmci npm install
|
||||
- npmci npm test
|
||||
- npmci npm prepare
|
||||
- npmci node install stable
|
||||
- npmci npm install
|
||||
- npmci npm test
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
- docker
|
||||
|
||||
testBuild:
|
||||
stage: test
|
||||
script:
|
||||
- npmci npm prepare
|
||||
- npmci node install lts
|
||||
- npmci npm install
|
||||
- npmci command npm run build
|
||||
- npmci npm prepare
|
||||
- npmci node install stable
|
||||
- npmci npm install
|
||||
- npmci command npm run build
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
- docker
|
||||
|
||||
release:
|
||||
stage: release
|
||||
script:
|
||||
- npmci node install lts
|
||||
- npmci npm publish
|
||||
- npmci node install stable
|
||||
- npmci npm publish
|
||||
only:
|
||||
- tags
|
||||
- tags
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
- lossless
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
# ====================
|
||||
# metadata stage
|
||||
@ -79,35 +97,37 @@ release:
|
||||
codequality:
|
||||
stage: metadata
|
||||
allow_failure: true
|
||||
only:
|
||||
- tags
|
||||
script:
|
||||
- npmci command npm install -g tslint typescript
|
||||
- npmci command npm install -g typescript
|
||||
- npmci npm prepare
|
||||
- npmci npm install
|
||||
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
|
||||
tags:
|
||||
- docker
|
||||
- priv
|
||||
- lossless
|
||||
- docker
|
||||
- priv
|
||||
|
||||
trigger:
|
||||
stage: metadata
|
||||
script:
|
||||
- npmci trigger
|
||||
- npmci trigger
|
||||
only:
|
||||
- tags
|
||||
- tags
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
- lossless
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
pages:
|
||||
image: hosttoday/ht-docker-dbase:npmci
|
||||
services:
|
||||
- docker:18-dind
|
||||
stage: metadata
|
||||
script:
|
||||
- npmci command npm install -g @gitzone/tsdoc
|
||||
- npmci node install stable
|
||||
- npmci npm prepare
|
||||
- npmci npm install
|
||||
- npmci command tsdoc
|
||||
- npmci command npm run buildDocs
|
||||
tags:
|
||||
- lossless
|
||||
- docker
|
||||
- notpriv
|
||||
only:
|
||||
@ -115,5 +135,5 @@ pages:
|
||||
artifacts:
|
||||
expire_in: 1 week
|
||||
paths:
|
||||
- public
|
||||
- public
|
||||
allow_failure: true
|
||||
|
4
.snyk
4
.snyk
@ -1,4 +0,0 @@
|
||||
# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.
|
||||
version: v1.13.3
|
||||
ignore: {}
|
||||
patch: {}
|
11
.vscode/launch.json
vendored
Normal file
11
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"command": "npm test",
|
||||
"name": "Run npm test",
|
||||
"request": "launch",
|
||||
"type": "node-terminal"
|
||||
}
|
||||
]
|
||||
}
|
26
.vscode/settings.json
vendored
Normal file
26
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
"json.schemas": [
|
||||
{
|
||||
"fileMatch": ["/npmextra.json"],
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"npmci": {
|
||||
"type": "object",
|
||||
"description": "settings for npmci"
|
||||
},
|
||||
"gitzone": {
|
||||
"type": "object",
|
||||
"description": "settings for gitzone",
|
||||
"properties": {
|
||||
"projectType": {
|
||||
"type": "string",
|
||||
"enum": ["website", "element", "service", "npm", "wcc"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
53
README.md
53
README.md
@ -1,53 +0,0 @@
|
||||
# @pushrocks/smartjson
|
||||
typed json handlers
|
||||
|
||||
## Availabililty and Links
|
||||
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/smartjson)
|
||||
* [gitlab.com (source)](https://gitlab.com/pushrocks/smartjson)
|
||||
* [github.com (source mirror)](https://github.com/pushrocks/smartjson)
|
||||
* [docs (typedoc)](https://pushrocks.gitlab.io/smartjson/)
|
||||
|
||||
## Status for master
|
||||
[](https://gitlab.com/pushrocks/smartjson/commits/master)
|
||||
[](https://gitlab.com/pushrocks/smartjson/commits/master)
|
||||
[](https://www.npmjs.com/package/@pushrocks/smartjson)
|
||||
[](https://snyk.io/test/npm/@pushrocks/smartjson)
|
||||
[](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||
[](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||
[](https://prettier.io/)
|
||||
|
||||
## Usage
|
||||
|
||||
Use TypeScript for best in class instellisense.
|
||||
|
||||
### Classes
|
||||
|
||||
SmartJson makes it easy to fold and enfold classes into and from JSON
|
||||
|
||||
```javascript
|
||||
import { Smartjson, foldDec } from 'smartjson';
|
||||
|
||||
class AwesomeClass extends Smartjson {
|
||||
static stringify;
|
||||
|
||||
computedValue: string;
|
||||
|
||||
@foldDec() // mark anotherValueToStore as foldable
|
||||
anotherValueToStore: string = null;
|
||||
constructor() {
|
||||
super(); // this is important
|
||||
}
|
||||
}
|
||||
|
||||
let myAwesomeInstance = new AwesomeClass();
|
||||
let foldedObject = myAwesomeInstance.foldToObject(); // will return {anotherValueToStore: null}
|
||||
myAwesomeInstance.enfoldFromObject({ anotherValueToStore: 'hi' });
|
||||
foldedObject = myAwesomeInstance.foldToObject(); // will return {anotherValueToStore: 'hi'}
|
||||
```
|
||||
|
||||
For further information read the linked docs at the top of this readme.
|
||||
|
||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
|
||||
|
||||
[](https://maintainedby.lossless.com)
|
@ -3,11 +3,12 @@
|
||||
"npmAccessLevel": "public"
|
||||
},
|
||||
"gitzone": {
|
||||
"projectType": "npm",
|
||||
"module": {
|
||||
"githost": "gitlab.com",
|
||||
"gitscope": "pushrocks",
|
||||
"gitrepo": "smartjson",
|
||||
"shortDescription": "typed json handlers",
|
||||
"description": "typed json handlers",
|
||||
"npmPackagename": "@pushrocks/smartjson",
|
||||
"license": "MIT"
|
||||
}
|
||||
|
11274
package-lock.json
generated
11274
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
49
package.json
49
package.json
@ -1,13 +1,14 @@
|
||||
{
|
||||
"name": "@pushrocks/smartjson",
|
||||
"version": "3.0.7",
|
||||
"version": "5.0.1",
|
||||
"private": false,
|
||||
"description": "typed json handlers",
|
||||
"main": "dist/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"main": "dist_ts/index.js",
|
||||
"typings": "dist_ts/index.d.ts",
|
||||
"scripts": {
|
||||
"test": "(tstest test/)",
|
||||
"build": "(tsbuild)"
|
||||
"test": "(tstest test/ --web)",
|
||||
"build": "(tsbuild --web --allowimplicitany)",
|
||||
"buildDocs": "tsdoc"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@ -20,28 +21,34 @@
|
||||
},
|
||||
"homepage": "https://gitlab.com/pushrocks/smartjson#README",
|
||||
"devDependencies": {
|
||||
"@gitzone/tsbuild": "^2.1.11",
|
||||
"@gitzone/tsrun": "^1.2.8",
|
||||
"@gitzone/tstest": "^1.0.24",
|
||||
"@pushrocks/tapbundle": "^3.0.11",
|
||||
"@types/node": "^12.7.1",
|
||||
"tslint": "^5.18.0",
|
||||
"tslint-config-prettier": "^1.18.0"
|
||||
"@gitzone/tsbuild": "^2.1.63",
|
||||
"@gitzone/tsrun": "^1.2.37",
|
||||
"@gitzone/tstest": "^1.0.71",
|
||||
"@pushrocks/tapbundle": "^5.0.3",
|
||||
"@types/node": "^18.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/fast-json-stable-stringify": "^2.0.0",
|
||||
"fast-json-stable-stringify": "^2.0.0",
|
||||
"@types/buffer-json": "^2.0.1",
|
||||
"@types/fast-json-stable-stringify": "^2.1.0",
|
||||
"@types/lodash.clonedeep": "^4.5.7",
|
||||
"buffer-json": "^2.0.0",
|
||||
"fast-json-stable-stringify": "^2.1.0",
|
||||
"lodash.clonedeep": "^4.5.0"
|
||||
},
|
||||
"files": [
|
||||
"ts/*",
|
||||
"ts_web/*",
|
||||
"dist/*",
|
||||
"dist_web/*",
|
||||
"dist_ts_web/*",
|
||||
"assets/*",
|
||||
"ts/**/*",
|
||||
"ts_web/**/*",
|
||||
"dist/**/*",
|
||||
"dist_*/**/*",
|
||||
"dist_ts/**/*",
|
||||
"dist_ts_web/**/*",
|
||||
"assets/**/*",
|
||||
"cli.js",
|
||||
"npmextra.json",
|
||||
"readme.md"
|
||||
]
|
||||
],
|
||||
"browserslist": [
|
||||
"last 1 chrome versions"
|
||||
],
|
||||
"type": "module"
|
||||
}
|
||||
|
66
readme.md
Normal file
66
readme.md
Normal file
@ -0,0 +1,66 @@
|
||||
# @pushrocks/smartjson
|
||||
typed json handlers
|
||||
|
||||
## Availabililty and Links
|
||||
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/smartjson)
|
||||
* [gitlab.com (source)](https://gitlab.com/pushrocks/smartjson)
|
||||
* [github.com (source mirror)](https://github.com/pushrocks/smartjson)
|
||||
* [docs (typedoc)](https://pushrocks.gitlab.io/smartjson/)
|
||||
|
||||
## Status for master
|
||||
|
||||
Status Category | Status Badge
|
||||
-- | --
|
||||
GitLab Pipelines | [](https://lossless.cloud)
|
||||
GitLab Pipline Test Coverage | [](https://lossless.cloud)
|
||||
npm | [](https://lossless.cloud)
|
||||
Snyk | [](https://lossless.cloud)
|
||||
TypeScript Support | [](https://lossless.cloud)
|
||||
node Support | [](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||
Code Style | [](https://lossless.cloud)
|
||||
PackagePhobia (total standalone install weight) | [](https://lossless.cloud)
|
||||
PackagePhobia (package size on registry) | [](https://lossless.cloud)
|
||||
BundlePhobia (total size when bundled) | [](https://lossless.cloud)
|
||||
Platform support | [](https://lossless.cloud) [](https://lossless.cloud)
|
||||
|
||||
## Usage
|
||||
|
||||
Use TypeScript for best in class instellisense.
|
||||
|
||||
### Classes
|
||||
|
||||
SmartJson makes it easy to fold and enfold classes into and from JSON
|
||||
|
||||
```javascript
|
||||
import { Smartjson, foldDec } from 'smartjson';
|
||||
|
||||
class AwesomeClass extends Smartjson {
|
||||
static stringify;
|
||||
|
||||
computedValue: string;
|
||||
|
||||
@foldDec() // mark anotherValueToStore as foldable
|
||||
anotherValueToStore: string = null;
|
||||
constructor() {
|
||||
super(); // this is important
|
||||
}
|
||||
}
|
||||
|
||||
let myAwesomeInstance = new AwesomeClass();
|
||||
let foldedObject = myAwesomeInstance.foldToObject(); // will return {anotherValueToStore: null}
|
||||
// You can also fold to Json, with support for buffers
|
||||
// const jsonString = myAwesomeInstance.foldToJson();
|
||||
myAwesomeInstance = AwesomeClass.enfoldFromObject({ anotherValueToStore: 'hi' });
|
||||
foldedObject = myAwesomeInstance.foldToObject(); // will return {anotherValueToStore: 'hi'}
|
||||
```
|
||||
|
||||
## Contribution
|
||||
|
||||
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
|
||||
|
||||
For further information read the linked docs at the top of this readme.
|
||||
|
||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
|
||||
|
||||
[](https://maintainedby.lossless.com)
|
43
test/test.both.ts
Normal file
43
test/test.both.ts
Normal file
@ -0,0 +1,43 @@
|
||||
import { tap, expect } from '@pushrocks/tapbundle';
|
||||
|
||||
import * as smartjson from '../ts/index.js';
|
||||
|
||||
class SomeClass extends smartjson.Smartjson {
|
||||
@smartjson.foldDec() thisis: string = 'test';
|
||||
constructor() {
|
||||
super();
|
||||
console.log(this.saveableProperties);
|
||||
}
|
||||
}
|
||||
|
||||
let mySomeClass: SomeClass;
|
||||
|
||||
tap.test('should create a Foldable extended instance', async () => {
|
||||
mySomeClass = new SomeClass();
|
||||
expect(mySomeClass).toBeInstanceOf(SomeClass);
|
||||
expect(mySomeClass).toBeInstanceOf(smartjson.Smartjson);
|
||||
});
|
||||
|
||||
tap.test('should create a folded object', async () => {
|
||||
let foldedObject = mySomeClass.foldToObject();
|
||||
expect(foldedObject).property('thisis').toEqual('test');
|
||||
});
|
||||
|
||||
tap.test('should enfold from object', async () => {
|
||||
const mySomeClass2 = SomeClass.enfoldFromObject({ thisis: 'test2' });
|
||||
expect(mySomeClass2).property('thisis').toEqual('test2');
|
||||
});
|
||||
|
||||
tap.test('should products stable jsons', async () => {
|
||||
const jsonString = smartjson.stringify({
|
||||
a: 1,
|
||||
f: 6,
|
||||
b: 3,
|
||||
c: 3,
|
||||
e: 5,
|
||||
d: 4,
|
||||
});
|
||||
console.log(jsonString);
|
||||
});
|
||||
|
||||
tap.start();
|
35
test/test.ts
35
test/test.ts
@ -1,35 +0,0 @@
|
||||
import { tap, expect } from '@pushrocks/tapbundle';
|
||||
|
||||
import { Smartjson, foldDec } from '../ts/index';
|
||||
|
||||
class SomeClass extends Smartjson {
|
||||
@foldDec() thisis: string = 'test';
|
||||
constructor() {
|
||||
super();
|
||||
console.log(this.saveableProperties);
|
||||
}
|
||||
}
|
||||
|
||||
let mySomeClass: SomeClass;
|
||||
|
||||
tap.test('should create a Foldable extended instance', async () => {
|
||||
mySomeClass = new SomeClass();
|
||||
expect(mySomeClass).to.be.instanceof(SomeClass);
|
||||
expect(mySomeClass).to.be.instanceof(Smartjson);
|
||||
});
|
||||
|
||||
tap.test('should create a folded object', async () => {
|
||||
let foldedObject = mySomeClass.foldToObject();
|
||||
expect(foldedObject)
|
||||
.property('thisis')
|
||||
.to.equal('test');
|
||||
});
|
||||
|
||||
tap.test('should enfold from object', async () => {
|
||||
mySomeClass.enfoldFromObject({ thisis: 'test2' });
|
||||
expect(mySomeClass)
|
||||
.property('thisis')
|
||||
.to.equal('test2');
|
||||
});
|
||||
|
||||
tap.start();
|
8
ts/00_commitinfo_data.ts
Normal file
8
ts/00_commitinfo_data.ts
Normal file
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* autocreated commitinfo by @pushrocks/commitinfo
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@pushrocks/smartjson',
|
||||
version: '5.0.1',
|
||||
description: 'typed json handlers'
|
||||
}
|
79
ts/index.ts
79
ts/index.ts
@ -1,14 +1,47 @@
|
||||
import * as plugins from './smartjson.plugins';
|
||||
import * as plugins from './smartjson.plugins.js';
|
||||
|
||||
/**
|
||||
* allows you to parse a json
|
||||
*/
|
||||
export const parse = plugins.bufferJson.parse;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param objArg
|
||||
* @param optionsArg
|
||||
*/
|
||||
export const stringify = (
|
||||
objArg: any,
|
||||
simpleOrderArray?: string[],
|
||||
optionsArg: plugins.IStableJsonTypes['Options'] = {}
|
||||
): string => {
|
||||
const bufferedJson = plugins.bufferJson.stringify(objArg);
|
||||
objArg = JSON.parse(bufferedJson);
|
||||
let returnJson = plugins.stableJson(objArg, optionsArg);
|
||||
return returnJson;
|
||||
};
|
||||
|
||||
export class Smartjson {
|
||||
// ======
|
||||
// STATIC
|
||||
// ======
|
||||
public static parse = JSON.parse;
|
||||
/**
|
||||
* enfolds data from an object
|
||||
*/
|
||||
public static enfoldFromObject(objectArg) {
|
||||
const newInstance = new this();
|
||||
for (const keyName in objectArg) {
|
||||
if (newInstance.saveableProperties.indexOf(keyName) !== -1) {
|
||||
newInstance[keyName] = objectArg[keyName];
|
||||
}
|
||||
}
|
||||
return newInstance;
|
||||
}
|
||||
|
||||
public static stringify = (objArg: any, optionsArg: plugins.stableJson.Options) => {
|
||||
return plugins.stableJson(objArg, optionsArg);
|
||||
};
|
||||
/**
|
||||
* enfold from json
|
||||
*/
|
||||
public static enfoldFromJson(jsonArg: string) {
|
||||
const objectFromJson = parse(jsonArg);
|
||||
return this.enfoldFromObject(objectFromJson);
|
||||
}
|
||||
|
||||
// ========
|
||||
// INSTANCE
|
||||
@ -21,28 +54,34 @@ export class Smartjson {
|
||||
*/
|
||||
public foldToObject() {
|
||||
const newFoldedObject: { [key: string]: any } = {};
|
||||
const trackMap = [];
|
||||
for (const keyName of this.saveableProperties) {
|
||||
newFoldedObject[keyName] = plugins.lodashCloneDeep(this[keyName]);
|
||||
let value = this[keyName];
|
||||
if (value instanceof Smartjson) {
|
||||
if (trackMap.includes(value)) {
|
||||
throw new Error('cycle detected');
|
||||
}
|
||||
trackMap.push(value);
|
||||
value = value.foldToObject();
|
||||
}
|
||||
newFoldedObject[keyName] = plugins.lodashCloneDeep(value);
|
||||
}
|
||||
return newFoldedObject;
|
||||
}
|
||||
|
||||
/**
|
||||
* enfolds data from an object
|
||||
* folds a class into an object
|
||||
*/
|
||||
public enfoldFromObject(objectArg) {
|
||||
for (const keyName in objectArg) {
|
||||
if (this.saveableProperties.indexOf(keyName) !== -1) {
|
||||
this[keyName] = objectArg[keyName];
|
||||
}
|
||||
}
|
||||
public foldToJson() {
|
||||
const foldedObject = this.foldToObject();
|
||||
return stringify(foldedObject);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Decorator that marks a property as foldable
|
||||
*/
|
||||
export let foldDec = () => {
|
||||
export const foldDec = () => {
|
||||
return (target: any, key: string) => {
|
||||
if (!target.saveableProperties) {
|
||||
target.saveableProperties = [];
|
||||
@ -50,3 +89,9 @@ export let foldDec = () => {
|
||||
target.saveableProperties.push(key);
|
||||
};
|
||||
};
|
||||
|
||||
export const deepEqualObjects = (object1: any, object2: any): boolean => {
|
||||
const object1String = stringify(object1);
|
||||
const object2String = stringify(object2);
|
||||
return object1String === object2String;
|
||||
};
|
||||
|
@ -1,4 +1,26 @@
|
||||
// third party scope
|
||||
import lodashCloneDeep from 'lodash.clonedeep';
|
||||
import stableJson from 'fast-json-stable-stringify';
|
||||
import stableJson2 from 'fast-json-stable-stringify';
|
||||
import bufferJson from 'buffer-json';
|
||||
|
||||
export { lodashCloneDeep, stableJson };
|
||||
const stableJson = stableJson2 as any;
|
||||
|
||||
export { bufferJson, lodashCloneDeep, stableJson };
|
||||
|
||||
export interface IStableJsonTypes {
|
||||
Comparator: (
|
||||
a: IStableJsonTypes['CompareDescriptor'],
|
||||
b: IStableJsonTypes['CompareDescriptor']
|
||||
) => number;
|
||||
CompareDescriptor: {
|
||||
key: string;
|
||||
value: any;
|
||||
};
|
||||
Options: {
|
||||
cmp?: (
|
||||
a: IStableJsonTypes['CompareDescriptor'],
|
||||
b: IStableJsonTypes['CompareDescriptor']
|
||||
) => number;
|
||||
cycles?: boolean;
|
||||
};
|
||||
}
|
||||
|
@ -1,8 +1,10 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"experimentalDecorators": true,
|
||||
"esModuleInterop": true,
|
||||
"target": "es2017",
|
||||
"module": "commonjs"
|
||||
}
|
||||
"compilerOptions": {
|
||||
"experimentalDecorators": true,
|
||||
"useDefineForClassFields": false,
|
||||
"target": "ES2022",
|
||||
"module": "ES2022",
|
||||
"moduleResolution": "nodenext",
|
||||
"esModuleInterop": true
|
||||
}
|
||||
}
|
||||
|
17
tslint.json
17
tslint.json
@ -1,17 +0,0 @@
|
||||
{
|
||||
"extends": ["tslint:latest", "tslint-config-prettier"],
|
||||
"rules": {
|
||||
"semicolon": [true, "always"],
|
||||
"no-console": false,
|
||||
"ordered-imports": false,
|
||||
"object-literal-sort-keys": false,
|
||||
"member-ordering": {
|
||||
"options":{
|
||||
"order": [
|
||||
"static-method"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"defaultSeverity": "warning"
|
||||
}
|
Reference in New Issue
Block a user