@adminiumjs/manifest 0.3.48 → 0.3.49

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.
Files changed (71) hide show
  1. package/dist/app-requires.d.ts +66 -0
  2. package/dist/app-requires.d.ts.map +1 -0
  3. package/dist/app-requires.js +98 -0
  4. package/dist/app-requires.js.map +1 -0
  5. package/dist/automations.d.ts +346 -2
  6. package/dist/automations.d.ts.map +1 -1
  7. package/dist/automations.js +64 -7
  8. package/dist/automations.js.map +1 -1
  9. package/dist/compose.d.ts.map +1 -1
  10. package/dist/compose.js +5 -0
  11. package/dist/compose.js.map +1 -1
  12. package/dist/documents.d.ts +49 -0
  13. package/dist/documents.d.ts.map +1 -1
  14. package/dist/documents.js +41 -1
  15. package/dist/documents.js.map +1 -1
  16. package/dist/formula.js +1 -1
  17. package/dist/formula.js.map +1 -1
  18. package/dist/index.d.ts +11 -4
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +11 -4
  21. package/dist/index.js.map +1 -1
  22. package/dist/instance.d.ts +133 -0
  23. package/dist/instance.d.ts.map +1 -0
  24. package/dist/instance.js +157 -0
  25. package/dist/instance.js.map +1 -0
  26. package/dist/outbox.d.ts +79 -0
  27. package/dist/outbox.d.ts.map +1 -1
  28. package/dist/outbox.js +37 -2
  29. package/dist/outbox.js.map +1 -1
  30. package/dist/plan-context.d.ts +9 -0
  31. package/dist/plan-context.d.ts.map +1 -1
  32. package/dist/plan-context.js +74 -9
  33. package/dist/plan-context.js.map +1 -1
  34. package/dist/plan-model.d.ts +9 -2
  35. package/dist/plan-model.d.ts.map +1 -1
  36. package/dist/plan-types.d.ts.map +1 -1
  37. package/dist/plan-types.js +2 -0
  38. package/dist/plan-types.js.map +1 -1
  39. package/dist/public-access.d.ts +23 -0
  40. package/dist/public-access.d.ts.map +1 -1
  41. package/dist/public-access.js +51 -5
  42. package/dist/public-access.js.map +1 -1
  43. package/dist/refs.d.ts +12 -1
  44. package/dist/refs.d.ts.map +1 -1
  45. package/dist/refs.js +23 -2
  46. package/dist/refs.js.map +1 -1
  47. package/dist/saved-apps.d.ts +132 -0
  48. package/dist/saved-apps.d.ts.map +1 -0
  49. package/dist/saved-apps.js +215 -0
  50. package/dist/saved-apps.js.map +1 -0
  51. package/dist/saved-parts.d.ts +368 -0
  52. package/dist/saved-parts.d.ts.map +1 -0
  53. package/dist/saved-parts.js +232 -0
  54. package/dist/saved-parts.js.map +1 -0
  55. package/dist/schema.d.ts +1395 -52
  56. package/dist/schema.d.ts.map +1 -1
  57. package/dist/schema.js +131 -5
  58. package/dist/schema.js.map +1 -1
  59. package/dist/table-names.d.ts +82 -0
  60. package/dist/table-names.d.ts.map +1 -0
  61. package/dist/table-names.js +145 -0
  62. package/dist/table-names.js.map +1 -0
  63. package/dist/words.d.ts +1 -1
  64. package/dist/words.d.ts.map +1 -1
  65. package/dist/words.js +206 -0
  66. package/dist/words.js.map +1 -1
  67. package/dist/workspace-file.d.ts +115 -0
  68. package/dist/workspace-file.d.ts.map +1 -0
  69. package/dist/workspace-file.js +130 -0
  70. package/dist/workspace-file.js.map +1 -0
  71. package/package.json +2 -2
