Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
9686caff18 | |||
9260d653a1 | |||
28cd849d0d | |||
89a399bf42 | |||
16048fe96d | |||
04d60333a9 | |||
c30f1f4ab9 | |||
fc91dd3171 | |||
55f8951732 | |||
92f212e9d3 | |||
1a22db26da | |||
0d3bcab40f |
4
.gitignore
vendored
4
.gitignore
vendored
@ -15,8 +15,6 @@ node_modules/
|
||||
|
||||
# builds
|
||||
dist/
|
||||
dist_web/
|
||||
dist_serve/
|
||||
dist_ts_web/
|
||||
dist_*/
|
||||
|
||||
# custom
|
@ -1,12 +1,10 @@
|
||||
# gitzone ci_default
|
||||
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||
variables:
|
||||
GIT_STRATEGY: clone
|
||||
|
||||
cache:
|
||||
paths:
|
||||
- .npmci_cache/
|
||||
key: "$CI_BUILD_STAGE"
|
||||
key: '$CI_BUILD_STAGE'
|
||||
|
||||
stages:
|
||||
- security
|
||||
@ -21,20 +19,35 @@ mirror:
|
||||
stage: security
|
||||
script:
|
||||
- npmci git mirror
|
||||
only:
|
||||
- tags
|
||||
tags:
|
||||
- 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
|
||||
|
||||
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
|
||||
@ -50,28 +63,27 @@ testStable:
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
- priv
|
||||
|
||||
testBuild:
|
||||
stage: test
|
||||
script:
|
||||
- npmci npm prepare
|
||||
- npmci node install lts
|
||||
- npmci node install stable
|
||||
- npmci npm install
|
||||
- npmci command npm run build
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
release:
|
||||
stage: release
|
||||
script:
|
||||
- npmci node install lts
|
||||
- npmci node install stable
|
||||
- npmci npm publish
|
||||
only:
|
||||
- tags
|
||||
tags:
|
||||
- lossless
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
@ -81,11 +93,15 @@ release:
|
||||
codequality:
|
||||
stage: metadata
|
||||
allow_failure: true
|
||||
only:
|
||||
- tags
|
||||
script:
|
||||
- npmci command npm install -g tslint typescript
|
||||
- npmci npm prepare
|
||||
- npmci npm install
|
||||
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
|
||||
tags:
|
||||
- lossless
|
||||
- docker
|
||||
- priv
|
||||
|
||||
@ -96,20 +112,20 @@ trigger:
|
||||
only:
|
||||
- tags
|
||||
tags:
|
||||
- lossless
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
pages:
|
||||
image: hosttoday/ht-docker-dbase:npmci
|
||||
services:
|
||||
- docker:18-dind
|
||||
stage: metadata
|
||||
script:
|
||||
- npmci node install lts
|
||||
- npmci command npm install -g @gitzone/tsdoc
|
||||
- npmci npm prepare
|
||||
- npmci npm install
|
||||
- npmci command tsdoc
|
||||
tags:
|
||||
- lossless
|
||||
- docker
|
||||
- notpriv
|
||||
only:
|
||||
|
29
.vscode/launch.json
vendored
Normal file
29
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "current file",
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"args": [
|
||||
"${relativeFile}"
|
||||
],
|
||||
"runtimeArgs": ["-r", "@gitzone/tsrun"],
|
||||
"cwd": "${workspaceRoot}",
|
||||
"protocol": "inspector",
|
||||
"internalConsoleOptions": "openOnSessionStart"
|
||||
},
|
||||
{
|
||||
"name": "test.ts",
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"args": [
|
||||
"test/test.ts"
|
||||
],
|
||||
"runtimeArgs": ["-r", "@gitzone/tsrun"],
|
||||
"cwd": "${workspaceRoot}",
|
||||
"protocol": "inspector",
|
||||
"internalConsoleOptions": "openOnSessionStart"
|
||||
}
|
||||
]
|
||||
}
|
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)
|
||||
|
||||
[](https://maintainedby.lossless.com)
|
2947
package-lock.json
generated
2947
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
22
package.json
22
package.json
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@pushrocks/smartjson",
|
||||
"version": "4.0.0",
|
||||
"version": "4.0.6",
|
||||
"private": false,
|
||||
"description": "typed json handlers",
|
||||
"main": "dist_ts/index.js",
|
||||
@ -23,8 +23,8 @@
|
||||
"@gitzone/tsbuild": "^2.1.25",
|
||||
"@gitzone/tsrun": "^1.2.12",
|
||||
"@gitzone/tstest": "^1.0.52",
|
||||
"@pushrocks/tapbundle": "^3.2.9",
|
||||
"@types/node": "^14.11.2",
|
||||
"@pushrocks/tapbundle": "^3.2.10",
|
||||
"@types/node": "^14.14.22",
|
||||
"tslint": "^6.1.3",
|
||||
"tslint-config-prettier": "^1.18.0"
|
||||
},
|
||||
@ -36,14 +36,18 @@
|
||||
"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"
|
||||
]
|
||||
}
|
||||
|
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)
|
@ -20,16 +20,12 @@ tap.test('should create a Foldable extended instance', async () => {
|
||||
|
||||
tap.test('should create a folded object', async () => {
|
||||
let foldedObject = mySomeClass.foldToObject();
|
||||
expect(foldedObject)
|
||||
.property('thisis')
|
||||
.to.equal('test');
|
||||
expect(foldedObject).property('thisis').to.equal('test');
|
||||
});
|
||||
|
||||
tap.test('should enfold from object', async () => {
|
||||
const mySomeClass2 = SomeClass.enfoldFromObject({ thisis: 'test2' });
|
||||
expect(mySomeClass2)
|
||||
.property('thisis')
|
||||
.to.equal('test2');
|
||||
expect(mySomeClass2).property('thisis').to.equal('test2');
|
||||
});
|
||||
|
||||
tap.start();
|
21
ts/index.ts
21
ts/index.ts
@ -10,7 +10,7 @@ export const parse = plugins.bufferJson.parse;
|
||||
* @param objArg
|
||||
* @param optionsArg
|
||||
*/
|
||||
export const stringify = (objArg: any, optionsArg: plugins.IStableJsonTypes['Options'] = {}) => {
|
||||
export const stringify = (objArg: any, optionsArg: plugins.IStableJsonTypes['Options'] = {}): string => {
|
||||
const bufferedJson = plugins.bufferJson.stringify(objArg);
|
||||
objArg = JSON.parse(bufferedJson);
|
||||
return plugins.stableJson(objArg, optionsArg);
|
||||
@ -49,8 +49,17 @@ 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;
|
||||
}
|
||||
@ -67,7 +76,7 @@ export class Smartjson {
|
||||
/**
|
||||
* Decorator that marks a property as foldable
|
||||
*/
|
||||
export let foldDec = () => {
|
||||
export const foldDec = () => {
|
||||
return (target: any, key: string) => {
|
||||
if (!target.saveableProperties) {
|
||||
target.saveableProperties = [];
|
||||
@ -75,3 +84,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;
|
||||
}
|
||||
|
@ -8,13 +8,19 @@ const stableJson = stableJson2 as any;
|
||||
export { bufferJson, lodashCloneDeep, stableJson };
|
||||
|
||||
export interface IStableJsonTypes {
|
||||
Comparator: (a: IStableJsonTypes['CompareDescriptor'], b: IStableJsonTypes['CompareDescriptor']) => number;
|
||||
Comparator: (
|
||||
a: IStableJsonTypes['CompareDescriptor'],
|
||||
b: IStableJsonTypes['CompareDescriptor']
|
||||
) => number;
|
||||
CompareDescriptor: {
|
||||
key: string;
|
||||
value: any;
|
||||
};
|
||||
Options: {
|
||||
cmp?: (a: IStableJsonTypes['CompareDescriptor'], b: IStableJsonTypes['CompareDescriptor']) => number;
|
||||
cmp?: (
|
||||
a: IStableJsonTypes['CompareDescriptor'],
|
||||
b: IStableJsonTypes['CompareDescriptor']
|
||||
) => number;
|
||||
cycles?: boolean;
|
||||
};
|
||||
}
|
||||
|
Reference in New Issue
Block a user