@heychunky/core 0.2.1 → 0.4.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/dist/admin/provision.d.ts +23 -2
- package/dist/admin/provision.d.ts.map +1 -1
- package/dist/admin/provision.js +16 -17
- package/dist/admin/provision.js.map +1 -1
- package/dist/config/environments.d.ts +13 -0
- package/dist/config/environments.d.ts.map +1 -1
- package/dist/config/environments.js +13 -0
- package/dist/config/environments.js.map +1 -1
- package/dist/services/db.d.ts.map +1 -1
- package/dist/services/db.js +24 -0
- package/dist/services/db.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,7 +2,11 @@ import { type RunContext } from "./run.ts";
|
|
|
2
2
|
export interface AppSpec {
|
|
3
3
|
/** The app's name. Becomes the repository, the database and the project. */
|
|
4
4
|
name: string;
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* GitHub organisation. Omitted means the factory's, not the token's account
|
|
7
|
+
* — an app made on whoever happens to hold the token is a silent wrong
|
|
8
|
+
* answer rather than a default worth having.
|
|
9
|
+
*/
|
|
6
10
|
org?: string;
|
|
7
11
|
/** Give it a database. */
|
|
8
12
|
neon?: boolean;
|
|
@@ -38,5 +42,22 @@ export interface Run {
|
|
|
38
42
|
* provisioning against five providers, and the caller needs to see how far it
|
|
39
43
|
* got. A thrown error would lose exactly the steps that already succeeded.
|
|
40
44
|
*/
|
|
41
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Told about each step as it settles, and about each one before it is tried.
|
|
47
|
+
*
|
|
48
|
+
* A run takes the better part of a minute — a repository, a database with a
|
|
49
|
+
* branch per environment, a deployment target — and a caller that can only
|
|
50
|
+
* report the end has nothing to say for most of it. `watch` is optional
|
|
51
|
+
* because the CLI prints the finished run, and adding a callback there would
|
|
52
|
+
* be ceremony for the same output.
|
|
53
|
+
*/
|
|
54
|
+
export interface Watcher {
|
|
55
|
+
/** About to be attempted. */
|
|
56
|
+
start?(step: string): void;
|
|
57
|
+
/** Settled, one way or another. */
|
|
58
|
+
done?(result: StepResult): void;
|
|
59
|
+
}
|
|
60
|
+
/** The steps a run will attempt, before it attempts any. */
|
|
61
|
+
export declare const stepsFor: (spec: AppSpec) => string[];
|
|
62
|
+
export declare function provision(spec: AppSpec, ctx: RunContext, watch?: Watcher): Promise<Run>;
|
|
42
63
|
//# sourceMappingURL=provision.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../../src/admin/provision.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAGpD,MAAM,WAAW,OAAO;IACtB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb
|
|
1
|
+
{"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../../src/admin/provision.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAGpD,MAAM,WAAW,OAAO;IACtB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mCAAmC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,SAAS;AACnB,uCAAuC;AACrC,QAAQ;AACV,qBAAqB;GACnB,SAAS;AACX,6CAA6C;GAC3C,cAAc;AAChB,+CAA+C;GAC7C,QAAQ,CAAC;AAEb,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,GAAG;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,uCAAuC;IACvC,EAAE,EAAE,OAAO,CAAC;CACb;AA6GD;;;;;;GAMG;AACH;;;;;;;;GAQG;AACH,MAAM,WAAW,OAAO;IACtB,6BAA6B;IAC7B,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mCAAmC;IACnC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;CACjC;AAED,4DAA4D;AAC5D,eAAO,MAAM,QAAQ,GAAI,MAAM,OAAO,KAAG,MAAM,EACS,CAAC;AAEzD,wBAAsB,SAAS,CAC7B,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,UAAU,EACf,KAAK,CAAC,EAAE,OAAO,GACd,OAAO,CAAC,GAAG,CAAC,CAqCd"}
|
package/dist/admin/provision.js
CHANGED
|
@@ -24,7 +24,7 @@ import { github } from "./services/github.js";
|
|
|
24
24
|
import { vercel } from "./services/vercel.js";
|
|
25
25
|
import { neon } from "./services/neon.js";
|
|
26
26
|
import { KEY_FOR } from "./run.js";
|
|
27
|
-
import { BRANCHED, DEFAULT_BRANCH } from "../config/environments.js";
|
|
27
|
+
import { BRANCHED, DEFAULT_BRANCH, DEFAULT_ORG } from "../config/environments.js";
|
|
28
28
|
const STEPS = [
|
|
29
29
|
{
|
|
30
30
|
name: "github repo",
|
|
@@ -33,16 +33,15 @@ const STEPS = [
|
|
|
33
33
|
// What would be created, replaced below by what actually exists — the
|
|
34
34
|
// repository may be named a variant of the app, and later steps must link
|
|
35
35
|
// to the real one rather than to the name we guessed.
|
|
36
|
-
const
|
|
37
|
-
carry.repo = `${
|
|
38
|
-
const repo = await gh.findRepoFor(spec.name, spec.org);
|
|
36
|
+
const repo = await gh.findRepoFor(spec.name, spec.org ?? DEFAULT_ORG);
|
|
37
|
+
carry.repo = `${spec.org ?? DEFAULT_ORG}/${spec.name}`;
|
|
39
38
|
if (!repo)
|
|
40
39
|
return undefined;
|
|
41
40
|
carry.repo = repo.full_name;
|
|
42
41
|
return `${repo.full_name} · ${repo.private ? "private" : "PUBLIC"}`;
|
|
43
42
|
},
|
|
44
43
|
async create(spec, { gh }, carry) {
|
|
45
|
-
const repo = await gh.createRepo(spec.name, { org: spec.org });
|
|
44
|
+
const repo = await gh.createRepo(spec.name, { org: spec.org ?? DEFAULT_ORG });
|
|
46
45
|
carry.repo = repo.full_name;
|
|
47
46
|
return `${repo.full_name} · private`;
|
|
48
47
|
},
|
|
@@ -115,32 +114,32 @@ async function clientsFor(ctx) {
|
|
|
115
114
|
const [g, v, n] = await Promise.all([key("github"), key("vercel"), key("neon")]);
|
|
116
115
|
return { gh: github(g), vc: vercel(v), nn: neon(n) };
|
|
117
116
|
}
|
|
118
|
-
/**
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
* Returns rather than throws: a partial run is the normal outcome of
|
|
122
|
-
* provisioning against five providers, and the caller needs to see how far it
|
|
123
|
-
* got. A thrown error would lose exactly the steps that already succeeded.
|
|
124
|
-
*/
|
|
125
|
-
export async function provision(spec, ctx) {
|
|
117
|
+
/** The steps a run will attempt, before it attempts any. */
|
|
118
|
+
export const stepsFor = (spec) => STEPS.filter((s) => s.wanted(spec)).map((s) => s.name);
|
|
119
|
+
export async function provision(spec, ctx, watch) {
|
|
126
120
|
const clients = await clientsFor(ctx);
|
|
127
121
|
const carry = {};
|
|
128
122
|
const steps = [];
|
|
123
|
+
const settle = (result) => {
|
|
124
|
+
steps.push(result);
|
|
125
|
+
watch?.done?.(result);
|
|
126
|
+
};
|
|
129
127
|
for (const step of STEPS.filter((s) => s.wanted(spec))) {
|
|
128
|
+
watch?.start?.(step.name);
|
|
130
129
|
try {
|
|
131
130
|
const found = await step.find(spec, clients, carry);
|
|
132
131
|
if (found !== undefined) {
|
|
133
|
-
|
|
132
|
+
settle({ step: step.name, state: "exists", detail: found });
|
|
134
133
|
continue;
|
|
135
134
|
}
|
|
136
135
|
if (!ctx.confirmed) {
|
|
137
|
-
|
|
136
|
+
settle({ step: step.name, state: "would-create", detail: spec.name });
|
|
138
137
|
continue;
|
|
139
138
|
}
|
|
140
|
-
|
|
139
|
+
settle({ step: step.name, state: "created", detail: await step.create(spec, clients, carry) });
|
|
141
140
|
}
|
|
142
141
|
catch (err) {
|
|
143
|
-
|
|
142
|
+
settle({
|
|
144
143
|
step: step.name, state: "failed",
|
|
145
144
|
detail: err instanceof Error ? err.message : String(err),
|
|
146
145
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provision.js","sourceRoot":"","sources":["../../src/admin/provision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAmB,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"provision.js","sourceRoot":"","sources":["../../src/admin/provision.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,4 +47,17 @@ export declare const DEPLOYS: Partial<Record<Environment, {
|
|
|
47
47
|
}>>;
|
|
48
48
|
/** The environments a deployment ever reads. */
|
|
49
49
|
export declare const DEPLOYED: readonly Environment[];
|
|
50
|
+
/**
|
|
51
|
+
* The GitHub organisation an app is made in, unless a caller says otherwise.
|
|
52
|
+
*
|
|
53
|
+
* Without one, GitHub creates the repository on whatever account the token
|
|
54
|
+
* belongs to. That is a silent wrong answer rather than an error: the app is
|
|
55
|
+
* made, it works, and it is in the wrong place — and a repository can be
|
|
56
|
+
* transferred later where a Neon project and a Vercel project cannot be moved
|
|
57
|
+
* nearly as easily.
|
|
58
|
+
*
|
|
59
|
+
* The CLI has always passed `--org`. The API had no way to, so every app
|
|
60
|
+
* provisioned through it landed on the user account.
|
|
61
|
+
*/
|
|
62
|
+
export declare const DEFAULT_ORG = "heychunkydev";
|
|
50
63
|
//# sourceMappingURL=environments.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environments.d.ts","sourceRoot":"","sources":["../../src/config/environments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,eAAO,MAAM,YAAY,yEAaf,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,kEAAkE;AAClE,eAAO,MAAM,cAAc,SAAS,CAAC;AAErC,gFAAgF;AAChF,eAAO,MAAM,QAAQ,EAAE,SAAS,WAAW,EAAmD,CAAC;AAE/F;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE;IAAE,MAAM,EAAE,YAAY,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAC,CAItH,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,QAAQ,EAAE,SAAS,WAAW,EAA6C,CAAC"}
|
|
1
|
+
{"version":3,"file":"environments.d.ts","sourceRoot":"","sources":["../../src/config/environments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,eAAO,MAAM,YAAY,yEAaf,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,kEAAkE;AAClE,eAAO,MAAM,cAAc,SAAS,CAAC;AAErC,gFAAgF;AAChF,eAAO,MAAM,QAAQ,EAAE,SAAS,WAAW,EAAmD,CAAC;AAE/F;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE;IAAE,MAAM,EAAE,YAAY,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAC,CAItH,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,QAAQ,EAAE,SAAS,WAAW,EAA6C,CAAC;AAEzF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,iBAAiB,CAAC"}
|
|
@@ -59,4 +59,17 @@ export const DEPLOYS = {
|
|
|
59
59
|
};
|
|
60
60
|
/** The environments a deployment ever reads. */
|
|
61
61
|
export const DEPLOYED = ENVIRONMENTS.filter((e) => e in DEPLOYS);
|
|
62
|
+
/**
|
|
63
|
+
* The GitHub organisation an app is made in, unless a caller says otherwise.
|
|
64
|
+
*
|
|
65
|
+
* Without one, GitHub creates the repository on whatever account the token
|
|
66
|
+
* belongs to. That is a silent wrong answer rather than an error: the app is
|
|
67
|
+
* made, it works, and it is in the wrong place — and a repository can be
|
|
68
|
+
* transferred later where a Neon project and a Vercel project cannot be moved
|
|
69
|
+
* nearly as easily.
|
|
70
|
+
*
|
|
71
|
+
* The CLI has always passed `--org`. The API had no way to, so every app
|
|
72
|
+
* provisioned through it landed on the user account.
|
|
73
|
+
*/
|
|
74
|
+
export const DEFAULT_ORG = "heychunkydev";
|
|
62
75
|
//# sourceMappingURL=environments.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environments.js","sourceRoot":"","sources":["../../src/config/environments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,mCAAmC;IACnC,YAAY;IACZ,kEAAkE;IAClE,SAAS;IACT,qEAAqE;IACrE,KAAK;IACL,mCAAmC;IACnC,QAAQ;IACR,eAAe;IACf,QAAQ;IACR,uEAAuE;IACvE,QAAQ;CACA,CAAC;AAIX,kEAAkE;AAClE,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AAErC,gFAAgF;AAChF,MAAM,CAAC,MAAM,QAAQ,GAA2B,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;AAE/F;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,OAAO,GAAuG;IACzH,UAAU,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE;IACpC,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE;IACzC,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;CAC3B,CAAC;AAEF,gDAAgD;AAChD,MAAM,CAAC,MAAM,QAAQ,GAA2B,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"environments.js","sourceRoot":"","sources":["../../src/config/environments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,mCAAmC;IACnC,YAAY;IACZ,kEAAkE;IAClE,SAAS;IACT,qEAAqE;IACrE,KAAK;IACL,mCAAmC;IACnC,QAAQ;IACR,eAAe;IACf,QAAQ;IACR,uEAAuE;IACvE,QAAQ;CACA,CAAC;AAIX,kEAAkE;AAClE,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AAErC,gFAAgF;AAChF,MAAM,CAAC,MAAM,QAAQ,GAA2B,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;AAE/F;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,OAAO,GAAuG;IACzH,UAAU,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE;IACpC,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE;IACzC,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;CAC3B,CAAC;AAEF,gDAAgD;AAChD,MAAM,CAAC,MAAM,QAAQ,GAA2B,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC;AAEzF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/services/db.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,EAAE,CAAC,gBAAgB,EAAE,MAAM;iBAuCf,MAAM,WAAU,OAAO,EAAE,KAAQ,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/services/db.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,EAAE,CAAC,gBAAgB,EAAE,MAAM;iBAuCf,MAAM,WAAU,OAAO,EAAE,KAAQ,OAAO,CAAC,IAAI,CAAC;iBAoC9C,MAAM,WAAU,OAAO,EAAE,KAAQ,OAAO,CAAC,IAAI,CAAC;cAatD,OAAO,CAAC,MAAM,EAAE,CAAC;mBAOZ,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;EAelD"}
|
package/dist/services/db.js
CHANGED
|
@@ -54,12 +54,36 @@ export function db(connectionString) {
|
|
|
54
54
|
* — a promise kept by parsing the statement here would be worth very little.
|
|
55
55
|
*/
|
|
56
56
|
async function query(sql, params = []) {
|
|
57
|
+
refuseMultiple(sql);
|
|
57
58
|
const body = (await send({ queries: [{ query: sql, params }] }, { "Neon-Batch-Read-Only": "true" }));
|
|
58
59
|
const first = body.results?.[0];
|
|
59
60
|
return { rows: first?.rows ?? [], rowCount: first?.rowCount ?? 0 };
|
|
60
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Reject a statement that is really several.
|
|
64
|
+
*
|
|
65
|
+
* The endpoint runs one query per request. Sent two separated by a
|
|
66
|
+
* semicolon, it runs one of them and answers as though all was well: a
|
|
67
|
+
* `delete` followed by a `delete` reported "1 row affected" while the first
|
|
68
|
+
* one never happened. Silence is the problem — an error would have been
|
|
69
|
+
* fine. Semicolons inside a string literal or a dollar-quoted body are left
|
|
70
|
+
* alone, since those are one statement.
|
|
71
|
+
*/
|
|
72
|
+
function refuseMultiple(sql) {
|
|
73
|
+
const stripped = sql
|
|
74
|
+
.replace(/\$\$[\s\S]*?\$\$/g, "")
|
|
75
|
+
.replace(/'(?:[^']|'')*'/g, "")
|
|
76
|
+
.replace(/"(?:[^"]|"")*"/g, "")
|
|
77
|
+
.replace(/--[^\n]*/g, "")
|
|
78
|
+
.replace(/\/\*[\s\S]*?\*\//g, "");
|
|
79
|
+
if (/;\s*\S/.test(stripped)) {
|
|
80
|
+
throw new Error("One statement at a time. This runs a single query per request, so a " +
|
|
81
|
+
"second one after a semicolon would be dropped without saying so.");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
61
84
|
/** SQL that may change data. Gated in the registry, not here. */
|
|
62
85
|
async function write(sql, params = []) {
|
|
86
|
+
refuseMultiple(sql);
|
|
63
87
|
const body = (await send({ query: sql, params }));
|
|
64
88
|
return { rows: body.rows ?? [], rowCount: body.rowCount ?? 0 };
|
|
65
89
|
}
|
package/dist/services/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/services/db.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/services/db.ts"],"names":[],"mappings":"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"}
|