@cloud-cli/env 1.1.0 → 1.1.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/index.d.ts CHANGED
@@ -1,3 +1,10 @@
1
+ import { Resource } from '@cloud-cli/store';
2
+ import { init } from '@cloud-cli/cli';
3
+ declare class EnvEntry extends Resource {
4
+ app: string;
5
+ key: string;
6
+ value: string;
7
+ }
1
8
  export interface App {
2
9
  app: string;
3
10
  }
@@ -7,18 +14,19 @@ export interface KeyValue {
7
14
  }
8
15
  export interface AppKeyValue extends App, KeyValue {
9
16
  }
10
- declare function reload(): void;
11
- declare function show(options: App): Promise<unknown>;
12
- declare function apps(): Promise<unknown>;
13
- declare function set(options: AppKeyValue): Promise<unknown>;
14
- declare function remove(options: AppKeyValue): Promise<unknown>;
15
- declare function get(options: Omit<AppKeyValue, 'value'>): Promise<unknown>;
17
+ declare function reload(): Promise<void>;
18
+ declare function show(options: App): Promise<EnvEntry[]>;
19
+ declare function apps(): Promise<string[]>;
20
+ declare function set(options: AppKeyValue): Promise<EnvEntry>;
21
+ declare function remove(options: AppKeyValue): Promise<any>;
22
+ declare function get(options: Omit<AppKeyValue, 'value'>): Promise<EnvEntry[]>;
16
23
  declare const _default: {
17
- reload: typeof reload;
18
- show: typeof show;
19
24
  get: typeof get;
20
25
  set: typeof set;
21
- delete: typeof remove;
26
+ show: typeof show;
27
+ remove: typeof remove;
22
28
  apps: typeof apps;
29
+ reload: typeof reload;
30
+ [init]: typeof reload;
23
31
  };
24
32
  export default _default;
package/dist/index.js CHANGED
@@ -1,113 +1,72 @@
1
- import sqlite from 'sqlite3';
2
- import { join } from 'path';
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Model, NotNull, Property, Query, Resource, Unique } from '@cloud-cli/store';
8
+ import { init } from '@cloud-cli/cli';
3
9
  const appNotSpecifiedError = new Error('App not specified');
4
10
  const keyNotSpecifiedError = new Error('Key not specified');
