@paroicms/public-server-lib 0.45.1 → 0.46.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/dist/index.d.ts CHANGED
@@ -3,9 +3,12 @@ export type * from "../typeonly/configuration-types.d.ts";
3
3
  export type * from "../typeonly/site-schema-json-types.d.ts";
4
4
  export type * from "../typeonly/theme-json-types.d.ts";
5
5
  export type * from "../types/backend-plugin-types.d.ts";
6
+ export type * from "../types/load-descriptor-types.d.ts";
6
7
  export * from "./api-error-handler.js";
7
8
  export * from "./html-helpers.js";
9
+ export * from "./load-descriptors.js";
8
10
  export * from "./obfuscate.helper.js";
9
11
  export * from "./server-image-cache-engine.helper.js";
10
12
  export * from "./simple-i18n.js";
13
+ export * from "./site-schema-public-helpers.js";
11
14
  export * from "./typeonly-validator.js";
package/dist/index.js CHANGED
@@ -1,7 +1,9 @@
1
1
  export * from "./api-error-handler.js";
2
2
  export * from "./html-helpers.js";
3
+ export * from "./load-descriptors.js";
3
4
  export * from "./obfuscate.helper.js";
4
5
  export * from "./server-image-cache-engine.helper.js";
5
6
  export * from "./simple-i18n.js";
7
+ export * from "./site-schema-public-helpers.js";
6
8
  export * from "./typeonly-validator.js";
