@blinkk/root-cms 1.0.0-alpha.28 → 1.0.0-alpha.29

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,163 +1,3 @@
1
- import { FunctionalComponent } from 'preact';
1
+ declare const test: {};
2
2
 
3
- interface CommonFieldProps {
4
- id?: string;
5
- label?: string;
6
- help?: string;
7
- type: string;
8
- default?: any;
9
- hidden?: boolean;
10
- deprecated?: boolean;
11
- }
12
- type StringField = CommonFieldProps & {
13
- type: 'string';
14
- default?: string;
15
- translate?: boolean;
16
- variant?: 'input' | 'textarea';
17
- };
18
- declare function string(field: Omit<StringField, 'type'>): StringField;
19
- type NumberField = CommonFieldProps & {
20
- type: 'number';
21
- default?: number;
22
- };
23
- declare function number(field: Omit<NumberField, 'type'>): NumberField;
24
- type DateField = CommonFieldProps & {
25
- type: 'date';
26
- default?: string;
27
- };
28
- declare function date(field: Omit<DateField, 'type'>): DateField;
29
- type DateTimeField = CommonFieldProps & {
30
- type: 'datetime';
31
- default?: string;
32
- };
33
- declare function datetime(field: Omit<DateTimeField, 'type'>): DateTimeField;
34
- type BooleanField = CommonFieldProps & {
35
- type: 'boolean';
36
- default?: boolean;
37
- };
38
- declare function boolean(field: Omit<BooleanField, 'type'>): BooleanField;
39
- type SelectField = CommonFieldProps & {
40
- type: 'select';
41
- default?: string;
42
- options?: {
43
- values?: Array<{
44
- value: string;
45
- label?: string;
46
- }>;
47
- };
48
- };
49
- declare function select(field: Omit<SelectField, 'type'>): SelectField;
50
- type MultiSelectField = Omit<SelectField, 'type'> & {
51
- type: 'multiselect';
52
- default?: string[];
53
- };
54
- declare function multiselect(field: Omit<MultiSelectField, 'type'>): MultiSelectField;
55
- type ImageField = CommonFieldProps & {
56
- type: 'image';
57
- };
58
- declare function image(field: Omit<ImageField, 'type'>): ImageField;
59
- type ObjectField = CommonFieldProps & {
60
- type: 'object';
61
- fields: FieldWithId[];
62
- };
63
- declare function object(field: Omit<ObjectField, 'type'>): ObjectField;
64
- type ArrayField = CommonFieldProps & {
65
- type: 'array';
66
- default?: Array<any>;
67
- preview?: (value: any) => string;
68
- of: ImageField | ObjectField | OneOfField;
69
- };
70
- declare function array(field: Omit<ArrayField, 'type'>): ArrayField;
71
- type OneOfField = CommonFieldProps & {
72
- type: 'oneof';
73
- types: Array<Schema>;
74
- };
75
- declare function oneOf(field: Omit<OneOfField, 'type'>): OneOfField;
76
- type Field = StringField | NumberField | DateField | DateTimeField | BooleanField | SelectField | MultiSelectField | ImageField | ObjectField | ArrayField | OneOfField;
77
- type FieldWithId = Field;
78
- interface Schema {
79
- name: string;
80
- description?: string;
81
- fields: Array<FieldWithId>;
82
- }
83
- declare function defineSchema(schema: Schema): Schema;
84
- declare const define: typeof defineSchema;
85
- type Collection = Schema & {
86
- url?: string;
87
- Component: FunctionalComponent;
88
- preview?: {
89
- title?: string;
90
- image?: string;
91
- };
92
- };
93
- declare function defineCollection(collection: Collection): Collection;
94
- declare const collection: typeof defineCollection;
95
-
96
- type schema_CommonFieldProps = CommonFieldProps;
97
- type schema_StringField = StringField;
98
- declare const schema_string: typeof string;
99
- type schema_NumberField = NumberField;
100
- declare const schema_number: typeof number;
101
- type schema_DateField = DateField;
102
- declare const schema_date: typeof date;
103
- type schema_DateTimeField = DateTimeField;
104
- declare const schema_datetime: typeof datetime;
105
- type schema_BooleanField = BooleanField;
106
- declare const schema_boolean: typeof boolean;
107
- type schema_SelectField = SelectField;
108
- declare const schema_select: typeof select;
109
- type schema_MultiSelectField = MultiSelectField;
110
- declare const schema_multiselect: typeof multiselect;
111
- type schema_ImageField = ImageField;
112
- declare const schema_image: typeof image;
113
- type schema_ObjectField = ObjectField;
114
- declare const schema_object: typeof object;
115
- type schema_ArrayField = ArrayField;
116
- declare const schema_array: typeof array;
117
- type schema_OneOfField = OneOfField;
118
- declare const schema_oneOf: typeof oneOf;
119
- type schema_Field = Field;
120
- type schema_FieldWithId = FieldWithId;
121
- type schema_Schema = Schema;
122
- declare const schema_defineSchema: typeof defineSchema;
123
- declare const schema_define: typeof define;
124
- type schema_Collection = Collection;
125
- declare const schema_defineCollection: typeof defineCollection;
126
- declare const schema_collection: typeof collection;
127
- declare namespace schema {
128
- export {
129
- schema_CommonFieldProps as CommonFieldProps,
130
- schema_StringField as StringField,
131
- schema_string as string,
132
- schema_NumberField as NumberField,
133
- schema_number as number,
134
- schema_DateField as DateField,
135
- schema_date as date,
136
- schema_DateTimeField as DateTimeField,
137
- schema_datetime as datetime,
138
- schema_BooleanField as BooleanField,
139
- schema_boolean as boolean,
140
- schema_SelectField as SelectField,
141
- schema_select as select,
142
- schema_MultiSelectField as MultiSelectField,
143
- schema_multiselect as multiselect,
144
- schema_ImageField as ImageField,
145
- schema_image as image,
146
- schema_ObjectField as ObjectField,
147
- schema_object as object,
148
- schema_ArrayField as ArrayField,
149
- schema_array as array,
150
- schema_OneOfField as OneOfField,
151
- schema_oneOf as oneOf,
152
- schema_Field as Field,
153
- schema_FieldWithId as FieldWithId,
154
- schema_Schema as Schema,
155
- schema_defineSchema as defineSchema,
156
- schema_define as define,
157
- schema_Collection as Collection,
158
- schema_defineCollection as defineCollection,
159
- schema_collection as collection,
160
- };
161
- }
162
-
163
- export { schema };
3
+ export { test };
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ // src/index.ts
2
+ var test = {};
3
+ export {
4
+ test
5
+ };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export const test = {};\n"],"mappings":";AAAO,IAAM,OAAO,CAAC;","names":[]}
package/dist/plugin.d.ts CHANGED
@@ -1,14 +1,6 @@
1
- import { Request, Plugin } from '@blinkk/root';
1
+ import { Plugin } from '@blinkk/root';
2
2
 