5
- /* istanbul ignore next */
6
- const valueOrError = (resolve, reject) => (error, value = null) => error ? reject(error) : resolve(value);
7
- let db;
8
- const columns = {
9
- App: 'app',
10
- Key: 'key',
11
- Value: 'value',
11
+ let EnvEntry = class EnvEntry extends Resource {
12
12
  };
13
- function close() {
14
- try {
15
- db?.close();
16
- }
17
- catch { }
18
- ;
19
- }
20
- function reload() {
21
- close();
22
- const inMemory = !!process.env.IN_MEMORY_DB;
23
- if (inMemory) {
24
- sqlite.verbose();
25
- }
26
- const databasePath = {
27
- true: ':memory:',
28
- false: join(process.cwd(), 'env.db')
29
- }[String(inMemory)];
30
- db = new sqlite.Database(databasePath);
31
- db.run(`CREATE TABLE IF NOT EXISTS env (
32
- ${columns.App} TEXT,
33
- ${columns.Key} TEXT,
34
- ${columns.Value} TEXT,
35
- UNIQUE (${columns.App}, ${columns.Key})
36
- )`);
13
+ __decorate([
14
+ Unique(),
15
+ NotNull(),
16
+ Property(String)
17
+ ], EnvEntry.prototype, "app", void 0);
18
+ __decorate([
19
+ Unique(),
20
+ NotNull(),
21
+ Property(String)
22
+ ], EnvEntry.prototype, "key", void 0);
23
+ __decorate([
24
+ Property(String)
25
+ ], EnvEntry.prototype, "value", void 0);
26
+ EnvEntry = __decorate([
27
+ Model('env')
28
+ ], EnvEntry);
29
+ async function reload() {
30
+ await Resource.create(EnvEntry);
37
31
  }
38
32
  async function show(options) {
39
- return new Promise((resolve, reject) => {
40
- const { app } = options;
41
- if (!app) {
42
- return reject(appNotSpecifiedError);
43
- }
44
- db
45
- .prepare(`
46
- SELECT
47
- ${columns.App},
48
- ${columns.Key},
49
- ${columns.Value}
50
- FROM env WHERE
51
- ${columns.App} = ?`)
52
- .all([app], valueOrError(resolve, reject));
53
- });
33
+ const { app } = options;
34
+ if (!app) {
35
+ throw appNotSpecifiedError;
36
+ }
37
+ return Resource.find(EnvEntry, new Query().where('app').is(app));
54
38
  }
55
39
  async function apps() {
56
- return new Promise((resolve, reject) => {
57
- db
58
- .prepare(`SELECT ${columns.App} FROM env`)
59
- .all([], valueOrError(resolve, reject));
60
- });
40
+ const rows = await Resource.find(EnvEntry, new Query());
41
+ return rows.map(entry => entry.app);
61
42
  }
62
43
  async function set(options) {
63
44
  const { app, key, value } = options;
64
45
  if (!app) {
65
- return Promise.reject(appNotSpecifiedError);
46
+ throw appNotSpecifiedError;
66
47
  }
67
48
  if (!key) {
68
- return Promise.reject(keyNotSpecifiedError);
49
+ throw keyNotSpecifiedError;
69
50
  }
70
- return query('REPLACE INTO env VALUES (?, ?, ?)', [app, key, value]);
51
+ const entry = new EnvEntry({ app, key, value });
52
+ await entry.save();
53
+ return entry;
71
54
  }
72
55
  async function remove(options) {
56
+ const { app, key } = options;
57
+ const found = await get({ app, key });
58
+ if ((found).length) {
59
+ return void await found[0].remove();
60
+ }
61
+ }
62
+ async function get(options) {
73
63
  const { app, key } = options;
74
64
  if (!app) {
75
- return Promise.reject(appNotSpecifiedError);
65
+ throw appNotSpecifiedError;
76
66
  }
77
67
  if (!key) {
78
- return Promise.reject(keyNotSpecifiedError);
68
+ throw keyNotSpecifiedError;
79
69
  }
80
- return query(`DELETE FROM env WHERE ${columns.App} = ? AND ${columns.Key} = ?`, [app, key]);
81
- }
82
- async function get(options) {
83
- return new Promise((resolve, reject) => {
84
- const { app, key } = options;
85
- if (!app) {
86
- return reject(appNotSpecifiedError);
87
- }
88
- if (!key) {
89
- return reject(keyNotSpecifiedError);
90
- }
91
- db.serialize(() => {
92
- db
93
- .prepare(`
94
- SELECT
95
- ${columns.App},
96
- ${columns.Key},
97
- ${columns.Value}
98
- FROM env WHERE
99
- ${columns.App} = ? AND ${columns.Key} = ?`)
100
- .all([app, key], valueOrError(resolve, reject));
101
- });
102
- });
103
- }
104
- async function query(statement, inputs) {
105
- return new Promise((resolve, reject) => {
106
- db.serialize(() => {
107
- db
108
- .prepare(statement)
109
- .run(inputs, valueOrError(resolve, reject));
110
- });
111
- });
70
+ return Resource.find(EnvEntry, new Query().where('app').is(app).where('key').is(key));
112
71
  }
113
- export default { reload, show, get, set, delete: remove, apps };
72
+ export default { get, set, show, remove, apps, reload, [init]: reload };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloud-cli/env",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "Storage for app environment variables",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -28,6 +28,7 @@
28
28
  "access": "public"
29
29
  },
30
30
  "dependencies": {
31
- "sqlite3": "^5.1.4"
31
+ "@cloud-cli/cli": "^1.4.4",
32
+ "@cloud-cli/store": "^1.5.1"
32
33
  }
33
34
  }
