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.
Files changed (163) hide show
  1. package/.jsii +11 -10
  2. package/lib/awscdk/auto-discover.js +5 -5
  3. package/lib/awscdk/awscdk-app-java.js +1 -1
  4. package/lib/awscdk/awscdk-app-py.js +1 -1
  5. package/lib/awscdk/awscdk-app-ts.js +1 -1
  6. package/lib/awscdk/awscdk-construct.js +2 -2
  7. package/lib/awscdk/awscdk-deps-java.js +1 -1
  8. package/lib/awscdk/awscdk-deps-js.js +1 -1
  9. package/lib/awscdk/awscdk-deps-py.js +1 -1
  10. package/lib/awscdk/awscdk-deps.js +1 -1
  11. package/lib/awscdk/cdk-config.js +1 -1
  12. package/lib/awscdk/cdk-tasks.js +1 -1
  13. package/lib/awscdk/integration-test.js +1 -1
  14. package/lib/awscdk/lambda-extension.js +1 -1
  15. package/lib/awscdk/lambda-function.js +2 -2
  16. package/lib/build/build-workflow.js +1 -1
  17. package/lib/cdk/auto-discover-base.js +2 -2
  18. package/lib/cdk/construct-lib.js +1 -1
  19. package/lib/cdk/integration-test-base.js +1 -1
  20. package/lib/cdk/jsii-docgen.js +1 -1
  21. package/lib/cdk/jsii-project.js +1 -1
  22. package/lib/cdk8s/auto-discover.js +2 -2
  23. package/lib/cdk8s/cdk8s-app-py.js +1 -1
  24. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  25. package/lib/cdk8s/cdk8s-construct.js +1 -1
  26. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  27. package/lib/cdk8s/cdk8s-deps.js +1 -1
  28. package/lib/cdk8s/integration-test.js +1 -1
  29. package/lib/cdktf/cdktf-construct.js +1 -1
  30. package/lib/circleci/circleci.js +1 -1
  31. package/lib/component.js +1 -1
  32. package/lib/dependencies.js +1 -1
  33. package/lib/dev-env.js +1 -1
  34. package/lib/docker-compose/docker-compose-service.js +1 -1
  35. package/lib/docker-compose/docker-compose.js +1 -1
  36. package/lib/file.js +1 -1
  37. package/lib/gitattributes.js +1 -1
  38. package/lib/github/actions-provider.js +1 -1
  39. package/lib/github/auto-approve.js +1 -1
  40. package/lib/github/auto-merge.js +1 -1
  41. package/lib/github/auto-queue.js +1 -1
  42. package/lib/github/dependabot.js +1 -1
  43. package/lib/github/github-credentials.js +1 -1
  44. package/lib/github/github-project.js +1 -1
  45. package/lib/github/github.js +1 -1
  46. package/lib/github/merge-queue.js +1 -1
  47. package/lib/github/mergify.js +1 -1
  48. package/lib/github/pr-template.js +1 -1
  49. package/lib/github/pull-request-backport.js +1 -1
  50. package/lib/github/pull-request-lint.js +1 -1
  51. package/lib/github/stale.js +1 -1
  52. package/lib/github/task-workflow-job.js +1 -1
  53. package/lib/github/task-workflow.js +1 -1
  54. package/lib/github/workflow-actions.js +1 -1
  55. package/lib/github/workflow-jobs.js +1 -1
  56. package/lib/github/workflow-steps.js +1 -1
  57. package/lib/github/workflows.js +1 -1
  58. package/lib/gitlab/configuration.js +1 -1
  59. package/lib/gitlab/gitlab-configuration.js +1 -1
  60. package/lib/gitlab/nested-configuration.js +1 -1
  61. package/lib/gitpod.js +1 -1
  62. package/lib/ignore-file.js +1 -1
  63. package/lib/ini.js +1 -1
  64. package/lib/java/java-project.js +1 -1
  65. package/lib/java/junit.js +1 -1
  66. package/lib/java/maven-compile.js +1 -1
  67. package/lib/java/maven-packaging.js +1 -1
  68. package/lib/java/maven-sample.js +1 -1
  69. package/lib/java/pom.js +2 -2
  70. package/lib/java/projenrc.js +1 -1
  71. package/lib/javascript/bundler.js +1 -1
  72. package/lib/javascript/eslint.js +1 -1
  73. package/lib/javascript/jest.js +4 -4
  74. package/lib/javascript/license-checker.js +1 -1
  75. package/lib/javascript/node-package.js +1 -1
  76. package/lib/javascript/node-project.js +1 -1
  77. package/lib/javascript/npm-config.js +1 -1
  78. package/lib/javascript/prettier.js +1 -1
  79. package/lib/javascript/projenrc.js +1 -1
  80. package/lib/javascript/typescript-config.js +2 -2
  81. package/lib/javascript/upgrade-dependencies.js +2 -2
  82. package/lib/javascript/yarnrc.js +1 -1
  83. package/lib/json-patch.js +1 -1
  84. package/lib/json.js +1 -1
  85. package/lib/license.js +1 -1
  86. package/lib/logger.js +1 -1
  87. package/lib/makefile.js +1 -1
  88. package/lib/object-file.js +1 -1
  89. package/lib/project-build.js +1 -1
  90. package/lib/project-tree.js +1 -1
  91. package/lib/project.js +1 -1
  92. package/lib/projects.js +1 -1
  93. package/lib/projenrc-json.js +2 -2
  94. package/lib/projenrc.js +1 -1
  95. package/lib/python/pip.js +1 -1
  96. package/lib/python/poetry.js +2 -2
  97. package/lib/python/projenrc.js +1 -1
  98. package/lib/python/pytest-sample.js +1 -1
  99. package/lib/python/pytest.js +1 -1
  100. package/lib/python/python-project.js +1 -1
  101. package/lib/python/python-sample.js +1 -1
  102. package/lib/python/requirements-file.js +1 -1
  103. package/lib/python/setuppy.js +1 -1
  104. package/lib/python/setuptools.js +1 -1
  105. package/lib/python/venv.js +1 -1
  106. package/lib/readme.js +1 -1
  107. package/lib/release/publisher.js +1 -1
  108. package/lib/release/release-trigger.js +1 -1
  109. package/lib/release/release.js +1 -1
  110. package/lib/renovatebot.js +1 -1
  111. package/lib/run-task.cjs +451 -1
  112. package/lib/sample-file.js +2 -2
  113. package/lib/semver.js +1 -1
  114. package/lib/source-code.js +1 -1
  115. package/lib/task-runtime.js +4 -3
  116. package/lib/task.js +1 -1
  117. package/lib/tasks.js +1 -1
  118. package/lib/testing.js +1 -1
  119. package/lib/textfile.js +1 -1
  120. package/lib/toml.js +1 -1
  121. package/lib/typescript/projenrc-ts.js +1 -1
  122. package/lib/typescript/projenrc.js +1 -1
  123. package/lib/typescript/typescript-typedoc.js +1 -1
  124. package/lib/typescript/typescript.js +6 -6
  125. package/lib/version.js +2 -2
  126. package/lib/vscode/devcontainer.js +1 -1
  127. package/lib/vscode/extensions.js +1 -1
  128. package/lib/vscode/launch-config.js +1 -1
  129. package/lib/vscode/settings.js +1 -1
  130. package/lib/vscode/vscode.js +1 -1
  131. package/lib/web/next.js +3 -3
  132. package/lib/web/postcss.js +1 -1
  133. package/lib/web/react.js +4 -4
  134. package/lib/web/tailwind.js +1 -1
  135. package/lib/xmlfile.js +1 -1
  136. package/lib/yaml.js +1 -1
  137. package/node_modules/just-diff/CHANGELOG.md +49 -0
  138. package/node_modules/just-diff/LICENSE +21 -0
  139. package/node_modules/just-diff/README.md +86 -0
  140. package/node_modules/just-diff/index.cjs +230 -0
  141. package/node_modules/just-diff/index.d.ts +20 -0
  142. package/node_modules/just-diff/index.mjs +227 -0
  143. package/node_modules/just-diff/index.tests.ts +65 -0
  144. package/node_modules/just-diff/package.json +33 -0
  145. package/node_modules/just-diff/rollup.config.js +3 -0
  146. package/node_modules/just-diff-apply/CHANGELOG.md +43 -0
  147. package/node_modules/just-diff-apply/LICENSE +21 -0
  148. package/node_modules/just-diff-apply/README.md +69 -0
  149. package/node_modules/just-diff-apply/index.cjs +161 -0
  150. package/node_modules/just-diff-apply/index.d.ts +17 -0
  151. package/node_modules/just-diff-apply/index.mjs +158 -0
  152. package/node_modules/just-diff-apply/index.tests.ts +108 -0
  153. package/node_modules/just-diff-apply/package.json +34 -0
  154. package/node_modules/just-diff-apply/rollup.config.js +3 -0
  155. package/node_modules/parse-conflict-json/LICENSE.md +20 -0
  156. package/node_modules/parse-conflict-json/README.md +42 -0
  157. package/node_modules/parse-conflict-json/lib/index.js +104 -0
  158. package/node_modules/parse-conflict-json/node_modules/json-parse-even-better-errors/LICENSE.md +25 -0
  159. package/node_modules/parse-conflict-json/node_modules/json-parse-even-better-errors/README.md +96 -0
  160. package/node_modules/parse-conflict-json/node_modules/json-parse-even-better-errors/lib/index.js +137 -0
  161. package/node_modules/parse-conflict-json/node_modules/json-parse-even-better-errors/package.json +50 -0
  162. package/node_modules/parse-conflict-json/package.json +51 -0
  163. 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,3 @@
1
+ const createRollupConfig = require('../../config/createRollupConfig');
2
+
3
+ module.exports = createRollupConfig(__dirname);
@@ -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;