@@ -0,0 +1,82 @@
1
+ /**
2
+ * A TABLE'S REAL NAME, AND THE SCHEMA IT LIVES IN.
3
+ *
4
+ * A table's `ref` is the app's own short name for it, lower snake_case. Its
5
+ * real name is the ref, or `<prefix><ref>` for a prefixed app. A self-made app
6
+ * (`publisher: local`) is saved from tables a person made by hand, so it may
7
+ * give a table its real `name` beside the ref (`Order Lines`), and on Postgres
8
+ * the `schema` it is in (`sales`).
9
+ *
10
+ * Everywhere the server speaks of a real table it uses one string: the bare
11
+ * name, or `<schema>.<name>` when the manifest names a schema — the id the
12
+ * engine's snapshot gives the table, so a page bound to it finds it. Neither
13
+ * part may hold a dot, which is what keeps that string read one way only.
14
+ */
15
+ /** The longest table or schema name, in bytes: Postgres cuts anything longer short. */
16
+ export declare const TABLE_NAME_MAX_BYTES = 63;
17
+ /** What is wrong with a table's real name, or null. */
18
+ export declare function tableNameIssue(name: string): string | null;
19
+ /** What is wrong with a column's own name, or null: the same rules as a table's. */
20
+ export declare function columnNameIssue(name: string): string | null;
21
+ /**
22
+ * The schemas a Supabase project keeps for its own services: sign-in
23
+ * (`auth`), files, realtime, the GraphQL layer, secrets, extensions, edge
24
+ * functions, its migrations, HTTP calls and scheduled jobs. A table an app
25
+ * names in one of them would be the platform's (`auth.users`), never the
26
+ * app's, so "use the existing tables" must not take one over.
27
+ */
28
+ export declare const SUPABASE_SCHEMAS: readonly string[];
29
+ /**
30
+ * What is wrong with a table's schema, or null: the database's own schemas
31
+ * (`pg_catalog`, `information_schema`, `pg_toast`, any temporary one —
32
+ * Postgres keeps every `pg_` name for itself), Supabase's own and Adminium's
33
+ * are never an app's. Which engine may have a schema at all is the planner's
34
+ * to say.
35
+ */
36
+ export declare function tableSchemaIssue(schema: string): string | null;
37
+ /** `<schema>.<name>`, or the bare name without a schema. */
38
+ export declare function qualifyTableName(schema: string | null | undefined, name: string): string;
39
+ /** A real table string read back into its schema (null without one) and its name. */
40
+ export declare function splitTableName(real: string): {
41
+ schema: string | null;
42
+ name: string;
43
+ };
44
+ /**
45
+ * The real table a declared table is made under: its own name (in its
46
+ * schema), else the prefixed or plain ref. A table that gives either is never
47
+ * prefixed: the manifest refuses the two together.
48
+ */
49
+ export declare function realTableName(table: {
50
+ ref: string;
51
+ name?: string | undefined;
52
+ schema?: string | undefined;
53
+ }, prefix: string | null): string;
54
+ /** Whether a declared table gives its own real name or schema. */
55
+ export declare function namesItsTable(table: {
56
+ name?: string | undefined;
57
+ schema?: string | undefined;
58
+ }): boolean;
59
+ /**
60
+ * The schema a table is in when none is named: Postgres's `public`. Postgres
61
+ * is the only engine an app's table names a schema on (MySQL's and SQLite's
62
+ * are refused by the planner), so a file that names it says nothing more than
63
+ * a file that does not.
64
+ */
65
+ export declare const DEFAULT_TABLE_SCHEMA = "public";
66
+ /**
67
+ * A manifest with `schema: "public"` taken off each table, as it is read in:
68
+ * the default schema named or not is one table, never two identities of it.
69
+ * The table keeps its real name (its `name`, else its ref), so naming the
70
+ * schema still keeps the table off the app's prefix. Unchanged when no table
71
+ * names it.
72
+ */
73
+ export declare function withoutDefaultSchema<M extends {
74
+ requiredSchema?: {
75
+ tables?: readonly {
76
+ ref: string;
77
+ name?: string | undefined;
78
+ schema?: string | undefined;
79
+ }[] | undefined;
80
+ } | undefined;
81
+ }>(manifest: M): M;
82
+ //# sourceMappingURL=table-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-names.d.ts","sourceRoot":"","sources":["../src/table-names.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;GAaG;AAEH,uFAAuF;AACvF,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAqBvC,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE1D;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE3D;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAiB7C,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO9D;AAED,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAExF;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAGpF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAG3I;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,OAAO,CAExG;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,cAAc,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,SAAS;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAAE,EAAE,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAA;CAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAc3M"}
@@ -0,0 +1,145 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ /**
3
+ * A TABLE'S REAL NAME, AND THE SCHEMA IT LIVES IN.
4
+ *
5
+ * A table's `ref` is the app's own short name for it, lower snake_case. Its
6
+ * real name is the ref, or `<prefix><ref>` for a prefixed app. A self-made app
7
+ * (`publisher: local`) is saved from tables a person made by hand, so it may
8
+ * give a table its real `name` beside the ref (`Order Lines`), and on Postgres
9
+ * the `schema` it is in (`sales`).
10
+ *
11
+ * Everywhere the server speaks of a real table it uses one string: the bare
12
+ * name, or `<schema>.<name>` when the manifest names a schema — the id the
13
+ * engine's snapshot gives the table, so a page bound to it finds it. Neither
14
+ * part may hold a dot, which is what keeps that string read one way only.
15
+ */
16
+ /** The longest table or schema name, in bytes: Postgres cuts anything longer short. */
17
+ export const TABLE_NAME_MAX_BYTES = 63;
18
+ /** Adminium's own namespace: no table or schema of an app is named into it. */
19
+ const RESERVED_PREFIX = 'adminium_';
20
+ function byteLength(text) {
21
+ return new TextEncoder().encode(text).length;
22
+ }
23
+ /** What is wrong with a name shared by tables and schemas, or null. */
24
+ function identifierIssue(what, name) {
25
+ if (name.length === 0 || byteLength(name) > TABLE_NAME_MAX_BYTES)
26
+ return `a ${what} name is 1 to ${String(TABLE_NAME_MAX_BYTES)} bytes`;
27
+ if (name.includes('\u0000'))
28
+ return `a ${what} name holds no NUL character`;
29
+ if (name.trim() !== name)
30
+ return `a ${what} name neither starts nor ends with a space`;
31
+ // A dot would read as `<schema>.<name>`, and " as " as an alias, wherever a table is named by one string.
32
+ if (name.includes('.'))
33
+ return `a ${what} name holds no dot`;
34
+ if (/ as /i.test(name))
35
+ return `a ${what} name holds no " as " between words`;
36
+ if (name.toLowerCase().startsWith(RESERVED_PREFIX))
37
+ return `"${name}" is in Adminium's own namespace ("${RESERVED_PREFIX}")`;
38
+ return null;
39
+ }
40
+ /** What is wrong with a table's real name, or null. */
41
+ export function tableNameIssue(name) {
42
+ return identifierIssue('table', name);
43
+ }
44
+ /** What is wrong with a column's own name, or null: the same rules as a table's. */
45
+ export function columnNameIssue(name) {
46
+ return identifierIssue('column', name);
47
+ }
48
+ /**
49
+ * The schemas a Supabase project keeps for its own services: sign-in
50
+ * (`auth`), files, realtime, the GraphQL layer, secrets, extensions, edge
51
+ * functions, its migrations, HTTP calls and scheduled jobs. A table an app
52
+ * names in one of them would be the platform's (`auth.users`), never the
53
+ * app's, so "use the existing tables" must not take one over.
54
+ */
55
+ export const SUPABASE_SCHEMAS = [
56
+ 'auth',
57
+ 'storage',
58
+ 'realtime',
59
+ '_realtime',
60
+ 'graphql',
61
+ 'graphql_public',
62
+ 'vault',
63
+ 'pgsodium',
64
+ 'pgsodium_masks',
65
+ 'extensions',
66
+ 'supabase_functions',
67
+ 'supabase_migrations',
68
+ 'net',
69
+ 'cron',
70
+ 'pgbouncer',
71
+ '_analytics',
72
+ ];
73
+ /**
74
+ * What is wrong with a table's schema, or null: the database's own schemas
75
+ * (`pg_catalog`, `information_schema`, `pg_toast`, any temporary one —
76
+ * Postgres keeps every `pg_` name for itself), Supabase's own and Adminium's
77
+ * are never an app's. Which engine may have a schema at all is the planner's
78
+ * to say.
79
+ */
80
+ export function tableSchemaIssue(schema) {
81
+ const issue = identifierIssue('schema', schema);
82
+ if (issue !== null)
83
+ return issue;
84
+ const lower = schema.toLowerCase();
85
+ if (lower === 'information_schema' || lower.startsWith('pg_'))
86
+ return `"${schema}" is the database's own schema`;
87
+ if (SUPABASE_SCHEMAS.includes(lower) || lower.startsWith('supabase_'))
88
+ return `"${schema}" is a schema Supabase keeps for its own services`;
89
+ return null;
90
+ }
91
+ /** `<schema>.<name>`, or the bare name without a schema. */
92
+ export function qualifyTableName(schema, name) {
93
+ return schema === null || schema === undefined ? name : `${schema}.${name}`;
94
+ }
95
+ /** A real table string read back into its schema (null without one) and its name. */
96
+ export function splitTableName(real) {
97
+ const dot = real.indexOf('.');
98
+ return dot < 0 ? { schema: null, name: real } : { schema: real.slice(0, dot), name: real.slice(dot + 1) };
99
+ }
100
+ /**
101
+ * The real table a declared table is made under: its own name (in its
102
+ * schema), else the prefixed or plain ref. A table that gives either is never
103
+ * prefixed: the manifest refuses the two together.
104
+ */
105
+ export function realTableName(table, prefix) {
106
+ if (table.name !== undefined || table.schema !== undefined)
107
+ return qualifyTableName(table.schema, table.name ?? table.ref);
108
+ return prefix === null ? table.ref : `${prefix}${table.ref}`;
109
+ }
110
+ /** Whether a declared table gives its own real name or schema. */
111
+ export function namesItsTable(table) {
112
+ return table.name !== undefined || table.schema !== undefined;
113
+ }
114
+ /**
115
+ * The schema a table is in when none is named: Postgres's `public`. Postgres
116
+ * is the only engine an app's table names a schema on (MySQL's and SQLite's
117
+ * are refused by the planner), so a file that names it says nothing more than
118
+ * a file that does not.
119
+ */
120
+ export const DEFAULT_TABLE_SCHEMA = 'public';
121
+ /**
122
+ * A manifest with `schema: "public"` taken off each table, as it is read in:
123
+ * the default schema named or not is one table, never two identities of it.
124
+ * The table keeps its real name (its `name`, else its ref), so naming the
125
+ * schema still keeps the table off the app's prefix. Unchanged when no table
126
+ * names it.
127
+ */
128
+ export function withoutDefaultSchema(manifest) {
129
+ const tables = manifest.requiredSchema?.tables;
130
+ if (tables === undefined || !tables.some((table) => table.schema === DEFAULT_TABLE_SCHEMA))
131
+ return manifest;
132
+ return {
133
+ ...manifest,
134
+ requiredSchema: {
135
+ ...manifest.requiredSchema,
136
+ tables: tables.map((table) => {
137
+ if (table.schema !== DEFAULT_TABLE_SCHEMA)
138
+ return table;
139
+ const { schema: _schema, ...rest } = table;
140
+ return { ...rest, name: table.name ?? table.ref };
141
+ }),
142
+ },
143
+ };
144
+ }
145
+ //# sourceMappingURL=table-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-names.js","sourceRoot":"","sources":["../src/table-names.ts"],"names":[],"mappings":"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"}
package/dist/words.d.ts CHANGED
@@ -14,7 +14,7 @@ export declare const ADD_ON_INSTALL_BLOCKS: readonly ["pages", "roles", "optionL
14
14
  * runs the word, or it refuses a manifest that uses it — and its tests read
15
15
  * this list to see that none is left without one.
16
16
  */
17
- export declare const INSTALL_FLOOR_WORD_NAMES: readonly ["pages", "roles", "optionLists", "emailTemplates", "outbox", "documents", "sampleData", "publicAccess", "publicKeys", "navGroups", "seeds", "automations", "addOns", "requiredSchema.prefixed", "addOn.settingsTable", "addOn.ledgers", "addOn.adjuster", "addOn.words", "addOn.recordTabs", "addOn.hostApi.2", "addOn.lookUp", "ledger.decides", "table.indexes", "table.postings", "table.adjust", "states.actions", "states.planned", "column.addOnLink", "column.addOnLink.default", "column.tableRef", "column.announce", "column.plainText", "column.customerKey", "column.codeLast4", "code.givenByLedger", "rollup.capUnless", "rollup.latest", "roles.tables", "roles.writableFrom", "toolbar.links", "config.tabs", "config.bulk", "sampleData.addOns", "sampleData.people", "app.seeds", "table.occupies", "sequence.sample", "email.onlyWith", "email.onlyWithout", "outbox.pages.app", "rows.pair", "unlockBy.self", "availability.words", "addOn.steps", "addOn.assistant", "automations.addOnStep", "email.showWhen", "placeholder.backup", "frontend.mobile", "column.staff", "table.belongs", "table.private", "belongs.throughPrivate", "shape.create", "table.appGrants", "roles.rows", "rows.several", "listing.while", "states.handOver", "app.modules", "roles.names", "app.maps", "automations.staffRecipient", "automations.perSpell", "automations.urgent", "automations.digest", "digest.reach", "digest.sum", "digest.by", "digest.target", "digest.within", "automations.stepName", "automations.many", "automations.replyTo", "automations.lead", "automations.leadAlone", "automations.listed", "automations.staffName", "automations.recordUrl", "automations.was", "automations.settingAmount", "automations.settingValue", "automations.daysAfter", "automations.settingElse", "outbox.replyTo", "outbox.onDelete", "column.mentions", "column.place", "column.area", "column.linkable", "linkable.same", "column.file", "config.board", "board.toolbar", "board.secondAmount", "board.daysLabel", "states.notPast", "states.moveOnCreate", "publicAccess.requiresWhen", "frontend.records", "nav.offRail", "navLinks", "outbox.staffName", "card.module", "card.columnLabels", "link.staffPath", "column.changes", "rows.notBy", "rows.via", "rows.notThrough", "states.carries", "table.removal", "column.history", "bounds.other", "bounds.now", "stamp.strict", "requiredWhen.stamp", "outbox.classes", "automations.emailClass", "people", "table.keep", "publicAccess.consent", "automations.more", "addOn.forms", "publicAccess.forms", "outbox.purposes", "outbox.surveyLinks", "publicAccess.forms.source", "step.person", "step.recordBy", "step.recordWhere", "step.help", "step.recordTokens", "publicAccess.appColumn", "people.addOnCopies", "table.expire", "column.band", "stamp.addWorkingDays", "formula.ceilFloor", "table.check", "addOn.checker", "addOn.panels", "publicAccess.uploads", "file.upload", "file.tiff", "file.large", "file.assetKinds", "publicAccess.assets", "publicAccess.ownLink", "publicAccess.sessionRead", "people.copyDetails", "publicAccess.ownDelete", "roles.addOnPages", "agrees.length", "people.addOnCopyFrom", "email.rowPicture", "roles.addOnActions", "appGrants.more", "roles.privacyPeople", "config.columns"];
17
+ export declare const INSTALL_FLOOR_WORD_NAMES: readonly ["pages", "roles", "optionLists", "emailTemplates", "outbox", "documents", "sampleData", "publicAccess", "publicKeys", "navGroups", "seeds", "automations", "addOns", "requiredSchema.prefixed", "addOn.settingsTable", "addOn.ledgers", "addOn.adjuster", "addOn.words", "addOn.recordTabs", "addOn.hostApi.2", "addOn.lookUp", "ledger.decides", "table.indexes", "table.postings", "table.adjust", "states.actions", "states.planned", "column.addOnLink", "column.addOnLink.default", "column.tableRef", "column.announce", "column.plainText", "column.customerKey", "column.codeLast4", "code.givenByLedger", "rollup.capUnless", "rollup.latest", "roles.tables", "roles.writableFrom", "toolbar.links", "config.tabs", "config.bulk", "sampleData.addOns", "sampleData.people", "app.seeds", "table.occupies", "sequence.sample", "email.onlyWith", "email.onlyWithout", "outbox.pages.app", "rows.pair", "unlockBy.self", "availability.words", "addOn.steps", "addOn.assistant", "automations.addOnStep", "email.showWhen", "placeholder.backup", "frontend.mobile", "column.staff", "table.belongs", "table.private", "belongs.throughPrivate", "shape.create", "table.appGrants", "roles.rows", "rows.several", "listing.while", "states.handOver", "app.modules", "roles.names", "app.maps", "automations.staffRecipient", "automations.perSpell", "automations.urgent", "automations.digest", "digest.reach", "digest.sum", "digest.by", "digest.target", "digest.within", "automations.stepName", "automations.many", "automations.replyTo", "automations.lead", "automations.leadAlone", "automations.listed", "automations.staffName", "automations.recordUrl", "automations.was", "automations.settingAmount", "automations.settingValue", "automations.daysAfter", "automations.settingElse", "outbox.replyTo", "outbox.onDelete", "column.mentions", "column.place", "column.area", "column.linkable", "linkable.same", "column.file", "config.board", "board.toolbar", "board.secondAmount", "board.daysLabel", "states.notPast", "states.moveOnCreate", "publicAccess.requiresWhen", "frontend.records", "nav.offRail", "navLinks", "outbox.staffName", "card.module", "card.columnLabels", "link.staffPath", "column.changes", "rows.notBy", "rows.via", "rows.notThrough", "states.carries", "table.removal", "column.history", "bounds.other", "bounds.now", "stamp.strict", "requiredWhen.stamp", "outbox.classes", "automations.emailClass", "people", "table.keep", "publicAccess.consent", "automations.more", "addOn.forms", "publicAccess.forms", "outbox.purposes", "outbox.surveyLinks", "publicAccess.forms.source", "step.person", "step.recordBy", "step.recordWhere", "step.help", "step.recordTokens", "publicAccess.appColumn", "people.addOnCopies", "table.expire", "column.band", "stamp.addWorkingDays", "formula.ceilFloor", "table.check", "addOn.checker", "addOn.panels", "publicAccess.uploads", "file.upload", "file.tiff", "file.large", "file.assetKinds", "publicAccess.assets", "publicAccess.ownLink", "publicAccess.sessionRead", "people.copyDetails", "publicAccess.ownDelete", "roles.addOnPages", "agrees.length", "people.addOnCopyFrom", "email.rowPicture", "roles.addOnActions", "appGrants.more", "roles.privacyPeople", "config.columns", "addOn.scope", "frontend.instances", "page.envelope", "page.views", "app.provenance", "app.icon", "apps.requires", "instance", "column.time", "column.precision", "column.hidden", "column.yesNo", "column.name", "relation.label", "relation.remove", "relation.noConstraint", "table.exclude", "table.existingCustomers", "table.switchedOff", "table.name", "table.schema", "optionList.description", "email.kind", "email.category", "email.brand", "email.attachments", "automations.webhook", "automations.documentRender", "automations.fixedAddress", "automations.purpose", "automations.watch", "documents.options", "documents.trigger", "documents.deliver", "reports", "invoiceLayouts", "scheduledReports", "payments", "publicAccess.put", "publicAccess.delete", "publicAccess.batch", "publicAccess.path", "publicAccess.pagination", "publicAccess.rateLimit", "publicAccess.response"];
18
18
  export type ManifestWordName = (typeof INSTALL_FLOOR_WORD_NAMES)[number];
19
19
  /**
20
20
  * The words that came after the install floor, each with the first Adminium
@@ -1 +1 @@
1
- {"version":3,"file":"words.d.ts","sourceRoot":"","sources":["../src/words.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,YAAY;IAC3B,8FAA8F;IAC9F,IAAI,EAAE,gBAAgB,CAAC;IACvB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;CACd;AAOD,2HAA2H;AAC3H,eAAO,MAAM,6BAA6B,QAAmB,CAAC;AAE9D,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,gLAcxB,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,qnGAkM3B,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAyN3E,CAAC;AAYF,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,YAAY,EAAE,CAiZnE"}
1
+ {"version":3,"file":"words.d.ts","sourceRoot":"","sources":["../src/words.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,YAAY;IAC3B,8FAA8F;IAC9F,IAAI,EAAE,gBAAgB,CAAC;IACvB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;CACd;AAOD,2HAA2H;AAC3H,eAAO,MAAM,6BAA6B,QAAmB,CAAC;AAE9D,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,gLAcxB,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,+9HAgQ3B,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CA2Q3E,CAAC;AAYF,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,YAAY,EAAE,CAidnE"}
package/dist/words.js CHANGED
@@ -234,6 +234,68 @@ export const INSTALL_FLOOR_WORD_NAMES = [
234
234
  'roles.privacyPeople',
235
235
  // The columns a records page's list opens on, in order (`config.columns`).
236
236
  'config.columns',
237
+ // An add-on kept once per server rather than installed per database.
238
+ 'addOn.scope',
239
+ // A side that serves every install of its app (it sends the install it is).
240
+ 'frontend.instances',
241
+ // A self-made app's page as a person arranged it, its shared views, and where the file was saved.
242
+ 'page.envelope',
243
+ 'page.views',
244
+ 'app.provenance',
245
+ // A self-made app's icon.
246
+ 'app.icon',
247
+ // The other apps a self-made app needs on its database, and its part that is the whole deployment's.
248
+ 'apps.requires',
249
+ 'instance',
250
+ // A time of day, a decimal's places in all, a column kept off forms, an int read as a yes or a no.
251
+ 'column.time',
252
+ 'column.precision',
253
+ 'column.hidden',
254
+ 'column.yesNo',
255
+ // A self-made app's column under the name it has in its own database (`orderDate`), not snake_case.
256
+ 'column.name',
257
+ // A link's own name, a link Adminium does not show, a link no foreign key keeps.
258
+ 'relation.label',
259
+ 'relation.remove',
260
+ 'relation.noConstraint',
261
+ // A table left out of Adminium, a people table whose existing customers were mailed, a posting kept switched off.
262
+ 'table.exclude',
263
+ 'table.existingCustomers',
264
+ 'table.switchedOff',
265
+ // A self-made app's table under the real name a person gave it, and in its own Postgres schema.
266
+ 'table.name',
267
+ 'table.schema',
268
+ // An answer's line under it.
269
+ 'optionList.description',
270
+ // A mail's kind, what it is for, its own brand, and the package's files it carries.
271
+ 'email.kind',
272
+ 'email.category',
273
+ 'email.brand',
274
+ 'email.attachments',
275
+ // A rule's call to a web address, its drawing of a document, its mail to addresses the owner types, a marketing
276
+ // mail's purpose, and a record rule that also notices rows written around Adminium.
277
+ 'automations.webhook',
278
+ 'automations.documentRender',
279
+ 'automations.fixedAddress',
280
+ 'automations.purpose',
281
+ 'automations.watch',
282
+ // A document's own options, the change that draws it, and where it goes once drawn.
283
+ 'documents.options',
284
+ 'documents.trigger',
285
+ 'documents.deliver',
286
+ // What only a file made on an Adminium carries: its report documents, invoice layouts, scheduled reports and payments.
287
+ 'reports',
288
+ 'invoiceLayouts',
289
+ 'scheduledReports',
290
+ 'payments',
291
+ // A public entry of such a file: a row replaced, removed or written many at a time, and its own address, pages, rate and reply.
292
+ 'publicAccess.put',
293
+ 'publicAccess.delete',
294
+ 'publicAccess.batch',
295
+ 'publicAccess.path',
296
+ 'publicAccess.pagination',
297
+ 'publicAccess.rateLimit',
298
+ 'publicAccess.response',
237
299
  ];
238
300
  /**
239
301
  * The words that came after the install floor, each with the first Adminium
@@ -458,6 +520,56 @@ export const WORD_FLOORS = {
458
520
  'roles.privacyPeople': '0.3.47',
459
521
  // A release before ignores the key, and the list opens on the columns Adminium picks.
460
522
  'config.columns': '0.3.47',
523
+ 'addOn.scope': '0.3.49',
524
+ 'frontend.instances': '0.3.49',
525
+ // What a file saved from a dashboard carries, and the fields its tables and mails need: a release before refuses each key.
526
+ 'page.envelope': '0.3.49',
527
+ 'page.views': '0.3.49',
528
+ 'app.provenance': '0.3.49',
529
+ 'app.icon': '0.3.49',
530
+ 'apps.requires': '0.3.49',
531
+ 'instance': '0.3.49',
532
+ 'column.time': '0.3.49',
533
+ 'column.precision': '0.3.49',
534
+ 'column.hidden': '0.3.49',
535
+ 'column.yesNo': '0.3.49',
536
+ 'column.name': '0.3.49',
537
+ 'relation.label': '0.3.49',
538
+ 'relation.remove': '0.3.49',
539
+ 'relation.noConstraint': '0.3.49',
540
+ 'table.exclude': '0.3.49',
541
+ 'table.existingCustomers': '0.3.49',
542
+ 'table.switchedOff': '0.3.49',
543
+ 'table.name': '0.3.49',
544
+ 'table.schema': '0.3.49',
545
+ 'optionList.description': '0.3.49',
546
+ 'email.kind': '0.3.49',
547
+ 'email.category': '0.3.49',
548
+ 'email.brand': '0.3.49',
549
+ 'email.attachments': '0.3.49',
550
+ // A rule's webhook, document, typed addresses, purpose and watch: a release before refuses the keys.
551
+ 'automations.webhook': '0.3.49',
552
+ 'automations.documentRender': '0.3.49',
553
+ 'automations.fixedAddress': '0.3.49',
554
+ 'automations.purpose': '0.3.49',
555
+ 'automations.watch': '0.3.49',
556
+ // A document's options, trigger and delivery: a release before refuses the keys.
557
+ 'documents.options': '0.3.49',
558
+ 'documents.trigger': '0.3.49',
559
+ 'documents.deliver': '0.3.49',
560
+ // A file's reports, invoice layouts, scheduled reports and payments: a release before refuses the blocks.
561
+ 'reports': '0.3.49',
562
+ 'invoiceLayouts': '0.3.49',
563
+ 'scheduledReports': '0.3.49',
564
+ 'payments': '0.3.49',
565
+ // A public entry's wider methods and its own address, pages, rate and reply: a release before refuses them.
566
+ 'publicAccess.put': '0.3.49',
567
+ 'publicAccess.delete': '0.3.49',
568
+ 'publicAccess.batch': '0.3.49',
569
+ 'publicAccess.path': '0.3.49',
570
+ 'publicAccess.pagination': '0.3.49',
571
+ 'publicAccess.rateLimit': '0.3.49',
572
+ 'publicAccess.response': '0.3.49',
461
573
  };
462
574
  /** The kinds of file a column takes from the release that cleans SVG and reads models and fonts whole (`ASSET_FILE_KINDS`). */
463
575
  const ASSET_KINDS = new Set(['svg', 'glb', 'stl', '3mf', 'woff2']);
@@ -509,6 +621,8 @@ export function installFloorWords(document) {
509
621
  out.push({ word: 'addOn.assistant', path: 'addOn.assistant' });
510
622
  if (block['forms'] !== undefined)
511
623
  out.push({ word: 'addOn.forms', path: 'addOn.forms' });
624
+ if (block['scope'] !== undefined)
625
+ out.push({ word: 'addOn.scope', path: 'addOn.scope' });
512
626
  // A step's person, its record named by a column and filtered, a choice's help line, and the record's own table and key.
513
627
  list(block['steps']).forEach((step, s) => {
514
628
  if (!isDoc(step))
@@ -580,6 +694,9 @@ export function installFloorWords(document) {
580
694
  // Where a record opens on the side: a release before the floor refuses the key.
581
695
  if (isDoc(frontend) && frontend['records'] !== undefined)
582
696
  out.push({ word: 'frontend.records', path: `frontends.${String(f)}.records` });
697
+ // A side that serves every install of its app.
698
+ if (isDoc(frontend) && frontend['instances'] !== undefined)
699
+ out.push({ word: 'frontend.instances', path: `frontends.${String(f)}.instances` });
583
700
  });
584
701
  // An entry of the app's section that is not a page.
585
702
  if (document['navLinks'] !== undefined)
@@ -595,6 +712,16 @@ export function installFloorWords(document) {
595
712
  out.push({ word: 'roles.privacyPeople', path: `roles.${String(r)}.permissions.${String(g)}` });
596
713
  });
597
714
  });