7
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uCAAuC,CAAC;AACtD,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uCAAuC,CAAC;AACtD,cAAc,kBAAkB,CAAC;AACjC,cAAc,iCAAiC,CAAC;AAChD,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { DocumentsLoadDescriptor, ListBaseDescriptor, LoadDescriptor, OneDocumentLoadDescriptor } from "../types/load-descriptor-types.js";
2
+ declare const loadDescriptorSymbol: unique symbol;
3
+ export interface WithLoadDescriptor<T extends LoadDescriptor = LoadDescriptor> {
4
+ [loadDescriptorSymbol]: T;
5
+ }
6
+ export interface WithOneDocumentLoadDescriptor {
7
+ [loadDescriptorSymbol]: OneDocumentLoadDescriptor;
8
+ }
9
+ export interface WithDocumentsLoadDescriptor {
10
+ [loadDescriptorSymbol]: DocumentsLoadDescriptor;
11
+ }
12
+ export declare function assignLoadDescriptor<T>(val: T, loadDescriptor: OneDocumentLoadDescriptor): T & WithOneDocumentLoadDescriptor;
13
+ export declare function assignLoadDescriptor<T>(val: T, loadDescriptor: DocumentsLoadDescriptor): T & WithDocumentsLoadDescriptor;
14
+ export declare function assignLoadDescriptor<T>(val: T, loadDescriptor: LoadDescriptor): T & WithLoadDescriptor;
15
+ export declare function extractLoadDescriptor(val: unknown): LoadDescriptor | undefined;
16
+ export declare function extractOneDocumentLoadDescriptor(val: unknown): OneDocumentLoadDescriptor | undefined;
17
+ export declare function extractDocumentsLoadDescriptor(val: unknown): DocumentsLoadDescriptor | undefined;
18
+ export declare function mergeListDescriptor<T extends ListBaseDescriptor>(base: T, newValues: ListBaseDescriptor): T;
19
+ export {};
@@ -0,0 +1,42 @@
1
+ const loadDescriptorSymbol = Symbol("loadDescriptor");
2
+ export function assignLoadDescriptor(val, loadDescriptor) {
3
+ val[loadDescriptorSymbol] = loadDescriptor;
4
+ return val;
5
+ }
6
+ export function extractLoadDescriptor(val) {
7
+ if (typeof val !== "object" || val === null)
8
+ return;
9
+ if (!(loadDescriptorSymbol in val))
10
+ return;
11
+ const payload = val[loadDescriptorSymbol];
12
+ return payload;
13
+ }
14
+ export function extractOneDocumentLoadDescriptor(val) {
15
+ const payload = extractLoadDescriptor(val);
16
+ if (!payload)
17
+ return;
18
+ return payload.load === "one" && payload.nodeKind === "document" ? payload : undefined;
19
+ }
20
+ export function extractDocumentsLoadDescriptor(val) {
21
+ const payload = extractLoadDescriptor(val);
22
+ if (!payload)
23
+ return;
24
+ return payload.load === "list" && payload.nodeKind === "document" ? payload : undefined;
25
+ }
26
+ export function mergeListDescriptor(base, newValues) {
27
+ const target = { ...base };
28
+ if (newValues.labeledWith) {
29
+ target.labeledWith = newValues.labeledWith;
30
+ }
31
+ if (newValues.sorting) {
32
+ target.sorting = newValues.sorting;
33
+ }
34
+ if (newValues.offset !== undefined) {
35
+ target.offset = newValues.offset;
36
+ }
37
+ if (newValues.limit !== undefined) {
38
+ target.limit = newValues.limit;
39
+ }
40
+ return target;
41
+ }
42
+ //# sourceMappingURL=load-descriptors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-descriptors.js","sourceRoot":"","sources":["../src/load-descriptors.ts"],"names":[],"mappings":"AAOA,MAAM,oBAAoB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AA0BtD,MAAM,UAAU,oBAAoB,CAAC,GAAQ,EAAE,cAA8B;IAC3E,GAAG,CAAC,oBAAoB,CAAC,GAAG,cAAc,CAAC;IAC3C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAY;IAChD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO;IACpD,IAAI,CAAC,CAAC,oBAAoB,IAAI,GAAG,CAAC;QAAE,OAAO;IAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,CAAmB,CAAC;IAC5D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,GAAY;IAEZ,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,OAAO,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,GAAY;IACzD,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,OAAO,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAO,EACP,SAA6B;IAE7B,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAC3B,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;IAC7C,CAAC;IACD,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;IACrC,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IACnC,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;IACjC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ScSorting } from "@paroicms/public-anywhere-lib";
2
+ import type { JtSorting } from "../typeonly/site-schema-json-types.js";
3
+ export declare function parseSorting(val: JtSorting): ScSorting;
@@ -0,0 +1,15 @@
1
+ export function parseSorting(val) {
2
+ if (val === "manual")
3
+ return "manual";
4
+ const regularChildrenSorting = [];
5
+ const arr = typeof val === "string" ? val.split(/\s*,\s*/) : val;
6
+ for (const item of arr) {
7
+ const [fieldName, direction] = item.split(/\s+/);
8
+ if ((direction !== "asc" && direction !== "desc") || !/^[a-zA-Z]+$/.test(fieldName)) {
9
+ throw new Error(`invalid child ordering '${item}'`);
10
+ }
11
+ regularChildrenSorting.push({ fieldName, direction });
12
+ }
13
+ return regularChildrenSorting;
14
+ }
15
+ //# sourceMappingURL=site-schema-public-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-schema-public-helpers.js","sourceRoot":"","sources":["../src/site-schema-public-helpers.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,YAAY,CAAC,GAAc;IACzC,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAEtC,MAAM,sBAAsB,GAAiB,EAAE,CAAC;IAChD,MAAM,GAAG,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACjE,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACpF,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,GAAG,CAAC,CAAC;QACtD,CAAC;QACD,sBAAsB,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,sBAAsB,CAAC;AAChC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paroicms/public-server-lib",
3
- "version": "0.45.1",
3
+ "version": "0.46.0",
4
4
  "description": "Common utilitaries for paroicms plugins (backend side).",
5
5
  "author": "Paroi Team",
