@dani-builder/strapi-client 0.13.0 → 0.15.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 CHANGED
@@ -34,6 +34,23 @@ const global = await getGlobal(strapi);
34
34
  const draft = await getPageBySlug(strapi, "about", { status: "draft" });
35
35
  ```
36
36
 
37
+ ## Site settings and analytics
38
+
39
+ `getSiteSettings` populates analytics settings automatically. For a custom REST
40
+ request, include the shared populate builder:
41
+
42
+ ```ts
43
+ import { getSiteSettingsPopulate } from "@dani-builder/strapi-client/populate";
44
+ import type { SiteSettingsDocument, StrapiResponse } from "@dani-builder/strapi-client/types";
45
+
46
+ const { data } = await strapi.get<StrapiResponse<SiteSettingsDocument>>(
47
+ "/api/builder/site-setting",
48
+ { params: { populate: getSiteSettingsPopulate() } },
49
+ );
50
+ const configs = data.data.analyticsSettings;
51
+ // Pass configs to AnalyticsProvider from @dani-builder/blocks/analytics.
52
+ ```
53
+
37
54
  ## Sub-exports
38
55
 
39
56
  | Import | Contents |
@@ -156,3 +173,46 @@ nodes, and returns an empty string for absent/non-array input. The outer result
156
173
  is trimmed. `faqPageJsonLd` accepts a readonly array of question/answer records,
157
174
  uses that extraction for answers, trims questions and omits blank pairs. The result
158
175
  uses `Question` and `Answer` entities; return `null` means no FAQ script is needed.
176
+
177
+ ## robots.txt
178
+
179
+ Site Settings has optional `robotsTxt` text. Saves accept `User-agent`, `Allow`,
180
+ `Disallow`, `Sitemap`, and `Crawl-delay` directive names (case insensitive), followed
181
+ by a colon, plus comments and blank lines. Invalid lines return a validation error
182
+ with the field name and original one-based line number. This is basic directive
183
+ syntax validation; directive values and crawler behavior remain author-owned.
184
+
185
+ `resolveRobotsTxt(siteSetting, { indexingAllowed, siteUrl, defaultRules })` is
186
+ exported from the root and `/utils`. Null, absent, empty, or whitespace-only CMS
187
+ text uses the consumer's `defaultRules`. With indexing enabled, it preserves those
188
+ rules and appends `Sitemap: <siteUrl>/sitemap.xml` unless an active, case-insensitive
189
+ `Sitemap` directive already exists. Trailing slashes are removed from `siteUrl`;
190
+ commented sitemap directives do not count. With `indexingAllowed: false`, it always
191
+ returns exactly `User-agent: *\nDisallow: /`, without a sitemap.
192
+
193
+ Serve the returned string from a plain-text route, for example in Next.js at
194
+ `app/robots.txt/route.ts`:
195
+
196
+ ```ts
197
+ import {
198
+ getSiteSettings,
199
+ resolveRobotsTxt,
200
+ } from "@dani-builder/strapi-client";
201
+ import { client } from "@/lib/strapi";
202
+ import { indexingAllowed, siteUrl } from "@/lib/site-config";
203
+
204
+ export async function GET() {
205
+ const siteSetting = await getSiteSettings(client);
206
+ const body = resolveRobotsTxt(siteSetting, {
207
+ indexingAllowed,
208
+ siteUrl,
209
+ defaultRules: "User-agent: *\nAllow: /",
210
+ });
211
+ return new Response(body, {
212
+ headers: { "Content-Type": "text/plain; charset=utf-8" },
213
+ });
214
+ }
215
+ ```
216
+
217
+ The consumer controls indexing policy and must supply its own client and site
218
+ configuration. Avoid also defining a framework `robots.ts` route at the same URL.
package/dist/index.d.ts CHANGED
@@ -4,8 +4,8 @@ export type { StrapiClientConfig } from "./client/index.js";
4
4
  export { coreBlockPopulates, seoPopulate, footerPopulate, getPagePopulate, getPageListPopulate, getGlobalPopulate, getArticlePopulate, getArticleListPopulate, getNavigationPopulate, getSiteSettingsPopulate, getFaqPopulate, getCategoryPopulate, } from "./populate/index.js";
5
5
  export { getPage, getPageBySlug, listPages, listPagesRest, getArticle, getArticleBySlug, listArticles, getGlobal, getGlobalRest, getNavigation, getSiteSettings, listFaqs, listCategories, listTags, listAuthors, getAuthorBySlug, listSeries, getSeriesBySlug, postInquiry, } from "./api/index.js";
6
6
  export type { PageQueryOptions, PageListOptions, ArticleQueryOptions, ArticleListOptions, GlobalQueryOptions, NavigationQueryOptions, FaqListOptions, CategoryListOptions, TagListOptions, AuthorListOptions, SeriesListOptions, } from "./api/index.js";
7
- export { getMediaUrl, getAssetUrl, resolveSeo, siteVerificationMeta, serializeJsonLd, mergeStructuredData, blocksToPlainText, faqPageJsonLd, } from "./utils/index.js";
8
- export type { SeoDefaults, SeoInput, ResolvedSeo, ResolvedSocialMetadata, VerificationMeta, SiteVerificationSettings, StructuredDataObject, StructuredDataExclusion, StructuredDataMergeResult, FaqJsonLdInput, FaqPageJsonLd, } from "./utils/index.js";
7
+ export { getMediaUrl, getAssetUrl, resolveSeo, siteVerificationMeta, serializeJsonLd, mergeStructuredData, blocksToPlainText, faqPageJsonLd, resolveRobotsTxt, } from "./utils/index.js";
8
+ export type { SeoDefaults, SeoInput, ResolvedSeo, ResolvedSocialMetadata, VerificationMeta, SiteVerificationSettings, StructuredDataObject, StructuredDataExclusion, StructuredDataMergeResult, FaqJsonLdInput, FaqPageJsonLd, ResolveRobotsTxtOptions, } from "./utils/index.js";
9
9
  export { createAgentClient, AgentClientError, } from "./agent/create-agent-client.js";
10
10
  export type { AgentClientConfig, AgentSessionCredentials, AgentRestoreOptions, AgentChatOptions, AgentTurn, } from "./agent/create-agent-client.js";
11
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,wBAAwB,EACxB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,cAAc,EACd,YAAY,EACZ,SAAS,EACT,aAAa,EACb,UAAU,EACV,SAAS,EACT,UAAU,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,IAAI,EACJ,eAAe,EACf,GAAG,EACH,YAAY,EACZ,aAAa,EACb,WAAW,EACX,aAAa,EACb,UAAU,EACV,SAAS,EACT,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,OAAO,EACP,MAAM,EACN,SAAS,EACT,aAAa,EACb,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,OAAO,EACP,eAAe,EACf,GAAG,EACH,WAAW,EACX,OAAO,EACP,eAAe,EACf,eAAe,EACf,QAAQ,EACR,gBAAgB,EAChB,GAAG,EACH,WAAW,EACX,MAAM,EACN,cAAc,EACd,MAAM,EACN,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,MAAM,EACN,cAAc,EACd,cAAc,EACd,YAAY,EACZ,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,cAAc,EACd,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,aAAa,EACb,aAAa,EACb,eAAe,EACf,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,WAAW,EACX,eAAe,EACf,UAAU,EACV,eAAe,EACf,WAAW,GACZ,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,WAAW,EACX,QAAQ,EACR,WAAW,EACX,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,EACzB,cAAc,EACd,aAAa,GACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,EAChB,SAAS,GACV,MAAM,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -6,6 +6,6 @@ export { coreBlockPopulates, seoPopulate, footerPopulate, getPagePopulate, getPa
6
6
  // API
7
7
  export { getPage, getPageBySlug, listPages, listPagesRest, getArticle, getArticleBySlug, listArticles, getGlobal, getGlobalRest, getNavigation, getSiteSettings, listFaqs, listCategories, listTags, listAuthors, getAuthorBySlug, listSeries, getSeriesBySlug, postInquiry, } from "./api/index.js";
8
8
  // Utils
9
- export { getMediaUrl, getAssetUrl, resolveSeo, siteVerificationMeta, serializeJsonLd, mergeStructuredData, blocksToPlainText, faqPageJsonLd, } from "./utils/index.js";
9
+ export { getMediaUrl, getAssetUrl, resolveSeo, siteVerificationMeta, serializeJsonLd, mergeStructuredData, blocksToPlainText, faqPageJsonLd, resolveRobotsTxt, } from "./utils/index.js";
10
10
  export { createAgentClient, AgentClientError, } from "./agent/create-agent-client.js";
11
11
  //# 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":"AAAA,0DAA0D;AAsF1D,SAAS;AACT,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,aAAa,GACd,MAAM,mBAAmB,CAAC;AAG3B,WAAW;AACX,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,cAAc,EACd,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,MAAM;AACN,OAAO,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,aAAa,EACb,aAAa,EACb,eAAe,EACf,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,WAAW,EACX,eAAe,EACf,UAAU,EACV,eAAe,EACf,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAexB,QAAQ;AACR,OAAO,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAe1B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAsF1D,SAAS;AACT,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,aAAa,GACd,MAAM,mBAAmB,CAAC;AAG3B,WAAW;AACX,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,cAAc,EACd,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,MAAM;AACN,OAAO,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,aAAa,EACb,aAAa,EACb,eAAe,EACf,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,WAAW,EACX,eAAe,EACf,UAAU,EACV,eAAe,EACf,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAexB,QAAQ;AACR,OAAO,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAgB1B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { StrapiDocument } from '../strapi.js';
2
2
  import type { AnalyticsSetting, BrandColors, ChatbotSetting, SiteVerification } from '../components/shared.js';
3
3
  export interface SiteSettings {
4
+ robotsTxt?: string | null;
4
5
  analyticsSettings: AnalyticsSetting[];
5
6
  chatbot: ChatbotSetting | null;
6
7
  siteVerifications: SiteVerification[];
@@ -1 +1 @@
1
- {"version":3,"file":"site-settings.d.ts","sourceRoot":"","sources":["../../../src/types/content-types/site-settings.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE/G,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,YAAY,CAAC"}
1
+ {"version":3,"file":"site-settings.d.ts","sourceRoot":"","sources":["../../../src/types/content-types/site-settings.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE/G,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,YAAY,CAAC"}
@@ -5,4 +5,6 @@ export { serializeJsonLd, mergeStructuredData } from "./structured-data.js";
5
5
  export type { StructuredDataObject, StructuredDataExclusion, StructuredDataMergeResult, } from "./structured-data.js";
6
6
  export { blocksToPlainText, faqPageJsonLd } from "./faq.js";
7
7
  export type { FaqJsonLdInput, FaqPageJsonLd } from "./faq.js";
8
+ export { resolveRobotsTxt } from "./robots-txt.js";
9
+ export type { ResolveRobotsTxtOptions } from "./robots-txt.js";
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC5D,YAAY,EACV,WAAW,EACX,QAAQ,EACR,WAAW,EACX,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,YAAY,EACV,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC5D,YAAY,EACV,WAAW,EACX,QAAQ,EACR,WAAW,EACX,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,YAAY,EACV,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -2,4 +2,5 @@ export { getMediaUrl, getAssetUrl } from "./media.js";
2
2
  export { resolveSeo, siteVerificationMeta } from "./seo.js";
3
3
  export { serializeJsonLd, mergeStructuredData } from "./structured-data.js";
4
4
  export { blocksToPlainText, faqPageJsonLd } from "./faq.js";
5
+ export { resolveRobotsTxt } from "./robots-txt.js";
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAS5D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAM5E,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAS5D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAM5E,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { SiteSettings } from "../types/content-types/site-settings.js";
2
+ export interface ResolveRobotsTxtOptions {
3
+ indexingAllowed: boolean;
4
+ siteUrl: string;
5
+ defaultRules: string;
6
+ }
7
+ /** Resolve CMS rules with the consumer's indexing policy and sitemap URL. */
8
+ export declare function resolveRobotsTxt(siteSetting: Pick<SiteSettings, "robotsTxt"> | null | undefined, { indexingAllowed, siteUrl, defaultRules }: ResolveRobotsTxtOptions): string;
9
+ //# sourceMappingURL=robots-txt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robots-txt.d.ts","sourceRoot":"","sources":["../../src/utils/robots-txt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAE5E,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,IAAI,GAAG,SAAS,EAC/D,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,uBAAuB,GAClE,MAAM,CAcR"}
@@ -0,0 +1,17 @@
1
+ /** Resolve CMS rules with the consumer's indexing policy and sitemap URL. */
2
+ export function resolveRobotsTxt(siteSetting, { indexingAllowed, siteUrl, defaultRules }) {
3
+ if (!indexingAllowed)
4
+ return "User-agent: *\nDisallow: /";
5
+ const customRules = siteSetting?.robotsTxt;
6
+ const rules = customRules?.trim() ? customRules : defaultRules;
7
+ const hasSitemap = rules
8
+ .split(/\r\n|\n|\r/)
9
+ .some((line) => /^\s*sitemap\s*:/i.test(line));
10
+ if (hasSitemap)
11
+ return rules;
12
+ const sitemap = `Sitemap: ${siteUrl.replace(/\/+$/, "")}/sitemap.xml`;
13
+ return rules
14
+ ? `${rules}${/[\r\n]$/.test(rules) ? "" : "\n"}${sitemap}`
15
+ : sitemap;
16
+ }
17
+ //# sourceMappingURL=robots-txt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robots-txt.js","sourceRoot":"","sources":["../../src/utils/robots-txt.ts"],"names":[],"mappings":"AAQA,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAC9B,WAA+D,EAC/D,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,EAA2B;IAEnE,IAAI,CAAC,eAAe;QAAE,OAAO,4BAA4B,CAAC;IAE1D,MAAM,WAAW,GAAG,WAAW,EAAE,SAAS,CAAC;IAC3C,MAAM,KAAK,GAAG,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;IAC/D,MAAM,UAAU,GAAG,KAAK;SACrB,KAAK,CAAC,YAAY,CAAC;SACnB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,IAAI,UAAU;QAAE,OAAO,KAAK,CAAC;IAE7B,MAAM,OAAO,GAAG,YAAY,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC;IACtE,OAAO,KAAK;QACV,CAAC,CAAC,GAAG,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,OAAO,EAAE;QAC1D,CAAC,CAAC,OAAO,CAAC;AACd,CAAC"}
@@ -45,7 +45,7 @@ Reusable sub-components referenced by blocks and content types.
45
45
  |---|---|---|---|---|
46
46
  | `provider` | enumeration | yes | — | `google-tag-manager`, `google-analytics`, `matomo` |
47
47
  | `trackingId` | string | yes | — | — |
48
- | `customDomain` | string | — | — | — |
48
+ | `customDomain` | string | — | — | regex `^(?![\s\S]*[\s<>"'\x60\\])https?://(?:\[[0-9A-Fa-f:]+\]\|[^/@:?#\[\]]+)(?::\d+)?(?:[/?#][\s\S]*)?$` |
49
49
  | `enabled` | boolean | — | `true` | — |
50
50
 
51
51
  ## Bento Item
@@ -186,6 +186,7 @@ Operational settings for analytics, chatbot, and site verification
186
186
 
187
187
  | Attribute | Type | Required | Default | Notes |
188
188
  |---|---|---|---|---|
189
+ | `robotsTxt` | text | — | — | — |
189
190
  | `analyticsSettings` | component `shared.analytics-setting` (repeatable) | — | — | — |
190
191
  | `chatbot` | component `shared.chatbot-setting` | — | — | — |
191
192
  | `siteVerifications` | component `shared.site-verification` (repeatable) | — | — | — |
@@ -199,6 +200,6 @@ Article tag with optional color
199
200
  |---|---|---|---|---|
200
201
  | `name` | string | yes | — | — |
201
202
  | `slug` | uid ← `name` | yes | — | — |
202
- | `color` | customField | — | — | custom field `plugin::color-picker.color` |
203
+ | `color` | customField | — | — | custom field `plugin::color-picker.color` · regex `^#([A-Fa-f0-9]{6}\|[A-Fa-f0-9]{3})$` |
203
204
  | `description` | text | — | — | — |
204
205
  | `articles` | relation `manyToMany` → `plugin::builder.article` | — | — | — |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dani-builder/strapi-client",
3
- "version": "0.13.0",
3
+ "version": "0.15.0",
4
4
  "description": "TypeScript client for Daniworks Builder CMS (Strapi v5)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -68,8 +68,8 @@
68
68
  "typescript": "^6.0.3",
69
69
  "@types/node": "^26",
70
70
  "@dani-builder/agent-contract-build": "npm:@dani-builder/agent-contract@0.6.0",
71
- "@repo/eslint-config": "0.0.0",
72
- "@repo/typescript-config": "0.0.0"
71
+ "@repo/typescript-config": "0.0.0",
72
+ "@repo/eslint-config": "0.0.0"
73
73
  },
74
74
  "keywords": [
75
75
  "strapi",