715
+ // What only a file made on an Adminium carries.
716
+ for (const block of ['reports', 'invoiceLayouts', 'scheduledReports', 'payments']) {
717
+ if (document[block] !== undefined)
718
+ out.push({ word: block, path: block });
719
+ }
720
+ // A row removed through a public entry of an app (an add-on's own link says `publicAccess.ownDelete`).
721
+ list(document['publicAccess']).forEach((entry, e) => {
722
+ if (isDoc(entry) && Array.isArray(entry['methods']) && entry['methods'].includes('DELETE'))
723
+ out.push({ word: 'publicAccess.delete', path: `publicAccess.${String(e)}.methods` });
724
+ });
598
725
  // The app's people tables.
599
726
  if (document['people'] !== undefined)
600
727
  out.push({ word: 'people', path: 'people' });
@@ -816,8 +943,62 @@ export function installFloorWords(document) {
816
943
  }
817
944
  });
818
945
  });
946
+ // The fields a dashboard's tables are described with: on a column, on a link, on a table.
947
+ if (document['provenance'] !== undefined)
948
+ out.push({ word: 'app.provenance', path: 'provenance' });
949
+ if (document['icon'] !== undefined)
950
+ out.push({ word: 'app.icon', path: 'icon' });
951
+ if (isDoc(document['apps']) && document['apps']['requires'] !== undefined)
952
+ out.push({ word: 'apps.requires', path: 'apps.requires' });
953
+ if (document['instance'] !== undefined)
954
+ out.push({ word: 'instance', path: 'instance' });
955
+ list(schema['tables']).forEach((table, t) => {
956
+ if (!isDoc(table))
957
+ return;
958
+ const at = `requiredSchema.tables.${String(t)}`;
959
+ for (const key of ['exclude', 'existingCustomers', 'switchedOff', 'name', 'schema']) {
960
+ if (table[key] !== undefined)
961
+ out.push({ word: `table.${key}`, path: `${at}.${key}` });
962
+ }
963
+ list(table['columns']).forEach((column, c) => {
964
+ if (!isDoc(column))
965
+ return;
966
+ const here = `${at}.columns.${String(c)}`;
967
+ if (column['type'] === 'time')
968
+ out.push({ word: 'column.time', path: `${here}.type` });
969
+ if (typeof column['ref'] === 'string' && !/^[a-z][a-z0-9_]*$/.test(column['ref']))
970
+ out.push({ word: 'column.name', path: `${here}.ref` });
971
+ for (const key of ['precision', 'hidden', 'yesNo']) {
972
+ if (column[key] !== undefined)
973
+ out.push({ word: `column.${key}`, path: `${here}.${key}` });
974
+ }
975
+ const relation = isDoc(column['relation']) ? column['relation'] : {};
976
+ if (relation['label'] !== undefined)
977
+ out.push({ word: 'relation.label', path: `${here}.relation.label` });
978
+ if (relation['remove'] !== undefined)
979
+ out.push({ word: 'relation.remove', path: `${here}.relation.remove` });
980
+ if (relation['constraint'] !== undefined)
981
+ out.push({ word: 'relation.noConstraint', path: `${here}.relation.constraint` });
982
+ });
983
+ });
984
+ for (const [name, optionList] of Object.entries(isDoc(document['optionLists']) ? document['optionLists'] : {})) {
985
+ list(isDoc(optionList) ? optionList['values'] : undefined).forEach((value, v) => {
986
+ if (isDoc(value) && value['description'] !== undefined)
987
+ out.push({ word: 'optionList.description', path: `optionLists.${name}.values.${String(v)}.description` });
988
+ });
989
+ }
990
+ list(document['emailTemplates']).forEach((template, t) => {
991
+ for (const key of ['kind', 'category', 'brand', 'attachments']) {
992
+ if (isDoc(template) && template[key] !== undefined)
993
+ out.push({ word: `email.${key}`, path: `emailTemplates.${String(t)}.${key}` });
994
+ }
995
+ });
819
996
  // A dashboard's second toolbar link, a ranking's named pair, a record page's tab words, a list's bulk action, a board's columns.