6
6
  "repository": {
@@ -15,16 +15,16 @@
15
15
  "scripts": {
16
16
  "build": "npm run typeonly && npm run tsc",
17
17
  "tsc": "tsc",
18
- "typeonly": "typeonly --bundle dist/types.to.json -s ./typeonly",
18
+ "typeonly": "typeonly --bundle dist/types.to.json --source-dir typeonly",
19
19
  "test:watch": "vitest",
20
20
  "test": "vitest run",
21
21
  "clear": "rimraf dist/*",
22
22
  "dev": "tsc --watch --preserveWatchOutput"
23
23
  },
24
24
  "dependencies": {
25
- "@paroicms/internal-anywhere-lib": "1.34.1",
26
- "@paroicms/public-anywhere-lib": "0.35.1",
27
- "@paroicms/script-lib": "0.2.2",
25
+ "@paroicms/internal-anywhere-lib": "1.35.0",
26
+ "@paroicms/public-anywhere-lib": "0.36.0",
27
+ "@paroicms/script-lib": "0.3.0",
28
28
  "@typeonly/validator": "~1.1.2",
29
29
  "arktype": "~2.1.20"
30
30
  },
@@ -32,7 +32,7 @@
32
32
  "@types/node": "~24.0.1",
33
33
  "rimraf": "~6.0.1",
34
34
  "typeonly": "~1.1.3",
35
- "typescript": "~5.8.3",
35
+ "typescript": "~5.9.2",
36
36
  "vitest": "~3.2.3"
37
37
  },
