@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.
@@ -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
+ }
@@ -0,0 +1,4 @@
1
+ import type { Adapter } from '@genoacms/cloudabstraction/deployment';
2
+ declare const svelteKitAdapter: Adapter.svelteKitAdapter;
3
+ declare const deployProcedure: Adapter.deployProcedure;
4
+ export { svelteKitAdapter, deployProcedure };
@@ -0,0 +1,6 @@
1
+ const svelteKitAdapter = '@sveltejs/adapter-node';
2
+ const deployProcedure = async () => {
3
+ const deploy = (await import('./deploy.js')).default;
4
+ await deploy();
5
+ };
6
+ export { svelteKitAdapter, deployProcedure };
@@ -1,14 +1,4 @@
1
- import { Storage } from '@google-cloud/storage';
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,3 @@
1
+ import { type Bucket } from '@google-cloud/storage';
2
+ declare const getBucket: (name: string) => Bucket;
3
+ export { getBucket };
@@ -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.4.2",
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.4.2-fix.2",
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,8 @@
1
+ import { HttpFunction } from '@google-cloud/functions-framework'
2
+ import app from './build'
3
+
4
+ const svelteKitApp = HttpFunction(app.handler)
5
+
6
+ export {
7
+ svelteKitApp
8
+ }
@@ -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 Bucket, Storage, type File } from '@google-cloud/storage'
6
- import config from '../../config.js'
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
+ }