3
- interface User {
4
- email: string;
5
- jwt: any;
6
- }
7
-
8
- type CMSPluginOptions = {
9
- cookieSecret?: string | string[];
10
- isUserAuthorized?: (req: Request, user: User) => boolean | Promise<boolean>;
11
- };
3
+ declare type CMSPluginOptions = {};
12
4
  declare function cmsPlugin(options?: CMSPluginOptions): Plugin;
13
5
 
14
- export { CMSPluginOptions, cmsPlugin };
6
+ export { cmsPlugin };
package/dist/plugin.js CHANGED
@@ -1,196 +1,17 @@
1
- // core/users.ts
2
- import jsonwebtoken from "jsonwebtoken";
3
- var AUTH_COOKIE = "ROOTJS_AUTH";
4
- function usersMiddleware(options) {
5
- const clientId = process.env.GOOGLE_CLIENT_ID;
6
- const clientSecret = process.env.GOOGLE_CLIENT_SECRET;
7
- const loginUrl = options.loginUrl || "/cms/login";
8
- if (!clientId || !clientSecret) {
9
- throw new Error(
10
- "Missing one or more required .env vars: GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET"
11
- );
12
- }
13
- function isLoginRequired(req) {
14
- if (!options.isLoginRequired) {
15
- return false;
16
- }
17
- return options.isLoginRequired(req);
18
- }
19
- function isUserAuthorized(req, user) {
20
- if (!options.isUserAuthorized) {
21
- return true;
22
- }
23
- return options.isUserAuthorized(req, user);
24
- }
25
- function getLoginUrl(req) {
26
- const params = new URLSearchParams();
27
- params.set("scope", "email");
28
- params.set("access_type", "online");
29
- params.set("client_id", clientId);
30
- params.set("redirect_uri", getRedirectUrl(req));
31
- params.set("state", req.originalUrl);
32
- params.set("response_type", "code");
33
- return `https://accounts.google.com/o/oauth2/v2/auth?${params.toString()}`;
34
- }
35
- function getRedirectUrl(req) {
36
- const host = getHost(req);
37
- const protocol = req.protocol;
38
- return `${protocol}://${host}${loginUrl}`;
39
- }
40
- function getHost(req) {
41
- return req.headers["x-forwarded-host"] || req.headers.host;
42
- }
43
- function loginRedirect(req, res) {
44
- const loginUrl2 = getLoginUrl(req);
45
- res.redirect(loginUrl2);
46
- return;
47
- }
48
- async function getOAuthToken(req, code) {
49
- const params = new URLSearchParams();
50
- params.set("client_id", clientId);
51
- params.set("client_secret", clientSecret);
52
- params.set("redirect_uri", getRedirectUrl(req));
53
- params.set("grant_type", "authorization_code");
54
- params.set("code", code);
55
- const res = await fetch("https://oauth2.googleapis.com/token", {
56
- method: "POST",
57
- headers: {
58
- "Content-Type": "application/x-www-form-urlencoded"
59
- },
60
- body: params.toString()
61
- });
62
- if (res.status !== 200) {
63
- console.error(res.status);
64
- throw new Error("failed to retrieve jwt token");
65
- }
66
- return res.json();
67
- }
68
- async function getUser(req) {
69
- const cookieValue = req.signedCookies[AUTH_COOKIE];
70
- console.log(cookieValue);
71
- if (cookieValue) {
72
- try {
73
- const jwt = decodeJWT(cookieValue);
74
- if (jwt && jwt.email) {
75
- return {
76
- email: jwt.email,
77
- jwt
78
- };
79
- }
80
- } catch (e) {
81
- console.error(`failed to parse jwt: ${cookieValue}`);
82
- console.error(e);
83
- }
84
- }
85
- return null;
86
- }
87
- async function handleLogin(req, res) {
88
- const code = req.query.code;
89
- if (!code) {
90
- res.status(403).send("Missing required param: code");
91
- return;
92
- }
93
- const token = await getOAuthToken(req, code);
94
- const jwt = decodeJWT(token.id_token);
95
- if (!jwt || !jwt.email || !jwt.email_verified) {
96
- res.status(500).send("500: Login failed");
97
- return;
98
- }
99
- const exp = jwt.exp || Math.floor(new Date().getTime() / 1e3 + 3600);
100
- res.cookie(AUTH_COOKIE, token.id_token, {
101
- secure: req.hostname !== "localhost",
102
- httpOnly: true,
103
- sameSite: true,
104
- expires: new Date(exp * 1e3),
105
- signed: true
106
- });
107
- const state = String(req.params.state);
108
- if (state && state.startsWith("/cms")) {
109
- res.redirect(state);
110
- } else {
111
- res.redirect("/cms");
112
- }
113
- }
114
- function decodeJWT(token) {
115
- try {
116
- const decoded = jsonwebtoken.decode(token, { complete: true });
117
- return decoded == null ? void 0 : decoded.payload;
118
- } catch (err) {
119
- return null;
120
- }
121
- }
122
- return async (req, res, next) => {
123
- try {
124
- if (req.originalUrl.startsWith(loginUrl)) {
125
- await handleLogin(req, res);
126
- return;
127
- }
128
- const user = await getUser(req);
129
- if (isLoginRequired(req)) {
130
- if (!user) {
131
- loginRedirect(req, res);
132
- return;
133
- }
134
- if (!isUserAuthorized(req, user)) {
135
- res.status(403).send("403: Login failed");
136
- return;
137
- }
138
- }
139
- const r = req;
140
- r.user = user;
141
- next();
142
- } catch (err) {
143
- next(err);
144
- }
145
- };
146
- }
147
-
148
- // core/plugin.ts
149
- import cookieParser from "cookie-parser";
150
- import * as dotenv from "dotenv";
151
- import path from "node:path";
152
- import { fileURLToPath } from "node:url";
153
- var __dirname = path.dirname(fileURLToPath(import.meta.url));
154
- dotenv.config();
155
- function generateSecret() {
156
- const result = [];
157
- const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
158
- for (let i = 0; i < 36; i++) {
159
- const rand = Math.floor(Math.random() * chars.length);
160
- result.push(chars.charAt(rand));
161
- }
162
- return result.join("");
163
- }
1
+ // src/plugin.ts
164
2
  function cmsPlugin(options) {
165
- const cookieSecret = (options == null ? void 0 : options.cookieSecret) || generateSecret();
166
3
  return {
167
4
  name: "root-cms",
168
5
  configureServer: (server) => {
169
- server.use("/cms", cookieParser(cookieSecret));
170
- server.use(
171
- "/cms",
172
- usersMiddleware({
173
- isLoginRequired: () => true,
174
- isUserAuthorized: options == null ? void 0 : options.isUserAuthorized
175
- })
176
- );
177
- server.use(
178
- "/cms",
179
- async (req, res, next) => {
180
- try {
181
- const appPath = path.resolve(__dirname, "./app.js");
182
- const app = await req.viteServer.ssrLoadModule(appPath);
183
- app.render(req, res);
184
- } catch (err) {
185
- console.error(err);
186
- next(err);
187
- }
188
- }
189
- );
6
+ server.use("/cms", (req, res) => {
7
+ console.log("root config context var:");
8
+ console.log(req.rootConfig);
9
+ res.end("cms");
10
+ });
190
11
  }
191
12
  };
192
13
  }