38
38
  "files": [
@@ -17,6 +17,7 @@ import type {
17
17
  WithAttachedData,
18
18
  } from "@paroicms/public-anywhere-lib";
19
19
  import type Stream from "node:stream";
20
+ import type { DocumentsLoadDescriptor } from "./load-descriptor-types.d.ts";
20
21
 
21
22
  export interface PaHttpContext {
22
23
  req: PaHttpRequest;
@@ -88,15 +89,11 @@ export interface BackendPluginInitService extends PluginStaticConfiguration {
88
89
  handler: PluginLiquidFilterHandler,
89
90
  options?: { raw?: boolean },
90
91
  ): void;
91
- registerLiquidTag(
92
+ registerSetLiquidTagFunction(tagName: string, handler: PluginSetLiquidTagHandler): void;
93
+ registerOutLiquidTagFunction(
92
94
  tagName: string,
93
- tagKind: "assignToVar",
94
- handler: PluginLiquidTagReturnsVarHandler,
95
- ): void;
96
- registerLiquidTag(
97
- tagName: string,
98
- tagKind: "injectHtml",
99
- handler: PluginLiquidTagReturnsHtmlHandler,
95
+ handler: PluginOutLiquidTagHandler,
96
+ options?: { raw?: boolean },
100
97
  ): void;
101
98
  registerHook(
102
99
  hookName: "initialized",
@@ -160,15 +157,21 @@ export type PluginLiquidFilterHandler = (
160
157
  },
161
158
  ) => string | undefined | Promise<string | undefined>;
162
159
 
163
- export type PluginLiquidTagReturnsVarHandler = (
160
+ export type PluginSetLiquidTagHandler = (
164
161
  service: PluginRenderingService,
165
- parameters: { [key: string]: unknown },
166
- options: { variableName: string },
167
- ) => Generator;
162
+ options: {
163
+ positionedParameters: unknown[];
164
+ namedParameters: { [key: string]: unknown };
165
+ variableName: string;
166
+ },
167
+ ) => Generator<unknown, unknown, unknown>;
168
168
 
169
- export type PluginLiquidTagReturnsHtmlHandler = (
169
+ export type PluginOutLiquidTagHandler = (
170
170
  service: PluginRenderingService,
171
- parameters: { [key: string]: unknown },
171
+ options: {
172
+ positionedParameters: unknown[];
173
+ namedParameters: { [key: string]: unknown };
174
+ },
172
175
  ) => string | Promise<string>;
173
176
 
174
177
  export type PublicApiHandler = (
@@ -235,22 +238,20 @@ export interface PluginRenderingService {
235
238
  language: string;
236
239
  homeUrl: string;
237
240
  setRenderState(key: string, value: any): void;
238
- renderChildPartials(
239
- ctx: PaHttpContext,
240
- options: {
241
- params: PartialsParamsInput;
242
- parentDocumentId: ParsedLNodeId;
243
- labeledBy?: LabeledBy;
244
- },
245
- ): Promise<void>;
246
- renderSearchPartials(
247
- ctx: PaHttpContext,
248
- options: {
249
- language: string;
250
- words: string[];
251
- limit: number;
252
- start: number;
253
- templateName: string;
241
+
242
+ loadDocuments(loadDescriptor: DocumentsLoadDescriptor): Promise<TpDocument[]>;
243
+ loadDocuments(
244
+ loadDescriptor: DocumentsLoadDescriptor,
245
+ options: { withTotal: true },
246
+ ): Promise<{ documents: TpDocument[]; total: number }>;
247
+
248
+ renderDocument(templateName: string, doc: TpDocument): Promise<string>;
249
+
250
+ serve(
251
+ httpContext: PaHttpContext,
252
+ response: {
253
+ content: string;
254
+ contentType: string;
254
255
  },
255
256
  ): Promise<void>;
256
257
 
@@ -269,9 +270,10 @@ export interface PluginRenderingService {
269
270
  close(): Promise<void>;
270
271
  }
271
272
 
272
- export interface LabeledBy {
273
- termNodeId: string;
274
- fieldName: string;
273
+ /** This type is a stub for `TpDocPayload`. It represents a full `doc` payload for LiquidJS templates. */
274
+ export interface TpDocument {
275
+ kind: "routingDocument" | "regularDocument";
276
+ id: string;
275
277
  }
276
278
 
277
279
  export interface PublicDocument {
@@ -321,12 +323,6 @@ export interface AppLogger {
321
323
  debug(...messages: any[]): void;
322
324
  }
323
325
 
324
- export interface PartialsParamsInput {
325
- templateName: string;
326
- offset: number;
327
- limit: number;
328
- }
329
-
330
326
  export interface RegisteredSite {
331
327
  readonly fqdn: string;
332
328
  readonly siteName: string;
@@ -0,0 +1,43 @@
1
+ import type { ParsedLNodeId, ScSorting } from "@paroicms/public-anywhere-lib";
2
+
3
+ export type LoadDescriptor = DocumentsLoadDescriptor | OneDocumentLoadDescriptor;
4
+
5
+ export type DocumentsLoadDescriptor = ChildDocumentsLoadDescriptor | SearchDocumentsLoadDescriptor;
6
+
7
+ export interface ListBaseDescriptor {
8
+ offset?: number;
9
+ limit?: number;
10
+ sorting?: ScSorting;
11
+ labeledWith?: LabeledWithDescriptor;
12
+ }
13
+
14
+ export interface LabeledWithDescriptor {
15
+ fieldName: string;
16
+ termNodeId: string;
17
+ }
18
+
19
+ export interface ChildDocumentsLoadDescriptor extends ListBaseDescriptor {
20
+ load: "list";
21
+ nodeKind: "document";
22
+ descriptorName: "children";
23
+ parentDocumentId: ParsedLNodeId;
24
+ /**
25
+ * If omitted, an additional query to fetch the type name will be made to the database.
26
+ */
27
+ parentDocumentTypeName?: string;
28
+ }
29
+
30
+ export interface SearchDocumentsLoadDescriptor extends ListBaseDescriptor {
31
+ load: "list";
32
+ nodeKind: "document";
33
+ descriptorName: "search";
34
+ language: string;
35
+ words: string[];
36
+ }
37
+
38
+ export interface OneDocumentLoadDescriptor {
39
+ load: "one";
40
+ nodeKind: "document";
41
+ descriptorName: "id";
42
+ documentId: ParsedLNodeId;
43
+ }