@lage-run/cache 0.1.1
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/CHANGELOG.json +32 -0
- package/CHANGELOG.md +15 -0
- package/README.md +70 -0
- package/jest.config.js +1 -0
- package/lib/TargetHasher.d.ts +18 -0
- package/lib/TargetHasher.js +24 -0
- package/lib/TargetHasher.js.map +1 -0
- package/lib/backfillWrapper.d.ts +24 -0
- package/lib/backfillWrapper.js +55 -0
- package/lib/backfillWrapper.js.map +1 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +10 -0
- package/lib/index.js.map +1 -0
- package/lib/providers/BackfillCacheProvider.d.ts +20 -0
- package/lib/providers/BackfillCacheProvider.js +119 -0
- package/lib/providers/BackfillCacheProvider.js.map +1 -0
- package/lib/providers/RemoteFallbackCacheProvider.d.ts +27 -0
- package/lib/providers/RemoteFallbackCacheProvider.js +72 -0
- package/lib/providers/RemoteFallbackCacheProvider.js.map +1 -0
- package/lib/salt.d.ts +2 -0
- package/lib/salt.js +68 -0
- package/lib/salt.js.map +1 -0
- package/lib/types/CacheOptions.d.ts +22 -0
- package/lib/types/CacheOptions.js +3 -0
- package/lib/types/CacheOptions.js.map +1 -0
- package/lib/types/CacheProvider.d.ts +10 -0
- package/lib/types/CacheProvider.js +3 -0
- package/lib/types/CacheProvider.js.map +1 -0
- package/package.json +38 -0
- package/tsconfig.json +23 -0
package/CHANGELOG.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lage-run/cache",
|
|
3
|
+
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"date": "Tue, 09 Aug 2022 21:16:19 GMT",
|
|
6
|
+
"tag": "@lage-run/cache_v0.1.1",
|
|
7
|
+
"version": "0.1.1",
|
|
8
|
+
"comments": {
|
|
9
|
+
"patch": [
|
|
10
|
+
{
|
|
11
|
+
"author": "ken@gizzar.com",
|
|
12
|
+
"package": "@lage-run/cache",
|
|
13
|
+
"commit": "6dc38b30d19b0cba7e2609d3681e4e55c4fd6238",
|
|
14
|
+
"comment": "Gets the args from the cliArgs, not the target"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"author": "ken@gizzar.com",
|
|
18
|
+
"package": "@lage-run/cache",
|
|
19
|
+
"commit": "6dc38b30d19b0cba7e2609d3681e4e55c4fd6238",
|
|
20
|
+
"comment": "Adds a @lage-run/cache for v2 refactoring"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"author": "beachball",
|
|
24
|
+
"package": "@lage-run/cache",
|
|
25
|
+
"comment": "Bump @lage-run/target-graph to v0.2.0",
|
|
26
|
+
"commit": "6dc38b30d19b0cba7e2609d3681e4e55c4fd6238"
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Change Log - @lage-run/cache
|
|
2
|
+
|
|
3
|
+
This log was last generated on Tue, 09 Aug 2022 21:16:19 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
<!-- Start content -->
|
|
6
|
+
|
|
7
|
+
## 0.1.1
|
|
8
|
+
|
|
9
|
+
Tue, 09 Aug 2022 21:16:19 GMT
|
|
10
|
+
|
|
11
|
+
### Patches
|
|
12
|
+
|
|
13
|
+
- Gets the args from the cliArgs, not the target (ken@gizzar.com)
|
|
14
|
+
- Adds a @lage-run/cache for v2 refactoring (ken@gizzar.com)
|
|
15
|
+
- Bump @lage-run/target-graph to v0.2.0
|
package/README.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# @lage-run/cache
|
|
2
|
+
|
|
3
|
+
This package provides:
|
|
4
|
+
|
|
5
|
+
1. `Cache` interface
|
|
6
|
+
2. a default cache provider that uses `backfill`
|
|
7
|
+
|
|
8
|
+
## Usage
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
import { BackfillCacheProvider, RemoteFallbackCacheProvider, TargetHasher } from "@lage-run/cache";
|
|
12
|
+
|
|
13
|
+
const cacheOptions = {
|
|
14
|
+
internalCacheFolder: ".cache",
|
|
15
|
+
outputGlob: ["dist/**", "lib/**"]
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const root = getWorkspaceRoot(cwd);
|
|
19
|
+
|
|
20
|
+
const remoteFallbackCacheProviderOptions = {
|
|
21
|
+
root,
|
|
22
|
+
localCacheProvider: cacheOptions.skipLocalCache ? undefined : new BackfillCacheProvider({
|
|
23
|
+
root,
|
|
24
|
+
cacheOptions: {
|
|
25
|
+
outputGlob: ["dist/**"]
|
|
26
|
+
}
|
|
27
|
+
}),
|
|
28
|
+
|
|
29
|
+
remoteCacheProvider: new BackfillCacheProvider({
|
|
30
|
+
root,
|
|
31
|
+
{
|
|
32
|
+
cacheStorageOptions: {
|
|
33
|
+
provider: "azure-blob",
|
|
34
|
+
options: {
|
|
35
|
+
connectionString: "asdfasdfasdfafds";
|
|
36
|
+
container: "container";
|
|
37
|
+
maxSize?: 150;
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
...cacheOptions
|
|
41
|
+
writeRemoteCache: true,
|
|
42
|
+
outputGlob: ["dist/**", "lib/**"]
|
|
43
|
+
},
|
|
44
|
+
isReadOnly: cacheOptions.writeRemoteCache !== true,
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const cacheProvider = new RemoteFallbackCacheProvider(remoteFallbackCacheProviderOptions);
|
|
49
|
+
const hasher = new TargetHasher({
|
|
50
|
+
root,
|
|
51
|
+
environmentGlob: ["lage.config.js"],
|
|
52
|
+
cacheKey: "some cache key",
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
let hash: string | null = null;
|
|
56
|
+
let cacheHit = false;
|
|
57
|
+
|
|
58
|
+
if (target.cache && !skipCaching) {
|
|
59
|
+
hash = await hasher.hash(target, cliArgs);
|
|
60
|
+
|
|
61
|
+
if (hash && !shouldResetCache) {
|
|
62
|
+
cacheHit = await cacheProvider.fetch(hash, target);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// DO TARGET RUN ACTIONS
|
|
67
|
+
// ...
|
|
68
|
+
|
|
69
|
+
await cacheProvider.put(hash, target);
|
|
70
|
+
```
|
package/jest.config.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require("monorepo-scripts/config/jest.config.js");
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Target } from "@lage-run/target-graph";
|
|
2
|
+
export interface TargetHasherOptions {
|
|
3
|
+
root: string;
|
|
4
|
+
environmentGlob: string[];
|
|
5
|
+
cacheKey?: string;
|
|
6
|
+
cliArgs?: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* TargetHasher is a class that can be used to generate a hash of a target.
|
|
10
|
+
*
|
|
11
|
+
* Currently, it encapsulates the use of `backfill-hasher` to generate a hash.
|
|
12
|
+
*/
|
|
13
|
+
export declare class TargetHasher {
|
|
14
|
+
private options;
|
|
15
|
+
private backfillLogger;
|
|
16
|
+
constructor(options: TargetHasherOptions);
|
|
17
|
+
hash(target: Target): Promise<string>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TargetHasher = void 0;
|
|
4
|
+
const backfillWrapper_1 = require("./backfillWrapper");
|
|
5
|
+
const backfill_hasher_1 = require("backfill-hasher");
|
|
6
|
+
const salt_1 = require("./salt");
|
|
7
|
+
/**
|
|
8
|
+
* TargetHasher is a class that can be used to generate a hash of a target.
|
|
9
|
+
*
|
|
10
|
+
* Currently, it encapsulates the use of `backfill-hasher` to generate a hash.
|
|
11
|
+
*/
|
|
12
|
+
class TargetHasher {
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.options = options;
|
|
15
|
+
this.backfillLogger = (0, backfillWrapper_1.createBackfillLogger)();
|
|
16
|
+
}
|
|
17
|
+
async hash(target) {
|
|
18
|
+
const hashKey = await (0, salt_1.salt)(this.options.environmentGlob || ["lage.config.js"], `${target.id}|${JSON.stringify(this.options.cliArgs)}`, this.options.root, this.options.cacheKey || "");
|
|
19
|
+
const hasher = new backfill_hasher_1.Hasher({ packageRoot: target.cwd }, this.backfillLogger);
|
|
20
|
+
return hasher.createPackageHash(hashKey);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.TargetHasher = TargetHasher;
|
|
24
|
+
//# sourceMappingURL=TargetHasher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TargetHasher.js","sourceRoot":"","sources":["../src/TargetHasher.ts"],"names":[],"mappings":";;;AAAA,uDAAyD;AACzD,qDAA2D;AAC3D,iCAA8B;AAW9B;;;;GAIG;AACH,MAAa,YAAY;IAGvB,YAAoB,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;QAC9C,IAAI,CAAC,cAAc,GAAG,IAAA,sCAAoB,GAAE,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,MAAM,OAAO,GAAG,MAAM,IAAA,WAAI,EACxB,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,gBAAgB,CAAC,EAClD,GAAG,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EACtD,IAAI,CAAC,OAAO,CAAC,IAAI,EACjB,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAC5B,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,wBAAc,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACpF,OAAO,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;CACF;AAjBD,oCAiBC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backfill wrappers: some functions that uses the `backfill` library that doesn't require them to be inside a class
|
|
3
|
+
*/
|
|
4
|
+
import { CacheOptions } from "./types/CacheOptions";
|
|
5
|
+
export declare function createBackfillLogger(): import("backfill-logger").Logger;
|
|
6
|
+
export declare function createBackfillCacheConfig(cwd: string, cacheOptions?: Partial<CacheOptions>): {
|
|
7
|
+
writeRemoteCache?: boolean | undefined;
|
|
8
|
+
skipLocalCache?: boolean | undefined;
|
|
9
|
+
environmentGlob?: string[] | undefined;
|
|
10
|
+
cacheKey?: string | undefined;
|
|
11
|
+
cacheStorageConfig: import("backfill-config").CacheStorageConfig;
|
|
12
|
+
clearOutput: boolean;
|
|
13
|
+
internalCacheFolder: string;
|
|
14
|
+
logFolder: string;
|
|
15
|
+
logLevel: "silly" | "verbose" | "info" | "warn" | "error" | "mute";
|
|
16
|
+
name: string;
|
|
17
|
+
mode: "READ_ONLY" | "WRITE_ONLY" | "READ_WRITE" | "PASS";
|
|
18
|
+
outputGlob: string[];
|
|
19
|
+
packageRoot: string;
|
|
20
|
+
performanceReportName?: string | undefined;
|
|
21
|
+
producePerformanceLogs: boolean;
|
|
22
|
+
validateOutput: boolean;
|
|
23
|
+
incrementalCaching: boolean;
|
|
24
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Backfill wrappers: some functions that uses the `backfill` library that doesn't require them to be inside a class
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
22
|
+
if (mod && mod.__esModule) return mod;
|
|
23
|
+
var result = {};
|
|
24
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
25
|
+
__setModuleDefault(result, mod);
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.createBackfillCacheConfig = exports.createBackfillLogger = void 0;
|
|
30
|
+
const backfill_config_1 = require("backfill-config");
|
|
31
|
+
const backfill_logger_1 = require("backfill-logger");
|
|
32
|
+
const os = __importStar(require("os"));
|
|
33
|
+
function createBackfillLogger() {
|
|
34
|
+
const stdout = process.stdout;
|
|
35
|
+
const stderr = process.stderr;
|
|
36
|
+
return (0, backfill_logger_1.makeLogger)("error", {
|
|
37
|
+
console: {
|
|
38
|
+
info(...args) {
|
|
39
|
+
stdout.write(args.join(" ") + os.EOL);
|
|
40
|
+
},
|
|
41
|
+
warn(...args) {
|
|
42
|
+
stderr.write(args.join(" ") + os.EOL);
|
|
43
|
+
},
|
|
44
|
+
error(...args) {
|
|
45
|
+
stderr.write(args.join(" ") + os.EOL);
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
exports.createBackfillLogger = createBackfillLogger;
|
|
51
|
+
function createBackfillCacheConfig(cwd, cacheOptions = {}) {
|
|
52
|
+
return Object.assign(Object.assign({}, (0, backfill_config_1.createDefaultConfig)(cwd)), cacheOptions);
|
|
53
|
+
}
|
|
54
|
+
exports.createBackfillCacheConfig = createBackfillCacheConfig;
|
|
55
|
+
//# sourceMappingURL=backfillWrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfillWrapper.js","sourceRoot":"","sources":["../src/backfillWrapper.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,qDAAsD;AACtD,qDAA6C;AAC7C,uCAAyB;AAGzB,SAAgB,oBAAoB;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,OAAO,IAAA,4BAAU,EAAC,OAAO,EAAE;QACzB,OAAO,EAAE;YACP,IAAI,CAAC,GAAG,IAAI;gBACV,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;YACD,IAAI,CAAC,GAAG,IAAI;gBACV,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;YACD,KAAK,CAAC,GAAG,IAAI;gBACX,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAhBD,oDAgBC;AAED,SAAgB,yBAAyB,CAAC,GAAW,EAAE,eAAsC,EAAE;IAC7F,uCACK,IAAA,qCAAmB,EAAC,GAAG,CAAC,GACxB,YAAY,EACf;AACJ,CAAC;AALD,8DAKC"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { BackfillCacheProvider } from "./providers/BackfillCacheProvider";
|
|
2
|
+
export { RemoteFallbackCacheProvider } from "./providers/RemoteFallbackCacheProvider";
|
|
3
|
+
export { TargetHasher } from "./TargetHasher";
|
|
4
|
+
export type { CacheOptions } from "./types/CacheOptions";
|
|
5
|
+
export type { CacheProvider } from "./types/CacheProvider";
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TargetHasher = exports.RemoteFallbackCacheProvider = exports.BackfillCacheProvider = void 0;
|
|
4
|
+
var BackfillCacheProvider_1 = require("./providers/BackfillCacheProvider");
|
|
5
|
+
Object.defineProperty(exports, "BackfillCacheProvider", { enumerable: true, get: function () { return BackfillCacheProvider_1.BackfillCacheProvider; } });
|
|
6
|
+
var RemoteFallbackCacheProvider_1 = require("./providers/RemoteFallbackCacheProvider");
|
|
7
|
+
Object.defineProperty(exports, "RemoteFallbackCacheProvider", { enumerable: true, get: function () { return RemoteFallbackCacheProvider_1.RemoteFallbackCacheProvider; } });
|
|
8
|
+
var TargetHasher_1 = require("./TargetHasher");
|
|
9
|
+
Object.defineProperty(exports, "TargetHasher", { enumerable: true, get: function () { return TargetHasher_1.TargetHasher; } });
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,2EAA0E;AAAjE,8HAAA,qBAAqB,OAAA;AAC9B,uFAAsF;AAA7E,0IAAA,2BAA2B,OAAA;AACpC,+CAA8C;AAArC,4GAAA,YAAY,OAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CacheProvider, CacheProviderOptions } from "../types/CacheProvider";
|
|
2
|
+
import type { Target } from "@lage-run/target-graph";
|
|
3
|
+
export interface BackfillCacheProviderOptions {
|
|
4
|
+
root: string;
|
|
5
|
+
cacheOptions: Partial<CacheProviderOptions>;
|
|
6
|
+
isReadOnly?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare class BackfillCacheProvider implements CacheProvider {
|
|
9
|
+
private options;
|
|
10
|
+
/**
|
|
11
|
+
* logger for backfill
|
|
12
|
+
*/
|
|
13
|
+
private backfillLogger;
|
|
14
|
+
private getTargetCacheStorageProvider;
|
|
15
|
+
constructor(options: BackfillCacheProviderOptions);
|
|
16
|
+
fetch(hash: string, target: Target): Promise<boolean>;
|
|
17
|
+
put(hash: string, target: Target): Promise<void>;
|
|
18
|
+
clear(): Promise<void>;
|
|
19
|
+
purge(sinceDays: number): Promise<void>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.BackfillCacheProvider = void 0;
|
|
27
|
+
const backfillWrapper_1 = require("../backfillWrapper");
|
|
28
|
+
const backfill_cache_1 = require("backfill-cache");
|
|
29
|
+
const workspace_tools_1 = require("workspace-tools");
|
|
30
|
+
const util_1 = require("util");
|
|
31
|
+
const fs = __importStar(require("fs"));
|
|
32
|
+
const path = __importStar(require("path"));
|
|
33
|
+
const rmdir = (0, util_1.promisify)(fs.rmdir);
|
|
34
|
+
const rm = (0, util_1.promisify)(fs.unlink);
|
|
35
|
+
const readdir = (0, util_1.promisify)(fs.readdir);
|
|
36
|
+
const stat = (0, util_1.promisify)(fs.stat);
|
|
37
|
+
const MS_IN_A_DAY = 1000 * 60 * 60 * 24;
|
|
38
|
+
class BackfillCacheProvider {
|
|
39
|
+
constructor(options) {
|
|
40
|
+
this.options = options;
|
|
41
|
+
this.backfillLogger = (0, backfillWrapper_1.createBackfillLogger)();
|
|
42
|
+
}
|
|
43
|
+
getTargetCacheStorageProvider(cwd) {
|
|
44
|
+
const { cacheOptions } = this.options;
|
|
45
|
+
const { cacheStorageConfig, internalCacheFolder, incrementalCaching } = (0, backfillWrapper_1.createBackfillCacheConfig)(cwd, cacheOptions);
|
|
46
|
+
return (0, backfill_cache_1.getCacheStorageProvider)(cacheStorageConfig !== null && cacheStorageConfig !== void 0 ? cacheStorageConfig : { provider: "local" }, internalCacheFolder, this.backfillLogger, cwd, incrementalCaching);
|
|
47
|
+
}
|
|
48
|
+
async fetch(hash, target) {
|
|
49
|
+
if (!hash) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const cacheStorage = this.getTargetCacheStorageProvider(target.cwd);
|
|
53
|
+
try {
|
|
54
|
+
return await cacheStorage.fetch(hash);
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
// backfill fetch can error, but we should simply ignore and continue
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async put(hash, target) {
|
|
62
|
+
var _a, _b;
|
|
63
|
+
if (!hash || this.options.isReadOnly) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const cacheStorage = this.getTargetCacheStorageProvider(target.cwd);
|
|
67
|
+
try {
|
|
68
|
+
await cacheStorage.put(hash, (_b = (_a = target.outputs) !== null && _a !== void 0 ? _a : this.options.cacheOptions.outputGlob) !== null && _b !== void 0 ? _b : ["**/*"]);
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
// backfill throws an error if outputGlob doesn't match any files, we will skip this error
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async clear() {
|
|
75
|
+
const allPackages = (0, workspace_tools_1.getPackageInfos)(this.options.root);
|
|
76
|
+
for (const info of Object.values(allPackages)) {
|
|
77
|
+
const cachePath = getCachePath(info, this.options.cacheOptions.internalCacheFolder);
|
|
78
|
+
if (fs.existsSync(cachePath)) {
|
|
79
|
+
const entries = await readdir(cachePath);
|
|
80
|
+
for (const entry of entries) {
|
|
81
|
+
const entryPath = path.join(cachePath, entry);
|
|
82
|
+
const entryStat = await stat(entryPath);
|
|
83
|
+
await removeCache(entryPath, entryStat);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async purge(sinceDays) {
|
|
89
|
+
const prunePeriod = sinceDays || 30;
|
|
90
|
+
const now = new Date();
|
|
91
|
+
const allPackages = (0, workspace_tools_1.getPackageInfos)(this.options.root);
|
|
92
|
+
for (const info of Object.values(allPackages)) {
|
|
93
|
+
const cachePath = getCachePath(info, this.options.cacheOptions.internalCacheFolder);
|
|
94
|
+
if (fs.existsSync(cachePath)) {
|
|
95
|
+
const entries = await readdir(cachePath);
|
|
96
|
+
for (const entry of entries) {
|
|
97
|
+
const entryPath = path.join(cachePath, entry);
|
|
98
|
+
const entryStat = await stat(entryPath);
|
|
99
|
+
if (now.getTime() - entryStat.mtime.getTime() > prunePeriod * MS_IN_A_DAY) {
|
|
100
|
+
await removeCache(entryPath, entryStat);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.BackfillCacheProvider = BackfillCacheProvider;
|
|
108
|
+
function getCachePath(info, internalCacheFolder) {
|
|
109
|
+
return path.resolve(path.dirname(info.packageJsonPath), internalCacheFolder !== null && internalCacheFolder !== void 0 ? internalCacheFolder : "node_modules/.cache/backfill");
|
|
110
|
+
}
|
|
111
|
+
async function removeCache(cachePath, entryStat) {
|
|
112
|
+
if (entryStat.isDirectory()) {
|
|
113
|
+
rmdir(cachePath, { recursive: true });
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
rm(cachePath);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=BackfillCacheProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackfillCacheProvider.js","sourceRoot":"","sources":["../../src/providers/BackfillCacheProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CacheProvider } from "../types/CacheProvider";
|
|
2
|
+
import type { Logger } from "@lage-run/logger";
|
|
3
|
+
import type { Target } from "@lage-run/target-graph";
|
|
4
|
+
export interface RemoteFallbackCacheProviderOptions {
|
|
5
|
+
root: string;
|
|
6
|
+
logger: Logger;
|
|
7
|
+
localCacheProvider?: CacheProvider;
|
|
8
|
+
remoteCacheProvider?: CacheProvider;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Remote Fallback Cache Provider
|
|
12
|
+
*
|
|
13
|
+
* This backfill cache provider will fallback to a remote cache provider if the local cache does not contain the item.
|
|
14
|
+
* It will also automatically populate the local cache with the remote cache.
|
|
15
|
+
*/
|
|
16
|
+
export declare class RemoteFallbackCacheProvider implements CacheProvider {
|
|
17
|
+
private options;
|
|
18
|
+
private static localHits;
|
|
19
|
+
private static remoteHits;
|
|
20
|
+
constructor(options: RemoteFallbackCacheProviderOptions);
|
|
21
|
+
fetch(hash: string, target: Target): Promise<boolean>;
|
|
22
|
+
put(hash: string, target: Target): Promise<void>;
|
|
23
|
+
private isRemoteHit;
|
|
24
|
+
private isLocalHit;
|
|
25
|
+
clear(): Promise<void>;
|
|
26
|
+
purge(sinceDays: number): Promise<void>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RemoteFallbackCacheProvider = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Remote Fallback Cache Provider
|
|
6
|
+
*
|
|
7
|
+
* This backfill cache provider will fallback to a remote cache provider if the local cache does not contain the item.
|
|
8
|
+
* It will also automatically populate the local cache with the remote cache.
|
|
9
|
+
*/
|
|
10
|
+
class RemoteFallbackCacheProvider {
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.options = options;
|
|
13
|
+
}
|
|
14
|
+
async fetch(hash, target) {
|
|
15
|
+
const { logger, remoteCacheProvider, localCacheProvider } = this.options;
|
|
16
|
+
if (localCacheProvider) {
|
|
17
|
+
RemoteFallbackCacheProvider.localHits[hash] = await localCacheProvider.fetch(hash, target);
|
|
18
|
+
logger.silly(`local cache fetch: ${hash} ${RemoteFallbackCacheProvider.localHits[hash]}`);
|
|
19
|
+
}
|
|
20
|
+
if (!RemoteFallbackCacheProvider.localHits[hash] && remoteCacheProvider) {
|
|
21
|
+
RemoteFallbackCacheProvider.remoteHits[hash] = await remoteCacheProvider.fetch(hash, target);
|
|
22
|
+
logger.silly(`remote fallback fetch: ${hash} ${RemoteFallbackCacheProvider.remoteHits[hash]}`);
|
|
23
|
+
// now save this into the localCacheProvider, if available
|
|
24
|
+
if (localCacheProvider) {
|
|
25
|
+
logger.silly(`local cache put, fetched cache from remote: ${hash}`);
|
|
26
|
+
await localCacheProvider.put(hash, target);
|
|
27
|
+
}
|
|
28
|
+
return RemoteFallbackCacheProvider.remoteHits[hash];
|
|
29
|
+
}
|
|
30
|
+
return RemoteFallbackCacheProvider.localHits[hash];
|
|
31
|
+
}
|
|
32
|
+
async put(hash, target) {
|
|
33
|
+
const { logger, remoteCacheProvider, localCacheProvider } = this.options;
|
|
34
|
+
const putPromises = [];
|
|
35
|
+
// Write local cache if it doesn't already exist, or if the the hash isn't in the localHits
|
|
36
|
+
const shouldWriteLocalCache = !this.isLocalHit(hash) && !!localCacheProvider;
|
|
37
|
+
if (shouldWriteLocalCache) {
|
|
38
|
+
logger.silly(`local cache put: ${hash}`);
|
|
39
|
+
putPromises.push(localCacheProvider.put(hash, target));
|
|
40
|
+
}
|
|
41
|
+
// Write to remote if there is a no hit in the remote cache, and remote cache storage provider, and that the "writeRemoteCache" config flag is set to true
|
|
42
|
+
const shouldWriteRemoteCache = !this.isRemoteHit(hash) && !!remoteCacheProvider;
|
|
43
|
+
if (shouldWriteRemoteCache) {
|
|
44
|
+
logger.silly(`remote fallback put: ${hash}`);
|
|
45
|
+
const remotePut = remoteCacheProvider.put(hash, target);
|
|
46
|
+
putPromises.push(remotePut);
|
|
47
|
+
}
|
|
48
|
+
await Promise.all(putPromises);
|
|
49
|
+
}
|
|
50
|
+
isRemoteHit(hash) {
|
|
51
|
+
return hash in RemoteFallbackCacheProvider.remoteHits && RemoteFallbackCacheProvider.remoteHits[hash];
|
|
52
|
+
}
|
|
53
|
+
isLocalHit(hash) {
|
|
54
|
+
return hash in RemoteFallbackCacheProvider.localHits && RemoteFallbackCacheProvider.localHits[hash];
|
|
55
|
+
}
|
|
56
|
+
async clear() {
|
|
57
|
+
const { localCacheProvider } = this.options;
|
|
58
|
+
if (localCacheProvider) {
|
|
59
|
+
return localCacheProvider.clear();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async purge(sinceDays) {
|
|
63
|
+
const { localCacheProvider } = this.options;
|
|
64
|
+
if (localCacheProvider) {
|
|
65
|
+
return localCacheProvider.purge(sinceDays);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.RemoteFallbackCacheProvider = RemoteFallbackCacheProvider;
|
|
70
|
+
RemoteFallbackCacheProvider.localHits = {};
|
|
71
|
+
RemoteFallbackCacheProvider.remoteHits = {};
|
|
72
|
+
//# sourceMappingURL=RemoteFallbackCacheProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemoteFallbackCacheProvider.js","sourceRoot":"","sources":["../../src/providers/RemoteFallbackCacheProvider.ts"],"names":[],"mappings":"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"}
|
package/lib/salt.d.ts
ADDED
package/lib/salt.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.salt = exports._testResetEnvHash = void 0;
|
|
27
|
+
const path = __importStar(require("path"));
|
|
28
|
+
const crypto = __importStar(require("crypto"));
|
|
29
|
+
const fg = __importStar(require("fast-glob"));
|
|
30
|
+
const fs = __importStar(require("fs/promises"));
|
|
31
|
+
let envHash = undefined;
|
|
32
|
+
function _testResetEnvHash() {
|
|
33
|
+
envHash = undefined;
|
|
34
|
+
}
|
|
35
|
+
exports._testResetEnvHash = _testResetEnvHash;
|
|
36
|
+
async function salt(environmentGlobFiles, command, repoRoot, customKey = "") {
|
|
37
|
+
return hashStrings([...(await getEnvHash(environmentGlobFiles, repoRoot)), command, customKey]);
|
|
38
|
+
}
|
|
39
|
+
exports.salt = salt;
|
|
40
|
+
async function getEnvHash(environmentGlobFiles, repoRoot) {
|
|
41
|
+
if (!envHash) {
|
|
42
|
+
envHash = [];
|
|
43
|
+
const newline = /\r\n|\r|\n/g;
|
|
44
|
+
const LF = "\n";
|
|
45
|
+
const files = fg.sync(environmentGlobFiles, {
|
|
46
|
+
cwd: repoRoot,
|
|
47
|
+
});
|
|
48
|
+
files.sort((a, b) => a.localeCompare(b));
|
|
49
|
+
for (const file of files) {
|
|
50
|
+
const hasher = crypto.createHash("sha1");
|
|
51
|
+
hasher.update(file);
|
|
52
|
+
const fileBuffer = await fs.readFile(path.join(repoRoot, file), "utf-8");
|
|
53
|
+
const data = fileBuffer.replace(newline, LF);
|
|
54
|
+
hasher.update(data);
|
|
55
|
+
envHash.push(hasher.digest("hex"));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return envHash;
|
|
59
|
+
}
|
|
60
|
+
function hashStrings(strings) {
|
|
61
|
+
const hasher = crypto.createHash("sha1");
|
|
62
|
+
const anArray = typeof strings === "string" ? [strings] : strings;
|
|
63
|
+
const elements = [...anArray];
|
|
64
|
+
elements.sort((a, b) => a.localeCompare(b));
|
|
65
|
+
elements.forEach((element) => hasher.update(element));
|
|
66
|
+
return hasher.digest("hex");
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=salt.js.map
|
package/lib/salt.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"salt.js","sourceRoot":"","sources":["../src/salt.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAC7B,+CAAiC;AACjC,8CAAgC;AAChC,gDAAkC;AAElC,IAAI,OAAO,GAAyB,SAAS,CAAC;AAE9C,SAAgB,iBAAiB;IAC/B,OAAO,GAAG,SAAS,CAAC;AACtB,CAAC;AAFD,8CAEC;AAEM,KAAK,UAAU,IAAI,CAAC,oBAA8B,EAAE,OAAe,EAAE,QAAgB,EAAE,SAAS,GAAG,EAAE;IAC1G,OAAO,WAAW,CAAC,CAAC,GAAG,CAAC,MAAM,UAAU,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AAClG,CAAC;AAFD,oBAEC;AAED,KAAK,UAAU,UAAU,CAAC,oBAA8B,EAAE,QAAgB;IACxE,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC;QAChB,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC1C,GAAG,EAAE,QAAQ;SACd,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEpB,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACzE,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEpB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;SACpC;KACF;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,OAA0B;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAClE,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { CacheProviderOptions } from "./CacheProvider";
|
|
2
|
+
export interface CacheOptions extends CacheProviderOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Whether to write to the remote cache - useful for continuous integration systems to provide build-over-build cache.
|
|
5
|
+
* It is recommended to turn this OFF for local development, turning remote cache to be a build acceleration through remote cache downloads.
|
|
6
|
+
*/
|
|
7
|
+
writeRemoteCache?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Skips local cache entirely - useful for continous integration systems that only relies on a remote cache.
|
|
10
|
+
*/
|
|
11
|
+
skipLocalCache?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* A list of globs to match files whose contents will determine the cache key in addition to the package file contents
|
|
14
|
+
* The globs are relative to the root of the project.
|
|
15
|
+
*/
|
|
16
|
+
environmentGlob?: string[];
|
|
17
|
+
/**
|
|
18
|
+
* The cache key is a custom string that will be concatenated with the package file contents and the environment glob contents
|
|
19
|
+
* to generate the cache key.
|
|
20
|
+
*/
|
|
21
|
+
cacheKey?: string;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheOptions.js","sourceRoot":"","sources":["../../src/types/CacheOptions.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Target } from "@lage-run/target-graph";
|
|
2
|
+
import type { Config as BackfillCacheOptions } from "backfill-config";
|
|
3
|
+
export declare type CacheProviderOptions = BackfillCacheOptions;
|
|
4
|
+
export interface CacheProvider {
|
|
5
|
+
fetch(hash: string, target: Target): Promise<boolean>;
|
|
6
|
+
put(hash: string, target: Target): Promise<void>;
|
|
7
|
+
clear(): Promise<void>;
|
|
8
|
+
purge(sinceDays: number): Promise<void>;
|
|
9
|
+
isReadOnly?: boolean;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheProvider.js","sourceRoot":"","sources":["../../src/types/CacheProvider.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lage-run/cache",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Cache for Lage",
|
|
5
|
+
"repository": {
|
|
6
|
+
"url": "https://github.com/microsoft/lage"
|
|
7
|
+
},
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"main": "lib/index.js",
|
|
10
|
+
"types": "lib/index.d.ts",
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "monorepo-scripts tsc",
|
|
13
|
+
"start": "monorepo-scripts tsc -w --preserveWatchOutput",
|
|
14
|
+
"test": "monorepo-scripts jest",
|
|
15
|
+
"lint": "monorepo-scripts lint"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@lage-run/target-graph": "^0.2.0",
|
|
19
|
+
"@lage-run/logger": "^1.1.0",
|
|
20
|
+
"backfill-config": "^6.3.0",
|
|
21
|
+
"backfill-cache": "^5.6.1",
|
|
22
|
+
"backfill-hasher": "^6.4.1",
|
|
23
|
+
"backfill-logger": "^5.1.3",
|
|
24
|
+
"fast-glob": "^3.2.11",
|
|
25
|
+
"workspace-tools": "^0.23.3"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@lage-run/monorepo-fixture": "^0.1.0",
|
|
29
|
+
"@types/jest": "^27.0.1",
|
|
30
|
+
"@types/mock-fs": "^4.13.1",
|
|
31
|
+
"@types/node": "^14.0.0",
|
|
32
|
+
"monorepo-scripts": "*",
|
|
33
|
+
"mock-fs": "^5.1.2"
|
|
34
|
+
},
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
}
|
|
38
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"ts-node": {
|
|
3
|
+
"transpileOnly": true
|
|
4
|
+
},
|
|
5
|
+
"compilerOptions": {
|
|
6
|
+
"target": "ES2017",
|
|
7
|
+
"module": "CommonJS",
|
|
8
|
+
"moduleResolution": "Node",
|
|
9
|
+
"declaration": true,
|
|
10
|
+
"lib": ["ES2017"],
|
|
11
|
+
"allowJs": true,
|
|
12
|
+
"outDir": "./lib",
|
|
13
|
+
"strict": true,
|
|
14
|
+
"noImplicitAny": false,
|
|
15
|
+
"allowSyntheticDefaultImports": true,
|
|
16
|
+
"esModuleInterop": true,
|
|
17
|
+
"forceConsistentCasingInFileNames": true,
|
|
18
|
+
"skipLibCheck": true,
|
|
19
|
+
"noUnusedLocals": false,
|
|
20
|
+
"sourceMap": true
|
|
21
|
+
},
|
|
22
|
+
"include": ["src"]
|
|
23
|
+
}
|