nuxt-studio 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +241 -0
- package/dist/app/main.d.ts +342 -0
- package/dist/app/main.js +38597 -0
- package/dist/app/mdc-import-BDMct_Gn.js +4 -0
- package/dist/app/service-worker.d.ts +3 -0
- package/dist/app/service-worker.js +118 -0
- package/dist/app/shared-D04791PA.js +25754 -0
- package/dist/app/shared-DI6F-ifc.js +25774 -0
- package/dist/app/shared-R5zYJ3Dl.js +25803 -0
- package/dist/app/shared.d.ts +22 -0
- package/dist/app/shared.js +6 -0
- package/dist/app/utils-DI6F-ifc.js +25774 -0
- package/dist/app/utils.d.ts +22 -0
- package/dist/app/utils.js +6 -0
- package/dist/module/module.d.mts +68 -0
- package/dist/module/module.json +10 -0
- package/dist/module/module.mjs +185 -0
- package/dist/module/runtime/composables/useMeta.d.ts +6 -0
- package/dist/module/runtime/composables/useMeta.js +17 -0
- package/dist/module/runtime/host.d.ts +2 -0
- package/dist/module/runtime/host.dev.d.ts +2 -0
- package/dist/module/runtime/host.dev.js +46 -0
- package/dist/module/runtime/host.js +257 -0
- package/dist/module/runtime/plugins/studio.client.d.ts +2 -0
- package/dist/module/runtime/plugins/studio.client.dev.d.ts +2 -0
- package/dist/module/runtime/plugins/studio.client.dev.js +23 -0
- package/dist/module/runtime/plugins/studio.client.js +11 -0
- package/dist/module/runtime/server/routes/admin.d.ts +2 -0
- package/dist/module/runtime/server/routes/admin.js +192 -0
- package/dist/module/runtime/server/routes/auth/github.get.d.ts +53 -0
- package/dist/module/runtime/server/routes/auth/github.get.js +155 -0
- package/dist/module/runtime/server/routes/auth/google.get.d.ts +2 -0
- package/dist/module/runtime/server/routes/auth/google.get.js +13 -0
- package/dist/module/runtime/server/routes/auth/session.delete.d.ts +4 -0
- package/dist/module/runtime/server/routes/auth/session.delete.js +10 -0
- package/dist/module/runtime/server/routes/auth/session.get.d.ts +4 -0
- package/dist/module/runtime/server/routes/auth/session.get.js +12 -0
- package/dist/module/runtime/server/routes/dev/content/[...path].d.ts +2 -0
- package/dist/module/runtime/server/routes/dev/content/[...path].js +57 -0
- package/dist/module/runtime/server/routes/dev/public/[...path].d.ts +8 -0
- package/dist/module/runtime/server/routes/dev/public/[...path].js +61 -0
- package/dist/module/runtime/server/routes/meta.d.ts +17 -0
- package/dist/module/runtime/server/routes/meta.js +39 -0
- package/dist/module/runtime/server/routes/sw.d.ts +2 -0
- package/dist/module/runtime/server/routes/sw.js +6 -0
- package/dist/module/runtime/utils/activation.d.ts +2 -0
- package/dist/module/runtime/utils/activation.js +23 -0
- package/dist/module/runtime/utils/collection.d.ts +22 -0
- package/dist/module/runtime/utils/collection.js +154 -0
- package/dist/module/runtime/utils/ensure.d.ts +1 -0
- package/dist/module/runtime/utils/ensure.js +22 -0
- package/dist/module/runtime/utils/object.d.ts +3 -0
- package/dist/module/runtime/utils/object.js +3 -0
- package/dist/module/runtime/utils/path-meta.d.ts +50 -0
- package/dist/module/runtime/utils/path-meta.js +49 -0
- package/dist/module/types.d.mts +7 -0
- package/package.json +100 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getAppManifest, useState, useRuntimeConfig } from "#imports";
|
|
2
|
+
export async function defineStudioActivationPlugin(onStudioActivation) {
|
|
3
|
+
const user = useState("studio-session", () => null);
|
|
4
|
+
const config = useRuntimeConfig().public.studio;
|
|
5
|
+
await $fetch("/__nuxt_studio/auth/session").then((session) => {
|
|
6
|
+
user.value = session?.user ?? null;
|
|
7
|
+
});
|
|
8
|
+
let mounted = false;
|
|
9
|
+
if (user.value?.email) {
|
|
10
|
+
const manifest = await getAppManifest();
|
|
11
|
+
manifest.prerendered = [];
|
|
12
|
+
await onStudioActivation(user.value);
|
|
13
|
+
mounted = true;
|
|
14
|
+
} else if (mounted) {
|
|
15
|
+
window.location.reload();
|
|
16
|
+
} else {
|
|
17
|
+
document.addEventListener("keydown", (event) => {
|
|
18
|
+
if (event.metaKey && event.key === ".") {
|
|
19
|
+
window.location.href = config.route;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { CollectionInfo, CollectionSource, Draft07, CollectionItemBase, ResolvedCollectionSource } from '@nuxt/content';
|
|
2
|
+
import type { DatabaseItem } from 'nuxt-studio/app';
|
|
3
|
+
export declare const getCollectionByFilePath: (path: string, collections: Record<string, CollectionInfo>) => CollectionInfo | undefined;
|
|
4
|
+
export declare function generateStemFromFsPath(path: string): string;
|
|
5
|
+
export declare function generateIdFromFsPath(path: string, collectionInfo: CollectionInfo): string;
|
|
6
|
+
export declare function getOrderedSchemaKeys(schema: Draft07): string[];
|
|
7
|
+
export declare function getCollection(collectionName: string, collections: Record<string, CollectionInfo>): CollectionInfo;
|
|
8
|
+
export declare function getCollectionSource(id: string, collection: CollectionInfo): ResolvedCollectionSource | undefined;
|
|
9
|
+
export declare function generateFsPathFromId(id: string, source: CollectionInfo['source'][0]): string;
|
|
10
|
+
export declare function getCollectionInfo(id: string, collections: Record<string, CollectionInfo>): {
|
|
11
|
+
collection: CollectionInfo;
|
|
12
|
+
source: ResolvedCollectionSource | undefined;
|
|
13
|
+
fsPath: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function parseSourceBase(source: CollectionSource): {
|
|
16
|
+
fixed: string;
|
|
17
|
+
dynamic: string;
|
|
18
|
+
};
|
|
19
|
+
export declare function createCollectionDocument(collection: CollectionInfo, id: string, document: CollectionItemBase): DatabaseItem;
|
|
20
|
+
export declare function normalizeDocument(document: DatabaseItem): DatabaseItem;
|
|
21
|
+
export declare function generateRecordInsert(collection: CollectionInfo, data: Record<string, unknown>): string;
|
|
22
|
+
export declare function generateRecordDeletion(collection: CollectionInfo, id: string): string;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { hash } from "ohash";
|
|
2
|
+
import { pathMetaTransform } from "./path-meta.js";
|
|
3
|
+
import { minimatch } from "minimatch";
|
|
4
|
+
import { join, dirname, parse } from "pathe";
|
|
5
|
+
import { withoutLeadingSlash } from "ufo";
|
|
6
|
+
export const getCollectionByFilePath = (path, collections) => {
|
|
7
|
+
let matchedSource;
|
|
8
|
+
const collection = Object.values(collections).find((collection2) => {
|
|
9
|
+
if (!collection2.source || collection2.source.length === 0) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const paths = path === "/" ? ["index.yml", "index.yaml", "index.md", "index.json"] : [path];
|
|
13
|
+
return paths.some((p) => {
|
|
14
|
+
matchedSource = collection2.source.find((source) => {
|
|
15
|
+
const include = minimatch(p, source.include, { dot: true });
|
|
16
|
+
const exclude = source.exclude?.some((exclude2) => minimatch(p, exclude2));
|
|
17
|
+
return include && !exclude;
|
|
18
|
+
});
|
|
19
|
+
return matchedSource;
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
return collection;
|
|
23
|
+
};
|
|
24
|
+
export function generateStemFromFsPath(path) {
|
|
25
|
+
return withoutLeadingSlash(join(dirname(path), parse(path).name));
|
|
26
|
+
}
|
|
27
|
+
export function generateIdFromFsPath(path, collectionInfo) {
|
|
28
|
+
const { fixed } = parseSourceBase(collectionInfo.source[0]);
|
|
29
|
+
const pathWithoutFixed = path.substring(fixed.length);
|
|
30
|
+
return join(collectionInfo.name, collectionInfo.source[0]?.prefix || "", pathWithoutFixed);
|
|
31
|
+
}
|
|
32
|
+
export function getOrderedSchemaKeys(schema) {
|
|
33
|
+
const shape = Object.values(schema.definitions)[0]?.properties || {};
|
|
34
|
+
const keys = new Set([
|
|
35
|
+
shape.id ? "id" : void 0,
|
|
36
|
+
shape.title ? "title" : void 0,
|
|
37
|
+
...Object.keys(shape).sort()
|
|
38
|
+
].filter(Boolean));
|
|
39
|
+
return Array.from(keys);
|
|
40
|
+
}
|
|
41
|
+
export function getCollection(collectionName, collections) {
|
|
42
|
+
const collection = collections[collectionName];
|
|
43
|
+
if (!collection) {
|
|
44
|
+
throw new Error(`Collection ${collectionName} not found`);
|
|
45
|
+
}
|
|
46
|
+
return collection;
|
|
47
|
+
}
|
|
48
|
+
export function getCollectionSource(id, collection) {
|
|
49
|
+
const [_, ...rest] = id.split(/[/:]/);
|
|
50
|
+
const path = rest.join("/");
|
|
51
|
+
const matchedSource = collection.source.find((source) => {
|
|
52
|
+
const include = minimatch(path, source.include, { dot: true });
|
|
53
|
+
const exclude = source.exclude?.some((exclude2) => minimatch(path, exclude2));
|
|
54
|
+
return include && !exclude;
|
|
55
|
+
});
|
|
56
|
+
return matchedSource;
|
|
57
|
+
}
|
|
58
|
+
export function generateFsPathFromId(id, source) {
|
|
59
|
+
const [_, ...rest] = id.split(/[/:]/);
|
|
60
|
+
const path = rest.join("/");
|
|
61
|
+
const { fixed } = parseSourceBase(source);
|
|
62
|
+
const pathWithoutFixed = path.substring(fixed.length);
|
|
63
|
+
return join(fixed, pathWithoutFixed);
|
|
64
|
+
}
|
|
65
|
+
export function getCollectionInfo(id, collections) {
|
|
66
|
+
const collection = getCollection(id.split(/[/:]/)[0], collections);
|
|
67
|
+
const source = getCollectionSource(id, collection);
|
|
68
|
+
const fsPath = generateFsPathFromId(id, source);
|
|
69
|
+
return {
|
|
70
|
+
collection,
|
|
71
|
+
source,
|
|
72
|
+
fsPath
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export function parseSourceBase(source) {
|
|
76
|
+
const [fixPart, ...rest] = source.include.includes("*") ? source.include.split("*") : ["", source.include];
|
|
77
|
+
return {
|
|
78
|
+
fixed: fixPart || "",
|
|
79
|
+
dynamic: "*" + rest.join("*")
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export function createCollectionDocument(collection, id, document) {
|
|
83
|
+
const parsedContent = [
|
|
84
|
+
pathMetaTransform
|
|
85
|
+
].reduce((acc, fn) => collection.type === "page" ? fn(acc) : acc, { ...document, id });
|
|
86
|
+
const result = { id };
|
|
87
|
+
const meta = parsedContent.meta;
|
|
88
|
+
const collectionKeys = getOrderedSchemaKeys(collection.schema);
|
|
89
|
+
for (const key of Object.keys(parsedContent)) {
|
|
90
|
+
if (collectionKeys.includes(key)) {
|
|
91
|
+
result[key] = parsedContent[key];
|
|
92
|
+
} else {
|
|
93
|
+
meta[key] = parsedContent[key];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
result.meta = meta;
|
|
97
|
+
if (collectionKeys.includes("seo")) {
|
|
98
|
+
const seo = result.seo = result.seo || {};
|
|
99
|
+
seo.title = seo.title || result.title;
|
|
100
|
+
seo.description = seo.description || result.description;
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
export function normalizeDocument(document) {
|
|
105
|
+
if (document?.seo) {
|
|
106
|
+
const seo = document.seo;
|
|
107
|
+
if (!seo.title || seo.title === document.title) {
|
|
108
|
+
Reflect.deleteProperty(document.seo, "title");
|
|
109
|
+
}
|
|
110
|
+
if (!seo.description || seo.description === document.description) {
|
|
111
|
+
Reflect.deleteProperty(document.seo, "description");
|
|
112
|
+
}
|
|
113
|
+
if (Object.keys(seo).length === 0) {
|
|
114
|
+
Reflect.deleteProperty(document, "seo");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return document;
|
|
118
|
+
}
|
|
119
|
+
function computeValuesBasedOnCollectionSchema(collection, data) {
|
|
120
|
+
const fields = [];
|
|
121
|
+
const values = [];
|
|
122
|
+
const properties = collection.schema.definitions[collection.name].properties;
|
|
123
|
+
const sortedKeys = getOrderedSchemaKeys(collection.schema);
|
|
124
|
+
sortedKeys.forEach((key) => {
|
|
125
|
+
const value = properties[key];
|
|
126
|
+
const type = collection.fields[key];
|
|
127
|
+
const defaultValue = value?.default !== void 0 ? value.default : "NULL";
|
|
128
|
+
const valueToInsert = typeof data[key] !== "undefined" ? data[key] : defaultValue;
|
|
129
|
+
fields.push(key);
|
|
130
|
+
if (type === "json") {
|
|
131
|
+
values.push(`'${JSON.stringify(valueToInsert).replace(/'/g, "''")}'`);
|
|
132
|
+
} else if (type === "string" || ["string", "enum"].includes(value.type)) {
|
|
133
|
+
if (["data", "datetime"].includes(value.format)) {
|
|
134
|
+
values.push(valueToInsert !== "NULL" ? `'${new Date(valueToInsert).toISOString()}'` : defaultValue);
|
|
135
|
+
} else {
|
|
136
|
+
values.push(`'${String(valueToInsert).replace(/\n/g, "\\n").replace(/'/g, "''")}'`);
|
|
137
|
+
}
|
|
138
|
+
} else if (type === "boolean") {
|
|
139
|
+
values.push(valueToInsert !== "NULL" ? !!valueToInsert : valueToInsert);
|
|
140
|
+
} else {
|
|
141
|
+
values.push(valueToInsert);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
values.push(`'${hash(values)}'`);
|
|
145
|
+
return values;
|
|
146
|
+
}
|
|
147
|
+
export function generateRecordInsert(collection, data) {
|
|
148
|
+
const values = computeValuesBasedOnCollectionSchema(collection, data);
|
|
149
|
+
let index = 0;
|
|
150
|
+
return `INSERT INTO ${collection.tableName} VALUES (${"?, ".repeat(values.length).slice(0, -2)})`.replace(/\?/g, () => values[index++]);
|
|
151
|
+
}
|
|
152
|
+
export function generateRecordDeletion(collection, id) {
|
|
153
|
+
return `DELETE FROM ${collection.tableName} WHERE id = '${id}';`;
|
|
154
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ensure(check: () => boolean, timeout?: number, maxTries?: number): Promise<unknown>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function ensure(check, timeout = 50, maxTries = 20) {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
_ensureWithCallback(check, (error) => {
|
|
4
|
+
if (error) {
|
|
5
|
+
reject(error);
|
|
6
|
+
} else {
|
|
7
|
+
resolve(true);
|
|
8
|
+
}
|
|
9
|
+
}, timeout, maxTries);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function _ensureWithCallback(check, callback, timeout = 50, maxTries = 20) {
|
|
13
|
+
if (check()) {
|
|
14
|
+
return callback(void 0);
|
|
15
|
+
}
|
|
16
|
+
setTimeout(() => {
|
|
17
|
+
_ensureWithCallback(check, callback, timeout, maxTries - 1);
|
|
18
|
+
}, timeout);
|
|
19
|
+
if (maxTries === 0) {
|
|
20
|
+
callback(new Error("Max tries reached"));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { PageCollectionItemBase } from '@nuxt/content';
|
|
2
|
+
export interface PathMetaOptions {
|
|
3
|
+
slugifyOptions?: {
|
|
4
|
+
lower?: boolean;
|
|
5
|
+
};
|
|
6
|
+
}
|
|
7
|
+
export declare function pathMetaTransform(content: PageCollectionItemBase, options?: PathMetaOptions): {
|
|
8
|
+
title: string;
|
|
9
|
+
stem: string;
|
|
10
|
+
extension: string;
|
|
11
|
+
path: string;
|
|
12
|
+
description: string;
|
|
13
|
+
seo: {
|
|
14
|
+
title?: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
};
|
|
18
|
+
body: import("@nuxt/content").MarkdownRoot;
|
|
19
|
+
navigation?: boolean | {
|
|
20
|
+
title: string;
|
|
21
|
+
description: string;
|
|
22
|
+
icon: string;
|
|
23
|
+
};
|
|
24
|
+
id: string;
|
|
25
|
+
meta: Record<string, unknown>;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Generate path from file name
|
|
29
|
+
*
|
|
30
|
+
* @param path file full path
|
|
31
|
+
* @returns generated slug
|
|
32
|
+
*/
|
|
33
|
+
export declare const generatePath: (path: string, { forceLeadingSlash, slugifyOptions }?: {
|
|
34
|
+
forceLeadingSlash?: boolean | undefined;
|
|
35
|
+
slugifyOptions?: {} | undefined;
|
|
36
|
+
}) => string;
|
|
37
|
+
/**
|
|
38
|
+
* generate title from file path
|
|
39
|
+
*/
|
|
40
|
+
export declare const generateTitle: (path: string) => string;
|
|
41
|
+
/**
|
|
42
|
+
* Clean up special keywords from path part
|
|
43
|
+
*/
|
|
44
|
+
export declare function refineUrlPart(name: string): string;
|
|
45
|
+
export declare const describeId: (id: string) => {
|
|
46
|
+
source: string | undefined;
|
|
47
|
+
stem: string;
|
|
48
|
+
extension: string;
|
|
49
|
+
basename: string;
|
|
50
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { pascalCase } from "scule";
|
|
2
|
+
import slugify from "slugify";
|
|
3
|
+
import { withoutTrailingSlash, withLeadingSlash } from "ufo";
|
|
4
|
+
import defu from "defu";
|
|
5
|
+
const SEMVER_REGEX = /^\d+(?:\.\d+)*(?:\.x)?$/;
|
|
6
|
+
const defaultOptions = {
|
|
7
|
+
slugifyOptions: {
|
|
8
|
+
lower: true
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
export function pathMetaTransform(content, options = {}) {
|
|
12
|
+
const opts = defu(options, defaultOptions);
|
|
13
|
+
const { basename, extension, stem } = describeId(content.id);
|
|
14
|
+
const filePath = generatePath(stem, opts);
|
|
15
|
+
return {
|
|
16
|
+
// @ts-expect-error - duplicate key
|
|
17
|
+
path: filePath,
|
|
18
|
+
...content,
|
|
19
|
+
title: content.title || generateTitle(refineUrlPart(basename)),
|
|
20
|
+
stem,
|
|
21
|
+
extension
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export const generatePath = (path, { forceLeadingSlash = true, slugifyOptions = {} } = {}) => {
|
|
25
|
+
path = path.split("/").map((part) => slugify(refineUrlPart(part), slugifyOptions)).join("/");
|
|
26
|
+
return forceLeadingSlash ? withLeadingSlash(withoutTrailingSlash(path)) : path;
|
|
27
|
+
};
|
|
28
|
+
export const generateTitle = (path) => path.split(/[\s-]/g).map(pascalCase).join(" ");
|
|
29
|
+
export function refineUrlPart(name) {
|
|
30
|
+
name = name.split(/[/:]/).pop();
|
|
31
|
+
if (SEMVER_REGEX.test(name)) {
|
|
32
|
+
return name;
|
|
33
|
+
}
|
|
34
|
+
return name.replace(/(\d+\.)?(.*)/, "$2").replace(/^index(\.draft)?$/, "").replace(/\.draft$/, "");
|
|
35
|
+
}
|
|
36
|
+
export const describeId = (id) => {
|
|
37
|
+
const [source, ...parts] = id.split(/[:/]/);
|
|
38
|
+
const [, basename, extension] = parts[parts.length - 1]?.match(/(.*)\.([^.]+)$/) || [];
|
|
39
|
+
if (basename) {
|
|
40
|
+
parts[parts.length - 1] = basename;
|
|
41
|
+
}
|
|
42
|
+
const stem = (parts || []).join("/");
|
|
43
|
+
return {
|
|
44
|
+
source,
|
|
45
|
+
stem,
|
|
46
|
+
extension,
|
|
47
|
+
basename: basename || ""
|
|
48
|
+
};
|
|
49
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nuxt-studio",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "Nuxt Studio for Nuxt Content",
|
|
5
|
+
"private": false,
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/nuxt-content/studio.git"
|
|
9
|
+
},
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"type": "module",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": "./dist/module/module.mjs",
|
|
14
|
+
"./app": {
|
|
15
|
+
"types": "./dist/app/main.d.ts",
|
|
16
|
+
"default": "./dist/app/main.js"
|
|
17
|
+
},
|
|
18
|
+
"./app/utils": {
|
|
19
|
+
"types": "./dist/app/shared.d.ts",
|
|
20
|
+
"default": "./dist/app/shared.js"
|
|
21
|
+
},
|
|
22
|
+
"./app/service-worker": {
|
|
23
|
+
"types": "./dist/app/service-worker.d.ts",
|
|
24
|
+
"default": "./dist/app/service-worker.js"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist"
|
|
29
|
+
],
|
|
30
|
+
"main": "./dist/module/module.mjs",
|
|
31
|
+
"scripts": {
|
|
32
|
+
"prepack": "nuxt-module-build build src/module; vite build src/app",
|
|
33
|
+
"dev": "pnpm run dev:prepare && STUDIO_DEV_SERVER=http://localhost:5151 nuxi dev playground/docus",
|
|
34
|
+
"dev:minimal": "pnpm run dev:prepare && STUDIO_DEV_SERVER=http://localhost:5151 nuxt dev playground/minimal",
|
|
35
|
+
"dev:app": "vite src/app --port 5151",
|
|
36
|
+
"dev:build": "nuxi build playground/docus",
|
|
37
|
+
"dev:prepare": "nuxt-module-build build --stub src/module && nuxt-module-build prepare src/module && nuxi prepare playground/docus",
|
|
38
|
+
"release": "release-it --preRelease=alpha --npm.tag=alpha",
|
|
39
|
+
"lint": "eslint .",
|
|
40
|
+
"typecheck": "nuxt typecheck && vue-tsc -p src/app/tsconfig.app.json",
|
|
41
|
+
"verify": "pnpm run dev:prepare && pnpm run lint && pnpm run prepack && pnpm run typecheck && pnpm run test",
|
|
42
|
+
"test": "vitest run",
|
|
43
|
+
"test:watch": "vitest watch",
|
|
44
|
+
"test:types": "vue-tsc --noEmit && cd playground/docus && vue-tsc --noEmit"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@iconify-json/lucide": "^1.2.72",
|
|
48
|
+
"@nuxtjs/mdc": "^0.18.2",
|
|
49
|
+
"@vueuse/core": "^13.9.0",
|
|
50
|
+
"defu": "^6.1.4",
|
|
51
|
+
"destr": "^2.0.5",
|
|
52
|
+
"unstorage": "1.17.1"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@iconify-json/simple-icons": "^1.2.57",
|
|
56
|
+
"@nuxt/content": "^3.8.0",
|
|
57
|
+
"@nuxt/eslint-config": "^1.10.0",
|
|
58
|
+
"@nuxt/kit": "^4.2.0",
|
|
59
|
+
"@nuxt/module-builder": "^1.0.2",
|
|
60
|
+
"@nuxt/ui": "^4.1.0",
|
|
61
|
+
"@octokit/types": "^15.0.1",
|
|
62
|
+
"@release-it/conventional-changelog": "^10.0.1",
|
|
63
|
+
"@tailwindcss/typography": "^0.5.19",
|
|
64
|
+
"@types/js-yaml": "^4.0.9",
|
|
65
|
+
"@unhead/vue": "^2.0.19",
|
|
66
|
+
"@unpic/vue": "^1.0.0",
|
|
67
|
+
"@vitejs/plugin-vue": "^6.0.1",
|
|
68
|
+
"eslint": "^9.39.1",
|
|
69
|
+
"idb-keyval": "^6.2.2",
|
|
70
|
+
"minimark": "^0.2.0",
|
|
71
|
+
"modern-monaco": "^0.2.2",
|
|
72
|
+
"nuxt-studio": "workspace:*",
|
|
73
|
+
"ofetch": "^1.5.1",
|
|
74
|
+
"release-it": "^19.0.5",
|
|
75
|
+
"tailwindcss": "^4.1.16",
|
|
76
|
+
"vite": "^7.1.12",
|
|
77
|
+
"vite-plugin-dts": "^4.5.4",
|
|
78
|
+
"vite-plugin-libcss": "^1.1.2",
|
|
79
|
+
"vitest": "^3.2.4",
|
|
80
|
+
"vue": "^3.5.22",
|
|
81
|
+
"vue-router": "^4.6.3",
|
|
82
|
+
"vue-tsc": "^3.1.3",
|
|
83
|
+
"zod": "^4.1.12"
|
|
84
|
+
},
|
|
85
|
+
"resolutions": {
|
|
86
|
+
"remark-mdc": "3.8.1"
|
|
87
|
+
},
|
|
88
|
+
"packageManager": "pnpm@10.20.0",
|
|
89
|
+
"keywords": [
|
|
90
|
+
"nuxt",
|
|
91
|
+
"content",
|
|
92
|
+
"nuxt-module",
|
|
93
|
+
"studio",
|
|
94
|
+
"editor",
|
|
95
|
+
"preview",
|
|
96
|
+
"cms",
|
|
97
|
+
"markdown",
|
|
98
|
+
"mdc"
|
|
99
|
+
]
|
|
100
|
+
}
|