@caiquecamargo/vite-plugin-netlify-cms 0.0.18 → 0.1.1

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.js CHANGED
@@ -1,6 +1,134 @@
1
+ import {
2
+ authUrl,
3
+ clientId,
4
+ clientSecret,
5
+ tokenUrl
6
+ } from "./chunk-JOUSWMWF.js";
7
+
8
+ // src/oauth/callback.ts
9
+ async function handleOAuthCallback(code) {
10
+ const data = {
11
+ code,
12
+ client_id: clientId,
13
+ client_secret: clientSecret
14
+ };
15
+ try {
16
+ const response = await fetch(tokenUrl, {
17
+ method: "POST",
18
+ headers: {
19
+ "Accept": "application/json",
20
+ "Content-Type": "application/json"
21
+ },
22
+ body: JSON.stringify(data)
23
+ });
24
+ if (!response.ok) {
25
+ throw new Error(`HTTP error! status: ${response.status}`);
26
+ }
27
+ const body = await response.json();
28
+ const content = {
29
+ token: body.access_token,
30
+ provider: "github"
31
+ };
32
+ const script = `
33
+ <script>
34
+ const receiveMessage = (message) => {
35
+ window.opener.postMessage(
36
+ 'authorization:${content.provider}:success:${JSON.stringify(content)}',
37
+ message.origin
38
+ );
39
+
40
+ window.removeEventListener("message", receiveMessage, false);
41
+ }
42
+
43
+ window.addEventListener("message", receiveMessage, false);
44
+
45
+ window.opener.postMessage("authorizing:${content.provider}", "*");
46
+ </script>
47
+ `;
48
+ return {
49
+ statusCode: 200,
50
+ headers: {
51
+ "Content-Type": "text/html"
52
+ },
53
+ body: script
54
+ };
55
+ } catch (err) {
56
+ console.error("OAuth callback error:", err);
57
+ return {
58
+ statusCode: 500,
59
+ headers: {
60
+ "Content-Type": "text/html"
61
+ },
62
+ body: "<html><body><h1>OAuth Error</h1><p>Authentication failed. Please close this window and try again.</p></body></html>"
63
+ };
64
+ }
65
+ }
66
+
67
+ // src/oauth/login.ts
68
+ function handleOAuthLogin() {
69
+ return {
70
+ statusCode: 302,
71
+ headers: {
72
+ Location: authUrl
73
+ },
74
+ body: ""
75
+ };
76
+ }
77
+
78
+ // src/oauth-plugin.ts
79
+ function oauthPlugin(options) {
80
+ const {
81
+ loginRoute = "/oauth",
82
+ callbackRoute = "/oauth/callback",
83
+ disabled = false
84
+ } = options ?? {};
85
+ if (disabled) {
86
+ return {
87
+ name: "vite-plugin-oauth"
88
+ };
89
+ }
90
+ let warningShown = false;
91
+ return {
92
+ name: "vite-plugin-oauth",
93
+ configureServer(server) {
94
+ server.middlewares.use(async (req, res, next) => {
95
+ const url = req.url;
96
+ if (!warningShown) {
97
+ if (!clientId || !clientSecret) {
98
+ console.warn(
99
+ "\x1B[33m\u26A0 OAuth plugin enabled but OAUTH_GITHUB_CLIENT_ID or OAUTH_GITHUB_CLIENT_SECRET environment variables are not set.\x1B[0m"
100
+ );
101
+ }
102
+ warningShown = true;
103
+ }
104
+ if (url === loginRoute) {
105
+ const result = handleOAuthLogin();
106
+ res.writeHead(result.statusCode, result.headers);
107
+ res.end(result.body);
108
+ return;
109
+ }
110
+ if (url?.startsWith(callbackRoute)) {
111
+ const urlParams = new URLSearchParams(url.split("?")[1]);
112
+ const code = urlParams.get("code");
113
+ if (!code) {
114
+ res.writeHead(400, { "Content-Type": "text/html" });
115
+ res.end("<html><body><h1>Error</h1><p>No code provided</p></body></html>");
116
+ return;
117
+ }
118
+ const result = await handleOAuthCallback(code);
119
+ res.writeHead(result.statusCode, result.headers);
120
+ res.end(result.body);
121
+ return;
122
+ }
123
+ next();
124
+ });
125
+ }
126
+ };
127
+ }
128
+
1
129
  // src/plugin.ts
2
- import { mkdir, readdir, writeFile } from "node:fs/promises";
3
- import path from "node:path";
130
+ import { mkdir, readdir, writeFile } from "fs/promises";
131
+ import path from "path";
4
132
  import { loadConfigFromFile } from "vite";
5
133
  import YAML from "yaml";
6
134
 
@@ -15,8 +143,7 @@ var index_template_default = `<!DOCTYPE html>
15
143
  {{ identity }}
16
144
  </head>
17
145
  <body>
18
- <!-- Include the script that builds the page and powers Decap CMS -->
19
- <script src="https://unpkg.com/decap-cms@^3.0.0/dist/decap-cms.js"></script>
146
+ {{ script }}
20
147
  </body>
21
148
  </html>`;
22
149
 
@@ -47,6 +174,12 @@ function defineColorWidget(widget) {
47
174
  ...widget
48
175
  };
49
176
  }
177
+ function defineComputeWidget(widget) {
178
+ return {
179
+ widget: "compute",
180
+ ...widget
181
+ };
182
+ }
50
183
  function defineDateTimeWidget(widget) {
51
184
  return { widget: "datetime", ...widget };
52
185
  }