193
14
  export {
194
15
  cmsPlugin
195
16
  };
196
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS91c2Vycy50cyIsICIuLi9jb3JlL3BsdWdpbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtOZXh0RnVuY3Rpb24sIFJlcXVlc3QsIFJlc3BvbnNlfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IGpzb253ZWJ0b2tlbiBmcm9tICdqc29ud2VidG9rZW4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXIge1xuICBlbWFpbDogc3RyaW5nO1xuICBqd3Q6IGFueTtcbn1cblxuZXhwb3J0IHR5cGUgVXNlclJlcXVlc3QgPSBSZXF1ZXN0ICYge1xuICB1c2VyPzogVXNlciB8IG51bGw7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIE1pZGRsZXdhcmVPcHRpb25zIHtcbiAgaXNMb2dpblJlcXVpcmVkPzogKHJlcTogUmVxdWVzdCkgPT4gYm9vbGVhbjtcbiAgaXNVc2VyQXV0aG9yaXplZD86IChyZXE6IFJlcXVlc3QsIHVzZXI6IFVzZXIpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xuICBsb2dpblVybD86IHN0cmluZztcbn1cblxuY29uc3QgQVVUSF9DT09LSUUgPSAnUk9PVEpTX0FVVEgnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlcnNNaWRkbGV3YXJlKG9wdGlvbnM6IE1pZGRsZXdhcmVPcHRpb25zKSB7XG4gIGNvbnN0IGNsaWVudElkID0gcHJvY2Vzcy5lbnYuR09PR0xFX0NMSUVOVF9JRCE7XG4gIGNvbnN0IGNsaWVudFNlY3JldCA9IHByb2Nlc3MuZW52LkdPT0dMRV9DTElFTlRfU0VDUkVUITtcbiAgY29uc3QgbG9naW5VcmwgPSBvcHRpb25zLmxvZ2luVXJsIHx8ICcvY21zL2xvZ2luJztcblxuICBpZiAoIWNsaWVudElkIHx8ICFjbGllbnRTZWNyZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnTWlzc2luZyBvbmUgb3IgbW9yZSByZXF1aXJlZCAuZW52IHZhcnM6IEdPT0dMRV9DTElFTlRfSUQsIEdPT0dMRV9DTElFTlRfU0VDUkVUJ1xuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0xvZ2luUmVxdWlyZWQocmVxOiBSZXF1ZXN0KSB7XG4gICAgaWYgKCFvcHRpb25zLmlzTG9naW5SZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucy5pc0xvZ2luUmVxdWlyZWQocmVxKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzVXNlckF1dGhvcml6ZWQocmVxOiBSZXF1ZXN0LCB1c2VyOiBVc2VyKSB7XG4gICAgaWYgKCFvcHRpb25zLmlzVXNlckF1dGhvcml6ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucy5pc1VzZXJBdXRob3JpemVkKHJlcSwgdXNlcik7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRMb2dpblVybChyZXE6IFJlcXVlc3QpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgcGFyYW1zLnNldCgnc2NvcGUnLCAnZW1haWwnKTtcbiAgICBwYXJhbXMuc2V0KCdhY2Nlc3NfdHlwZScsICdvbmxpbmUnKTtcbiAgICBwYXJhbXMuc2V0KCdjbGllbnRfaWQnLCBjbGllbnRJZCk7XG4gICAgcGFyYW1zLnNldCgncmVkaXJlY3RfdXJpJywgZ2V0UmVkaXJlY3RVcmwocmVxKSk7XG4gICAgcGFyYW1zLnNldCgnc3RhdGUnLCByZXEub3JpZ2luYWxVcmwpO1xuICAgIHBhcmFtcy5zZXQoJ3Jlc3BvbnNlX3R5cGUnLCAnY29kZScpO1xuICAgIHJldHVybiBgaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL28vb2F1dGgyL3YyL2F1dGg/JHtwYXJhbXMudG9TdHJpbmcoKX1gO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UmVkaXJlY3RVcmwocmVxOiBSZXF1ZXN0KSB7XG4gICAgY29uc3QgaG9zdCA9IGdldEhvc3QocmVxKTtcbiAgICBjb25zdCBwcm90b2NvbCA9IHJlcS5wcm90b2NvbDtcbiAgICByZXR1cm4gYCR7cHJvdG9jb2x9Oi8vJHtob3N0fSR7bG9naW5Vcmx9YDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEhvc3QocmVxOiBSZXF1ZXN0KSB7XG4gICAgcmV0dXJuIHJlcS5oZWFkZXJzWyd4LWZvcndhcmRlZC1ob3N0J10gfHwgcmVxLmhlYWRlcnMuaG9zdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ2luUmVkaXJlY3QocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSB7XG4gICAgY29uc3QgbG9naW5VcmwgPSBnZXRMb2dpblVybChyZXEpO1xuICAgIHJlcy5yZWRpcmVjdChsb2dpblVybCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0T0F1dGhUb2tlbihyZXE6IFJlcXVlc3QsIGNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBwYXJhbXMuc2V0KCdjbGllbnRfaWQnLCBjbGllbnRJZCk7XG4gICAgcGFyYW1zLnNldCgnY2xpZW50X3NlY3JldCcsIGNsaWVudFNlY3JldCk7XG4gICAgcGFyYW1zLnNldCgncmVkaXJlY3RfdXJpJywgZ2V0UmVkaXJlY3RVcmwocmVxKSk7XG4gICAgcGFyYW1zLnNldCgnZ3JhbnRfdHlwZScsICdhdXRob3JpemF0aW9uX2NvZGUnKTtcbiAgICBwYXJhbXMuc2V0KCdjb2RlJywgY29kZSk7XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9vYXV0aDIuZ29vZ2xlYXBpcy5jb20vdG9rZW4nLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IHBhcmFtcy50b1N0cmluZygpLFxuICAgIH0pO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IocmVzLnN0YXR1cyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byByZXRyaWV2ZSBqd3QgdG9rZW4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5qc29uKCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBnZXRVc2VyKHJlcTogUmVxdWVzdCk6IFByb21pc2U8VXNlciB8IG51bGw+IHtcbiAgICBjb25zdCBjb29raWVWYWx1ZSA9IHJlcS5zaWduZWRDb29raWVzW0FVVEhfQ09PS0lFXTtcbiAgICBjb25zb2xlLmxvZyhjb29raWVWYWx1ZSk7XG4gICAgaWYgKGNvb2tpZVZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBqd3QgPSBkZWNvZGVKV1QoY29va2llVmFsdWUpO1xuICAgICAgICBpZiAoand0ICYmIGp3dC5lbWFpbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbWFpbDogand0LmVtYWlsLFxuICAgICAgICAgICAgand0OiBqd3QsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBmYWlsZWQgdG8gcGFyc2Ugand0OiAke2Nvb2tpZVZhbHVlfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUxvZ2luKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkge1xuICAgIGNvbnN0IGNvZGUgPSByZXEucXVlcnkuY29kZSBhcyBzdHJpbmc7XG4gICAgaWYgKCFjb2RlKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMykuc2VuZCgnTWlzc2luZyByZXF1aXJlZCBwYXJhbTogY29kZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldE9BdXRoVG9rZW4ocmVxLCBjb2RlKTtcbiAgICBjb25zdCBqd3QgPSBkZWNvZGVKV1QodG9rZW4uaWRfdG9rZW4pO1xuICAgIGlmICghand0IHx8ICFqd3QuZW1haWwgfHwgIWp3dC5lbWFpbF92ZXJpZmllZCkge1xuICAgICAgcmVzLnN0YXR1cyg1MDApLnNlbmQoJzUwMDogTG9naW4gZmFpbGVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4cCA9IGp3dC5leHAgfHwgTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDAgKyAzNjAwKTtcbiAgICByZXMuY29va2llKEFVVEhfQ09PS0lFLCB0b2tlbi5pZF90b2tlbiwge1xuICAgICAgc2VjdXJlOiByZXEuaG9zdG5hbWUgIT09ICdsb2NhbGhvc3QnLFxuICAgICAgaHR0cE9ubHk6IHRydWUsXG4gICAgICBzYW1lU2l0ZTogdHJ1ZSxcbiAgICAgIGV4cGlyZXM6IG5ldyBEYXRlKGV4cCAqIDEwMDApLFxuICAgICAgc2lnbmVkOiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IHN0YXRlID0gU3RyaW5nKHJlcS5wYXJhbXMuc3RhdGUpO1xuICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS5zdGFydHNXaXRoKCcvY21zJykpIHtcbiAgICAgIHJlcy5yZWRpcmVjdChzdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcy5yZWRpcmVjdCgnL2NtcycpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZUpXVCh0b2tlbjogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBqc29ud2VidG9rZW4uZGVjb2RlKHRva2VuLCB7Y29tcGxldGU6IHRydWV9KTtcbiAgICAgIHJldHVybiBkZWNvZGVkPy5wYXlsb2FkIGFzIGpzb253ZWJ0b2tlbi5Kd3RQYXlsb2FkO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAocmVxLm9yaWdpbmFsVXJsLnN0YXJ0c1dpdGgobG9naW5VcmwpKSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZUxvZ2luKHJlcSwgcmVzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IGdldFVzZXIocmVxKTtcbiAgICAgIGlmIChpc0xvZ2luUmVxdWlyZWQocmVxKSkge1xuICAgICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgICBsb2dpblJlZGlyZWN0KHJlcSwgcmVzKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VzZXJBdXRob3JpemVkKHJlcSwgdXNlcikpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMykuc2VuZCgnNDAzOiBMb2dpbiBmYWlsZWQnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHIgPSByZXEgYXMgVXNlclJlcXVlc3Q7XG4gICAgICByLnVzZXIgPSB1c2VyO1xuICAgICAgbmV4dCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbmV4dChlcnIpO1xuICAgIH1cbiAgfTtcbn1cbiIsICJpbXBvcnQge05leHRGdW5jdGlvbiwgUGx1Z2luLCBSZXF1ZXN0LCBSZXNwb25zZX0gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7VXNlciwgdXNlcnNNaWRkbGV3YXJlfSBmcm9tICcuL3VzZXJzLmpzJztcbmltcG9ydCBjb29raWVQYXJzZXIgZnJvbSAnY29va2llLXBhcnNlcic7XG5pbXBvcnQgKiBhcyBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gJ25vZGU6dXJsJztcblxuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cbmRvdGVudi5jb25maWcoKTtcblxuZXhwb3J0IHR5cGUgQ01TUGx1Z2luT3B0aW9ucyA9IHtcbiAgLy8gU2VjcmV0IHZhbHVlKHMpIHVzZWQgZm9yIHNpZ25pbmcgdGhlIHVzZXIgYXV0aGVudGljYXRpb24gY29va2llLlxuICBjb29raWVTZWNyZXQ/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLy8gRnVuY3Rpb24gY2FsbGVkIHRvIGNoZWNrIGlmIGEgdXNlciBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8gdGhlIENNUy5cbiAgaXNVc2VyQXV0aG9yaXplZD86IChyZXE6IFJlcXVlc3QsIHVzZXI6IFVzZXIpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xufTtcblxuZnVuY3Rpb24gZ2VuZXJhdGVTZWNyZXQoKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGNvbnN0IGNoYXJzID1cbiAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDM2OyBpKyspIHtcbiAgICBjb25zdCByYW5kID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKTtcbiAgICByZXN1bHQucHVzaChjaGFycy5jaGFyQXQocmFuZCkpO1xuICB9XG4gIHJldHVybiByZXN1bHQuam9pbignJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbXNQbHVnaW4ob3B0aW9ucz86IENNU1BsdWdpbk9wdGlvbnMpOiBQbHVnaW4ge1xuICBjb25zdCBjb29raWVTZWNyZXQgPSBvcHRpb25zPy5jb29raWVTZWNyZXQgfHwgZ2VuZXJhdGVTZWNyZXQoKTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAncm9vdC1jbXMnLFxuICAgIGNvbmZpZ3VyZVNlcnZlcjogKHNlcnZlcikgPT4ge1xuICAgICAgc2VydmVyLnVzZSgnL2NtcycsIGNvb2tpZVBhcnNlcihjb29raWVTZWNyZXQpKTtcbiAgICAgIHNlcnZlci51c2UoXG4gICAgICAgICcvY21zJyxcbiAgICAgICAgdXNlcnNNaWRkbGV3YXJlKHtcbiAgICAgICAgICBpc0xvZ2luUmVxdWlyZWQ6ICgpID0+IHRydWUsXG4gICAgICAgICAgaXNVc2VyQXV0aG9yaXplZDogb3B0aW9ucz8uaXNVc2VyQXV0aG9yaXplZCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICAvLyBzZXJ2ZXIudXNlKCcvY21zL21haW4uanMnLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyAgIGNvbnN0IHZpdGVTZXJ2ZXIgPSByZXEudml0ZVNlcnZlciE7XG4gICAgICAvLyAgIGNvbnN0IGFwcFBhdGggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9hcHAuanMnKTtcbiAgICAgIC8vICAgY29uc3QgZmlsZVVybCA9IHBhdGguam9pbignL0BmcycsIGFwcFBhdGguc2xpY2UoMSkpO1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhmaWxlVXJsKTtcbiAgICAgIC8vICAgY29uc3QgdmFsID0gYXdhaXQgdml0ZVNlcnZlci50cmFuc2Zvcm1SZXF1ZXN0KFxuICAgICAgLy8gICAgIHBhdGguam9pbignL0BmcycsIGFwcFBhdGguc2xpY2UoMSkpXG4gICAgICAvLyAgICk7XG4gICAgICAvLyAgIGlmICh2YWw/LmNvZGUpIHtcbiAgICAgIC8vICAgICByZXMuc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCAndGV4dC9wbGFpbicpO1xuICAgICAgLy8gICAgIHJlcy5zZW5kKHZhbC5jb2RlKTtcbiAgICAgIC8vICAgfSBlbHNlIHtcbiAgICAgIC8vICAgICByZXMuc2VuZCgnbm90IGZvdW5kJyk7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH0pO1xuICAgICAgc2VydmVyLnVzZShcbiAgICAgICAgJy9jbXMnLFxuICAgICAgICBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYXBwUGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL2FwcC5qcycpO1xuICAgICAgICAgICAgY29uc3QgYXBwID0gYXdhaXQgcmVxLnZpdGVTZXJ2ZXIhLnNzckxvYWRNb2R1bGUoYXBwUGF0aCk7XG4gICAgICAgICAgICBhcHAucmVuZGVyKHJlcSwgcmVzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIG5leHQoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFDQSxPQUFPLGtCQUFrQjtBQWlCekIsSUFBTSxjQUFjO0FBRWIsU0FBUyxnQkFBZ0IsU0FBNEI7QUFDMUQsUUFBTSxXQUFXLFFBQVEsSUFBSTtBQUM3QixRQUFNLGVBQWUsUUFBUSxJQUFJO0FBQ2pDLFFBQU0sV0FBVyxRQUFRLFlBQVk7QUFFckMsTUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjO0FBQzlCLFVBQU0sSUFBSTtBQUFBLE1BQ1I7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFdBQVMsZ0JBQWdCLEtBQWM7QUFDckMsUUFBSSxDQUFDLFFBQVEsaUJBQWlCO0FBQzVCLGFBQU87QUFBQSxJQUNUO0FBQ0EsV0FBTyxRQUFRLGdCQUFnQixHQUFHO0FBQUEsRUFDcEM7QUFFQSxXQUFTLGlCQUFpQixLQUFjLE1BQVk7QUFDbEQsUUFBSSxDQUFDLFFBQVEsa0JBQWtCO0FBQzdCLGFBQU87QUFBQSxJQUNUO0FBQ0EsV0FBTyxRQUFRLGlCQUFpQixLQUFLLElBQUk7QUFBQSxFQUMzQztBQUVBLFdBQVMsWUFBWSxLQUFjO0FBQ2pDLFVBQU0sU0FBUyxJQUFJLGdCQUFnQjtBQUNu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
17
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import {Plugin, Request, Response} from '@blinkk/root';\n\ntype CMSPluginOptions = {};\n\nexport function cmsPlugin(options?: CMSPluginOptions): Plugin {\n return {\n name: 'root-cms',\n configureServer: (server) => {\n server.use('/cms', (req: Request, res: Response) => {\n console.log('root config context var:');\n console.log(req.rootConfig);\n res.end('cms');\n });\n },\n };\n}\n"],"mappings":";AAIO,SAAS,UAAU,SAAoC;AAC5D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,iBAAiB,CAAC,WAAW;AAC3B,aAAO,IAAI,QAAQ,CAAC,KAAc,QAAkB;AAClD,gBAAQ,IAAI,0BAA0B;AACtC,gBAAQ,IAAI,IAAI,UAAU;AAC1B,YAAI,IAAI,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,83 @@
1
+ interface CommonFieldProps {
2
+ id?: string;
3
+ label?: string;
4
+ help?: string;
5
+ type: string;
6
+ default?: any;
7
+ hidden?: boolean;
8
+ deprecated?: boolean;
9
+ }
10
+ declare type StringField = CommonFieldProps & {
11
+ type: 'string';
12
+ default?: string;
13
+ translate?: boolean;
14
+ };
15
+ declare function string(field: Omit<StringField, 'type'>): StringField;
16
+ declare type NumberField = CommonFieldProps & {
17
+ type: 'number';
18
+ default?: number;
19
+ };
20
+ declare function number(field: Omit<NumberField, 'type'>): NumberField;
21
+ declare type DateField = CommonFieldProps & {
22
+ type: 'date';
23
+ default?: string;
24
+ };
25
+ declare function date(field: Omit<DateField, 'type'>): DateField;
26
+ declare type DateTimeField = CommonFieldProps & {
27
+ type: 'datetime';
28
+ default?: string;
29
+ };
30
+ declare function datetime(field: Omit<DateTimeField, 'type'>): DateTimeField;
31
+ declare type BooleanField = CommonFieldProps & {
32
+ type: 'boolean';
33
+ default?: boolean;
34
+ };
35
+ declare function boolean(field: Omit<BooleanField, 'type'>): BooleanField;
36
+ declare type SelectField = CommonFieldProps & {
37
+ type: 'select';
38
+ default?: string;
39
+ options?: {
40
+ values?: Array<{
41
+ value: string;
42
+ label?: string;
43
+ }>;
44
+ };
45
+ };
46
+ declare function select(field: Omit<SelectField, 'type'>): SelectField;
47
+ declare type MultiSelectField = Omit<SelectField, 'type'> & {
48
+ type: 'multiselect';
49
+ default?: string[];
50
+ };
51
+ declare function multiselect(field: Omit<MultiSelectField, 'type'>): MultiSelectField;
52
+ declare type ImageField = CommonFieldProps & {
53
+ type: 'image';
54
+ };
55
+ declare function image(field: Omit<ImageField, 'type'>): ImageField;
56
+ declare type ObjectField = CommonFieldProps & {
57
+ type: 'object';
58
+ fields: FieldWithId[];
59
+ };
60
+ declare function object(field: Omit<ObjectField, 'type'>): ObjectField;
61
+ declare type ArrayField = CommonFieldProps & {
62
+ type: 'array';
63
+ default?: Array<any>;
64
+ preview?: (value: any) => string;
65
+ of: ImageField | ObjectField | OneOfField;
66
+ };
67
+ declare function array(field: Omit<ArrayField, 'type'>): ArrayField;
68
+ declare type OneOfField = CommonFieldProps & {
69
+ type: 'oneof';
70
+ types: Array<Schema>;
71
+ };
72
+ declare function oneOf(field: Omit<OneOfField, 'type'>): OneOfField;
73
+ declare type Field = StringField | NumberField | DateField | DateTimeField | BooleanField | SelectField | MultiSelectField | ImageField | ObjectField | ArrayField | OneOfField;
74
+ declare type FieldWithId = Field;
75
+ interface Schema {
76
+ name: string;
77
+ description?: string;
78
+ fields: Array<FieldWithId>;
79
+ }
80
+ declare function defineSchema(schema: Schema): Schema;
81
+ declare const define: typeof defineSchema;
82
+
83
+ export { ArrayField, BooleanField, CommonFieldProps, DateField, DateTimeField, Field, FieldWithId, ImageField, MultiSelectField, NumberField, ObjectField, OneOfField, Schema, SelectField, StringField, array, boolean, date, datetime, define, defineSchema, image, multiselect, number, object, oneOf, select, string };
package/dist/schema.js ADDED
@@ -0,0 +1,54 @@
1
+ // src/schema.ts
2
+ function string(field) {
3
+ return { ...field, type: "string" };
4
+ }
5
+ function number(field) {
6
+ return { ...field, type: "number" };
7
+ }
8
+ function date(field) {
9
+ return { ...field, type: "date" };
10
+ }
11
+ function datetime(field) {
12
+ return { ...field, type: "datetime" };
13
+ }
14
+ function boolean(field) {
15
+ return { ...field, type: "boolean" };
16
+ }
17
+ function select(field) {
18
+ return { ...field, type: "select" };
19
+ }
20
+ function multiselect(field) {
21
+ return { ...field, type: "multiselect" };
22
+ }
23
+ function image(field) {
24
+ return { ...field, type: "image" };
25
+ }
26
+ function object(field) {
27
+ return { ...field, type: "object" };
28
+ }
29
+ function array(field) {
30
+ return { ...field, type: "array" };
31
+ }
32
+ function oneOf(field) {
33
+ return { ...field, type: "oneof" };
34
+ }
35
+ function defineSchema(schema) {
36
+ return schema;
37
+ }
38
+ var define = defineSchema;
39
+ export {
40
+ array,
41
+ boolean,
42
+ date,
43
+ datetime,
44
+ define,
45
+ defineSchema,
46
+ image,
47
+ multiselect,
48
+ number,
49
+ object,
50
+ oneOf,
51
+ select,
52
+ string
53
+ };
54
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema.ts"],"sourcesContent":["export interface CommonFieldProps {\n id?: string;\n label?: string;\n help?: string;\n type: string;\n default?: any;\n hidden?: boolean;\n deprecated?: boolean;\n}\n\nexport type StringField = CommonFieldProps & {\n type: 'string';\n default?: string;\n translate?: boolean;\n};\n\nexport function string(field: Omit<StringField, 'type'>): StringField {\n return {...field, type: 'string'};\n}\n\nexport type NumberField = CommonFieldProps & {\n type: 'number';\n default?: number;\n};\n\nexport function number(field: Omit<NumberField, 'type'>): NumberField {\n return {...field, type: 'number'};\n}\n\nexport type DateField = CommonFieldProps & {\n type: 'date';\n default?: string;\n};\n\nexport function date(field: Omit<DateField, 'type'>): DateField {\n return {...field, type: 'date'};\n}\n\nexport type DateTimeField = CommonFieldProps & {\n type: 'datetime';\n default?: string;\n};\n\nexport function datetime(field: Omit<DateTimeField, 'type'>): DateTimeField {\n return {...field, type: 'datetime'};\n}\n\nexport type BooleanField = CommonFieldProps & {\n type: 'boolean';\n default?: boolean;\n};\n\nexport function boolean(field: Omit<BooleanField, 'type'>): BooleanField {\n return {...field, type: 'boolean'};\n}\n\nexport type SelectField = CommonFieldProps & {\n type: 'select';\n default?: string;\n options?: {\n values?: Array<{value: string; label?: string}>;\n };\n};\n\nexport function select(field: Omit<SelectField, 'type'>): SelectField {\n return {...field, type: 'select'};\n}\n\nexport type MultiSelectField = Omit<SelectField, 'type'> & {\n type: 'multiselect';\n default?: string[];\n};\n\nexport function multiselect(\n field: Omit<MultiSelectField, 'type'>\n): MultiSelectField {\n return {...field, type: 'multiselect'};\n}\n\nexport type ImageField = CommonFieldProps & {\n type: 'image';\n};\n\nexport function image(field: Omit<ImageField, 'type'>): ImageField {\n return {...field, type: 'image'};\n}\n\nexport type ObjectField = CommonFieldProps & {\n type: 'object';\n fields: FieldWithId[];\n};\n\nexport function object(field: Omit<ObjectField, 'type'>): ObjectField {\n return {...field, type: 'object'};\n}\n\nexport type ArrayField = CommonFieldProps & {\n type: 'array';\n default?: Array<any>;\n preview?: (value: any) => string;\n // NOTE(stevenle): the array field should only accept object values to keep\n // the schemas future-friendly. For example, if we were to accept primatives\n // (e.g. Array<string>) and the developer decides in the future that they\n // need to add extra fields to that array type, they would have to create a\n // new field, create a new schema field, and then perform a db migration to\n // update from the old field type to the new field type. But if we enforce\n // objects here, a developer should technically be able to add fields to the\n // nested field definition without breaking any existing db entries.\n of: ImageField | ObjectField | OneOfField;\n};\n\nexport function array(field: Omit<ArrayField, 'type'>): ArrayField {\n return {...field, type: 'array'};\n}\n\nexport type OneOfField = CommonFieldProps & {\n type: 'oneof';\n types: Array<Schema>;\n};\n\nexport function oneOf(field: Omit<OneOfField, 'type'>): OneOfField {\n return {...field, type: 'oneof'};\n}\n\nexport type Field =\n | StringField\n | NumberField\n | DateField\n | DateTimeField\n | BooleanField\n | SelectField\n | MultiSelectField\n | ImageField\n | ObjectField\n | ArrayField\n | OneOfField;\n\nexport type FieldWithId = Field;\n\nexport interface Schema {\n name: string;\n description?: string;\n fields: Array<FieldWithId>;\n}\n\nexport function defineSchema(schema: Schema): Schema {\n return schema;\n}\n\nexport const define = defineSchema;\n"],"mappings":";AAgBO,SAAS,OAAO,OAA+C;AACpE,SAAO,EAAC,GAAG,OAAO,MAAM,SAAQ;AAClC;AAOO,SAAS,OAAO,OAA+C;AACpE,SAAO,EAAC,GAAG,OAAO,MAAM,SAAQ;AAClC;AAOO,SAAS,KAAK,OAA2C;AAC9D,SAAO,EAAC,GAAG,OAAO,MAAM,OAAM;AAChC;AAOO,SAAS,SAAS,OAAmD;AAC1E,SAAO,EAAC,GAAG,OAAO,MAAM,WAAU;AACpC;AAOO,SAAS,QAAQ,OAAiD;AACvE,SAAO,EAAC,GAAG,OAAO,MAAM,UAAS;AACnC;AAUO,SAAS,OAAO,OAA+C;AACpE,SAAO,EAAC,GAAG,OAAO,MAAM,SAAQ;AAClC;AAOO,SAAS,YACd,OACkB;AAClB,SAAO,EAAC,GAAG,OAAO,MAAM,cAAa;AACvC;AAMO,SAAS,MAAM,OAA6C;AACjE,SAAO,EAAC,GAAG,OAAO,MAAM,QAAO;AACjC;AAOO,SAAS,OAAO,OAA+C;AACpE,SAAO,EAAC,GAAG,OAAO,MAAM,SAAQ;AAClC;AAiBO,SAAS,MAAM,OAA6C;AACjE,SAAO,EAAC,GAAG,OAAO,MAAM,QAAO;AACjC;AAOO,SAAS,MAAM,OAA6C;AACjE,SAAO,EAAC,GAAG,OAAO,MAAM,QAAO;AACjC;AAuBO,SAAS,aAAa,QAAwB;AACnD,SAAO;AACT;AAEO,IAAM,SAAS;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blinkk/root-cms",
3
- "version": "1.0.0-alpha.28",
3
+ "version": "1.0.0-alpha.29",
4
4
  "author": "s@blinkk.com",
5
5
  "license": "MIT",
6
6
  "engines": {
@@ -23,7 +23,7 @@
23
23
  }
24
24
  },
25
25
  "dependencies": {
26
- "@blinkk/root": "1.0.0-alpha.35",
26
+ "@blinkk/root": "1.0.0-alpha.36",
27
27
  "firebase": "^9.13.0"
28
28
  },
29
29
  "devDependencies": {