@genoacms/adapter-gcp 0.4.2 → 0.5.2
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/services/deployment/deploy.d.ts +1 -0
- package/dist/services/deployment/deploy.js +67 -0
- package/dist/services/deployment/index.d.ts +4 -0
- package/dist/services/deployment/index.js +6 -0
- package/dist/services/storage/index.js +3 -13
- package/dist/services/storage/storage.d.ts +3 -0
- package/dist/services/storage/storage.js +12 -0
- package/package.json +7 -2
- package/src/services/deployment/cloudFunction.js +8 -0
- package/src/services/deployment/deploy.ts +74 -0
- package/src/services/deployment/index.ts +13 -0
- package/src/services/storage/index.ts +4 -14
- package/src/services/storage/storage.ts +16 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function (): Promise<void>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import config from '../../config.js';
|
|
2
|
+
import { getBucket } from '../storage/storage.js';
|
|
3
|
+
import { readdir, lstat } from 'node:fs/promises';
|
|
4
|
+
import { createReadStream } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { CloudFunctionsServiceClient } from '@google-cloud/functions';
|
|
7
|
+
const functionsClient = new CloudFunctionsServiceClient({
|
|
8
|
+
credentials: config.deployment.credentials
|
|
9
|
+
});
|
|
10
|
+
const projectId = config.deployment.projectId;
|
|
11
|
+
const region = config.deployment.region;
|
|
12
|
+
async function uploadDirectory(bucketName, directoryPath, prefix = '') {
|
|
13
|
+
const bucket = getBucket(bucketName);
|
|
14
|
+
const files = await readdir(directoryPath);
|
|
15
|
+
for (const file of files) {
|
|
16
|
+
const filePath = join(directoryPath, file);
|
|
17
|
+
const destination = join(prefix, file);
|
|
18
|
+
const isFileDirectory = (await lstat(filePath)).isDirectory();
|
|
19
|
+
if (isFileDirectory) {
|
|
20
|
+
await uploadDirectory(bucketName, filePath, destination);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
const fileStream = createReadStream(filePath);
|
|
24
|
+
const gcsFile = bucket.file(destination);
|
|
25
|
+
await new Promise((resolve, reject) => {
|
|
26
|
+
fileStream
|
|
27
|
+
.pipe(gcsFile.createWriteStream())
|
|
28
|
+
.on('error', reject)
|
|
29
|
+
.on('finish', resolve);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function uploadSourceCode(bucketName, source, dest) {
|
|
35
|
+
const bucket = getBucket(bucketName);
|
|
36
|
+
const uploadResponse = await bucket.upload(source, {
|
|
37
|
+
gzip: true,
|
|
38
|
+
destination: dest
|
|
39
|
+
});
|
|
40
|
+
const file = uploadResponse[0];
|
|
41
|
+
return file.cloudStorageURI.toString();
|
|
42
|
+
}
|
|
43
|
+
async function deployFunction(name, source) {
|
|
44
|
+
const location = functionsClient.locationPath(projectId, region);
|
|
45
|
+
const [response] = await functionsClient.createFunction({
|
|
46
|
+
location,
|
|
47
|
+
function: {
|
|
48
|
+
name,
|
|
49
|
+
sourceUploadUrl: source,
|
|
50
|
+
entryPoint: 'handler',
|
|
51
|
+
runtime: 'nodejs20',
|
|
52
|
+
httpsTrigger: {},
|
|
53
|
+
environmentVariables: {
|
|
54
|
+
NODE_ENV: 'production'
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}, {});
|
|
58
|
+
console.log(response);
|
|
59
|
+
}
|
|
60
|
+
export default async function () {
|
|
61
|
+
const bucketName = config.storage.defaultBucket;
|
|
62
|
+
const assetsPath = '.genoacms/deployment/static';
|
|
63
|
+
const buildArchivePath = '.genoacms/deployment/build.zip';
|
|
64
|
+
await uploadDirectory(bucketName, './static', assetsPath);
|
|
65
|
+
const buildArchiveURI = await uploadSourceCode(bucketName, './build', buildArchivePath);
|
|
66
|
+
await deployFunction('genoacms', buildArchiveURI);
|
|
67
|
+
}
|
|
@@ -1,14 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import config from '../../config.js';
|
|
3
|
-
const storage = new Storage({
|
|
4
|
-
credentials: config.storage.credentials
|
|
5
|
-
});
|
|
6
|
-
const getBucket = (name) => {
|
|
7
|
-
if (!config.storage.buckets.includes(name))
|
|
8
|
-
throw new Error('bucket-unregistered');
|
|
9
|
-
const bucket = storage.bucket(name);
|
|
10
|
-
return bucket;
|
|
11
|
-
};
|
|
1
|
+
import { getBucket } from './storage.js';
|
|
12
2
|
const getObject = async ({ bucket, name }) => {
|
|
13
3
|
const bucketInstance = getBucket(bucket);
|
|
14
4
|
const file = bucketInstance.file(name);
|
|
@@ -32,10 +22,10 @@ const getSignedURL = async ({ bucket, name }) => {
|
|
|
32
22
|
});
|
|
33
23
|
return url;
|
|
34
24
|
};
|
|
35
|
-
const uploadObject = async ({ bucket, name }, stream) => {
|
|
25
|
+
const uploadObject = async ({ bucket, name }, stream, options) => {
|
|
36
26
|
const bucketInstance = getBucket(bucket);
|
|
37
27
|
const file = bucketInstance.file(name);
|
|
38
|
-
await file.save(stream);
|
|
28
|
+
await file.save(stream, options);
|
|
39
29
|
};
|
|
40
30
|
const deleteObject = async ({ bucket, name }) => {
|
|
41
31
|
const bucketInstance = getBucket(bucket);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import config from '../../config.js';
|
|
2
|
+
import { Storage } from '@google-cloud/storage';
|
|
3
|
+
const storage = new Storage({
|
|
4
|
+
credentials: config.storage.credentials
|
|
5
|
+
});
|
|
6
|
+
const getBucket = (name) => {
|
|
7
|
+
if (!config.storage.buckets.includes(name))
|
|
8
|
+
throw new Error('bucket-unregistered');
|
|
9
|
+
const bucket = storage.bucket(name);
|
|
10
|
+
return bucket;
|
|
11
|
+
};
|
|
12
|
+
export { getBucket };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@genoacms/adapter-gcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "Implementation of abstraction layer of GenoaCMS for GCP",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -17,8 +17,9 @@
|
|
|
17
17
|
"homepage": "https://github.com/GenoaCMS/adapter-gcp#readme",
|
|
18
18
|
"type": "module",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@genoacms/cloudabstraction": "0.
|
|
20
|
+
"@genoacms/cloudabstraction": "^0.5.2",
|
|
21
21
|
"@google-cloud/firestore": "^7.1.0",
|
|
22
|
+
"@google-cloud/functions": "^3.2.0",
|
|
22
23
|
"@google-cloud/resource-manager": "^5.1.0",
|
|
23
24
|
"@google-cloud/storage": "^7.7.0"
|
|
24
25
|
},
|
|
@@ -33,6 +34,10 @@
|
|
|
33
34
|
"typescript": "^5.2.2",
|
|
34
35
|
"vitest": "^1.0.4"
|
|
35
36
|
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"@sveltejs/adapter-node": "^4.0.1",
|
|
39
|
+
"@google-cloud/functions-framework": "^3.3.0"
|
|
40
|
+
},
|
|
36
41
|
"files": [
|
|
37
42
|
"src",
|
|
38
43
|
"dist"
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import config from '../../config.js'
|
|
2
|
+
import { getBucket } from '../storage/storage.js'
|
|
3
|
+
import { readdir, lstat } from 'node:fs/promises'
|
|
4
|
+
import { createReadStream } from 'node:fs'
|
|
5
|
+
import { join } from 'node:path'
|
|
6
|
+
import { CloudFunctionsServiceClient } from '@google-cloud/functions'
|
|
7
|
+
|
|
8
|
+
const functionsClient = new CloudFunctionsServiceClient({
|
|
9
|
+
credentials: config.deployment.credentials
|
|
10
|
+
})
|
|
11
|
+
const projectId = config.deployment.projectId
|
|
12
|
+
const region = config.deployment.region
|
|
13
|
+
|
|
14
|
+
async function uploadDirectory (bucketName: string, directoryPath: string, prefix = ''): Promise<void> {
|
|
15
|
+
const bucket = getBucket(bucketName)
|
|
16
|
+
const files = await readdir(directoryPath)
|
|
17
|
+
|
|
18
|
+
for (const file of files) {
|
|
19
|
+
const filePath = join(directoryPath, file)
|
|
20
|
+
const destination = join(prefix, file)
|
|
21
|
+
|
|
22
|
+
const isFileDirectory = (await lstat(filePath)).isDirectory()
|
|
23
|
+
if (isFileDirectory) {
|
|
24
|
+
await uploadDirectory(bucketName, filePath, destination)
|
|
25
|
+
} else {
|
|
26
|
+
const fileStream = createReadStream(filePath)
|
|
27
|
+
const gcsFile = bucket.file(destination)
|
|
28
|
+
|
|
29
|
+
await new Promise((resolve, reject) => {
|
|
30
|
+
fileStream
|
|
31
|
+
.pipe(gcsFile.createWriteStream())
|
|
32
|
+
.on('error', reject)
|
|
33
|
+
.on('finish', resolve)
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function uploadSourceCode (bucketName: string, source: string, dest: string): Promise<string> {
|
|
40
|
+
const bucket = getBucket(bucketName)
|
|
41
|
+
const uploadResponse = await bucket.upload(source, {
|
|
42
|
+
gzip: true,
|
|
43
|
+
destination: dest
|
|
44
|
+
})
|
|
45
|
+
const file = uploadResponse[0]
|
|
46
|
+
return file.cloudStorageURI.toString()
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function deployFunction (name: string, source: string): Promise<void> {
|
|
50
|
+
const location = functionsClient.locationPath(projectId, region)
|
|
51
|
+
const [response] = await functionsClient.createFunction({
|
|
52
|
+
location,
|
|
53
|
+
function: {
|
|
54
|
+
name,
|
|
55
|
+
sourceUploadUrl: source,
|
|
56
|
+
entryPoint: 'handler',
|
|
57
|
+
runtime: 'nodejs20',
|
|
58
|
+
httpsTrigger: {},
|
|
59
|
+
environmentVariables: {
|
|
60
|
+
NODE_ENV: 'production'
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}, {})
|
|
64
|
+
console.log(response)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export default async function (): Promise<void> {
|
|
68
|
+
const bucketName = config.storage.defaultBucket
|
|
69
|
+
const assetsPath = '.genoacms/deployment/static'
|
|
70
|
+
const buildArchivePath = '.genoacms/deployment/build.zip'
|
|
71
|
+
await uploadDirectory(bucketName, './static', assetsPath)
|
|
72
|
+
const buildArchiveURI = await uploadSourceCode(bucketName, './build', buildArchivePath)
|
|
73
|
+
await deployFunction('genoacms', buildArchiveURI)
|
|
74
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Adapter } from '@genoacms/cloudabstraction/deployment'
|
|
2
|
+
|
|
3
|
+
const svelteKitAdapter: Adapter.svelteKitAdapter = '@sveltejs/adapter-node'
|
|
4
|
+
|
|
5
|
+
const deployProcedure: Adapter.deployProcedure = async () => {
|
|
6
|
+
const deploy = (await import('./deploy.js')).default
|
|
7
|
+
await deploy()
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export {
|
|
11
|
+
svelteKitAdapter,
|
|
12
|
+
deployProcedure
|
|
13
|
+
}
|
|
@@ -2,18 +2,8 @@ import type {
|
|
|
2
2
|
Adapter,
|
|
3
3
|
StorageObject
|
|
4
4
|
} from '@genoacms/cloudabstraction/storage'
|
|
5
|
-
import { type
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
const storage = new Storage({
|
|
9
|
-
credentials: config.storage.credentials
|
|
10
|
-
})
|
|
11
|
-
|
|
12
|
-
const getBucket = (name: string): Bucket => {
|
|
13
|
-
if (!config.storage.buckets.includes(name)) throw new Error('bucket-unregistered')
|
|
14
|
-
const bucket = storage.bucket(name)
|
|
15
|
-
return bucket
|
|
16
|
-
}
|
|
5
|
+
import { type File } from '@google-cloud/storage'
|
|
6
|
+
import { getBucket } from './storage.js'
|
|
17
7
|
|
|
18
8
|
const getObject: Adapter.getObject = async ({ bucket, name }) => {
|
|
19
9
|
const bucketInstance = getBucket(bucket)
|
|
@@ -42,10 +32,10 @@ const getSignedURL: Adapter.getSignedURL = async ({ bucket, name }) => {
|
|
|
42
32
|
return url
|
|
43
33
|
}
|
|
44
34
|
|
|
45
|
-
const uploadObject: Adapter.uploadObject = async ({ bucket, name }, stream) => {
|
|
35
|
+
const uploadObject: Adapter.uploadObject = async ({ bucket, name }, stream, options) => {
|
|
46
36
|
const bucketInstance = getBucket(bucket)
|
|
47
37
|
const file = bucketInstance.file(name)
|
|
48
|
-
await file.save(stream)
|
|
38
|
+
await file.save(stream, options)
|
|
49
39
|
}
|
|
50
40
|
|
|
51
41
|
const deleteObject: Adapter.deleteObject = async ({ bucket, name }) => {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import config from '../../config.js'
|
|
2
|
+
import { type Bucket, Storage } from '@google-cloud/storage'
|
|
3
|
+
|
|
4
|
+
const storage = new Storage({
|
|
5
|
+
credentials: config.storage.credentials
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
const getBucket = (name: string): Bucket => {
|
|
9
|
+
if (!config.storage.buckets.includes(name)) throw new Error('bucket-unregistered')
|
|
10
|
+
const bucket = storage.bucket(name)
|
|
11
|
+
return bucket
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
getBucket
|
|
16
|
+
}
|