@@ -68,6 +201,12 @@ function defineImageWidget(widget) {
68
201
  ...widget
69
202
  };
70
203
  }
204
+ function defineKeyValueWidget(widget) {
205
+ return {
206
+ widget: "keyvalue",
207
+ ...widget
208
+ };
209
+ }
71
210
  function defineListWidget(widget) {
72
211
  return {
73
212
  widget: "list",
@@ -119,6 +258,18 @@ function defineMarkdownWidget(widget) {
119
258
  ...widget
120
259
  };
121
260
  }
261
+ function defineRichTextWidget(widget) {
262
+ return {
263
+ widget: "richtext",
264
+ ...widget
265
+ };
266
+ }
267
+ function defineUuidWidget(widget) {
268
+ return {
269
+ widget: "uuid",
270
+ ...widget
271
+ };
272
+ }
122
273
  async function createFolderIfNotExists(path2) {
123
274
  try {
124
275
  await readdir(path2);
@@ -159,10 +310,11 @@ async function getConfigFile(root, configFile) {
159
310
  throw new Error(`Config file not found`);
160
311
  }
161
312
  }
162
- function createIndex(title, iconUrl, useIdentityWidget) {
313
+ function createIndex(title, iconUrl, useIdentityWidget, type = "sveltia") {
163
314
  const icon = iconUrl ? `<link rel="icon" type="image/svg+xml" href="${iconUrl}" />` : "";
164
315
  const identity = useIdentityWidget ? `<script src="https://identity.netlify.com/v1/netlify-identity-widget.js"></script>` : "";
165
- const document = index_template_default.replace("{{ title }}", title).replace("{{ icon }}", icon).replace("{{ identity }}", identity);
316
+ const script = type === "decap" ? `<script src="https://unpkg.com/decap-cms@^3.0.0/dist/decap-cms.js"></script>` : `<script src="https://unpkg.com/@sveltia/cms/dist/sveltia-cms.js"></script>`;
317
+ const document = index_template_default.replace("{{ script }}", script).replace("{{ title }}", title).replace("{{ icon }}", icon).replace("{{ identity }}", identity);
166
318
  return document;
167
319
  }
168
320
  async function createConfig(root, entry) {
@@ -173,7 +325,8 @@ async function createConfig(root, entry) {
173
325
  createIndexHTML = true,
174
326
  title = "Admin",
175
327
  iconUrl = "https://decapcms.org/img/decap-logo.svg",
176
- useIdentityWidget = true
328
+ useIdentityWidget = false,
329
+ type = "sveltia"
177
330
  } = entry ?? {};
178
331
  const resolvedConfig = config ?? await getConfigFile(root, configFile);
179
332
  await createFolderIfNotExists(path.join(root, saveFolder));
@@ -181,7 +334,7 @@ async function createConfig(root, entry) {
181
334
  await saveConfig(document, path.join(root, saveFolder, "config.yml"));
182
335
  if (!createIndexHTML)
183
336
  return;
184
- const indexHTML = createIndex(title, iconUrl, useIdentityWidget);
337
+ const indexHTML = createIndex(title, iconUrl, useIdentityWidget, type);
185
338
  await saveConfig(indexHTML, path.join(root, saveFolder, "index.html"));
186
339
  }
187
340
  async function plugin_default(entry) {
@@ -210,14 +363,49 @@ async function plugin_default(entry) {
210
363
  };
211
364
  }
212
365
 
366
+ // src/astro-oauth-integration.ts
367
+ var defaultOptions = {
368
+ loginRoute: "/oauth",
369
+ callbackRoute: "/oauth/callback",
370
+ disabled: false
371
+ };
372
+ function githubOAuthIntegration(options) {
373
+ const { loginRoute, callbackRoute, disabled } = { ...defaultOptions, ...options };
374
+ if (!loginRoute?.startsWith("/") || !callbackRoute?.startsWith("/")) {
375
+ throw new Error('`loginRoute` and `callbackRoute` options must start with "/"');
376
+ }
377
+ return {
378
+ name: "github-oauth-integration",
379
+ hooks: {
380
+ "astro:config:setup": async ({ injectRoute }) => {
381
+ if (disabled) {
382
+ return;
383
+ }
384
+ injectRoute({
385
+ pattern: loginRoute,
386
+ entrypoint: "@caiquecamargo/vite-plugin-netlify-cms/src/oauth/astro-login.js",
387
+ prerender: false
388
+ });
389
+ injectRoute({
390
+ pattern: callbackRoute,
391
+ entrypoint: "@caiquecamargo/vite-plugin-netlify-cms/src/oauth/astro-callback.js",
392
+ prerender: false
393
+ });
394
+ }
395
+ }
396
+ };
397
+ }
398
+
213
399
  // index.ts
214
- var vite_plugin_netlify_cms_default = plugin_default;
400
+ var index_default = plugin_default;
215
401
  export {
402
+ plugin_default as cmsPlugin,
216
403
  createConfig,
217
- vite_plugin_netlify_cms_default as default,
404
+ index_default as default,
218
405
  defineBooleanWidget,
219
406
  defineCodeWidget,
220
407
  defineColorWidget,
408
+ defineComputeWidget,
221
409
  defineConfig,
222
410
  defineDateTimeWidget,
223
411
  defineFileCollection,
@@ -226,14 +414,19 @@ export {
226
414
  defineFolderCollection,
227
415
  defineHiddenWidget,
228
416
  defineImageWidget,
417
+ defineKeyValueWidget,
229
418
  defineListWidget,
230
419
  defineMapWidget,
231
420
  defineMarkdownWidget,
232
421
  defineNumberWidget,
233
422
  defineObjectWidget,
234
423
  defineRelationWidget,
424
+ defineRichTextWidget,
235
425
  defineSelectWidget,
236
426
  defineStringWidget,
237
- defineTextWidget
427
+ defineTextWidget,
428
+ defineUuidWidget,
429
+ githubOAuthIntegration,
430
+ oauthPlugin
238
431
  };
239
432
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts","../src/index.template.ts","../index.ts"],"sourcesContent":["import { mkdir, readdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Plugin } from 'vite';\nimport { loadConfigFromFile } from 'vite';\nimport YAML from 'yaml';\nimport indexHTMLTemplate from './index.template';\nimport type {\n BooleanWidget,\n CodeWidget,\n ColorWidget,\n DateTimeWidget,\n FileCollection,\n FileCollectionEntry,\n FileWidget,\n FolderCollection,\n HiddenWidget,\n ImageWidget,\n ListWidget,\n MapWidget,\n MarkdownWidget,\n NetlifyCMSConfig,\n NumberWidget,\n ObjectWidget,\n RelationWidget,\n SelectWidget,\n StringWidget,\n TextWidget,\n} from './types';\n\nexport function defineConfig(config: NetlifyCMSConfig): NetlifyCMSConfig {\n return config;\n}\nexport function defineFolderCollection(collection: FolderCollection) {\n return collection;\n}\nexport const defineFileCollection = (collection: FileCollection) => collection;\nexport const defineFileCollectionEntry = (collection: FileCollectionEntry) => collection;\nexport function defineBooleanWidget(widget: Omit<BooleanWidget, 'widget'>): BooleanWidget {\n return {\n widget: 'boolean',\n ...widget,\n };\n}\nexport function defineCodeWidget(widget: Omit<CodeWidget, 'widget'>): CodeWidget {\n return {\n widget: 'code',\n ...widget,\n };\n}\nexport function defineColorWidget(widget: Omit<ColorWidget, 'widget'>): ColorWidget {\n return {\n widget: 'color',\n ...widget,\n };\n}\nexport function defineDateTimeWidget(widget: Omit<DateTimeWidget, 'widget'>): DateTimeWidget {\n return { widget: 'datetime', ...widget };\n}\nexport function defineHiddenWidget(widget: Omit<HiddenWidget, 'widget'>): HiddenWidget {\n return {\n widget: 'hidden',\n ...widget,\n };\n}\nexport function defineFileWidget(widget: Omit<FileWidget, 'widget'>): FileWidget {\n return {\n widget: 'file',\n ...widget,\n };\n}\nexport function defineImageWidget(widget: Omit<ImageWidget, 'widget'>): ImageWidget {\n return {\n widget: 'image',\n ...widget,\n };\n}\nexport function defineListWidget(widget: Omit<ListWidget, 'widget'>): ListWidget {\n return {\n widget: 'list',\n ...widget,\n };\n}\nexport function defineMapWidget(widget: Omit<MapWidget, 'widget'>): MapWidget {\n return {\n widget: 'map',\n ...widget,\n };\n}\nexport function defineNumberWidget(widget: Omit<NumberWidget, 'widget'>): NumberWidget {\n return {\n widget: 'number',\n ...widget,\n };\n}\nexport function defineObjectWidget(widget: Omit<ObjectWidget, 'widget'>): ObjectWidget {\n return {\n widget: 'object',\n ...widget,\n };\n}\nexport function defineRelationWidget(widget: Omit<RelationWidget, 'widget'>): RelationWidget {\n return { widget: 'relation', ...widget };\n}\nexport function defineSelectWidget(widget: Omit<SelectWidget, 'widget'>): SelectWidget {\n return {\n widget: 'select',\n ...widget,\n };\n}\nexport function defineStringWidget(widget: Omit<StringWidget, 'widget'>): StringWidget {\n return {\n widget: 'string',\n ...widget,\n };\n}\nexport function defineTextWidget(widget: Omit<TextWidget, 'widget'>): TextWidget {\n return {\n widget: 'text',\n ...widget,\n };\n}\nexport function defineMarkdownWidget(widget: Omit<MarkdownWidget, 'widget'>): MarkdownWidget {\n return {\n widget: 'markdown',\n ...widget,\n };\n}\n\nexport interface NetlifyCMSEntry {\n /**\n * Name of config file\n *\n * @default cms.config\n */\n configFile?: string;\n\n /**\n * Netlify CMS config object\n */\n config?: NetlifyCMSConfig;\n\n /**\n * Folder to save config file\n *\n * @default ./public/admin\n */\n saveFolder?: string;\n\n /**\n * If has to create index.html file in the save folder\n */\n createIndexHTML?: boolean;\n\n /**\n * Title of the admin page\n *\n * @default Admin\n */\n title?: string;\n\n /**\n * Icon URL of the admin page\n *\n * @default https://decapcms.org/img/decap-logo.svg\n */\n iconUrl?: string;\n\n /**\n * If has to use identity widget\n *\n * @default true\n */\n useIdentityWidget?: boolean;\n}\n\nasync function createFolderIfNotExists(path: string) {\n try {\n await readdir(path);\n }\n catch {\n await mkdir(path, { recursive: true });\n }\n}\n\nasync function saveConfig(document: string, pathTo: string) {\n await writeFile(pathTo, document);\n}\n\nfunction resolveConfigFilePath(configFile: string) {\n const _path = configFile.startsWith('.') ? configFile.slice(2) : configFile;\n\n if (!_path)\n return configFile;\n if (['ts', 'js', 'cjs', 'mjs'].some(ext => _path.includes(ext)))\n return _path.split('.').slice(0, -1).join('.');\n\n return _path;\n}\n\nasync function getConfigFile(root: string, configFile: string): Promise<NetlifyCMSConfig> {\n try {\n const files = await readdir(root);\n const configPath = resolveConfigFilePath(configFile);\n\n if (configPath.includes('/')) {\n const [folder, file] = configPath.split('/');\n return await getConfigFile(path.join(root, folder), file);\n }\n\n const file = files.find(file => file.startsWith(configPath));\n\n if (!file)\n throw new Error(`Config file not found`);\n\n const { config }\n = (await loadConfigFromFile(\n { command: 'build', mode: '' },\n path.join(root, file),\n )) ?? {};\n\n if (!config)\n throw new Error(`Config file not found`);\n\n return config as NetlifyCMSConfig;\n }\n catch {\n throw new Error(`Config file not found`);\n }\n}\n\nfunction createIndex(title: string, iconUrl: string, useIdentityWidget: boolean) {\n const icon = iconUrl ? `<link rel=\"icon\" type=\"image/svg+xml\" href=\"${iconUrl}\" />` : '';\n const identity = useIdentityWidget ? `<script src=\"https://identity.netlify.com/v1/netlify-identity-widget.js\"></script>` : '';\n\n const document = indexHTMLTemplate\n .replace('{{ title }}', title)\n .replace('{{ icon }}', icon)\n .replace('{{ identity }}', identity);\n\n return document;\n}\n\nexport async function createConfig(root: string, entry?: NetlifyCMSEntry) {\n const {\n configFile = 'cms.config',\n config,\n saveFolder = './public/admin',\n createIndexHTML = true,\n title = 'Admin',\n iconUrl = 'https://decapcms.org/img/decap-logo.svg',\n useIdentityWidget = true,\n } = entry ?? {};\n\n const resolvedConfig = config ?? (await getConfigFile(root, configFile));\n await createFolderIfNotExists(path.join(root, saveFolder));\n\n const document = YAML.stringify(resolvedConfig);\n await saveConfig(document, path.join(root, saveFolder, 'config.yml'));\n\n if (!createIndexHTML)\n return;\n\n const indexHTML = createIndex(title, iconUrl, useIdentityWidget);\n await saveConfig(indexHTML, path.join(root, saveFolder, 'index.html'));\n}\n\nexport default async function (entry?: NetlifyCMSEntry): Promise<Plugin> {\n let root = '';\n\n return {\n name: 'vite-plugin-netlify-cms',\n configResolved: (config) => {\n root = config.root;\n },\n buildStart: async () => {\n try {\n await createConfig(root, entry);\n }\n catch (error) {\n console.log(error);\n }\n },\n handleHotUpdate: async ({ file }) => {\n if (file.includes(entry?.configFile ?? 'cms.config')) {\n try {\n await createConfig(root, entry);\n }\n catch (error) {\n console.log(error);\n }\n }\n },\n };\n}\n","export default `<!DOCTYPE html>\n<html>\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>{{ title }}</title>\n {{ icon }}\n {{ identity }}\n </head>\n <body>\n <!-- Include the script that builds the page and powers Decap CMS -->\n <script src=\"https://unpkg.com/decap-cms@^3.0.0/dist/decap-cms.js\"></script>\n </body>\n</html>`\n","export * from \"./src/plugin.js\";\nexport * from \"./src/types.js\";\nimport plugin from \"./src/plugin.js\";\n\nexport default plugin;\n"],"mappings":"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","names":["path","file"]}
1
+ {"version":3,"sources":["../src/oauth/callback.ts","../src/oauth/login.ts","../src/oauth-plugin.ts","../src/plugin.ts","../src/index.template.ts","../src/astro-oauth-integration.ts","../index.ts"],"sourcesContent":["import { clientId, clientSecret, tokenUrl } from './config';\n\n/**\n * OAuth callback handler - exchanges code for access token\n */\nexport async function handleOAuthCallback(code: string) {\n const data = {\n code,\n client_id: clientId,\n client_secret: clientSecret,\n };\n\n try {\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const body = await response.json();\n\n const content = {\n token: body.access_token,\n provider: 'github',\n };\n\n // Return HTML with postMessage script to communicate with CMS\n const script = `\n <script>\n const receiveMessage = (message) => {\n window.opener.postMessage(\n 'authorization:${content.provider}:success:${JSON.stringify(content)}',\n message.origin\n );\n\n window.removeEventListener(\"message\", receiveMessage, false);\n }\n\n window.addEventListener(\"message\", receiveMessage, false);\n\n window.opener.postMessage(\"authorizing:${content.provider}\", \"*\");\n </script>\n `;\n\n return {\n statusCode: 200,\n headers: {\n 'Content-Type': 'text/html',\n },\n body: script,\n };\n }\n catch (err) {\n console.error('OAuth callback error:', err);\n return {\n statusCode: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n body: '<html><body><h1>OAuth Error</h1><p>Authentication failed. Please close this window and try again.</p></body></html>',\n };\n }\n}\n","import { authUrl } from './config';\n\n/**\n * OAuth login handler - redirects to GitHub authorization\n */\nexport function handleOAuthLogin() {\n return {\n statusCode: 302,\n headers: {\n Location: authUrl,\n },\n body: '',\n };\n}\n","import type { Plugin } from 'vite';\nimport { handleOAuthCallback } from './oauth/callback';\nimport { clientId, clientSecret } from './oauth/config';\nimport { handleOAuthLogin } from './oauth/login';\n\nexport interface OAuthPluginOptions {\n /**\n * OAuth login route\n * @default '/oauth'\n */\n loginRoute?: string;\n\n /**\n * OAuth callback route\n * @default '/oauth/callback'\n */\n callbackRoute?: string;\n\n /**\n * Disable OAuth plugin\n * @default false\n */\n disabled?: boolean;\n}\n\n/**\n * Vite plugin for OAuth authentication routes\n * Adds /oauth and /oauth/callback routes for GitHub authentication\n */\nexport default function oauthPlugin(options?: OAuthPluginOptions): Plugin {\n const {\n loginRoute = '/oauth',\n callbackRoute = '/oauth/callback',\n disabled = false,\n } = options ?? {};\n\n if (disabled) {\n return {\n name: 'vite-plugin-oauth',\n };\n }\n\n let warningShown = false;\n\n return {\n name: 'vite-plugin-oauth',\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n const url = req.url;\n\n // Show warning once if environment variables are not set\n if (!warningShown) {\n if (!clientId || !clientSecret) {\n console.warn(\n '\\x1B[33m⚠ OAuth plugin enabled but OAUTH_GITHUB_CLIENT_ID or OAUTH_GITHUB_CLIENT_SECRET environment variables are not set.\\x1B[0m',\n );\n }\n warningShown = true;\n }\n\n // Handle OAuth login route\n if (url === loginRoute) {\n const result = handleOAuthLogin();\n res.writeHead(result.statusCode, result.headers);\n res.end(result.body);\n return;\n }\n\n // Handle OAuth callback route\n if (url?.startsWith(callbackRoute)) {\n const urlParams = new URLSearchParams(url.split('?')[1]);\n const code = urlParams.get('code');\n\n if (!code) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end('<html><body><h1>Error</h1><p>No code provided</p></body></html>');\n return;\n }\n\n const result = await handleOAuthCallback(code);\n res.writeHead(result.statusCode, result.headers);\n res.end(result.body);\n return;\n }\n\n next();\n });\n },\n };\n}\n","import type { Plugin } from 'vite';\nimport type {\n BooleanWidget,\n CodeWidget,\n ColorWidget,\n ComputeWidget,\n DateTimeWidget,\n FileCollection,\n FileCollectionEntry,\n FileWidget,\n FolderCollection,\n HiddenWidget,\n ImageWidget,\n KeyValueWidget,\n ListWidget,\n MapWidget,\n MarkdownWidget,\n NetlifyCMSConfig,\n NumberWidget,\n ObjectWidget,\n RelationWidget,\n RichTextWidget,\n SelectWidget,\n StringWidget,\n TextWidget,\n UuidWidget,\n} from './types';\nimport { mkdir, readdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { loadConfigFromFile } from 'vite';\nimport YAML from 'yaml';\nimport indexHTMLTemplate from './index.template';\n\nexport function defineConfig(config: NetlifyCMSConfig): NetlifyCMSConfig {\n return config;\n}\nexport function defineFolderCollection(collection: FolderCollection) {\n return collection;\n}\nexport const defineFileCollection = (collection: FileCollection) => collection;\nexport const defineFileCollectionEntry = (collection: FileCollectionEntry) => collection;\nexport function defineBooleanWidget(widget: Omit<BooleanWidget, 'widget'>): BooleanWidget {\n return {\n widget: 'boolean',\n ...widget,\n };\n}\nexport function defineCodeWidget(widget: Omit<CodeWidget, 'widget'>): CodeWidget {\n return {\n widget: 'code',\n ...widget,\n };\n}\nexport function defineColorWidget(widget: Omit<ColorWidget, 'widget'>): ColorWidget {\n return {\n widget: 'color',\n ...widget,\n };\n}\nexport function defineComputeWidget(widget: Omit<ComputeWidget, 'widget'>): ComputeWidget {\n return {\n widget: 'compute',\n ...widget,\n };\n}\nexport function defineDateTimeWidget(widget: Omit<DateTimeWidget, 'widget'>): DateTimeWidget {\n return { widget: 'datetime', ...widget };\n}\nexport function defineHiddenWidget(widget: Omit<HiddenWidget, 'widget'>): HiddenWidget {\n return {\n widget: 'hidden',\n ...widget,\n };\n}\nexport function defineFileWidget(widget: Omit<FileWidget, 'widget'>): FileWidget {\n return {\n widget: 'file',\n ...widget,\n };\n}\nexport function defineImageWidget(widget: Omit<ImageWidget, 'widget'>): ImageWidget {\n return {\n widget: 'image',\n ...widget,\n };\n}\nexport function defineKeyValueWidget(widget: Omit<KeyValueWidget, 'widget'>): KeyValueWidget {\n return {\n widget: 'keyvalue',\n ...widget,\n };\n}\nexport function defineListWidget(widget: Omit<ListWidget, 'widget'>): ListWidget {\n return {\n widget: 'list',\n ...widget,\n };\n}\nexport function defineMapWidget(widget: Omit<MapWidget, 'widget'>): MapWidget {\n return {\n widget: 'map',\n ...widget,\n };\n}\nexport function defineNumberWidget(widget: Omit<NumberWidget, 'widget'>): NumberWidget {\n return {\n widget: 'number',\n ...widget,\n };\n}\nexport function defineObjectWidget(widget: Omit<ObjectWidget, 'widget'>): ObjectWidget {\n return {\n widget: 'object',\n ...widget,\n };\n}\nexport function defineRelationWidget(widget: Omit<RelationWidget, 'widget'>): RelationWidget {\n return { widget: 'relation', ...widget };\n}\nexport function defineSelectWidget(widget: Omit<SelectWidget, 'widget'>): SelectWidget {\n return {\n widget: 'select',\n ...widget,\n };\n}\nexport function defineStringWidget(widget: Omit<StringWidget, 'widget'>): StringWidget {\n return {\n widget: 'string',\n ...widget,\n };\n}\nexport function defineTextWidget(widget: Omit<TextWidget, 'widget'>): TextWidget {\n return {\n widget: 'text',\n ...widget,\n };\n}\nexport function defineMarkdownWidget(widget: Omit<MarkdownWidget, 'widget'>): MarkdownWidget {\n return {\n widget: 'markdown',\n ...widget,\n };\n}\nexport function defineRichTextWidget(widget: Omit<RichTextWidget, 'widget'>): RichTextWidget {\n return {\n widget: 'richtext',\n ...widget,\n };\n}\nexport function defineUuidWidget(widget: Omit<UuidWidget, 'widget'>): UuidWidget {\n return {\n widget: 'uuid',\n ...widget,\n };\n}\n\nexport interface NetlifyCMSEntry {\n /**\n * Name of config file\n *\n * @default cms.config\n */\n configFile?: string;\n\n /**\n * Netlify CMS config object\n */\n config?: NetlifyCMSConfig;\n\n /**\n * Folder to save config file\n *\n * @default ./public/admin\n */\n saveFolder?: string;\n\n /**\n * If has to create index.html file in the save folder\n */\n createIndexHTML?: boolean;\n\n /**\n * Title of the admin page\n *\n * @default Admin\n */\n title?: string;\n\n /**\n * Icon URL of the admin page\n *\n * @default https://decapcms.org/img/decap-logo.svg\n */\n iconUrl?: string;\n\n /**\n * If has to use identity widget\n *\n * @default true\n */\n useIdentityWidget?: boolean;\n\n /**\n * Type of CMS to generate config for\n *\n * @default 'sveltia'\n */\n type?: 'decap' | 'sveltia';\n}\n\nasync function createFolderIfNotExists(path: string) {\n try {\n await readdir(path);\n }\n catch {\n await mkdir(path, { recursive: true });\n }\n}\n\nasync function saveConfig(document: string, pathTo: string) {\n await writeFile(pathTo, document);\n}\n\nfunction resolveConfigFilePath(configFile: string) {\n const _path = configFile.startsWith('.') ? configFile.slice(2) : configFile;\n\n if (!_path)\n return configFile;\n if (['ts', 'js', 'cjs', 'mjs'].some(ext => _path.includes(ext)))\n return _path.split('.').slice(0, -1).join('.');\n\n return _path;\n}\n\nasync function getConfigFile(root: string, configFile: string): Promise<NetlifyCMSConfig> {\n try {\n const files = await readdir(root);\n const configPath = resolveConfigFilePath(configFile);\n\n if (configPath.includes('/')) {\n const [folder, file] = configPath.split('/');\n return await getConfigFile(path.join(root, folder), file);\n }\n\n const file = files.find(file => file.startsWith(configPath));\n\n if (!file)\n throw new Error(`Config file not found`);\n\n const { config }\n = (await loadConfigFromFile(\n { command: 'build', mode: '' },\n path.join(root, file),\n )) ?? {};\n\n if (!config)\n throw new Error(`Config file not found`);\n\n return config as NetlifyCMSConfig;\n }\n catch {\n throw new Error(`Config file not found`);\n }\n}\n\nfunction createIndex(title: string, iconUrl: string, useIdentityWidget: boolean, type: 'decap' | 'sveltia' = 'sveltia') {\n const icon = iconUrl ? `<link rel=\"icon\" type=\"image/svg+xml\" href=\"${iconUrl}\" />` : '';\n const identity = useIdentityWidget ? `<script src=\"https://identity.netlify.com/v1/netlify-identity-widget.js\"></script>` : '';\n\n const script = type === 'decap'\n ? `<script src=\"https://unpkg.com/decap-cms@^3.0.0/dist/decap-cms.js\"></script>`\n : `<script src=\"https://unpkg.com/@sveltia/cms/dist/sveltia-cms.js\"></script>`;\n\n const document = indexHTMLTemplate\n .replace('{{ script }}', script)\n .replace('{{ title }}', title)\n .replace('{{ icon }}', icon)\n .replace('{{ identity }}', identity);\n\n return document;\n}\n\nexport async function createConfig(root: string, entry?: NetlifyCMSEntry) {\n const {\n configFile = 'cms.config',\n config,\n saveFolder = './public/admin',\n createIndexHTML = true,\n title = 'Admin',\n iconUrl = 'https://decapcms.org/img/decap-logo.svg',\n useIdentityWidget = false,\n type = 'sveltia',\n } = entry ?? {};\n\n const resolvedConfig = config ?? (await getConfigFile(root, configFile));\n await createFolderIfNotExists(path.join(root, saveFolder));\n\n const document = YAML.stringify(resolvedConfig);\n await saveConfig(document, path.join(root, saveFolder, 'config.yml'));\n\n if (!createIndexHTML)\n return;\n\n const indexHTML = createIndex(title, iconUrl, useIdentityWidget, type);\n await saveConfig(indexHTML, path.join(root, saveFolder, 'index.html'));\n}\n\nexport default async function (entry?: NetlifyCMSEntry): Promise<Plugin> {\n let root = '';\n\n return {\n name: 'vite-plugin-netlify-cms',\n configResolved: (config) => {\n root = config.root;\n },\n buildStart: async () => {\n try {\n await createConfig(root, entry);\n }\n catch (error) {\n console.log(error);\n }\n },\n handleHotUpdate: async ({ file }) => {\n if (file.includes(entry?.configFile ?? 'cms.config')) {\n try {\n await createConfig(root, entry);\n }\n catch (error) {\n console.log(error);\n }\n }\n },\n };\n}\n","export default `<!DOCTYPE html>\n<html>\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>{{ title }}</title>\n {{ icon }}\n {{ identity }}\n </head>\n <body>\n {{ script }}\n </body>\n</html>`;\n","export interface AstroOAuthOptions {\n /**\n * OAuth login route\n * @default '/oauth'\n */\n loginRoute?: string;\n\n /**\n * OAuth callback route\n * @default '/oauth/callback'\n */\n callbackRoute?: string;\n\n /**\n * Disable OAuth integration\n * @default false\n */\n disabled?: boolean;\n}\n\nconst defaultOptions: AstroOAuthOptions = {\n loginRoute: '/oauth',\n callbackRoute: '/oauth/callback',\n disabled: false,\n};\n\n/**\n * Astro integration for OAuth authentication routes\n * Adds /oauth and /oauth/callback routes for GitHub authentication\n *\n * @example\n * ```ts\n * import { defineConfig } from 'astro/config';\n * import { githubOAuthIntegration } from 'vite-plugin-netlify-cms';\n *\n * export default defineConfig({\n * integrations: [githubOAuthIntegration()],\n * output: 'server', // or 'hybrid'\n * });\n * ```\n */\nexport function githubOAuthIntegration(options?: AstroOAuthOptions): any {\n const { loginRoute, callbackRoute, disabled } = { ...defaultOptions, ...options };\n\n if (!loginRoute?.startsWith('/') || !callbackRoute?.startsWith('/')) {\n throw new Error('`loginRoute` and `callbackRoute` options must start with \"/\"');\n }\n\n return {\n name: 'github-oauth-integration',\n hooks: {\n 'astro:config:setup': async ({ injectRoute }: any) => {\n if (disabled) {\n return;\n }\n\n // Inject OAuth login route\n injectRoute({\n pattern: loginRoute,\n entrypoint: '@caiquecamargo/vite-plugin-netlify-cms/src/oauth/astro-login.js',\n prerender: false,\n });\n\n // Inject OAuth callback route\n injectRoute({\n pattern: callbackRoute,\n entrypoint: '@caiquecamargo/vite-plugin-netlify-cms/src/oauth/astro-callback.js',\n prerender: false,\n });\n },\n },\n };\n}\n","import oauthPlugin from './src/oauth-plugin.js';\nimport cmsPlugin from './src/plugin.js';\n\nexport * from './src/astro-oauth-integration.js';\nexport * from './src/oauth-plugin.js';\nexport * from './src/plugin.js';\nexport * from './src/types.js';\n\nexport { cmsPlugin, oauthPlugin };\nexport default cmsPlugin;\n"],"mappings":"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","names":["path","file"]}
@@ -0,0 +1,4 @@
1
+ declare const prerender = false;
2
+ declare function GET({ url, redirect }: any): Promise<any>;
3
+
4
+ export { GET, prerender };
@@ -0,0 +1,67 @@
1
+ import {
2
+ clientId,
3
+ clientSecret,
4
+ tokenUrl
5
+ } from "../../chunk-JOUSWMWF.js";
6
+
7
+ // src/oauth/astro-callback.ts
8
+ var prerender = false;
9
+ async function GET({ url, redirect }) {
10
+ const code = url.searchParams.get("code");
11
+ if (!code) {
12
+ return new Response("<html><body><h1>Error</h1><p>No code provided</p></body></html>", {
13
+ status: 400,
14
+ headers: { "Content-Type": "text/html" }
15
+ });
16
+ }
17
+ const data = {
18
+ code,
19
+ client_id: clientId,
20
+ client_secret: clientSecret
21
+ };
22
+ try {
23
+ const response = await fetch(tokenUrl, {
24
+ method: "POST",
25
+ headers: {
26
+ "Accept": "application/json",
27
+ "Content-Type": "application/json"
28
+ },
29
+ body: JSON.stringify(data)
30
+ });
31
+ if (!response.ok) {
32
+ throw new Error(`HTTP error! status: ${response.status}`);
33
+ }
34
+ const body = await response.json();
35
+ const content = {
36
+ token: body.access_token,
37
+ provider: "github"
38
+ };
39
+ const script = `
40
+ <script>
41
+ const receiveMessage = (message) => {
42
+ window.opener.postMessage(
43
+ 'authorization:${content.provider}:success:${JSON.stringify(content)}',
44
+ message.origin
45
+ );
46
+
47
+ window.removeEventListener("message", receiveMessage, false);
48
+ }
49
+
50
+ window.addEventListener("message", receiveMessage, false);
51
+
52
+ window.opener.postMessage("authorizing:${content.provider}", "*");
53
+ </script>
54
+ `;
55
+ return new Response(script, {
56
+ headers: { "Content-Type": "text/html" }
57
+ });
58
+ } catch (err) {
59
+ console.error("OAuth callback error:", err);
60
+ return redirect("/?error=oauth_failed");
61
+ }
62
+ }
63
+ export {
64
+ GET,
65
+ prerender
66
+ };
67
+ //# sourceMappingURL=astro-callback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/oauth/astro-callback.ts"],"sourcesContent":["import { clientId, clientSecret, tokenUrl } from './config';\n\nexport const prerender = false;\n\nexport async function GET({ url, redirect }: any) {\n const code = url.searchParams.get('code');\n\n if (!code) {\n return new Response('<html><body><h1>Error</h1><p>No code provided</p></body></html>', {\n status: 400,\n headers: { 'Content-Type': 'text/html' },\n });\n }\n\n const data = {\n code,\n client_id: clientId,\n client_secret: clientSecret,\n };\n\n try {\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const body = await response.json();\n\n const content = {\n token: body.access_token,\n provider: 'github',\n };\n\n // Return HTML with postMessage script to communicate with CMS\n const script = `\n <script>\n const receiveMessage = (message) => {\n window.opener.postMessage(\n 'authorization:${content.provider}:success:${JSON.stringify(content)}',\n message.origin\n );\n\n window.removeEventListener(\"message\", receiveMessage, false);\n }\n\n window.addEventListener(\"message\", receiveMessage, false);\n\n window.opener.postMessage(\"authorizing:${content.provider}\", \"*\");\n </script>\n `;\n\n return new Response(script, {\n headers: { 'Content-Type': 'text/html' },\n });\n }\n catch (err) {\n console.error('OAuth callback error:', err);\n return redirect('/?error=oauth_failed');\n }\n}\n"],"mappings":";;;;;;;AAEO,IAAM,YAAY;AAEzB,eAAsB,IAAI,EAAE,KAAK,SAAS,GAAQ;AAChD,QAAM,OAAO,IAAI,aAAa,IAAI,MAAM;AAExC,MAAI,CAAC,MAAM;AACT,WAAO,IAAI,SAAS,mEAAmE;AAAA,MACrF,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,YAAY;AAAA,IACzC,CAAC;AAAA,EACH;AAEA,QAAM,OAAO;AAAA,IACX;AAAA,IACA,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAEA,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,UAAU;AAAA,MACrC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,UAAU;AAAA,QACV,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAAA,IAC1D;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,UAAM,UAAU;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,UAAU;AAAA,IACZ;AAGA,UAAM,SAAS;AAAA;AAAA;AAAA;AAAA,6BAIU,QAAQ,QAAQ,YAAY,KAAK,UAAU,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iDAS/B,QAAQ,QAAQ;AAAA;AAAA;AAI7D,WAAO,IAAI,SAAS,QAAQ;AAAA,MAC1B,SAAS,EAAE,gBAAgB,YAAY;AAAA,IACzC,CAAC;AAAA,EACH,SACO,KAAK;AACV,YAAQ,MAAM,yBAAyB,GAAG;AAC1C,WAAO,SAAS,sBAAsB;AAAA,EACxC;AACF;","names":[]}
@@ -0,0 +1,4 @@
1
+ declare const prerender = false;
2
+ declare function GET({ redirect }: any): any;
3
+
4
+ export { GET, prerender };
@@ -0,0 +1,14 @@
1
+ import {
2
+ authUrl
3
+ } from "../../chunk-JOUSWMWF.js";
4
+
5
+ // src/oauth/astro-login.ts
6
+ var prerender = false;
7
+ function GET({ redirect }) {
8
+ return redirect(authUrl);
9
+ }
10
+ export {
11
+ GET,
12
+ prerender
13
+ };
14
+ //# sourceMappingURL=astro-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/oauth/astro-login.ts"],"sourcesContent":["import { authUrl } from './config';\n\nexport const prerender = false;\n\nexport function GET({ redirect }: any) {\n return redirect(authUrl);\n}\n"],"mappings":";;;;;AAEO,IAAM,YAAY;AAElB,SAAS,IAAI,EAAE,SAAS,GAAQ;AACrC,SAAO,SAAS,OAAO;AACzB;","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@caiquecamargo/vite-plugin-netlify-cms",
3
3
  "type": "module",
4
- "version": "0.0.18",
4
+ "version": "0.1.1",
5
5
  "author": "Caique de Camargo",
6
6
  "license": "ISC",
7
7
  "repository": {
@@ -23,17 +23,17 @@
23
23
  "dist"
24
24
  ],
25
25
  "peerDependencies": {
26
- "vite": "^4.0.0 || ^5.0.0"
26
+ "vite": "^7.0.0"
27
27
  },
28
28
  "dependencies": {
29
- "yaml": "^2.3.4"
29
+ "yaml": "^2.8.2"
30
30
  },
31
31
  "devDependencies": {
32
- "@antfu/eslint-config": "^2.12.1",
33
- "@types/node": "^20.10.5",
34
- "eslint": "^8.57.0",
35
- "tsup": "^8.0.1",
36
- "typescript": "^5.3.3"
32
+ "@antfu/eslint-config": "^6.7.1",
33
+ "@types/node": "^20.19.27",
34
+ "eslint": "^9.39.2",
35
+ "tsup": "^8.5.1",
36
+ "typescript": "^5.9.3"
37
37
  },
38
38
  "publishConfig": {
39
39
  "access": "public",