@roundtreasury/prisma-extension-soft-delete 1.2.0 → 2.0.0
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/dist/esm/generated/nested-ops-meta/index.d.ts +13 -0
- package/dist/esm/generated/nested-ops-meta/index.js +107 -0
- package/dist/esm/generated/prisma/browser.d.ts +24 -0
- package/dist/esm/generated/prisma/browser.js +17 -0
- package/dist/esm/generated/prisma/client.d.ts +43 -0
- package/dist/esm/generated/prisma/client.js +31 -0
- package/dist/esm/generated/prisma/commonInputTypes.d.ts +359 -0
- package/dist/esm/generated/prisma/commonInputTypes.js +10 -0
- package/dist/esm/generated/prisma/enums.js +10 -0
- package/dist/esm/generated/prisma/internal/class.d.ts +165 -0
- package/dist/esm/generated/prisma/internal/class.js +49 -0
- package/dist/esm/generated/prisma/internal/prismaNamespace.d.ts +815 -0
- package/dist/esm/generated/prisma/internal/prismaNamespace.js +131 -0
- package/dist/esm/generated/prisma/internal/prismaNamespaceBrowser.d.ts +95 -0
- package/dist/esm/generated/prisma/internal/prismaNamespaceBrowser.js +102 -0
- package/dist/esm/generated/prisma/models/Comment.d.ts +1768 -0
- package/dist/esm/generated/prisma/models/Comment.js +1 -0
- package/dist/esm/generated/prisma/models/Post.d.ts +1543 -0
- package/dist/esm/generated/prisma/models/Post.js +1 -0
- package/dist/esm/generated/prisma/models/Profile.d.ts +1130 -0
- package/dist/esm/generated/prisma/models/Profile.js +1 -0
- package/dist/esm/generated/prisma/models/User.d.ts +1531 -0
- package/dist/esm/generated/prisma/models/User.js +1 -0
- package/dist/esm/generated/prisma/models.d.ts +5 -0
- package/dist/esm/generated/prisma/models.js +1 -0
- package/dist/esm/prisma.config.d.ts +3 -0
- package/dist/esm/prisma.config.js +11 -0
- package/dist/esm/src/lib/createSoftDeleteExtension.d.ts +2 -0
- package/dist/esm/{lib → src/lib}/createSoftDeleteExtension.js +11 -13
- package/dist/esm/{lib → src/lib}/helpers/createParams.d.ts +4 -4
- package/dist/esm/{lib → src/lib}/helpers/createParams.js +4 -16
- package/dist/esm/{lib → src/lib}/types.d.ts +14 -4
- package/dist/esm/src/lib/types.js +1 -0
- package/dist/generated/nested-ops-meta/index.d.ts +13 -0
- package/dist/generated/nested-ops-meta/index.js +110 -0
- package/dist/generated/prisma/browser.d.ts +24 -0
- package/dist/generated/prisma/browser.js +56 -0
- package/dist/generated/prisma/client.d.ts +43 -0
- package/dist/generated/prisma/client.js +70 -0
- package/dist/generated/prisma/commonInputTypes.d.ts +359 -0
- package/dist/generated/prisma/commonInputTypes.js +11 -0
- package/dist/generated/prisma/enums.d.ts +1 -0
- package/dist/generated/prisma/enums.js +11 -0
- package/dist/generated/prisma/internal/class.d.ts +165 -0
- package/dist/generated/prisma/internal/class.js +85 -0
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +815 -0
- package/dist/generated/prisma/internal/prismaNamespace.js +167 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +95 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +138 -0
- package/dist/generated/prisma/models/Comment.d.ts +1768 -0
- package/dist/generated/prisma/models/Comment.js +2 -0
- package/dist/generated/prisma/models/Post.d.ts +1543 -0
- package/dist/generated/prisma/models/Post.js +2 -0
- package/dist/generated/prisma/models/Profile.d.ts +1130 -0
- package/dist/generated/prisma/models/Profile.js +2 -0
- package/dist/generated/prisma/models/User.d.ts +1531 -0
- package/dist/generated/prisma/models/User.js +2 -0
- package/dist/generated/prisma/models.d.ts +5 -0
- package/dist/prisma.config.d.ts +3 -0
- package/dist/prisma.config.js +13 -0
- package/dist/src/lib/createSoftDeleteExtension.d.ts +2 -0
- package/dist/{lib → src/lib}/createSoftDeleteExtension.js +12 -15
- package/dist/{lib → src/lib}/helpers/createParams.d.ts +4 -4
- package/dist/{lib → src/lib}/helpers/createParams.js +4 -16
- package/dist/{lib → src/lib}/helpers/modifyResult.js +1 -2
- package/dist/{lib → src/lib}/types.d.ts +14 -4
- package/dist/src/lib/types.js +2 -0
- package/dist/{lib → src/lib}/utils/nestedReads.js +2 -3
- package/dist/{lib → src/lib}/utils/resultFiltering.js +2 -3
- package/package.json +10 -8
- package/dist/esm/lib/createSoftDeleteExtension.d.ts +0 -2
- package/dist/lib/createSoftDeleteExtension.d.ts +0 -2
- /package/dist/esm/{lib/types.js → generated/prisma/enums.d.ts} +0 -0
- /package/dist/esm/{index.d.ts → src/index.d.ts} +0 -0
- /package/dist/esm/{index.js → src/index.js} +0 -0
- /package/dist/esm/{lib → src/lib}/helpers/modifyResult.d.ts +0 -0
- /package/dist/esm/{lib → src/lib}/helpers/modifyResult.js +0 -0
- /package/dist/esm/{lib → src/lib}/utils/nestedReads.d.ts +0 -0
- /package/dist/esm/{lib → src/lib}/utils/nestedReads.js +0 -0
- /package/dist/esm/{lib → src/lib}/utils/resultFiltering.d.ts +0 -0
- /package/dist/esm/{lib → src/lib}/utils/resultFiltering.js +0 -0
- /package/dist/{lib/types.js → generated/prisma/models.js} +0 -0
- /package/dist/{index.d.ts → src/index.d.ts} +0 -0
- /package/dist/{index.js → src/index.js} +0 -0
- /package/dist/{lib → src/lib}/helpers/modifyResult.d.ts +0 -0
- /package/dist/{lib → src/lib}/utils/nestedReads.d.ts +0 -0
- /package/dist/{lib → src/lib}/utils/resultFiltering.d.ts +0 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require("dotenv/config");
|
|
4
|
+
const config_1 = require("prisma/config");
|
|
5
|
+
exports.default = (0, config_1.defineConfig)({
|
|
6
|
+
schema: "prisma/schema.prisma",
|
|
7
|
+
migrations: {
|
|
8
|
+
path: "prisma/migrations",
|
|
9
|
+
},
|
|
10
|
+
datasource: {
|
|
11
|
+
url: process.env.DATABASE_URL,
|
|
12
|
+
},
|
|
13
|
+
});
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Config } from "./types";
|
|
2
|
+
export declare function createSoftDeleteExtension({ models, defaultConfig, modelsMeta, }: Config): (client: any) => import("@prisma/client/extension").PrismaClientExtends<import("@prisma/client/runtime/client").InternalArgs<{}, {}, {}, {}> & import("@prisma/client/runtime/client").DefaultArgs>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createSoftDeleteExtension =
|
|
3
|
+
exports.createSoftDeleteExtension = createSoftDeleteExtension;
|
|
4
4
|
const extension_1 = require("@prisma/client/extension");
|
|
5
5
|
const prisma_extension_nested_operations_1 = require("@roundtreasury/prisma-extension-nested-operations");
|
|
6
6
|
const createParams_1 = require("./helpers/createParams");
|
|
@@ -10,7 +10,7 @@ function createSoftDeleteExtension({ models, defaultConfig = {
|
|
|
10
10
|
createValue: Boolean,
|
|
11
11
|
allowToOneUpdates: false,
|
|
12
12
|
allowCompoundUniqueIndexWhere: false,
|
|
13
|
-
},
|
|
13
|
+
}, modelsMeta, }) {
|
|
14
14
|
if (!defaultConfig.field) {
|
|
15
15
|
throw new Error("prisma-extension-soft-delete: defaultConfig.field is required");
|
|
16
16
|
}
|
|
@@ -19,14 +19,13 @@ function createSoftDeleteExtension({ models, defaultConfig = {
|
|
|
19
19
|
}
|
|
20
20
|
const modelConfig = {};
|
|
21
21
|
Object.keys(models).forEach((model) => {
|
|
22
|
-
const
|
|
23
|
-
const config = models[modelName];
|
|
22
|
+
const config = models[model];
|
|
24
23
|
if (config) {
|
|
25
|
-
modelConfig[
|
|
24
|
+
modelConfig[model] =
|
|
26
25
|
typeof config === "boolean" && config ? defaultConfig : config;
|
|
27
26
|
}
|
|
28
27
|
});
|
|
29
|
-
const context = (0, createParams_1.createContext)(
|
|
28
|
+
const context = (0, createParams_1.createContext)(modelsMeta);
|
|
30
29
|
const createParamsByModel = Object.keys(modelConfig).reduce((acc, model) => {
|
|
31
30
|
const config = modelConfig[model];
|
|
32
31
|
return {
|
|
@@ -61,26 +60,24 @@ function createSoftDeleteExtension({ models, defaultConfig = {
|
|
|
61
60
|
},
|
|
62
61
|
};
|
|
63
62
|
}, {});
|
|
64
|
-
// before handling root params generate deleted value so it is consistent
|
|
65
|
-
// for the query. Add it to root params and get it from scope?
|
|
66
63
|
return extension_1.Prisma.defineExtension((client) => {
|
|
67
64
|
return client.$extends({
|
|
68
65
|
query: {
|
|
69
66
|
$allModels: {
|
|
70
|
-
// @ts-expect-error - we don't know what the client is
|
|
71
67
|
$allOperations: (0, prisma_extension_nested_operations_1.withNestedOperations)({
|
|
72
|
-
|
|
68
|
+
modelsMeta,
|
|
73
69
|
async $rootOperation(initialParams) {
|
|
74
70
|
var _a, _b;
|
|
75
|
-
const
|
|
71
|
+
const model = String(initialParams.model || "");
|
|
72
|
+
const createParams = (_a = createParamsByModel[model]) === null || _a === void 0 ? void 0 : _a[initialParams.operation];
|
|
76
73
|
if (!createParams)
|
|
77
74
|
return initialParams.query(initialParams.args);
|
|
78
75
|
const { params, ctx } = createParams(initialParams);
|
|
79
|
-
const { model } = params;
|
|
76
|
+
const { model: paramsModel } = params;
|
|
80
77
|
const operationChanged = params.operation !== initialParams.operation;
|
|
81
78
|
const result = operationChanged
|
|
82
79
|
? // @ts-expect-error - we don't know what the client is
|
|
83
|
-
await client[
|
|
80
|
+
await client[paramsModel[0].toLowerCase() + paramsModel.slice(1)][params.operation](params.args)
|
|
84
81
|
: await params.query(params.args);
|
|
85
82
|
const modifyResult = (_b = modifyResultByModel[params.model || ""]) === null || _b === void 0 ? void 0 : _b[params.operation];
|
|
86
83
|
if (!modifyResult)
|
|
@@ -89,7 +86,8 @@ function createSoftDeleteExtension({ models, defaultConfig = {
|
|
|
89
86
|
},
|
|
90
87
|
async $allNestedOperations(initialParams) {
|
|
91
88
|
var _a, _b;
|
|
92
|
-
const
|
|
89
|
+
const model = String(initialParams.model || "");
|
|
90
|
+
const createParams = (_a = createParamsByModel[model]) === null || _a === void 0 ? void 0 : _a[initialParams.operation];
|
|
93
91
|
if (!createParams)
|
|
94
92
|
return initialParams.query(initialParams.args);
|
|
95
93
|
const { params, ctx } = createParams(initialParams);
|
|
@@ -105,4 +103,3 @@ function createSoftDeleteExtension({ models, defaultConfig = {
|
|
|
105
103
|
});
|
|
106
104
|
});
|
|
107
105
|
}
|
|
108
|
-
exports.createSoftDeleteExtension = createSoftDeleteExtension;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { NestedParams } from "@roundtreasury/prisma-extension-nested-operations";
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
export
|
|
5
|
-
export type Params = Omit<NestedParams<any>, "operation"> & {
|
|
2
|
+
import { Context, ModelConfig, ModelsMeta } from "../types";
|
|
3
|
+
export declare const createContext: (modelsMeta: ModelsMeta) => Context;
|
|
4
|
+
export type Params = Omit<NestedParams<any>, "operation" | "model"> & {
|
|
6
5
|
operation: string;
|
|
6
|
+
model?: string;
|
|
7
7
|
};
|
|
8
8
|
export type CreateParamsReturn = {
|
|
9
9
|
params: Params;
|
|
@@ -2,24 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createSelectParams = exports.createIncludeParams = exports.createWhereParams = exports.createAggregateParams = exports.createCountParams = exports.createGroupByParams = exports.createFindManyParams = exports.createFindFirstOrThrowParams = exports.createFindFirstParams = exports.createFindUniqueOrThrowParams = exports.createFindUniqueParams = exports.createUpsertParams = exports.createUpdateManyParams = exports.createUpdateParams = exports.createDeleteManyParams = exports.createDeleteParams = exports.createContext = void 0;
|
|
4
4
|
const nestedReads_1 = require("../utils/nestedReads");
|
|
5
|
-
const createContext = (
|
|
5
|
+
const createContext = (modelsMeta) => {
|
|
6
6
|
const uniqueFieldsByModel = {};
|
|
7
7
|
const uniqueIndexFieldsByModel = {};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
model.uniqueFields.forEach((field) => {
|
|
12
|
-
uniqueIndexFields.push(field.join("_"));
|
|
13
|
-
});
|
|
14
|
-
uniqueIndexFieldsByModel[model.name] = uniqueIndexFields;
|
|
15
|
-
// add id field and unique fields from @unique decorator
|
|
16
|
-
const uniqueFields = [];
|
|
17
|
-
model.fields.forEach((field) => {
|
|
18
|
-
if (field.isId || field.isUnique) {
|
|
19
|
-
uniqueFields.push(field.name);
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
uniqueFieldsByModel[model.name] = uniqueFields;
|
|
8
|
+
Object.entries(modelsMeta).forEach(([modelName, meta]) => {
|
|
9
|
+
uniqueFieldsByModel[modelName] = meta.uniqueFields;
|
|
10
|
+
uniqueIndexFieldsByModel[modelName] = meta.uniqueIndexFields;
|
|
23
11
|
});
|
|
24
12
|
return { uniqueFieldsByModel, uniqueIndexFieldsByModel };
|
|
25
13
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.modifyReadResult =
|
|
3
|
+
exports.modifyReadResult = modifyReadResult;
|
|
4
4
|
const nestedReads_1 = require("../utils/nestedReads");
|
|
5
5
|
const resultFiltering_1 = require("../utils/resultFiltering");
|
|
6
6
|
function modifyReadResult(_, config, result, params, ctx) {
|
|
@@ -13,4 +13,3 @@ function modifyReadResult(_, config, result, params, ctx) {
|
|
|
13
13
|
}
|
|
14
14
|
return result;
|
|
15
15
|
}
|
|
16
|
-
exports.modifyReadResult = modifyReadResult;
|
|
@@ -1,5 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export type RelationField = {
|
|
2
|
+
name: string;
|
|
3
|
+
kind: string;
|
|
4
|
+
isList: boolean;
|
|
5
|
+
type: string;
|
|
6
|
+
relationName: string;
|
|
7
|
+
};
|
|
8
|
+
export type ModelsMeta = Record<string, {
|
|
9
|
+
uniqueFields: string[];
|
|
10
|
+
uniqueIndexFields: string[];
|
|
11
|
+
relations: RelationField[];
|
|
12
|
+
}>;
|
|
3
13
|
export type Context = {
|
|
4
14
|
uniqueFieldsByModel: Record<string, string[]>;
|
|
5
15
|
uniqueIndexFieldsByModel: Record<string, string[]>;
|
|
@@ -11,7 +21,7 @@ export type ModelConfig = {
|
|
|
11
21
|
allowCompoundUniqueIndexWhere?: boolean;
|
|
12
22
|
};
|
|
13
23
|
export type Config = {
|
|
14
|
-
models:
|
|
24
|
+
models: Record<string, ModelConfig | boolean>;
|
|
15
25
|
defaultConfig?: ModelConfig;
|
|
16
|
-
|
|
26
|
+
modelsMeta: ModelsMeta;
|
|
17
27
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.addDeletedToSelect = addDeletedToSelect;
|
|
4
|
+
exports.stripDeletedFieldFromResults = stripDeletedFieldFromResults;
|
|
4
5
|
function addDeletedToSelect(params, config) {
|
|
5
6
|
if (params.args.select && !params.args.select[config.field]) {
|
|
6
7
|
return {
|
|
@@ -16,7 +17,6 @@ function addDeletedToSelect(params, config) {
|
|
|
16
17
|
}
|
|
17
18
|
return params;
|
|
18
19
|
}
|
|
19
|
-
exports.addDeletedToSelect = addDeletedToSelect;
|
|
20
20
|
function stripDeletedFieldFromResults(results, config) {
|
|
21
21
|
if (Array.isArray(results)) {
|
|
22
22
|
results === null || results === void 0 ? void 0 : results.forEach((item) => {
|
|
@@ -28,4 +28,3 @@ function stripDeletedFieldFromResults(results, config) {
|
|
|
28
28
|
}
|
|
29
29
|
return results;
|
|
30
30
|
}
|
|
31
|
-
exports.stripDeletedFieldFromResults = stripDeletedFieldFromResults;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.shouldFilterDeletedFromReadResult = shouldFilterDeletedFromReadResult;
|
|
4
|
+
exports.filterSoftDeletedResults = filterSoftDeletedResults;
|
|
4
5
|
// Maybe this should return true for non-list relations only?
|
|
5
6
|
function shouldFilterDeletedFromReadResult(params, config) {
|
|
6
7
|
return (!params.args.where ||
|
|
7
8
|
typeof params.args.where[config.field] === "undefined" ||
|
|
8
9
|
!params.args.where[config.field]);
|
|
9
10
|
}
|
|
10
|
-
exports.shouldFilterDeletedFromReadResult = shouldFilterDeletedFromReadResult;
|
|
11
11
|
function filterSoftDeletedResults(result, config) {
|
|
12
12
|
// filter out deleted records from array results
|
|
13
13
|
if (result && Array.isArray(result)) {
|
|
@@ -19,4 +19,3 @@ function filterSoftDeletedResults(result, config) {
|
|
|
19
19
|
}
|
|
20
20
|
return result;
|
|
21
21
|
}
|
|
22
|
-
exports.filterSoftDeletedResults = filterSoftDeletedResults;
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@roundtreasury/prisma-extension-soft-delete",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Prisma extension for soft deleting records",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"types": "dist/index.d.ts",
|
|
7
|
-
"module": "dist/esm/index.js",
|
|
5
|
+
"main": "dist/src/index.js",
|
|
6
|
+
"types": "dist/src/index.d.ts",
|
|
7
|
+
"module": "dist/esm/src/index.js",
|
|
8
8
|
"scripts": {
|
|
9
9
|
"build": "npm-run-all build:cjs build:esm",
|
|
10
10
|
"build:cjs": "tsc -p tsconfig.build.json",
|
|
@@ -29,15 +29,17 @@
|
|
|
29
29
|
"author": "Olivier Wilkinson",
|
|
30
30
|
"license": "Apache-2.0",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@roundtreasury/prisma-extension-nested-operations": "
|
|
32
|
+
"@roundtreasury/prisma-extension-nested-operations": "3.0.3"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
35
|
"@prisma/client": "*"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@prisma/
|
|
38
|
+
"@prisma/adapter-pg": "^7.0.0",
|
|
39
|
+
"@prisma/client": "^7.8.0",
|
|
39
40
|
"@types/faker": "^5.5.9",
|
|
40
41
|
"@types/jest": "^29.2.5",
|
|
42
|
+
"@types/node": "^25.9.2",
|
|
41
43
|
"@typescript-eslint/eslint-plugin": "^4.14.0",
|
|
42
44
|
"@typescript-eslint/parser": "^4.14.0",
|
|
43
45
|
"doctoc": "^2.2.0",
|
|
@@ -46,11 +48,11 @@
|
|
|
46
48
|
"jest": "^29.3.1",
|
|
47
49
|
"kcd-scripts": "^5.0.0",
|
|
48
50
|
"npm-run-all": "^4.1.5",
|
|
49
|
-
"prisma": "^
|
|
51
|
+
"prisma": "^7.8.0",
|
|
50
52
|
"semantic-release": "^17.0.2",
|
|
51
53
|
"ts-jest": "^29.0.3",
|
|
52
54
|
"ts-node": "^9.1.1",
|
|
53
|
-
"typescript": "^4.
|
|
55
|
+
"typescript": "^5.4.0"
|
|
54
56
|
},
|
|
55
57
|
"repository": {
|
|
56
58
|
"type": "git",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { Config } from "./types";
|
|
2
|
-
export declare function createSoftDeleteExtension({ models, defaultConfig, dmmf, }: Config): (client: any) => import("@prisma/client/extension").PrismaClientExtends<import("@prisma/client/runtime/library").InternalArgs<{}, {}, {}, {}> & import("@prisma/client/runtime/library").DefaultArgs>;
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { Config } from "./types";
|
|
2
|
-
export declare function createSoftDeleteExtension({ models, defaultConfig, dmmf, }: Config): (client: any) => import("@prisma/client/extension").PrismaClientExtends<import("@prisma/client/runtime/library").InternalArgs<{}, {}, {}, {}> & import("@prisma/client/runtime/library").DefaultArgs>;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|