820
997
  list(document['pages']).forEach((page, p) => {
998
+ if (isDoc(page) && page['envelope'] !== undefined)
999
+ out.push({ word: 'page.envelope', path: `pages.${String(p)}.envelope` });
1000
+ if (isDoc(page) && page['views'] !== undefined)
1001
+ out.push({ word: 'page.views', path: `pages.${String(p)}.views` });
821
1002
  const config = isDoc(page) && isDoc(page['config']) ? page['config'] : {};
822
1003
  const here = `pages.${String(p)}.config`;
823
1004
  // A page kept off the sidebar.
@@ -966,6 +1147,14 @@ export function installFloorWords(document) {
966
1147
  }
967
1148
  if (action['kind'] === 'record.create' && action['name'] !== undefined)
968
1149
  out.push({ word: 'automations.stepName', path: `${at}.${String(n)}.action.name` });
1150
+ if (action['kind'] === 'webhook')
1151
+ out.push({ word: 'automations.webhook', path: `${at}.${String(n)}.action` });
1152
+ if (action['kind'] === 'document.render')
1153
+ out.push({ word: 'automations.documentRender', path: `${at}.${String(n)}.action` });
1154
+ if (action['kind'] === 'email' && to['kind'] === 'fixed')
1155
+ out.push({ word: 'automations.fixedAddress', path: `${at}.${String(n)}.action.to` });
1156
+ if (action['kind'] === 'email' && action['purpose'] !== undefined)
1157
+ out.push({ word: 'automations.purpose', path: `${at}.${String(n)}.action.purpose` });
969
1158
  // A value read from the settings row, a day so many days on.
970
1159
  for (const [ref, value] of Object.entries(isDoc(action['values']) ? action['values'] : {})) {
971
1160
  if (isDoc(value) && value['setting'] !== undefined)
@@ -993,6 +1182,8 @@ export function installFloorWords(document) {
993
1182
  const forEach = isDoc(rule) && isDoc(rule['trigger']) && isDoc(rule['trigger']['forEach']) ? rule['trigger']['forEach'] : {};
994
1183
  if (forEach['once'] === 'per-spell')
995
1184
  out.push({ word: 'automations.perSpell', path: `automations.${String(r)}.trigger.forEach.once` });
1185
+ if (isDoc(rule) && isDoc(rule['trigger']) && rule['trigger']['watch'] !== undefined)
1186
+ out.push({ word: 'automations.watch', path: `automations.${String(r)}.trigger.watch` });
996
1187
  });
997
1188
  // An app's e-mail that names the person a staff column names: a template the outbox sends reading `<…>.<staff column>.name`.
998
1189
  const outboxTemplates = new Set(Object.values(isDoc(outbox['kinds']) ? outbox['kinds'] : {}).filter((key) => typeof key === 'string'));
@@ -1004,6 +1195,10 @@ export function installFloorWords(document) {
1004
1195
  out.push({ word: 'outbox.staffName', path: `emailTemplates.${String(t)}` });
1005
1196
  });
1006
1197
  list(document['documents']).forEach((entry, d) => {
1198
+ for (const key of ['options', 'trigger', 'deliver']) {
1199
+ if (isDoc(entry) && entry[key] !== undefined)
1200
+ out.push({ word: `documents.${key}`, path: `documents.${String(d)}.${key}` });
1201
+ }
1007
1202
  for (const [slot, source] of Object.entries(isDoc(entry) && isDoc(entry['mapping']) ? entry['mapping'] : {})) {
1008
1203
  const sources = isDoc(source) ? [...(isDoc(source['collection']) ? [source['collection']] : []), ...list(source['collections'])] : [];
1009
1204
  if (sources.some((one) => isDoc(one) && one['addOn'] !== undefined))
@@ -1038,6 +1233,17 @@ export function installFloorWords(document) {
1038
1233
  uploadsIn(entry, `publicAccess.${String(e)}`);
1039
1234
  if (isDoc(entry) && entry['assets'] !== undefined)
1040
1235
  out.push({ word: 'publicAccess.assets', path: `publicAccess.${String(e)}.assets` });
1236
+ // The wider methods and the endpoint's own address, pages, rate and reply.
1237
+ if (isDoc(entry) && Array.isArray(entry['methods'])) {
1238
+ if (entry['methods'].includes('PUT'))
1239
+ out.push({ word: 'publicAccess.put', path: `publicAccess.${String(e)}.methods` });
1240
+ if (entry['methods'].includes('BATCH'))
1241
+ out.push({ word: 'publicAccess.batch', path: `publicAccess.${String(e)}.methods` });
1242
+ }
1243
+ for (const [key, word] of [['path', 'publicAccess.path'], ['pagination', 'publicAccess.pagination'], ['rateLimit', 'publicAccess.rateLimit'], ['response', 'publicAccess.response']]) {
1244
+ if (isDoc(entry) && entry[key] !== undefined)
1245
+ out.push({ word, path: `publicAccess.${String(e)}.${key}` });
1246
+ }
1041
1247
  });
1042
1248
  return out;
1043
1249
  }