static-file-mapper-build 0.3.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 ADDED
@@ -0,0 +1,3 @@
1
+ # Static File Mapper
2
+
3
+ Helps with managing static files for frontend deployments during deployments.
@@ -0,0 +1,50 @@
1
+ import { StaticFileMapper } from 'static-file-mapper';
2
+ export interface StaticFileMapping {
3
+ name: string;
4
+ generatedName: string;
5
+ }
6
+ export declare type MappingStore = StaticFileMapping[];
7
+ /**
8
+ * Allows defining static file mappings during build.
9
+ */
10
+ export interface StaticFileMapperManager extends StaticFileMapper {
11
+ put({ name, generatedName, content, }: {
12
+ name: string;
13
+ generatedName: string;
14
+ content: string;
15
+ }): Promise<void>;
16
+ remove({ name }: {
17
+ name: string;
18
+ }): Promise<void>;
19
+ reset(): Promise<void>;
20
+ resolve({ name }: {
21
+ name: string;
22
+ }): Promise<string>;
23
+ }
24
+ export declare class StaticFileMapperBuild implements StaticFileMapperManager {
25
+ private dir;
26
+ private storePath;
27
+ private createContentHash;
28
+ private readStore;
29
+ private writeStore;
30
+ put({ name, generatedName, content, }: {
31
+ name: string;
32
+ generatedName: string;
33
+ content: string;
34
+ }): Promise<void>;
35
+ remove({ name }: {
36
+ name: string;
37
+ }): Promise<void>;
38
+ resolve({ name }: {
39
+ name: string;
40
+ }): Promise<string>;
41
+ has({ name }: {
42
+ name: string;
43
+ }): Promise<boolean>;
44
+ reset(): Promise<void>;
45
+ constructor({ dir, storePath }: {
46
+ dir: string;
47
+ storePath: string;
48
+ });
49
+ }
50
+ //# sourceMappingURL=staticFileMapperBuild.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staticFileMapperBuild.d.ts","sourceRoot":"","sources":["../../src/staticFileMapperBuild.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAID,oBAAY,YAAY,GAAG,iBAAiB,EAAE,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,GAAG,CAAC,EACF,IAAI,EACJ,aAAa,EACb,OAAO,GACR,EAAE;QACD,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtD;AAED,qBAAa,qBAAsB,YAAW,uBAAuB;IACnE,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,UAAU;IAOL,GAAG,CAAC,EACf,IAAI,EACJ,aAAa,EACb,OAAO,GACR,EAAE;QACD,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCJ,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAejD,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAUpD,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAQjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;gBAKvB,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CAInE"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StaticFileMapperBuild = void 0;
4
+ const utils_sh_1 = require("@goldstack/utils-sh");
5
+ const path_1 = require("path");
6
+ const crypto_1 = require("crypto");
7
+ class StaticFileMapperBuild {
8
+ constructor({ dir, storePath }) {
9
+ this.dir = dir;
10
+ this.storePath = storePath;
11
+ }
12
+ createContentHash(content) {
13
+ const hash = (0, crypto_1.createHash)('md5').update(content).digest('hex');
14
+ return hash;
15
+ }
16
+ readStore() {
17
+ if (this.storePath) {
18
+ return JSON.parse((0, utils_sh_1.read)(this.storePath));
19
+ }
20
+ throw new Error('Cannot read static file mapper store');
21
+ }
22
+ writeStore(store) {
23
+ if (!this.storePath) {
24
+ throw new Error('Cannot write static file mapper store');
25
+ }
26
+ (0, utils_sh_1.write)(JSON.stringify(store, null, 2), this.storePath);
27
+ }
28
+ async put({ name, generatedName, content, }) {
29
+ let hashedName = generatedName;
30
+ if (hashedName.indexOf('[hash]') !== -1) {
31
+ const hash = this.createContentHash(content);
32
+ hashedName = hashedName.replace('[hash]', hash);
33
+ }
34
+ const path = `${this.dir}/${hashedName}`;
35
+ (0, utils_sh_1.mkdir)('-p', (0, path_1.dirname)(path));
36
+ (0, utils_sh_1.write)(content, path);
37
+ const store = this.readStore();
38
+ let found = false;
39
+ store.map((mapping) => {
40
+ if (mapping.name === name) {
41
+ // clear out replaced file locally
42
+ // should still continue to exist in S3
43
+ // bucket
44
+ if (mapping.generatedName !== hashedName) {
45
+ (0, utils_sh_1.rm)('-f', `${this.dir}/${mapping.generatedName}`);
46
+ mapping.generatedName = hashedName;
47
+ }
48
+ found = true;
49
+ }
50
+ });
51
+ if (!found) {
52
+ store.push({
53
+ name,
54
+ generatedName: hashedName,
55
+ });
56
+ }
57
+ this.writeStore(store);
58
+ }
59
+ async remove({ name }) {
60
+ let store = this.readStore();
61
+ const element = store.find((el) => el.name === name);
62
+ if (element) {
63
+ // clear out removed file locally
64
+ // should still continue to exist in S3
65
+ // bucket
66
+ (0, utils_sh_1.rm)('-f', `${this.dir}/${element.generatedName}`);
67
+ }
68
+ store = store.filter((el) => {
69
+ return el.name !== name;
70
+ });
71
+ this.writeStore(store);
72
+ }
73
+ async resolve({ name }) {
74
+ const store = this.readStore();
75
+ const mapping = store.find((mapping) => mapping.name === name);
76
+ if (!mapping) {
77
+ throw new Error(`Cannot find static file mapping for ${name}`);
78
+ }
79
+ return mapping.generatedName;
80
+ }
81
+ async has({ name }) {
82
+ const store = this.readStore();
83
+ const mapping = store.find((mapping) => mapping.name === name);
84
+ return !!mapping;
85
+ }
86
+ async reset() {
87
+ this.writeStore([]);
88
+ await (0, utils_sh_1.rmSafe)(this.dir);
89
+ }
90
+ }
91
+ exports.StaticFileMapperBuild = StaticFileMapperBuild;
92
+ //# sourceMappingURL=staticFileMapperBuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staticFileMapperBuild.js","sourceRoot":"","sources":["../../src/staticFileMapperBuild.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "static-file-mapper-build",
3
+ "version": "0.3.0",
4
+ "description": "Helps tracking path to generated static files for deployment bundles",
5
+ "keywords": [
6
+ "javascript"
7
+ ],
8
+ "homepage": "https://goldstack.party",
9
+ "bugs": {
10
+ "url": "https://github.com/goldstack/goldstack/issues"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/goldstack/goldstack.git"
15
+ },
16
+ "license": "MIT",
17
+ "author": "Max Rohde",
18
+ "sideEffects": false,
19
+ "main": "dist/src/staticFileMapperBuild.js",
20
+ "scripts": {
21
+ "build": "yarn clean && yarn compile",
22
+ "build:watch": "yarn clean && yarn compile-watch",
23
+ "clean": "rimraf ./dist",
24
+ "compile": "tsc -p tsconfig.json",
25
+ "compile-watch": "tsc -p tsconfig.json --watch",
26
+ "compile-watch:light": "nodemon --watch ./src/ -e '*' --exec 'yarn compile'",
27
+ "coverage": "jest --collect-coverage --passWithNoTests --config=./jest.config.js --runInBand",
28
+ "prepublishOnly": "yarn run build",
29
+ "publish": "utils-git changed --exec \"yarn npm publish $@\"",
30
+ "test-ci": "jest --passWithNoTests --config=./jest.config.js --runInBand",
31
+ "version:apply": "utils-git changed --exec \"yarn version $@ && yarn version apply\""
32
+ },
33
+ "dependencies": {
34
+ "@goldstack/utils-sh": "0.5.0",
35
+ "static-file-mapper": "0.3.0"
36
+ },
37
+ "devDependencies": {
38
+ "@goldstack/utils-git": "0.2.0",
39
+ "@types/aws-lambda": "^8.10.88",
40
+ "@types/jest": "^28.1.8",
41
+ "@types/node": "^18.7.13",
42
+ "jest": "^28.1.0",
43
+ "rimraf": "^3.0.2",
44
+ "ts-jest": "^28.0.2",
45
+ "typescript": "^4.7.4"
46
+ },
47
+ "publishConfig": {
48
+ "main": "dist/src/staticFileMapperBuild.js"
49
+ }
50
+ }