pg-introspection 0.0.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/LICENSE.md +45 -0
- package/README.md +105 -0
- package/dist/acl.d.ts +151 -0
- package/dist/acl.d.ts.map +1 -0
- package/dist/acl.js +400 -0
- package/dist/acl.js.map +1 -0
- package/dist/augmentIntrospection.d.ts +6 -0
- package/dist/augmentIntrospection.d.ts.map +1 -0
- package/dist/augmentIntrospection.js +299 -0
- package/dist/augmentIntrospection.js.map +1 -0
- package/dist/index.d.ts +154 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/introspection.d.ts +1070 -0
- package/dist/introspection.d.ts.map +1 -0
- package/dist/introspection.js +207 -0
- package/dist/introspection.js.map +1 -0
- package/dist/smartComments.d.ts +9 -0
- package/dist/smartComments.d.ts.map +1 -0
- package/dist/smartComments.js +42 -0
- package/dist/smartComments.js.map +1 -0
- package/package.json +48 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright © `2022` Benjie Gillam
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
6
|
+
this software and associated documentation files (the “Software”), to deal in
|
|
7
|
+
the Software without restriction, including without limitation the rights to
|
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
10
|
+
subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
21
|
+
|
|
22
|
+
# PostgreSQL documentation
|
|
23
|
+
|
|
24
|
+
This package contains excerpts from the PostgreSQL documentation; the following
|
|
25
|
+
license applies to those excerpts:
|
|
26
|
+
|
|
27
|
+
PostgreSQL is Copyright © 1996–2022 by the PostgreSQL Global Development Group.
|
|
28
|
+
|
|
29
|
+
Postgres95 is Copyright © 1994–5 by the Regents of the University of California.
|
|
30
|
+
|
|
31
|
+
Permission to use, copy, modify, and distribute this software and its
|
|
32
|
+
documentation for any purpose, without fee, and without a written agreement is
|
|
33
|
+
hereby granted, provided that the above copyright notice and this paragraph and
|
|
34
|
+
the following two paragraphs appear in all copies.
|
|
35
|
+
|
|
36
|
+
IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
|
|
37
|
+
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST
|
|
38
|
+
PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
|
|
39
|
+
THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
40
|
+
|
|
41
|
+
THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
|
|
42
|
+
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
43
|
+
PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN “AS-IS” BASIS, AND
|
|
44
|
+
THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
|
|
45
|
+
UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
package/README.md
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# pg-introspection
|
|
2
|
+
|
|
3
|
+
[](https://github.com/sponsors/benjie)
|
|
4
|
+
[](https://patreon.com/benjie)
|
|
5
|
+
[](http://discord.gg/graphile)
|
|
6
|
+
[](https://twitter.com/GraphileHQ)
|
|
7
|
+
|
|
8
|
+
A strongly-typed PostgreSQL introspection library for PostgreSQL built
|
|
9
|
+
automatically from the
|
|
10
|
+
[PostgreSQL system catalog documentation](https://www.postgresql.org/docs/current/catalogs.html),
|
|
11
|
+
with the TypeScript documentation for each attribute/type also pulled from the
|
|
12
|
+
PostgreSQL documentation for easy reference directly in your editor.
|
|
13
|
+
|
|
14
|
+
<!-- SPONSORS_BEGIN -->
|
|
15
|
+
|
|
16
|
+
## Crowd-funded open-source software
|
|
17
|
+
|
|
18
|
+
To help us develop this software sustainably under the MIT license, we ask all
|
|
19
|
+
individuals and businesses that use it to help support its ongoing maintenance
|
|
20
|
+
and development via sponsorship.
|
|
21
|
+
|
|
22
|
+
### [Click here to find out more about sponsors and sponsorship.](https://www.graphile.org/sponsor/)
|
|
23
|
+
|
|
24
|
+
And please give some love to our featured sponsors 🤩:
|
|
25
|
+
|
|
26
|
+
<table><tr>
|
|
27
|
+
<td align="center"><a href="https://surge.io/"><img src="https://graphile.org/images/sponsors/surge.png" width="90" height="90" alt="Surge" /><br />Surge</a> *</td>
|
|
28
|
+
<td align="center"><a href="https://storyscript.com/?utm_source=postgraphile"><img src="https://graphile.org/images/sponsors/storyscript.png" width="90" height="90" alt="Story.ai" /><br />Story.ai</a> *</td>
|
|
29
|
+
<td align="center"><a href="http://chads.website"><img src="https://graphile.org/images/sponsors/chadf.png" width="90" height="90" alt="Chad Furman" /><br />Chad Furman</a> *</td>
|
|
30
|
+
<td align="center"><a href="https://www.fanatics.com/"><img src="https://graphile.org/images/sponsors/fanatics.png" width="90" height="90" alt="Fanatics" /><br />Fanatics</a> *</td>
|
|
31
|
+
</tr><tr>
|
|
32
|
+
<td align="center"><a href="https://qwick.com/"><img src="https://graphile.org/images/sponsors/qwick.png" width="90" height="90" alt="Qwick" /><br />Qwick</a> *</td>
|
|
33
|
+
<td align="center"><a href="https://www.the-guild.dev/"><img src="https://graphile.org/images/sponsors/theguild.png" width="90" height="90" alt="The Guild" /><br />The Guild</a> *</td>
|
|
34
|
+
<td align="center"><a href="https://dovetailapp.com/"><img src="https://graphile.org/images/sponsors/dovetail.png" width="90" height="90" alt="Dovetail" /><br />Dovetail</a> *</td>
|
|
35
|
+
<td align="center"><a href="https://www.enzuzo.com/"><img src="https://graphile.org/images/sponsors/enzuzo.png" width="90" height="90" alt="Enzuzo" /><br />Enzuzo</a> *</td>
|
|
36
|
+
</tr><tr>
|
|
37
|
+
<td align="center"><a href="https://stellate.co/"><img src="https://graphile.org/images/sponsors/Stellate.png" width="90" height="90" alt="Stellate" /><br />Stellate</a> *</td>
|
|
38
|
+
</tr></table>
|
|
39
|
+
|
|
40
|
+
<em>\* Sponsors the entire Graphile suite</em>
|
|
41
|
+
|
|
42
|
+
<!-- SPONSORS_END -->
|
|
43
|
+
|
|
44
|
+
## Usage
|
|
45
|
+
|
|
46
|
+
Issue the `makeIntrospectionQuery()` SQL query to your database, then feed the
|
|
47
|
+
first row's `introspection` field into `parseIntrospectionResults()` to get your
|
|
48
|
+
strongly typed introspection results.
|
|
49
|
+
|
|
50
|
+
Example usage with `pg` module:
|
|
51
|
+
|
|
52
|
+
```js
|
|
53
|
+
import {
|
|
54
|
+
makeIntrospectionQuery,
|
|
55
|
+
parseIntrospectionResults,
|
|
56
|
+
} from "pg-introspection";
|
|
57
|
+
import { Pool } from "pg";
|
|
58
|
+
|
|
59
|
+
const pool = new Pool({
|
|
60
|
+
connectionString: "postgres://localhost:5432/my_database",
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
async function main() {
|
|
64
|
+
const sql = makeIntrospectionQuery();
|
|
65
|
+
const { rows } = await pool.query(sql);
|
|
66
|
+
const introspection = parseIntrospectionResults(row[0].introspection);
|
|
67
|
+
|
|
68
|
+
console.log(
|
|
69
|
+
`The ${introspection.database.datname} DBA is ${
|
|
70
|
+
introspection.database.getDba()?.rolname ?? "-"
|
|
71
|
+
}`,
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
main();
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Accessors
|
|
79
|
+
|
|
80
|
+
Into the introspection results we mix "accessor" functions to make following
|
|
81
|
+
relationships easier. Note that these functions are typically evaluated lazily -
|
|
82
|
+
the first time you call them they may need to do an expensive lookup (e.g.
|
|
83
|
+
finding the relevant record from the list of records) but they cache the result
|
|
84
|
+
so that the next call will be near-instant.
|
|
85
|
+
|
|
86
|
+
Examples:
|
|
87
|
+
|
|
88
|
+
```js
|
|
89
|
+
const myTable = introspection.classes.find((rel) => rel.relname === "my_table");
|
|
90
|
+
const myTableAttributes = myTable.getAttributes();
|
|
91
|
+
const myColumn = myTable.getAttribute({ name: "my_column" });
|
|
92
|
+
const myColumnDescription = myColumn.getDescription();
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
You can use the TypeScript autocompletion to see what accessors are available,
|
|
96
|
+
or look in the `index.ts` file.
|
|
97
|
+
|
|
98
|
+
## Naming
|
|
99
|
+
|
|
100
|
+
Using the PostgreSQL column names is _by design_, even though some are hard to
|
|
101
|
+
read if you're not familiar with the system catalog.
|
|
102
|
+
|
|
103
|
+
We use `_id` rather than `oid` because older versions of PostgreSQL did not
|
|
104
|
+
explicitly list the `oid` columns when you `select * from` so we explicitly list
|
|
105
|
+
them among the selection set.
|
package/dist/acl.d.ts
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import type { Introspection, PgClass, PgRoles } from "./introspection.js";
|
|
2
|
+
/**
|
|
3
|
+
* A fake 'pg_roles' record representing the 'public' meta-role.
|
|
4
|
+
*/
|
|
5
|
+
export declare const PUBLIC_ROLE: PgRoles;
|
|
6
|
+
/**
|
|
7
|
+
* Represents a single ACL entry in an ACL string, such as
|
|
8
|
+
* `foo=arwdDxt/bar`
|
|
9
|
+
*/
|
|
10
|
+
export interface AclObject {
|
|
11
|
+
/** Who are these permissions granted to? */
|
|
12
|
+
role: string;
|
|
13
|
+
/** Who granted these permissions? */
|
|
14
|
+
granter: string;
|
|
15
|
+
/** r */
|
|
16
|
+
select?: boolean;
|
|
17
|
+
/** r* */
|
|
18
|
+
selectGrant?: boolean;
|
|
19
|
+
/** w */
|
|
20
|
+
update?: boolean;
|
|
21
|
+
/** w* */
|
|
22
|
+
updateGrant?: boolean;
|
|
23
|
+
/** a */
|
|
24
|
+
insert?: boolean;
|
|
25
|
+
/** a* */
|
|
26
|
+
insertGrant?: boolean;
|
|
27
|
+
/** d */
|
|
28
|
+
delete?: boolean;
|
|
29
|
+
/** d* */
|
|
30
|
+
deleteGrant?: boolean;
|
|
31
|
+
/** D */
|
|
32
|
+
truncate?: boolean;
|
|
33
|
+
/** D* */
|
|
34
|
+
truncateGrant?: boolean;
|
|
35
|
+
/** x */
|
|
36
|
+
references?: boolean;
|
|
37
|
+
/** x* */
|
|
38
|
+
referencesGrant?: boolean;
|
|
39
|
+
/** t */
|
|
40
|
+
trigger?: boolean;
|
|
41
|
+
/** t* */
|
|
42
|
+
triggerGrant?: boolean;
|
|
43
|
+
/** X */
|
|
44
|
+
execute?: boolean;
|
|
45
|
+
/** X* */
|
|
46
|
+
executeGrant?: boolean;
|
|
47
|
+
/** U */
|
|
48
|
+
usage?: boolean;
|
|
49
|
+
/** U* */
|
|
50
|
+
usageGrant?: boolean;
|
|
51
|
+
/** C */
|
|
52
|
+
create?: boolean;
|
|
53
|
+
/** C* */
|
|
54
|
+
createGrant?: boolean;
|
|
55
|
+
/** c */
|
|
56
|
+
connect?: boolean;
|
|
57
|
+
/** c* */
|
|
58
|
+
connectGrant?: boolean;
|
|
59
|
+
/** T */
|
|
60
|
+
temporary?: boolean;
|
|
61
|
+
/** T* */
|
|
62
|
+
temporaryGrant?: boolean;
|
|
63
|
+
}
|
|
64
|
+
export declare type ResolvedPermissions = Omit<AclObject, "role" | "granter">;
|
|
65
|
+
/**
|
|
66
|
+
* Accepts an ACL string such as `foo=arwdDxt/bar` and converts it into
|
|
67
|
+
* a parsed AclObject.
|
|
68
|
+
*/
|
|
69
|
+
export declare function parseAcl(aclString: string): AclObject;
|
|
70
|
+
/**
|
|
71
|
+
* Takes an `AclObject` and converts it back into a Postgres ACL string such as
|
|
72
|
+
* `foo=arwdDxt/bar`
|
|
73
|
+
*/
|
|
74
|
+
export declare function serializeAcl(acl: AclObject): string;
|
|
75
|
+
export declare const emptyAclObject: AclObject;
|
|
76
|
+
export declare const OBJECT_COLUMN = "OBJECT_COLUMN";
|
|
77
|
+
export declare const OBJECT_TABLE = "OBJECT_TABLE";
|
|
78
|
+
export declare const OBJECT_SEQUENCE = "OBJECT_SEQUENCE";
|
|
79
|
+
export declare const OBJECT_DATABASE = "OBJECT_DATABASE";
|
|
80
|
+
export declare const OBJECT_FUNCTION = "OBJECT_FUNCTION";
|
|
81
|
+
export declare const OBJECT_LANGUAGE = "OBJECT_LANGUAGE";
|
|
82
|
+
export declare const OBJECT_LARGEOBJECT = "OBJECT_LARGEOBJECT";
|
|
83
|
+
export declare const OBJECT_SCHEMA = "OBJECT_SCHEMA";
|
|
84
|
+
export declare const OBJECT_TABLESPACE = "OBJECT_TABLESPACE";
|
|
85
|
+
export declare const OBJECT_FDW = "OBJECT_FDW";
|
|
86
|
+
export declare const OBJECT_FOREIGN_SERVER = "OBJECT_FOREIGN_SERVER";
|
|
87
|
+
export declare const OBJECT_DOMAIN = "OBJECT_DOMAIN";
|
|
88
|
+
export declare const OBJECT_TYPE = "OBJECT_TYPE";
|
|
89
|
+
export declare type AclDefaultObjectType = typeof OBJECT_COLUMN | typeof OBJECT_TABLE | typeof OBJECT_SEQUENCE | typeof OBJECT_DATABASE | typeof OBJECT_FUNCTION | typeof OBJECT_LANGUAGE | typeof OBJECT_LARGEOBJECT | typeof OBJECT_SCHEMA | typeof OBJECT_TABLESPACE | typeof OBJECT_FDW | typeof OBJECT_FOREIGN_SERVER | typeof OBJECT_DOMAIN | typeof OBJECT_TYPE;
|
|
90
|
+
/**
|
|
91
|
+
* Returns a list of AclObject by parsing the given input ACL strings. If no
|
|
92
|
+
* ACL strings are present then it will return the default (implied) ACL for
|
|
93
|
+
* the given `type` of entity owned by `ownerId`.
|
|
94
|
+
*
|
|
95
|
+
* See:
|
|
96
|
+
*
|
|
97
|
+
* https://github.com/postgres/postgres/blob/14aec03502302eff6c67981d8fd121175c436ce9/src/backend/utils/adt/acl.c#L748-L854
|
|
98
|
+
*
|
|
99
|
+
* and:
|
|
100
|
+
*
|
|
101
|
+
* https://github.com/postgres/postgres/blob/fb3b098fe88441f9531a5169008ea17eac01301f/src/include/utils/acl.h#L153-L167
|
|
102
|
+
*/
|
|
103
|
+
export declare function parseAcls(introspection: Introspection, inAcls: readonly string[] | null, ownerId: string, type: AclDefaultObjectType): AclObject[];
|
|
104
|
+
export declare const Permission: {
|
|
105
|
+
readonly select: "select";
|
|
106
|
+
readonly selectGrant: "selectGrant";
|
|
107
|
+
readonly update: "update";
|
|
108
|
+
readonly updateGrant: "updateGrant";
|
|
109
|
+
readonly insert: "insert";
|
|
110
|
+
readonly insertGrant: "insertGrant";
|
|
111
|
+
readonly delete: "delete";
|
|
112
|
+
readonly deleteGrant: "deleteGrant";
|
|
113
|
+
readonly truncate: "truncate";
|
|
114
|
+
readonly truncateGrant: "truncateGrant";
|
|
115
|
+
readonly references: "references";
|
|
116
|
+
readonly referencesGrant: "referencesGrant";
|
|
117
|
+
readonly trigger: "trigger";
|
|
118
|
+
readonly triggerGrant: "triggerGrant";
|
|
119
|
+
readonly execute: "execute";
|
|
120
|
+
readonly executeGrant: "executeGrant";
|
|
121
|
+
readonly usage: "usage";
|
|
122
|
+
readonly usageGrant: "usageGrant";
|
|
123
|
+
readonly create: "create";
|
|
124
|
+
readonly createGrant: "createGrant";
|
|
125
|
+
readonly connect: "connect";
|
|
126
|
+
readonly connectGrant: "connectGrant";
|
|
127
|
+
readonly temporary: "temporary";
|
|
128
|
+
readonly temporaryGrant: "temporaryGrant";
|
|
129
|
+
};
|
|
130
|
+
export declare function aclsForTable(introspection: Introspection, table: PgClass): AclObject[];
|
|
131
|
+
/**
|
|
132
|
+
* Returns all the roles role has been granted (including PUBLIC),
|
|
133
|
+
* respecting `NOINHERIT`
|
|
134
|
+
*/
|
|
135
|
+
export declare function expandRoles(introspection: Introspection, roles: PgRoles[], includeNoInherit?: boolean): PgRoles[];
|
|
136
|
+
/**
|
|
137
|
+
* Returns true if ACL was applied to this role, or a role that this role
|
|
138
|
+
* inherits from (including public).
|
|
139
|
+
*
|
|
140
|
+
* i.e. does this ACL grant privileges to this role (directly or indirectly)?
|
|
141
|
+
*
|
|
142
|
+
* In Venn diagram terms, it asks if the 'role' is contained within (or equal to)
|
|
143
|
+
* the acl.role.
|
|
144
|
+
*/
|
|
145
|
+
export declare function aclContainsRole(introspection: Introspection, acl: AclObject, role: PgRoles, includeNoInherit?: boolean): boolean;
|
|
146
|
+
/**
|
|
147
|
+
* Filters the ACL objects to only those that apply to `role`, then calculates
|
|
148
|
+
* the `OR` of all the permissions to see what permissions the role has.
|
|
149
|
+
*/
|
|
150
|
+
export declare function resolvePermissions(introspection: Introspection, acls: AclObject[], role: PgRoles, includeNoInherit?: boolean): ResolvedPermissions;
|
|
151
|
+
//# sourceMappingURL=acl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acl.d.ts","sourceRoot":"","sources":["../src/acl.ts"],"names":[],"mappings":"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"}
|