scribe-cms 0.0.20 → 0.0.21
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/cli/index.cjs +17 -9
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +17 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +22 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +22 -10
- package/dist/index.js.map +1 -1
- package/dist/runtime.cjs +21 -9
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.js +21 -9
- package/dist/runtime.js.map +1 -1
- package/dist/src/create-project.d.ts +8 -2
- package/dist/src/create-project.d.ts.map +1 -1
- package/dist/src/create-scribe.d.ts.map +1 -1
- package/dist/src/inline/resolve-tokens.d.ts +9 -1
- package/dist/src/inline/resolve-tokens.d.ts.map +1 -1
- package/dist/src/inline/tokens.d.ts +2 -2
- package/dist/src/inline/tokens.d.ts.map +1 -1
- package/dist/studio/server.cjs +17 -9
- package/dist/studio/server.cjs.map +1 -1
- package/dist/studio/server.js +17 -9
- package/dist/studio/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ScribeConfig, ScribeProject } from "./core/types.js";
|
|
2
|
+
import { type InlineLinkStyle } from "./inline/resolve-tokens.js";
|
|
2
3
|
/**
|
|
3
4
|
* Create the untyped project engine (CLI, validation, studio).
|
|
4
5
|
* Apps should use `createScribe()` for typed per-type accessors.
|
|
@@ -13,8 +14,13 @@ import type { ScribeConfig, ScribeProject } from "./core/types.js";
|
|
|
13
14
|
* the CLI, validation, and studio keep raw token syntax.
|
|
14
15
|
* @internal
|
|
15
16
|
*/
|
|
16
|
-
export
|
|
17
|
+
export interface CreateProjectOptions {
|
|
17
18
|
resolveAssets?: boolean;
|
|
18
19
|
resolveInlineTokens?: boolean;
|
|
19
|
-
|
|
20
|
+
/** How `:href` relation tokens resolve. Default `"app"`. */
|
|
21
|
+
inlineLinkStyle?: InlineLinkStyle;
|
|
22
|
+
/** Extension for `:href` in `"export"` mode. Default `.md`. */
|
|
23
|
+
exportLinkExtension?: `.${string}`;
|
|
24
|
+
}
|
|
25
|
+
export declare function createProject(config: ScribeConfig, options?: CreateProjectOptions): ScribeProject;
|
|
20
26
|
//# sourceMappingURL=create-project.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/create-project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,YAAY,EAEZ,aAAa,EAEd,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/create-project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,YAAY,EAEZ,aAAa,EAEd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,4BAA4B,CAAC;AAwMpC;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,4DAA4D;IAC5D,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,+DAA+D;IAC/D,mBAAmB,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;CACpC;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,oBAAyB,GACjC,aAAa,CA0Cf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-scribe.d.ts","sourceRoot":"","sources":["../../src/create-scribe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAEhB,MAAM,EACN,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAOzB;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,MAAM,SAAS,SAAS,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAChF,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAC/B,MAAM,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"create-scribe.d.ts","sourceRoot":"","sources":["../../src/create-scribe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAEhB,MAAM,EACN,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAOzB;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,MAAM,SAAS,SAAS,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAChF,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAC/B,MAAM,CAAC,MAAM,CAAC,CAmChB"}
|
|
@@ -13,7 +13,15 @@ import { type InlineToken } from "./tokens.js";
|
|
|
13
13
|
export interface InlineResolver {
|
|
14
14
|
resolve(token: InlineToken, enFrontmatter: Record<string, unknown>, locale: string): string;
|
|
15
15
|
}
|
|
16
|
-
|
|
16
|
+
/** How `:href` relation tokens resolve (see `docs/inline-tokens.md`). */
|
|
17
|
+
export type InlineLinkStyle = "app" | "export";
|
|
18
|
+
export interface CreateInlineResolverOptions {
|
|
19
|
+
/** Default `"app"` — locale-free pathnames for framework routers. */
|
|
20
|
+
linkStyle?: InlineLinkStyle;
|
|
21
|
+
/** File extension appended to localized slugs in `"export"` mode. Default `.md`. */
|
|
22
|
+
exportExtension?: `.${string}`;
|
|
23
|
+
}
|
|
24
|
+
export declare function createInlineResolver(config: ScribeConfig, options?: CreateInlineResolverOptions): InlineResolver;
|
|
17
25
|
/**
|
|
18
26
|
* Substitute inline tokens in an EN body at read time: extract tokens, resolve
|
|
19
27
|
* each for the default locale, fill the placeholder markers, and unescape any
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-tokens.d.ts","sourceRoot":"","sources":["../../../src/inline/resolve-tokens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKrD,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAErB;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,CACL,KAAK,EAAE,WAAW,EAClB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,MAAM,EAAE,MAAM,GACb,MAAM,CAAC;CACX;AAWD,wBAAgB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"resolve-tokens.d.ts","sourceRoot":"","sources":["../../../src/inline/resolve-tokens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKrD,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAErB;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,CACL,KAAK,EAAE,WAAW,EAClB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,MAAM,EAAE,MAAM,GACb,MAAM,CAAC;CACX;AAED,yEAAyE;AACzE,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE/C,MAAM,WAAW,2BAA2B;IAC1C,qEAAqE;IACrE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,oFAAoF;IACpF,eAAe,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;CAChC;AAWD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,2BAAgC,GACxC,cAAc,CAgFhB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,cAAc,GACvB,MAAM,CAKR;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,cAAc,GACvB,MAAM,CAKR"}
|
|
@@ -23,8 +23,8 @@ export interface RelationInlineToken {
|
|
|
23
23
|
kind: "relation";
|
|
24
24
|
targetTypeId: string;
|
|
25
25
|
enSlug: string;
|
|
26
|
-
/** `"
|
|
27
|
-
mode: "
|
|
26
|
+
/** `"href"` resolves to a link path; `"slug"` resolves to the EN slug. */
|
|
27
|
+
mode: "href" | "slug";
|
|
28
28
|
raw: string;
|
|
29
29
|
}
|
|
30
30
|
export interface AssetInlineToken {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../src/inline/tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,KAAK,CAAC;AAEtE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,CAAC;IACf,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../src/inline/tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,KAAK,CAAC;AAEtE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,CAAC;IACf,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,WAAW,GACnB,iBAAiB,GACjB,mBAAmB,GACnB,gBAAgB,GAChB,cAAc,CAAC;AAEnB,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,uDAAuD;IACvD,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AAyGD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,yBAAyB,CAyC3E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM,CAK/E;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IACJ,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,MAAM,EAAE,MAAM,MAAM,CAAC;CACtB,GACA,MAAM,CAuBR;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK3D"}
|
package/dist/studio/server.cjs
CHANGED
|
@@ -299,18 +299,18 @@ function parseTokenInner(inner) {
|
|
|
299
299
|
}
|
|
300
300
|
case "relation": {
|
|
301
301
|
const parts = rest.split(":");
|
|
302
|
-
if (parts.length
|
|
302
|
+
if (parts.length !== 3) {
|
|
303
303
|
return {
|
|
304
304
|
ok: false,
|
|
305
|
-
reason: `relation must be relation:<typeId>:<enSlug
|
|
305
|
+
reason: `relation must be relation:<typeId>:<enSlug>:href or relation:<typeId>:<enSlug>:slug`
|
|
306
306
|
};
|
|
307
307
|
}
|
|
308
308
|
const [targetTypeId, enSlug, mode] = parts;
|
|
309
309
|
if (!targetTypeId || !enSlug) {
|
|
310
310
|
return { ok: false, reason: `relation is missing a typeId or enSlug` };
|
|
311
311
|
}
|
|
312
|
-
if (mode !==
|
|
313
|
-
return { ok: false, reason: `relation mode must be "slug" (got "${mode}")` };
|
|
312
|
+
if (mode !== "href" && mode !== "slug") {
|
|
313
|
+
return { ok: false, reason: `relation mode must be "href" or "slug" (got "${mode}")` };
|
|
314
314
|
}
|
|
315
315
|
return {
|
|
316
316
|
ok: true,
|
|
@@ -318,7 +318,7 @@ function parseTokenInner(inner) {
|
|
|
318
318
|
kind: "relation",
|
|
319
319
|
targetTypeId,
|
|
320
320
|
enSlug,
|
|
321
|
-
mode
|
|
321
|
+
mode
|
|
322
322
|
}
|
|
323
323
|
};
|
|
324
324
|
}
|
|
@@ -993,7 +993,9 @@ function isStringRecord(value) {
|
|
|
993
993
|
if (!value || typeof value !== "object" || Array.isArray(value)) return false;
|
|
994
994
|
return Object.values(value).every((v) => typeof v === "string");
|
|
995
995
|
}
|
|
996
|
-
function createInlineResolver(config) {
|
|
996
|
+
function createInlineResolver(config, options = {}) {
|
|
997
|
+
const linkStyle = options.linkStyle ?? "app";
|
|
998
|
+
const exportExtension = options.exportExtension ?? ".md";
|
|
997
999
|
const urlBuilder = createUrlBuilder(config);
|
|
998
1000
|
const typeById = new Map(config.types.map((t) => [t.id, t]));
|
|
999
1001
|
const storePath = resolveStorePath(config);
|
|
@@ -1054,7 +1056,10 @@ function createInlineResolver(config) {
|
|
|
1054
1056
|
if (token.mode === "slug") return token.enSlug;
|
|
1055
1057
|
if (!isRoutableType(type)) return "";
|
|
1056
1058
|
const slug = localizedSlug(token.targetTypeId, token.enSlug, locale);
|
|
1057
|
-
|
|
1059
|
+
if (linkStyle === "export") {
|
|
1060
|
+
return urlBuilder.resolvePath(type.path, `${slug}${exportExtension}`, locale);
|
|
1061
|
+
}
|
|
1062
|
+
return type.path.replace("{slug}", slug);
|
|
1058
1063
|
}
|
|
1059
1064
|
}
|
|
1060
1065
|
}
|
|
@@ -1654,7 +1659,10 @@ function createProject(config, options = {}) {
|
|
|
1654
1659
|
}
|
|
1655
1660
|
return runtime;
|
|
1656
1661
|
};
|
|
1657
|
-
const inlineResolver = options.resolveInlineTokens ? createInlineResolver(config
|
|
1662
|
+
const inlineResolver = options.resolveInlineTokens ? createInlineResolver(config, {
|
|
1663
|
+
linkStyle: options.inlineLinkStyle,
|
|
1664
|
+
exportExtension: options.exportLinkExtension
|
|
1665
|
+
}) : void 0;
|
|
1658
1666
|
for (const type of config.types) {
|
|
1659
1667
|
runtimes.set(
|
|
1660
1668
|
type.id,
|
|
@@ -2305,7 +2313,7 @@ function validateInlineTokens(config) {
|
|
|
2305
2313
|
});
|
|
2306
2314
|
break;
|
|
2307
2315
|
}
|
|
2308
|
-
if (token.mode === "
|
|
2316
|
+
if (token.mode === "href") {
|
|
2309
2317
|
const targetType = typeById.get(token.targetTypeId);
|
|
2310
2318
|
if (!isRoutableType(targetType)) {
|
|
2311
2319
|
issues.push({
|