@@ -1,13 +0,0 @@
1
- name: CICD
2
- on:
3
- push:
4
- branches:
5
- - main
6
- jobs:
7
- release:
8
- uses: homebots/workflows/.github/workflows/node-build-release.yml@master
9
- with:
10
- branches: main
11
- secrets:
12
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
13
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
package/src/index.spec.js DELETED
@@ -1,35 +0,0 @@
1
- import env from './index';
2
-
3
- beforeAll(() => {
4
- process.env.IN_MEMORY_DB = true;
5
- });
6
-
7
- const app = { app: 'test' };
8
- const envVariable = { app: 'test', key: 'key', value: 'ok' };
9
-
10
- describe('env', () => {
11
- it('should store variables for an app', async () => {
12
- env.reload();
13
- await expect(env.set({ app: '', key: '' })).rejects.toEqual(new Error('App not specified'));
14
- await expect(env.set({ app: 'test', key: '' })).rejects.toEqual(new Error('Key not specified'));
15
-
16
- await expect(env.get({ app: '', key: '' })).rejects.toEqual(new Error('App not specified'));
17
- await expect(env.get({ app: 'test', key: '' })).rejects.toEqual(new Error('Key not specified'));
18
- await expect(env.get({ app: 'test', key: 'key' })).resolves.toEqual([]);
19
-
20
- // upsert
21
- await expect(env.set(envVariable)).resolves.toBeNull();
22
- await expect(env.set(envVariable)).resolves.toBeNull();
23
-
24
- await expect(env.get({ app: 'test', key: 'key' })).resolves.toEqual([envVariable]);
25
-
26
- await expect(env.show({ app: '' })).rejects.toEqual(new Error('App not specified'));
27
- await expect(env.show(app)).resolves.toEqual([envVariable]);
28
- await expect(env.apps()).resolves.toEqual([{ app: 'test' }]);
29
-
30
- await expect(env.delete({ app: '', key: '' })).rejects.toEqual(new Error('App not specified'));
31
- await expect(env.delete({ app: 'test', key: '' })).rejects.toEqual(new Error('Key not specified'));
32
- await expect(env.delete(envVariable)).resolves.toBeNull();
33
- await expect(env.show(app)).resolves.toEqual([]);
34
- });
35
- });
package/src/index.ts DELETED
@@ -1,153 +0,0 @@
1
- import sqlite from 'sqlite3';
2
- import { join } from 'path';
3
-
4
- const appNotSpecifiedError = new Error('App not specified');
5
- const keyNotSpecifiedError = new Error('Key not specified');
6
-
7
- /* istanbul ignore next */
8
- const valueOrError = (resolve, reject) => (error, value = null) => error ? reject(error) : resolve(value)
9
-
10
- let db: sqlite.Database;
11
-
12
- const columns = {
13
- App: 'app',
14
- Key: 'key',
15
- Value: 'value',
16
- };
17
-
18
- export interface App {
19
- app: string;
20
- }
21
-
22
- export interface KeyValue {
23
- key: string;
24
- value?: string;
25
- }
26
-
27
- export interface AppKeyValue extends App, KeyValue { }
28
-
29
- function close() {
30
- try {
31
- db?.close();
32
- } catch { };
33
- }
34
-
35
- function reload() {
36
- close();
37
-
38
- const inMemory = !!process.env.IN_MEMORY_DB;
39
-
40
- if (inMemory) {
41
- sqlite.verbose();
42
- }
43
-
44
- const databasePath = {
45
- true: ':memory:',
46
- false: join(process.cwd(), 'env.db')
47
- }[String(inMemory)];
48
-
49
- db = new sqlite.Database(databasePath);
50
- db.run(`CREATE TABLE IF NOT EXISTS env (
51
- ${columns.App} TEXT,
52
- ${columns.Key} TEXT,
53
- ${columns.Value} TEXT,
54
- UNIQUE (${columns.App}, ${columns.Key})
55
- )`);
56
- }
57
-
58
- async function show(options: App) {
59
- return new Promise((resolve, reject) => {
60
- const { app } = options;
61
-
62
- if (!app) {
63
- return reject(appNotSpecifiedError);
64
- }
65
-
66
- db
67
- .prepare(`
68
- SELECT
69
- ${columns.App},
70
- ${columns.Key},
71
- ${columns.Value}
72
- FROM env WHERE
73
- ${columns.App} = ?`
74
- )
75
- .all([app], valueOrError(resolve, reject));
76
- });
77
- }
78
-
79
- async function apps() {
80
- return new Promise((resolve, reject) => {
81
- db
82
- .prepare(`SELECT ${columns.App} FROM env`)
83
- .all([], valueOrError(resolve, reject));
84
- });
85
- }
86
-
87
- async function set(options: AppKeyValue) {
88
- const { app, key, value } = options;
89
-
90
- if (!app) {
91
- return Promise.reject(appNotSpecifiedError);
92
- }
93
-
94
- if (!key) {
95
- return Promise.reject(keyNotSpecifiedError);
96
- }
97
-
98
- return query('REPLACE INTO env VALUES (?, ?, ?)', [app, key, value]);
99
- }
100
-
101
- async function remove(options: AppKeyValue) {
102
- const { app, key } = options;
103
-
104
- if (!app) {
105
- return Promise.reject(appNotSpecifiedError);
106
- }
107
-
108
- if (!key) {
109
- return Promise.reject(keyNotSpecifiedError);
110
- }
111
-
112
- return query(`DELETE FROM env WHERE ${columns.App} = ? AND ${columns.Key} = ?`, [app, key])
113
- }
114
-
115
- async function get(options: Omit<AppKeyValue, 'value'>) {
116
- return new Promise((resolve, reject) => {
117
- const { app, key } = options;
118
-
119
- if (!app) {
120
- return reject(appNotSpecifiedError);
121
- }
122
-
123
- if (!key) {
124
- return reject(keyNotSpecifiedError);
125
- }
126
-
127
- db.serialize(() => {
128
- db
129
- .prepare(`
130
- SELECT
131
- ${columns.App},
132
- ${columns.Key},
133
- ${columns.Value}
134
- FROM env WHERE
135
- ${columns.App} = ? AND ${columns.Key} = ?`
136
- )
137
- .all([app, key], valueOrError(resolve, reject));
138
- });
139
- });
140
- }
141
-
142
- async function query(statement, inputs) {
143
- return new Promise((resolve, reject) => {
144
- db.serialize(() => {
145
- db
146
- .prepare(statement)
147
- .run(inputs, valueOrError(resolve, reject));
148
- });
149
- })
150
- }
151
-
152
-
153
- export default { reload, show, get, set, delete: remove, apps };
package/tsconfig.json DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "extends": "@cloud-cli/typescript-config",
3
- "compilerOptions": {
4
- "outDir": "./dist",
5
- },
6
- "include": ["./src/**/*.ts"]
7
- }