projen 0.91.28 → 0.91.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +11 -10
- package/lib/awscdk/auto-discover.js +5 -5
- package/lib/awscdk/awscdk-app-java.js +1 -1
- package/lib/awscdk/awscdk-app-py.js +1 -1
- package/lib/awscdk/awscdk-app-ts.js +1 -1
- package/lib/awscdk/awscdk-construct.js +2 -2
- package/lib/awscdk/awscdk-deps-java.js +1 -1
- package/lib/awscdk/awscdk-deps-js.js +1 -1
- package/lib/awscdk/awscdk-deps-py.js +1 -1
- package/lib/awscdk/awscdk-deps.js +1 -1
- package/lib/awscdk/cdk-config.js +1 -1
- package/lib/awscdk/cdk-tasks.js +1 -1
- package/lib/awscdk/integration-test.js +1 -1
- package/lib/awscdk/lambda-extension.js +1 -1
- package/lib/awscdk/lambda-function.js +2 -2
- package/lib/build/build-workflow.js +1 -1
- package/lib/cdk/auto-discover-base.js +2 -2
- package/lib/cdk/construct-lib.js +1 -1
- package/lib/cdk/integration-test-base.js +1 -1
- package/lib/cdk/jsii-docgen.js +1 -1
- package/lib/cdk/jsii-project.js +1 -1
- package/lib/cdk8s/auto-discover.js +2 -2
- package/lib/cdk8s/cdk8s-app-py.js +1 -1
- package/lib/cdk8s/cdk8s-app-ts.js +1 -1
- package/lib/cdk8s/cdk8s-construct.js +1 -1
- package/lib/cdk8s/cdk8s-deps-py.js +1 -1
- package/lib/cdk8s/cdk8s-deps.js +1 -1
- package/lib/cdk8s/integration-test.js +1 -1
- package/lib/cdktf/cdktf-construct.js +1 -1
- package/lib/circleci/circleci.js +1 -1
- package/lib/component.js +1 -1
- package/lib/dependencies.js +1 -1
- package/lib/dev-env.js +1 -1
- package/lib/docker-compose/docker-compose-service.js +1 -1
- package/lib/docker-compose/docker-compose.js +1 -1
- package/lib/file.js +1 -1
- package/lib/gitattributes.js +1 -1
- package/lib/github/actions-provider.js +1 -1
- package/lib/github/auto-approve.js +1 -1
- package/lib/github/auto-merge.js +1 -1
- package/lib/github/auto-queue.js +1 -1
- package/lib/github/dependabot.js +1 -1
- package/lib/github/github-credentials.js +1 -1
- package/lib/github/github-project.js +1 -1
- package/lib/github/github.js +1 -1
- package/lib/github/merge-queue.js +1 -1
- package/lib/github/mergify.js +1 -1
- package/lib/github/pr-template.js +1 -1
- package/lib/github/pull-request-backport.js +1 -1
- package/lib/github/pull-request-lint.js +1 -1
- package/lib/github/stale.js +1 -1
- package/lib/github/task-workflow-job.js +1 -1
- package/lib/github/task-workflow.js +1 -1
- package/lib/github/workflow-actions.js +1 -1
- package/lib/github/workflow-jobs.js +1 -1
- package/lib/github/workflow-steps.js +1 -1
- package/lib/github/workflows.js +1 -1
- package/lib/gitlab/configuration.js +1 -1
- package/lib/gitlab/gitlab-configuration.js +1 -1
- package/lib/gitlab/nested-configuration.js +1 -1
- package/lib/gitpod.js +1 -1
- package/lib/ignore-file.js +1 -1
- package/lib/ini.js +1 -1
- package/lib/java/java-project.js +1 -1
- package/lib/java/junit.js +1 -1
- package/lib/java/maven-compile.js +1 -1
- package/lib/java/maven-packaging.js +1 -1
- package/lib/java/maven-sample.js +1 -1
- package/lib/java/pom.js +2 -2
- package/lib/java/projenrc.js +1 -1
- package/lib/javascript/bundler.js +1 -1
- package/lib/javascript/eslint.js +1 -1
- package/lib/javascript/jest.js +4 -4
- package/lib/javascript/license-checker.js +1 -1
- package/lib/javascript/node-package.js +1 -1
- package/lib/javascript/node-project.js +1 -1
- package/lib/javascript/npm-config.js +1 -1
- package/lib/javascript/prettier.js +1 -1
- package/lib/javascript/projenrc.js +1 -1
- package/lib/javascript/typescript-config.js +2 -2
- package/lib/javascript/upgrade-dependencies.js +2 -2
- package/lib/javascript/yarnrc.js +1 -1
- package/lib/json-patch.js +1 -1
- package/lib/json.js +1 -1
- package/lib/license.js +1 -1
- package/lib/logger.js +1 -1
- package/lib/makefile.js +1 -1
- package/lib/object-file.js +1 -1
- package/lib/project-build.js +1 -1
- package/lib/project-tree.js +1 -1
- package/lib/project.js +1 -1
- package/lib/projects.js +1 -1
- package/lib/projenrc-json.js +2 -2
- package/lib/projenrc.js +1 -1
- package/lib/python/pip.js +1 -1
- package/lib/python/poetry.js +2 -2
- package/lib/python/projenrc.js +1 -1
- package/lib/python/pytest-sample.js +1 -1
- package/lib/python/pytest.js +1 -1
- package/lib/python/python-project.js +1 -1
- package/lib/python/python-sample.js +1 -1
- package/lib/python/requirements-file.js +1 -1
- package/lib/python/setuppy.js +1 -1
- package/lib/python/setuptools.js +1 -1
- package/lib/python/venv.js +1 -1
- package/lib/readme.js +1 -1
- package/lib/release/publisher.js +1 -1
- package/lib/release/release-trigger.js +1 -1
- package/lib/release/release.js +1 -1
- package/lib/renovatebot.js +1 -1
- package/lib/run-task.cjs +451 -1
- package/lib/sample-file.js +2 -2
- package/lib/semver.js +1 -1
- package/lib/source-code.js +1 -1
- package/lib/task-runtime.js +4 -3
- package/lib/task.js +1 -1
- package/lib/tasks.js +1 -1
- package/lib/testing.js +1 -1
- package/lib/textfile.js +1 -1
- package/lib/toml.js +1 -1
- package/lib/typescript/projenrc-ts.js +1 -1
- package/lib/typescript/projenrc.js +1 -1
- package/lib/typescript/typescript-typedoc.js +1 -1
- package/lib/typescript/typescript.js +6 -6
- package/lib/version.js +2 -2
- package/lib/vscode/devcontainer.js +1 -1
- package/lib/vscode/extensions.js +1 -1
- package/lib/vscode/launch-config.js +1 -1
- package/lib/vscode/settings.js +1 -1
- package/lib/vscode/vscode.js +1 -1
- package/lib/web/next.js +3 -3
- package/lib/web/postcss.js +1 -1
- package/lib/web/react.js +4 -4
- package/lib/web/tailwind.js +1 -1
- package/lib/xmlfile.js +1 -1
- package/lib/yaml.js +1 -1
- package/node_modules/just-diff/CHANGELOG.md +49 -0
- package/node_modules/just-diff/LICENSE +21 -0
- package/node_modules/just-diff/README.md +86 -0
- package/node_modules/just-diff/index.cjs +230 -0
- package/node_modules/just-diff/index.d.ts +20 -0
- package/node_modules/just-diff/index.mjs +227 -0
- package/node_modules/just-diff/index.tests.ts +65 -0
- package/node_modules/just-diff/package.json +33 -0
- package/node_modules/just-diff/rollup.config.js +3 -0
- package/node_modules/just-diff-apply/CHANGELOG.md +43 -0
- package/node_modules/just-diff-apply/LICENSE +21 -0
- package/node_modules/just-diff-apply/README.md +69 -0
- package/node_modules/just-diff-apply/index.cjs +161 -0
- package/node_modules/just-diff-apply/index.d.ts +17 -0
- package/node_modules/just-diff-apply/index.mjs +158 -0
- package/node_modules/just-diff-apply/index.tests.ts +108 -0
- package/node_modules/just-diff-apply/package.json +34 -0
- package/node_modules/just-diff-apply/rollup.config.js +3 -0
- package/node_modules/parse-conflict-json/LICENSE.md +20 -0
- package/node_modules/parse-conflict-json/README.md +42 -0
- package/node_modules/parse-conflict-json/lib/index.js +104 -0
- package/node_modules/parse-conflict-json/node_modules/json-parse-even-better-errors/LICENSE.md +25 -0
- package/node_modules/parse-conflict-json/node_modules/json-parse-even-better-errors/README.md +96 -0
- package/node_modules/parse-conflict-json/node_modules/json-parse-even-better-errors/lib/index.js +137 -0
- package/node_modules/parse-conflict-json/node_modules/json-parse-even-better-errors/package.json +50 -0
- package/node_modules/parse-conflict-json/package.json +51 -0
- package/package.json +4 -1
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/*
|
|
2
|
+
const obj1 = {a: 4, b: 5};
|
|
3
|
+
const obj2 = {a: 3, b: 5};
|
|
4
|
+
const obj3 = {a: 4, c: 5};
|
|
5
|
+
|
|
6
|
+
diff(obj1, obj2);
|
|
7
|
+
[
|
|
8
|
+
{ "op": "replace", "path": ['a'], "value": 3 }
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
diff(obj2, obj3);
|
|
12
|
+
[
|
|
13
|
+
{ "op": "remove", "path": ['b'] },
|
|
14
|
+
{ "op": "replace", "path": ['a'], "value": 4 }
|
|
15
|
+
{ "op": "add", "path": ['c'], "value": 5 }
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
// using converter to generate jsPatch standard paths
|
|
19
|
+
// see http://jsonpatch.com
|
|
20
|
+
import {diff, jsonPatchPathConverter} from 'just-diff'
|
|
21
|
+
diff(obj1, obj2, jsonPatchPathConverter);
|
|
22
|
+
[
|
|
23
|
+
{ "op": "replace", "path": '/a', "value": 3 }
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
diff(obj2, obj3, jsonPatchPathConverter);
|
|
27
|
+
[
|
|
28
|
+
{ "op": "remove", "path": '/b' },
|
|
29
|
+
{ "op": "replace", "path": '/a', "value": 4 }
|
|
30
|
+
{ "op": "add", "path": '/c', "value": 5 }
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
// arrays
|
|
34
|
+
const obj4 = {a: 4, b: [1, 2, 3]};
|
|
35
|
+
const obj5 = {a: 3, b: [1, 2, 4]};
|
|
36
|
+
const obj6 = {a: 3, b: [1, 2, 4, 5]};
|
|
37
|
+
|
|
38
|
+
diff(obj4, obj5);
|
|
39
|
+
[
|
|
40
|
+
{ "op": "replace", "path": ['a'], "value": 3 }
|
|
41
|
+
{ "op": "replace", "path": ['b', 2], "value": 4 }
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
diff(obj5, obj6);
|
|
45
|
+
[
|
|
46
|
+
{ "op": "add", "path": ['b', 3], "value": 5 }
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
// nested paths
|
|
50
|
+
const obj7 = {a: 4, b: {c: 3}};
|
|
51
|
+
const obj8 = {a: 4, b: {c: 4}};
|
|
52
|
+
const obj9 = {a: 5, b: {d: 4}};
|
|
53
|
+
|
|
54
|
+
diff(obj7, obj8);
|
|
55
|
+
[
|
|
56
|
+
{ "op": "replace", "path": ['b', 'c'], "value": 4 }
|
|
57
|
+
]
|
|
58
|
+
|
|
59
|
+
diff(obj8, obj9);
|
|
60
|
+
[
|
|
61
|
+
{ "op": "replace", "path": ['a'], "value": 5 }
|
|
62
|
+
{ "op": "remove", "path": ['b', 'c']}
|
|
63
|
+
{ "op": "add", "path": ['b', 'd'], "value": 4 }
|
|
64
|
+
]
|
|
65
|
+
*/
|
|
66
|
+
|
|
67
|
+
function diff(obj1, obj2, pathConverter) {
|
|
68
|
+
if (!obj1 || typeof obj1 != 'object' || !obj2 || typeof obj2 != 'object') {
|
|
69
|
+
throw new Error('both arguments must be objects or arrays');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
pathConverter ||
|
|
73
|
+
(pathConverter = function(arr) {
|
|
74
|
+
return arr;
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
function getDiff({obj1, obj2, basePath, basePathForRemoves, diffs}) {
|
|
78
|
+
var obj1Keys = Object.keys(obj1);
|
|
79
|
+
var obj1KeysLength = obj1Keys.length;
|
|
80
|
+
var obj2Keys = Object.keys(obj2);
|
|
81
|
+
var obj2KeysLength = obj2Keys.length;
|
|
82
|
+
var path;
|
|
83
|
+
|
|
84
|
+
var lengthDelta = obj1.length - obj2.length;
|
|
85
|
+
|
|
86
|
+
if (trimFromRight(obj1, obj2)) {
|
|
87
|
+
for (var i = 0; i < obj1KeysLength; i++) {
|
|
88
|
+
var key = Array.isArray(obj1) ? Number(obj1Keys[i]) : obj1Keys[i];
|
|
89
|
+
if (!(key in obj2)) {
|
|
90
|
+
path = basePathForRemoves.concat(key);
|
|
91
|
+
diffs.remove.push({
|
|
92
|
+
op: 'remove',
|
|
93
|
+
path: pathConverter(path),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
for (var i = 0; i < obj2KeysLength; i++) {
|
|
99
|
+
var key = Array.isArray(obj2) ? Number(obj2Keys[i]) : obj2Keys[i];
|
|
100
|
+
pushReplaces({
|
|
101
|
+
key,
|
|
102
|
+
obj1,
|
|
103
|
+
obj2,
|
|
104
|
+
path: basePath.concat(key),
|
|
105
|
+
pathForRemoves: basePath.concat(key),
|
|
106
|
+
diffs,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
// trim from left, objects are both arrays
|
|
111
|
+
for (var i = 0; i < lengthDelta; i++) {
|
|
112
|
+
path = basePathForRemoves.concat(i);
|
|
113
|
+
diffs.remove.push({
|
|
114
|
+
op: 'remove',
|
|
115
|
+
path: pathConverter(path),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// now make a copy of obj1 with excess elements left trimmed and see if there any replaces
|
|
120
|
+
var obj1Trimmed = obj1.slice(lengthDelta);;
|
|
121
|
+
for (var i = 0; i < obj2KeysLength; i++) {
|
|
122
|
+
pushReplaces({
|
|
123
|
+
key: i,
|
|
124
|
+
obj1: obj1Trimmed,
|
|
125
|
+
obj2,
|
|
126
|
+
path: basePath.concat(i),
|
|
127
|
+
// since list of removes are reversed before presenting result,
|
|
128
|
+
// we need to ignore existing parent removes when doing nested removes
|
|
129
|
+
pathForRemoves: basePath.concat(i + lengthDelta),
|
|
130
|
+
diffs,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
var diffs = {remove: [], replace: [], add: []};
|
|
137
|
+
getDiff({
|
|
138
|
+
obj1,
|
|
139
|
+
obj2,
|
|
140
|
+
basePath: [],
|
|
141
|
+
basePathForRemoves: [],
|
|
142
|
+
diffs,
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
// reverse removes since we want to maintain indexes
|
|
146
|
+
return diffs.remove
|
|
147
|
+
.reverse()
|
|
148
|
+
.concat(diffs.replace)
|
|
149
|
+
.concat(diffs.add);
|
|
150
|
+
|
|
151
|
+
function pushReplaces({key, obj1, obj2, path, pathForRemoves, diffs}) {
|
|
152
|
+
var obj1AtKey = obj1[key];
|
|
153
|
+
var obj2AtKey = obj2[key];
|
|
154
|
+
|
|
155
|
+
if(!(key in obj1) && (key in obj2)) {
|
|
156
|
+
var obj2Value = obj2AtKey;
|
|
157
|
+
diffs.add.push({
|
|
158
|
+
op: 'add',
|
|
159
|
+
path: pathConverter(path),
|
|
160
|
+
value: obj2Value,
|
|
161
|
+
});
|
|
162
|
+
} else if(obj1AtKey !== obj2AtKey) {
|
|
163
|
+
if(Object(obj1AtKey) !== obj1AtKey ||
|
|
164
|
+
Object(obj2AtKey) !== obj2AtKey || differentTypes(obj1AtKey, obj2AtKey)
|
|
165
|
+
) {
|
|
166
|
+
pushReplace(path, diffs, obj2AtKey);
|
|
167
|
+
} else {
|
|
168
|
+
if(!Object.keys(obj1AtKey).length &&
|
|
169
|
+
!Object.keys(obj2AtKey).length &&
|
|
170
|
+
String(obj1AtKey) != String(obj2AtKey)) {
|
|
171
|
+
pushReplace(path, diffs, obj2AtKey);
|
|
172
|
+
} else {
|
|
173
|
+
getDiff({
|
|
174
|
+
obj1: obj1[key],
|
|
175
|
+
obj2: obj2[key],
|
|
176
|
+
basePath: path,
|
|
177
|
+
basePathForRemoves: pathForRemoves,
|
|
178
|
+
diffs});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function pushReplace(path, diffs, newValue) {
|
|
185
|
+
diffs.replace.push({
|
|
186
|
+
op: 'replace',
|
|
187
|
+
path: pathConverter(path),
|
|
188
|
+
value: newValue,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function jsonPatchPathConverter(arrayPath) {
|
|
194
|
+
return [''].concat(arrayPath).join('/');
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function differentTypes(a, b) {
|
|
198
|
+
return Object.prototype.toString.call(a) != Object.prototype.toString.call(b);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function trimFromRight(obj1, obj2) {
|
|
202
|
+
var lengthDelta = obj1.length - obj2.length;
|
|
203
|
+
if (Array.isArray(obj1) && Array.isArray(obj2) && lengthDelta > 0) {
|
|
204
|
+
var leftMatches = 0;
|
|
205
|
+
var rightMatches = 0;
|
|
206
|
+
for (var i = 0; i < obj2.length; i++) {
|
|
207
|
+
if (String(obj1[i]) === String(obj2[i])) {
|
|
208
|
+
leftMatches++;
|
|
209
|
+
} else {
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
for (var j = obj2.length; j > 0; j--) {
|
|
214
|
+
if (String(obj1[j + lengthDelta]) === String(obj2[j])) {
|
|
215
|
+
rightMatches++;
|
|
216
|
+
} else {
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// bias to trim right becase it requires less index shifting
|
|
222
|
+
return leftMatches >= rightMatches;
|
|
223
|
+
}
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export {diff, jsonPatchPathConverter};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import * as diffObj from './index'
|
|
2
|
+
|
|
3
|
+
const {diff, jsonPatchPathConverter} = diffObj;
|
|
4
|
+
const obj1 = {a: 2, b: 3};
|
|
5
|
+
const obj2 = {a: 2, c: 1};
|
|
6
|
+
const arr1 = [1, 'bee'];
|
|
7
|
+
const arr2 = [2, 'bee'];
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
//OK
|
|
11
|
+
diff(obj1, obj2);
|
|
12
|
+
diff(arr1, arr2);
|
|
13
|
+
diff(obj1, arr1);
|
|
14
|
+
diff(obj2, arr2);
|
|
15
|
+
diff(/yes/, arr1);
|
|
16
|
+
diff(new Date(), arr2);
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
diff(obj1, obj2, jsonPatchPathConverter);
|
|
20
|
+
diff(arr1, arr2, jsonPatchPathConverter);
|
|
21
|
+
diff(obj1, arr1, jsonPatchPathConverter);
|
|
22
|
+
diff(obj2, arr2, jsonPatchPathConverter);
|
|
23
|
+
|
|
24
|
+
// not OK
|
|
25
|
+
// @ts-expect-error
|
|
26
|
+
diff(obj1);
|
|
27
|
+
// @ts-expect-error
|
|
28
|
+
diff(arr2);
|
|
29
|
+
// @ts-expect-error
|
|
30
|
+
diff('a');
|
|
31
|
+
// @ts-expect-error
|
|
32
|
+
diff(true);
|
|
33
|
+
|
|
34
|
+
// @ts-expect-error
|
|
35
|
+
diff(obj1, 1);
|
|
36
|
+
// @ts-expect-error
|
|
37
|
+
diff(3, arr2);
|
|
38
|
+
// @ts-expect-error
|
|
39
|
+
diff(obj1, 'a');
|
|
40
|
+
// @ts-expect-error
|
|
41
|
+
diff('b', arr2);
|
|
42
|
+
|
|
43
|
+
// @ts-expect-error
|
|
44
|
+
diff('a', jsonPatchPathConverter);
|
|
45
|
+
// @ts-expect-error
|
|
46
|
+
diff(true, jsonPatchPathConverter);
|
|
47
|
+
|
|
48
|
+
// @ts-expect-error
|
|
49
|
+
diff(obj1, 1, jsonPatchPathConverter);
|
|
50
|
+
// @ts-expect-error
|
|
51
|
+
diff(3, arr2, jsonPatchPathConverter);
|
|
52
|
+
// @ts-expect-error
|
|
53
|
+
diff(obj1, 'a', jsonPatchPathConverter);
|
|
54
|
+
// @ts-expect-error
|
|
55
|
+
diff('b', arr2, jsonPatchPathConverter);
|
|
56
|
+
|
|
57
|
+
// @ts-expect-error
|
|
58
|
+
diff(obj1, obj2, 'a');
|
|
59
|
+
// @ts-expect-error
|
|
60
|
+
diff(arr1, arr2, 1);
|
|
61
|
+
// @ts-expect-error
|
|
62
|
+
diff(obj1, arr1, 'bee');
|
|
63
|
+
// @ts-expect-error
|
|
64
|
+
diff(obj2, arr2, 'nope');
|
|
65
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "just-diff",
|
|
3
|
+
"version": "6.0.2",
|
|
4
|
+
"description": "Return an object representing the diffs between two objects. Supports jsonPatch protocol",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./index.d.ts",
|
|
9
|
+
"require": "./index.cjs",
|
|
10
|
+
"import": "./index.mjs"
|
|
11
|
+
},
|
|
12
|
+
"./package.json": "./package.json"
|
|
13
|
+
},
|
|
14
|
+
"main": "index.cjs",
|
|
15
|
+
"types": "index.d.ts",
|
|
16
|
+
"scripts": {
|
|
17
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
18
|
+
"build": "rollup -c"
|
|
19
|
+
},
|
|
20
|
+
"repository": "https://github.com/angus-c/just",
|
|
21
|
+
"keywords": [
|
|
22
|
+
"object",
|
|
23
|
+
"diff",
|
|
24
|
+
"jsonPatch",
|
|
25
|
+
"no-dependencies",
|
|
26
|
+
"just"
|
|
27
|
+
],
|
|
28
|
+
"author": "Angus Croll",
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"bugs": {
|
|
31
|
+
"url": "https://github.com/angus-c/just/issues"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# just-diff-apply
|
|
2
|
+
|
|
3
|
+
## 5.5.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Rename node module .js -> .cjs
|
|
8
|
+
|
|
9
|
+
## 5.4.1
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- fix: reorder exports to set default last #488
|
|
14
|
+
|
|
15
|
+
## 5.4.0
|
|
16
|
+
|
|
17
|
+
### Minor Changes
|
|
18
|
+
|
|
19
|
+
- package.json updates to fix #467 and #483
|
|
20
|
+
|
|
21
|
+
## 5.3.1
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- Fix README
|
|
26
|
+
|
|
27
|
+
## 5.3.0
|
|
28
|
+
|
|
29
|
+
### Minor Changes
|
|
30
|
+
|
|
31
|
+
- Update .mjs module and d.ts
|
|
32
|
+
|
|
33
|
+
## 5.2.0
|
|
34
|
+
|
|
35
|
+
### Minor Changes
|
|
36
|
+
|
|
37
|
+
- Add support for 'move' op (https://datatracker.ietf.org/doc/html/rfc6902#section-4.4)
|
|
38
|
+
|
|
39
|
+
## 5.0.0
|
|
40
|
+
|
|
41
|
+
### Major Changes
|
|
42
|
+
|
|
43
|
+
- Disallow prototype updates
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2016 angus croll
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<!-- DO NOT EDIT THIS FILE! THIS FILE WAS AUTOGENERATED BY TEMPLATE-MATE -->
|
|
2
|
+
<!-- SEE https://github.com/angus-c/just/blob/master/CONTRIBUTING.md#readme-template -->
|
|
3
|
+
|
|
4
|
+
## just-diff-apply
|
|
5
|
+
|
|
6
|
+
Part of a [library](https://anguscroll.com/just) of zero-dependency npm modules that do just do one thing.
|
|
7
|
+
Guilt-free utilities for every occasion.
|
|
8
|
+
|
|
9
|
+
[`🍦 Try it`](https://anguscroll.com/just/just-diff-apply)
|
|
10
|
+
|
|
11
|
+
```shell
|
|
12
|
+
npm install just-diff-apply
|
|
13
|
+
```
|
|
14
|
+
```shell
|
|
15
|
+
yarn add just-diff-apply
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Apply a diff object to an object. Pass converter to apply a http://jsonpatch.com standard patch
|
|
19
|
+
|
|
20
|
+
```js
|
|
21
|
+
import {diffApply} from 'just-diff-apply';
|
|
22
|
+
|
|
23
|
+
const obj1 = {a: 3, b: 5};
|
|
24
|
+
diffApply(obj1,
|
|
25
|
+
[
|
|
26
|
+
{ "op": "remove", "path": ['b'] },
|
|
27
|
+
{ "op": "replace", "path": ['a'], "value": 4 },
|
|
28
|
+
{ "op": "add", "path": ['c'], "value": 5 }
|
|
29
|
+
]
|
|
30
|
+
);
|
|
31
|
+
obj1; // {a: 4, c: 5}
|
|
32
|
+
|
|
33
|
+
const obj2 = {a: 3, b: 5};
|
|
34
|
+
diffApply(obj2,
|
|
35
|
+
[
|
|
36
|
+
{ "op": "move", "from": ['a'], "path": ['c']},
|
|
37
|
+
]
|
|
38
|
+
);
|
|
39
|
+
obj2; // {b: 5, c: 3}
|
|
40
|
+
|
|
41
|
+
// using converter to apply jsPatch standard paths
|
|
42
|
+
// see http://jsonpatch.com
|
|
43
|
+
import {diffApply, jsonPatchPathConverter} from 'just-diff-apply'
|
|
44
|
+
const obj3 = {a: 3, b: 5};
|
|
45
|
+
diffApply(obj3, [
|
|
46
|
+
{ "op": "remove", "path": '/b' },
|
|
47
|
+
{ "op": "replace", "path": '/a', "value": 4 }
|
|
48
|
+
{ "op": "add", "path": '/c', "value": 5 }
|
|
49
|
+
], jsonPatchPathConverter);
|
|
50
|
+
obj3; // {a: 4, c: 5}
|
|
51
|
+
|
|
52
|
+
// arrays (array key can be string or numeric)
|
|
53
|
+
const obj4 = {a: 4, b: [1, 2, 3]};
|
|
54
|
+
diffApply(obj4, [
|
|
55
|
+
{ "op": "replace", "path": ['a'], "value": 3 }
|
|
56
|
+
{ "op": "replace", "path": ['b', 2], "value": 4 }
|
|
57
|
+
{ "op": "add", "path": ['b', 3], "value": 9 }
|
|
58
|
+
]);
|
|
59
|
+
obj4; // {a: 3, b: [1, 2, 4, 9]}
|
|
60
|
+
|
|
61
|
+
// nested paths
|
|
62
|
+
const obj5 = {a: 4, b: {c: 3}};
|
|
63
|
+
diffApply(obj5, [
|
|
64
|
+
{ "op": "replace", "path": ['a'], "value": 5 }
|
|
65
|
+
{ "op": "remove", "path": ['b', 'c']}
|
|
66
|
+
{ "op": "add", "path": ['b', 'd'], "value": 4 }
|
|
67
|
+
]);
|
|
68
|
+
obj5; // {a: 5, b: {d: 4}}
|
|
69
|
+
```
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
diffApply: diffApply,
|
|
3
|
+
jsonPatchPathConverter: jsonPatchPathConverter,
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
const obj1 = {a: 3, b: 5};
|
|
8
|
+
diffApply(obj1,
|
|
9
|
+
[
|
|
10
|
+
{ "op": "remove", "path": ['b'] },
|
|
11
|
+
{ "op": "replace", "path": ['a'], "value": 4 },
|
|
12
|
+
{ "op": "add", "path": ['c'], "value": 5 }
|
|
13
|
+
]
|
|
14
|
+
);
|
|
15
|
+
obj1; // {a: 4, c: 5}
|
|
16
|
+
|
|
17
|
+
// using converter to apply jsPatch standard paths
|
|
18
|
+
// see http://jsonpatch.com
|
|
19
|
+
import {diff, jsonPatchPathConverter} from 'just-diff'
|
|
20
|
+
const obj2 = {a: 3, b: 5};
|
|
21
|
+
diffApply(obj2, [
|
|
22
|
+
{ "op": "remove", "path": '/b' },
|
|
23
|
+
{ "op": "replace", "path": '/a', "value": 4 }
|
|
24
|
+
{ "op": "add", "path": '/c', "value": 5 }
|
|
25
|
+
], jsonPatchPathConverter);
|
|
26
|
+
obj2; // {a: 4, c: 5}
|
|
27
|
+
|
|
28
|
+
// arrays
|
|
29
|
+
const obj3 = {a: 4, b: [1, 2, 3]};
|
|
30
|
+
diffApply(obj3, [
|
|
31
|
+
{ "op": "replace", "path": ['a'], "value": 3 }
|
|
32
|
+
{ "op": "replace", "path": ['b', 2], "value": 4 }
|
|
33
|
+
{ "op": "add", "path": ['b', 3], "value": 9 }
|
|
34
|
+
]);
|
|
35
|
+
obj3; // {a: 3, b: [1, 2, 4, 9]}
|
|
36
|
+
|
|
37
|
+
// nested paths
|
|
38
|
+
const obj4 = {a: 4, b: {c: 3}};
|
|
39
|
+
diffApply(obj4, [
|
|
40
|
+
{ "op": "replace", "path": ['a'], "value": 5 }
|
|
41
|
+
{ "op": "remove", "path": ['b', 'c']}
|
|
42
|
+
{ "op": "add", "path": ['b', 'd'], "value": 4 }
|
|
43
|
+
]);
|
|
44
|
+
obj4; // {a: 5, b: {d: 4}}
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
var REMOVE = 'remove';
|
|
48
|
+
var REPLACE = 'replace';
|
|
49
|
+
var ADD = 'add';
|
|
50
|
+
var MOVE = 'move';
|
|
51
|
+
|
|
52
|
+
function diffApply(obj, diff, pathConverter) {
|
|
53
|
+
if (!obj || typeof obj != 'object') {
|
|
54
|
+
throw new Error('base object must be an object or an array');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (!Array.isArray(diff)) {
|
|
58
|
+
throw new Error('diff must be an array');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
var diffLength = diff.length;
|
|
62
|
+
for (var i = 0; i < diffLength; i++) {
|
|
63
|
+
var thisDiff = diff[i];
|
|
64
|
+
var subObject = obj;
|
|
65
|
+
var thisOp = thisDiff.op;
|
|
66
|
+
|
|
67
|
+
var thisPath = transformPath(pathConverter, thisDiff.path);
|
|
68
|
+
var thisFromPath = thisDiff.from && transformPath(pathConverter, thisDiff.from);
|
|
69
|
+
var toPath, toPathCopy, lastToProp, subToObject, valueToMove;
|
|
70
|
+
|
|
71
|
+
if (thisFromPath) {
|
|
72
|
+
// MOVE only, "fromPath" is effectively path and "path" is toPath
|
|
73
|
+
toPath = thisPath;
|
|
74
|
+
thisPath = thisFromPath;
|
|
75
|
+
|
|
76
|
+
toPathCopy = toPath.slice();
|
|
77
|
+
lastToProp = toPathCopy.pop();
|
|
78
|
+
prototypeCheck(lastToProp);
|
|
79
|
+
if (lastToProp == null) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
var thisToProp;
|
|
84
|
+
while (((thisToProp = toPathCopy.shift())) != null) {
|
|
85
|
+
prototypeCheck(thisToProp);
|
|
86
|
+
if (!(thisToProp in subToObject)) {
|
|
87
|
+
subToObject[thisToProp] = {};
|
|
88
|
+
}
|
|
89
|
+
subToObject = subToObject[thisToProp];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
var pathCopy = thisPath.slice();
|
|
94
|
+
var lastProp = pathCopy.pop();
|
|
95
|
+
prototypeCheck(lastProp);
|
|
96
|
+
if (lastProp == null) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
var thisProp;
|
|
101
|
+
while (((thisProp = pathCopy.shift())) != null) {
|
|
102
|
+
prototypeCheck(thisProp);
|
|
103
|
+
if (!(thisProp in subObject)) {
|
|
104
|
+
subObject[thisProp] = {};
|
|
105
|
+
}
|
|
106
|
+
subObject = subObject[thisProp];
|
|
107
|
+
}
|
|
108
|
+
if (thisOp === REMOVE || thisOp === REPLACE || thisOp === MOVE) {
|
|
109
|
+
var path = thisOp === MOVE ? thisDiff.from : thisDiff.path;
|
|
110
|
+
if (!subObject.hasOwnProperty(lastProp)) {
|
|
111
|
+
throw new Error(['expected to find property', path, 'in object', obj].join(' '));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (thisOp === REMOVE || thisOp === MOVE) {
|
|
115
|
+
if (thisOp === MOVE) {
|
|
116
|
+
valueToMove = subObject[lastProp];
|
|
117
|
+
}
|
|
118
|
+
Array.isArray(subObject) ? subObject.splice(lastProp, 1) : delete subObject[lastProp];
|
|
119
|
+
}
|
|
120
|
+
if (thisOp === REPLACE || thisOp === ADD) {
|
|
121
|
+
subObject[lastProp] = thisDiff.value;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (thisOp === MOVE) {
|
|
125
|
+
subObject[lastToProp] = valueToMove;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return subObject;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function transformPath(pathConverter, thisPath) {
|
|
132
|
+
if(pathConverter) {
|
|
133
|
+
thisPath = pathConverter(thisPath);
|
|
134
|
+
if(!Array.isArray(thisPath)) {
|
|
135
|
+
throw new Error([
|
|
136
|
+
'pathConverter must return an array, returned:',
|
|
137
|
+
thisPath,
|
|
138
|
+
].join(' '));
|
|
139
|
+
}
|
|
140
|
+
} else {
|
|
141
|
+
if(!Array.isArray(thisPath)) {
|
|
142
|
+
throw new Error([
|
|
143
|
+
'diff path',
|
|
144
|
+
thisPath,
|
|
145
|
+
'must be an array, consider supplying a path converter']
|
|
146
|
+
.join(' '));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return thisPath;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function jsonPatchPathConverter(stringPath) {
|
|
153
|
+
return stringPath.split('/').slice(1);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function prototypeCheck(prop) {
|
|
157
|
+
// coercion is intentional to catch prop values like `['__proto__']`
|
|
158
|
+
if (prop == '__proto__' || prop == 'constructor' || prop == 'prototype') {
|
|
159
|
+
throw new Error('setting of prototype values not supported');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Definitions by: Eddie Atkinson <https://github.com/eddie-atkinson>
|
|
2
|
+
|
|
3
|
+
type Operation = "add" | "replace" | "remove" | "move";
|
|
4
|
+
|
|
5
|
+
type DiffOps = Array<{
|
|
6
|
+
op: Operation;
|
|
7
|
+
path: Array<string | number>;
|
|
8
|
+
value?: any;
|
|
9
|
+
}>;
|
|
10
|
+
type PathConverter = (path: string) => string[];
|
|
11
|
+
|
|
12
|
+
export function diffApply<T extends object>(
|
|
13
|
+
obj: T,
|
|
14
|
+
diff: DiffOps,
|
|
15
|
+
pathConverter?: PathConverter
|
|
16
|
+
): T;
|
|
17
|
+
export const jsonPatchPathConverter: PathConverter;
|