turborepo-remote-cache 2.9.0 → 2.10.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/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|

|
|
7
7
|
|
|
8
8
|
[](https://github.com/ducktors/turborepo-remote-cache/releases)   [](https://github.com/ducktors/turborepo-remote-cache/actions/workflows/ci.yml) [](https://github.com/ducktors/turborepo-remote-cache/actions/workflows/test.yaml) [](https://github.com/ducktors/turborepo-remote-cache/actions/workflows/release.yml) [](https://github.com/ducktors/turborepo-remote-cache/actions/workflows/docker.yml) [](https://qlty.sh/gh/ducktors/projects/turborepo-remote-cache) [](https://coveralls.io/github/ducktors/turborepo-remote-cache?branch=main) [](https://hub.docker.com/r/ducktors/turborepo-remote-cache) [](https://www.npmjs.com/package/turborepo-remote-cache) [](https://github.com/semantic-release/semantic-release) [](https://securityscorecards.dev/viewer/?uri=github.com/ducktors/turborepo-remote-cache) [](https://www.bestpractices.dev/projects/10164) <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
|
9
|
-
[](#contributors-)
|
|
10
10
|
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
|
11
11
|
|
|
12
12
|
This project is an open-source implementation of the [Turborepo custom remote cache server](https://turbo.build/repo/docs/core-concepts/remote-caching#self-hosting). If Vercel's official cache server isn't a viable option, this server is an alternative for self-hosted deployments.
|
|
@@ -127,6 +127,7 @@ fix: fix a bug ---> 1.0.x
|
|
|
127
127
|
<td align="center" valign="top" width="14.28%"><a href="https://clemenskofler.com"><img src="https://avatars.githubusercontent.com/u/3749?v=4?s=100" width="100px;" alt="Clemens Kofler"/><br /><sub><b>Clemens Kofler</b></sub></a><br /><a href="https://github.com/ducktors/turborepo-remote-cache/commits?author=clemens" title="Documentation">📖</a></td>
|
|
128
128
|
<td align="center" valign="top" width="14.28%"><a href="http://thalles.me"><img src="https://avatars.githubusercontent.com/u/76017384?v=4?s=100" width="100px;" alt="Thalles Passos"/><br /><sub><b>Thalles Passos</b></sub></a><br /><a href="https://github.com/ducktors/turborepo-remote-cache/commits?author=ThallesP" title="Code">💻</a></td>
|
|
129
129
|
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kheyse"><img src="https://avatars.githubusercontent.com/u/2493640?v=4?s=100" width="100px;" alt="Karel Heyse"/><br /><sub><b>Karel Heyse</b></sub></a><br /><a href="https://github.com/ducktors/turborepo-remote-cache/commits?author=kheyse" title="Code">💻</a></td>
|
|
130
|
+
<td align="center" valign="top" width="14.28%"><a href="http://modin.us"><img src="https://avatars.githubusercontent.com/u/45493372?v=4?s=100" width="100px;" alt="Konstantin Modin"/><br /><sub><b>Konstantin Modin</b></sub></a><br /><a href="https://github.com/ducktors/turborepo-remote-cache/commits?author=KonstantinModin" title="Code">💻</a></td>
|
|
130
131
|
</tr>
|
|
131
132
|
</tbody>
|
|
132
133
|
</table>
|
package/dist/env.js
CHANGED
|
@@ -46,6 +46,7 @@ const schema = Type.Object({
|
|
|
46
46
|
SSL_KEY_PATH: Type.Optional(Type.String()),
|
|
47
47
|
SSL_CERT_PATH: Type.Optional(Type.String()),
|
|
48
48
|
TURBO_REMOTE_CACHE_SIGNATURE_KEY: Type.Optional(Type.String()),
|
|
49
|
+
READ_ONLY: Type.Optional(Type.Boolean({ default: false })),
|
|
49
50
|
}, {
|
|
50
51
|
additionalProperties: false,
|
|
51
52
|
});
|
|
@@ -70,4 +71,4 @@ export const env = {
|
|
|
70
71
|
return _env;
|
|
71
72
|
},
|
|
72
73
|
};
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vudi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVUsSUFBSSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDaEQsT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFBO0FBQ3JCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFdEMsTUFBTSxTQUFTLEdBQUc7SUFDaEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsSUFBSSxFQUFFLE1BQU07Q0FDSixDQUFBO0FBR1YsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUc7SUFDL0IsS0FBSyxFQUFFLE9BQU87SUFDZCxFQUFFLEVBQUUsSUFBSTtJQUNSLEVBQUUsRUFBRSxJQUFJO0lBQ1Isb0JBQW9CLEVBQUUsc0JBQXNCO0lBQzVDLGtCQUFrQixFQUFFLG9CQUFvQjtJQUN4QyxLQUFLLEVBQUUsT0FBTztDQUNOLENBQUE7QUFJVixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUN4QjtJQUNFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FDeEQ7SUFDRCxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FDMUQ7SUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN6QyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLEdB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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { badRequest } from '@hapi/boom';
|
|
1
|
+
import { badRequest, forbidden } from '@hapi/boom';
|
|
2
2
|
import { DEFAULT_OLDER_THAN_DAYS, cleanRouteSchema, } from './clean-schema.js';
|
|
3
3
|
function assertSafeTeamSlug(slug) {
|
|
4
4
|
if (slug === '.' ||
|
|
@@ -14,6 +14,9 @@ export const cleanCache = {
|
|
|
14
14
|
schema: cleanRouteSchema,
|
|
15
15
|
authorization: 'write',
|
|
16
16
|
async handler(req, reply) {
|
|
17
|
+
if (this.config.READ_ONLY) {
|
|
18
|
+
throw forbidden('Remote cache is running in read-only mode');
|
|
19
|
+
}
|
|
17
20
|
const slug = req.query.slug;
|
|
18
21
|
assertSafeTeamSlug(slug);
|
|
19
22
|
const olderThanDays = req.query.olderThan ?? DEFAULT_OLDER_THAN_DAYS;
|
|
@@ -21,4 +24,4 @@ export const cleanCache = {
|
|
|
21
24
|
return reply.send(result);
|
|
22
25
|
},
|
|
23
26
|
};
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGx1Z2lucy9yZW1vdGUtY2FjaGUvcm91dGVzL2NsZWFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBTWxELE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsZ0JBQWdCLEdBQ2pCLE1BQU0sbUJBQW1CLENBQUE7QUFFMUIsU0FBUyxrQkFBa0IsQ0FBQyxJQUFZO0lBQ3RDLElBQ0UsSUFBSSxLQUFLLEdBQUc7UUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUNuQixDQUFDO1FBQ0QsTUFBTSxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUE7SUFDbEMsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBT25CO0lBQ0YsTUFBTSxFQUFFLE1BQU07SUFDZCxHQUFHLEVBQUUsUUFBUTtJQUNiLE1BQU0sRUFBRSxnQkFBZ0I7SUFDeEIsYUFBYSxFQUFFLE9BQU87SUFDdEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSztRQUN0QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUIsTUFBTSxTQUFTLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtRQUM5RCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUE7UUFDM0Isa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFeEIsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksdUJBQXVCLENBQUE7UUFDcEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUUzRSxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0IsQ0FBQztDQUNGLENBQUEifQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Readable } from 'stream';
|
|
2
|
-
import { badRequest, preconditionFailed } from '@hapi/boom';
|
|
2
|
+
import { badRequest, forbidden, preconditionFailed } from '@hapi/boom';
|
|
3
3
|
import { artifactsRouteSchemaWithHeaders, } from './schema.js';
|
|
4
4
|
export const putArtifact = {
|
|
5
5
|
url: '/artifacts/:id',
|
|
@@ -7,6 +7,9 @@ export const putArtifact = {
|
|
|
7
7
|
schema: artifactsRouteSchemaWithHeaders,
|
|
8
8
|
authorization: 'write',
|
|
9
9
|
async handler(req, reply) {
|
|
10
|
+
if (this.config.READ_ONLY) {
|
|
11
|
+
throw forbidden('Remote cache is running in read-only mode');
|
|
12
|
+
}
|
|
10
13
|
const artifactId = req.params.id;
|
|
11
14
|
const team = req.query.teamId ?? req.query.team ?? req.query.slug;
|
|
12
15
|
if (!team) {
|
|
@@ -28,4 +31,4 @@ export const putArtifact = {
|
|
|
28
31
|
}
|
|
29
32
|
},
|
|
30
33
|
};
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHV0LWFydGlmYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbnMvcmVtb3RlLWNhY2hlL3JvdXRlcy9wdXQtYXJ0aWZhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQU10RSxPQUFPLEVBSUwsK0JBQStCLEdBQ2hDLE1BQU0sYUFBYSxDQUFBO0FBRXBCLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FVcEI7SUFDRixHQUFHLEVBQUUsZ0JBQWdCO0lBQ3JCLE1BQU0sRUFBRSxLQUFLO0lBQ2IsTUFBTSxFQUFFLCtCQUErQjtJQUN2QyxhQUFhLEVBQUUsT0FBTztJQUN0QixLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLO1FBQ3RCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQixNQUFNLFNBQVMsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFBO1FBQzlELENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQTtRQUNoQyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQTtRQUNqRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLFVBQVUsQ0FBQyxrREFBa0QsQ0FBQyxDQUFBO1FBQ3RFLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUE7WUFFakQsTUFBTSxlQUFlLEdBQW9CO2dCQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUNoQyxVQUFVLEVBQ1YsSUFBSSxFQUNKLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUN4QjthQUNGLENBQUE7WUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsZ0NBQWdDLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hFLGVBQWUsQ0FBQyxJQUFJLENBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FDckUsQ0FBQTtZQUNILENBQUM7WUFFRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUE7WUFFbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2pELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBRWIsTUFBTSxrQkFBa0IsQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUNyRSxDQUFDO0lBQ0gsQ0FBQztDQUNGLENBQUEifQ==
|