@once-ui-system/core 1.7.12 → 1.7.13

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.
Files changed (80) hide show
  1. package/AGENTS.md +53 -0
  2. package/README.md +27 -0
  3. package/agent/once-ui-codegen.mdc +27 -0
  4. package/ai/catalog.json +2 -2
  5. package/ai/components/ContextMenu.json +2 -2
  6. package/ai/components/Table.json +17 -2
  7. package/ai/manifest.json +2 -2
  8. package/ai/spec.json +22 -7
  9. package/dist/AGENTS.md +53 -0
  10. package/dist/README.md +27 -0
  11. package/dist/agent/once-ui-codegen.mdc +27 -0
  12. package/dist/ai/catalog.json +2 -2
  13. package/dist/ai/components/ContextMenu.json +2 -2
  14. package/dist/ai/components/Table.json +17 -2
  15. package/dist/ai/manifest.json +2 -2
  16. package/dist/ai/spec.json +22 -7
  17. package/dist/components/ContextMenu.d.ts +2 -2
  18. package/dist/components/ContextMenu.d.ts.map +1 -1
  19. package/dist/components/ContextMenu.js +3 -3
  20. package/dist/components/ContextMenu.js.map +1 -1
  21. package/dist/components/ElementType.d.ts.map +1 -1
  22. package/dist/components/ElementType.js +6 -4
  23. package/dist/components/ElementType.js.map +1 -1
  24. package/dist/components/Media.d.ts.map +1 -1
  25. package/dist/components/Media.js +6 -3
  26. package/dist/components/Media.js.map +1 -1
  27. package/dist/components/MediaVideoPlayer.d.ts +12 -0
  28. package/dist/components/MediaVideoPlayer.d.ts.map +1 -0
  29. package/dist/components/MediaVideoPlayer.js +246 -0
  30. package/dist/components/MediaVideoPlayer.js.map +1 -0
  31. package/dist/components/MediaVideoPlayer.module.scss +90 -0
  32. package/dist/components/Table.d.ts +34 -6
  33. package/dist/components/Table.d.ts.map +1 -1
  34. package/dist/components/Table.js +114 -30
  35. package/dist/components/Table.js.map +1 -1
  36. package/dist/components/Table.module.scss +174 -3
  37. package/dist/components/ThemeInit.d.ts.map +1 -1
  38. package/dist/components/ThemeInit.js +2 -1
  39. package/dist/components/ThemeInit.js.map +1 -1
  40. package/dist/components/Timeline.d.ts +1 -1
  41. package/dist/components/Timeline.d.ts.map +1 -1
  42. package/dist/components/Timeline.js +16 -52
  43. package/dist/components/Timeline.js.map +1 -1
  44. package/dist/data/emoji-data.json +8 -0
  45. package/dist/icons.d.ts.map +1 -1
  46. package/dist/icons.js +7 -2
  47. package/dist/icons.js.map +1 -1
  48. package/dist/index.d.ts +0 -1
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +0 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/modules/code/CodeBlock.impl.d.ts.map +1 -1
  53. package/dist/modules/code/CodeBlock.impl.js +11 -5
  54. package/dist/modules/code/CodeBlock.impl.js.map +1 -1
  55. package/dist/modules/seo/Schema.d.ts.map +1 -1
  56. package/dist/modules/seo/Schema.js +3 -4
  57. package/dist/modules/seo/Schema.js.map +1 -1
  58. package/dist/package.json +22 -3
  59. package/dist/server/og-url-validation.d.ts +10 -0
  60. package/dist/server/og-url-validation.d.ts.map +1 -0
  61. package/dist/server/og-url-validation.js +234 -0
  62. package/dist/server/og-url-validation.js.map +1 -0
  63. package/dist/server/og-utils.d.ts +5 -2
  64. package/dist/server/og-utils.d.ts.map +1 -1
  65. package/dist/server/og-utils.js +39 -14
  66. package/dist/server/og-utils.js.map +1 -1
  67. package/dist/utils/index.d.ts +1 -0
  68. package/dist/utils/index.d.ts.map +1 -1
  69. package/dist/utils/index.js +1 -0
  70. package/dist/utils/index.js.map +1 -1
  71. package/dist/utils/safe-html.d.ts +19 -0
  72. package/dist/utils/safe-html.d.ts.map +1 -0
  73. package/dist/utils/safe-html.js +43 -0
  74. package/dist/utils/safe-html.js.map +1 -0
  75. package/package.json +23 -3
  76. package/scripts/copy-files.js +103 -0
  77. package/scripts/generate-ai-spec.js +464 -0
  78. package/scripts/generate-emoji-data.js +128 -0
  79. package/scripts/init-agent.js +156 -0
  80. package/scripts/validate-ai-code.js +149 -0
@@ -1,4 +1,5 @@
1
1
  import { NextResponse } from 'next/server';
2
+ import { fetchValidatedUrl, OGUrlValidationError, validateOgUrl, } from './og-url-validation';
2
3
  function decodeHTMLEntities(text) {
3
4
  return text.replace(/&(#?[a-zA-Z0-9]+);/g, (match, entity) => {
4
5
  const entities = {
@@ -21,16 +22,16 @@ function decodeHTMLEntities(text) {
21
22
  return entities[entity] || match;
22
23
  });
23
24
  }
24
- async function fetchWithTimeout(url, timeout = 5000, userAgent = 'Mozilla/5.0 (compatible; OG-Fetcher/1.0)') {
25
+ async function fetchWithTimeout(url, timeout = 5000, userAgent = 'Mozilla/5.0 (compatible; OG-Fetcher/1.0)', validationOptions = {}) {
25
26
  const controller = new AbortController();
26
27
  const timeoutId = setTimeout(() => controller.abort(), timeout);
27
28
  try {
28
- const response = await fetch(url, {
29
+ const response = await fetchValidatedUrl(url, {
29
30
  signal: controller.signal,
30
31
  headers: {
31
- 'User-Agent': userAgent
32
- }
33
- });
32
+ 'User-Agent': userAgent,
33
+ },
34
+ }, validationOptions);
34
35
  clearTimeout(timeoutId);
35
36
  return response;
36
37
  }
@@ -39,17 +40,30 @@ async function fetchWithTimeout(url, timeout = 5000, userAgent = 'Mozilla/5.0 (c
39
40
  throw error;
40
41
  }
41
42
  }
43
+ function validationErrorResponse() {
44
+ return NextResponse.json({ error: 'URL is not allowed' }, { status: 400 });
45
+ }
42
46
  export async function handleOGFetch(request, options = {}) {
43
- const { timeout = 5000, userAgent = 'Mozilla/5.0 (compatible; OG-Fetcher/1.0)', decodeEntities = true } = options;
47
+ const { timeout = 5000, userAgent = 'Mozilla/5.0 (compatible; OG-Fetcher/1.0)', decodeEntities = true, allowedDomains, } = options;
44
48
  const { searchParams } = new URL(request.url);
45
49
  const url = searchParams.get('url');
46
50
  if (!url) {
47
51
  return NextResponse.json({ error: 'URL parameter is required' }, { status: 400 });
48
52
  }
53
+ const validationOptions = { allowedDomains };
49
54
  try {
50
- const response = await fetchWithTimeout(url, timeout, userAgent);
55
+ await validateOgUrl(url, validationOptions);
56
+ }
57
+ catch (error) {
58
+ if (error instanceof OGUrlValidationError) {
59
+ return validationErrorResponse();
60
+ }
61
+ return validationErrorResponse();
62
+ }
63
+ try {
64
+ const response = await fetchWithTimeout(url, timeout, userAgent, validationOptions);
51
65
  if (!response.ok) {
52
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
66
+ throw new Error(`HTTP ${response.status}`);
53
67
  }
54
68
  const html = await response.text();
55
69
  const ogData = {
@@ -89,24 +103,34 @@ export async function handleOGFetch(request, options = {}) {
89
103
  }
90
104
  catch (error) {
91
105
  console.error('Error fetching OG data:', error);
92
- return NextResponse.json({ error: 'Failed to fetch Open Graph data', message: error instanceof Error ? error.message : 'Unknown error' }, { status: 500 });
106
+ return NextResponse.json({ error: 'Failed to fetch Open Graph data' }, { status: 500 });
93
107
  }
94
108
  }
95
109
  export async function handleOGProxy(request, options = {}) {
96
- const { userAgent = 'Mozilla/5.0 (compatible; OG-Proxy/1.0)', cacheMaxAge = 3600 } = options;
110
+ const { userAgent = 'Mozilla/5.0 (compatible; OG-Proxy/1.0)', cacheMaxAge = 3600, allowedDomains, } = options;
97
111
  const { searchParams } = new URL(request.url);
98
112
  const url = searchParams.get('url');
99
113
  if (!url) {
100
114
  return NextResponse.json({ error: 'URL parameter is required' }, { status: 400 });
101
115
  }
116
+ const validationOptions = { allowedDomains };
102
117
  try {
103
- const response = await fetch(url, {
118
+ await validateOgUrl(url, validationOptions);
119
+ }
120
+ catch (error) {
121
+ if (error instanceof OGUrlValidationError) {
122
+ return validationErrorResponse();
123
+ }
124
+ return validationErrorResponse();
125
+ }
126
+ try {
127
+ const response = await fetchValidatedUrl(url, {
104
128
  headers: {
105
129
  'User-Agent': userAgent,
106
130
  },
107
- });
131
+ }, validationOptions);
108
132
  if (!response.ok) {
109
- return NextResponse.json({ error: `Failed to fetch image: ${response.status}` }, { status: response.status });
133
+ return NextResponse.json({ error: 'Failed to fetch image' }, { status: response.status >= 400 && response.status < 600 ? response.status : 502 });
110
134
  }
111
135
  const contentType = response.headers.get('content-type') || 'image/jpeg';
112
136
  const buffer = await response.arrayBuffer();
@@ -119,7 +143,8 @@ export async function handleOGProxy(request, options = {}) {
119
143
  }
120
144
  catch (error) {
121
145
  console.error('Error proxying image:', error);
122
- return NextResponse.json({ error: 'Failed to proxy image', message: error instanceof Error ? error.message : 'Unknown error' }, { status: 500 });
146
+ return NextResponse.json({ error: 'Failed to proxy image' }, { status: 500 });
123
147
  }
124
148
  }
149
+ export { OGUrlValidationError, validateOgUrl } from './og-url-validation';
125
150
  //# sourceMappingURL=og-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"og-utils.js","sourceRoot":"","sources":["../../src/server/og-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"og-utils.js","sourceRoot":"","sources":["../../src/server/og-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EAEpB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAgB7B,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAC3D,MAAM,QAAQ,GAA8B;YAC1C,KAAK,EAAE,GAAG;YACV,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,GAAG;YACX,MAAM,EAAE,GAAG;YACX,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,GAAG;SACX,CAAC;QAEF,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;gBACpC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC/B,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,GAAW,EACX,OAAO,GAAG,IAAI,EACd,SAAS,GAAG,0CAA0C,EACtD,oBAA4C,EAAE;IAE9C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CACtC,GAAG,EACH;YACE,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE;gBACP,YAAY,EAAE,SAAS;aACxB;SACF,EACD,iBAAiB,CAClB,CAAC;QACF,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAgB,EAAE,UAA0B,EAAE;IAChF,MAAM,EACJ,OAAO,GAAG,IAAI,EACd,SAAS,GAAG,0CAA0C,EACtD,cAAc,GAAG,IAAI,EACrB,cAAc,GACf,GAAG,OAAO,CAAC;IACZ,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,iBAAiB,GAAG,EAAE,cAAc,EAAE,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;YAC1C,OAAO,uBAAuB,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,uBAAuB,EAAE,CAAC;IACnC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAEpF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,MAAM,MAAM,GAAW;YACrB,GAAG,EAAE,GAAG;YACR,KAAK,EAAE,EAAE;YACT,WAAW,EAAE,EAAE;YACf,KAAK,EAAE,EAAE;SACV,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/D,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;QAC3G,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,wEAAwE,CAAC;eACjG,IAAI,CAAC,KAAK,CAAC,wEAAwE,CAAC;eACpF,IAAI,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;QACjG,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,yEAAyE,CAAC;eACrG,IAAI,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;QAC3F,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;QACjH,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7C,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,YAAY,CAAC,IAAI,CACtB,EAAE,KAAK,EAAE,iCAAiC,EAAE,EAC5C,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;IACJ,CAAC;AACH,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAgB,EAAE,UAA0B,EAAE;IAChF,MAAM,EACJ,SAAS,GAAG,wCAAwC,EACpD,WAAW,GAAG,IAAI,EAClB,cAAc,GACf,GAAG,OAAO,CAAC;IACZ,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,iBAAiB,GAAG,EAAE,cAAc,EAAE,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;YAC1C,OAAO,uBAAuB,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,uBAAuB,EAAE,CAAC;IACnC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CACtC,GAAG,EACH;YACE,OAAO,EAAE;gBACP,YAAY,EAAE,SAAS;aACxB;SACF,EACD,iBAAiB,CAClB,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC,IAAI,CACtB,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAClC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CACpF,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC;QACzE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QAE5C,OAAO,IAAI,YAAY,CAAC,MAAM,EAAE;YAC9B,OAAO,EAAE;gBACP,cAAc,EAAE,WAAW;gBAC3B,eAAe,EAAE,mBAAmB,WAAW,EAAE;aAClD;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAC9C,OAAO,YAAY,CAAC,IAAI,CACtB,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAClC,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from "./devLogger";
2
2
  export * from "./MissingDependency";
3
3
  export * from "./dropdownState";
4
+ export * from "./safe-html";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export * from "./devLogger";
2
2
  export * from "./MissingDependency";
3
3
  export * from "./dropdownState";
4
+ export * from "./safe-html";
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Escapes HTML special characters for safe insertion into HTML text nodes
3
+ * or attributes when content is not already sanitized HTML.
4
+ */
5
+ export declare function escapeHtml(text: string): string;
6
+ /**
7
+ * Serializes a value for safe embedding inside HTML <script> tags.
8
+ * JSON.stringify escapes quotes and backslashes but not `<`, which allows
9
+ * `</script>` breakout when prop values are attacker-controlled.
10
+ */
11
+ export declare function safeScriptJson(value: unknown): string;
12
+ /**
13
+ * Returns a trimmed href when it is safe to use as a navigation target,
14
+ * otherwise `undefined`. Blocks `javascript:`, `data:`, and other non-allowlisted
15
+ * schemes (including variants with embedded whitespace/control characters).
16
+ * Scheme-less values (relative paths, `#hash`, `?query`) are allowed.
17
+ */
18
+ export declare function sanitizeHref(href: string | null | undefined): string | undefined;
19
+ //# sourceMappingURL=safe-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-html.d.ts","sourceRoot":"","sources":["../../src/utils/safe-html.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAErD;AAID;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAchF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Escapes HTML special characters for safe insertion into HTML text nodes
3
+ * or attributes when content is not already sanitized HTML.
4
+ */
5
+ export function escapeHtml(text) {
6
+ return text
7
+ .replace(/&/g, "&amp;")
8
+ .replace(/</g, "&lt;")
9
+ .replace(/>/g, "&gt;")
10
+ .replace(/"/g, "&quot;")
11
+ .replace(/'/g, "&#39;");
12
+ }
13
+ /**
14
+ * Serializes a value for safe embedding inside HTML <script> tags.
15
+ * JSON.stringify escapes quotes and backslashes but not `<`, which allows
16
+ * `</script>` breakout when prop values are attacker-controlled.
17
+ */
18
+ export function safeScriptJson(value) {
19
+ return JSON.stringify(value).replace(/</g, "\\u003c");
20
+ }
21
+ const ALLOWED_HREF_SCHEMES = new Set(["http", "https", "mailto", "tel", "sms"]);
22
+ /**
23
+ * Returns a trimmed href when it is safe to use as a navigation target,
24
+ * otherwise `undefined`. Blocks `javascript:`, `data:`, and other non-allowlisted
25
+ * schemes (including variants with embedded whitespace/control characters).
26
+ * Scheme-less values (relative paths, `#hash`, `?query`) are allowed.
27
+ */
28
+ export function sanitizeHref(href) {
29
+ if (href == null)
30
+ return undefined;
31
+ const trimmed = href.trim();
32
+ if (!trimmed)
33
+ return undefined;
34
+ const forScheme = trimmed.replace(/[\u0000-\u001F\u007F\s]/g, "");
35
+ const schemeMatch = forScheme.match(/^([a-zA-Z][a-zA-Z0-9+.-]*):/);
36
+ if (schemeMatch) {
37
+ const scheme = schemeMatch[1].toLowerCase();
38
+ if (!ALLOWED_HREF_SCHEMES.has(scheme))
39
+ return undefined;
40
+ }
41
+ return trimmed;
42
+ }
43
+ //# sourceMappingURL=safe-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-html.js","sourceRoot":"","sources":["../../src/utils/safe-html.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAA+B;IAC1D,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAEnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACnE,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,SAAS,CAAC;IAC1D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@once-ui-system/core",
3
- "version": "1.7.12",
3
+ "version": "1.7.13",
4
4
  "description": "Once UI for Next.js NPM package",
5
5
  "keywords": [
6
6
  "once-ui",
@@ -9,7 +9,10 @@
9
9
  "scss",
10
10
  "design system",
11
11
  "design framework",
12
- "nextjs design system"
12
+ "nextjs design system",
13
+ "ai",
14
+ "agent",
15
+ "codegen"
13
16
  ],
14
17
  "author": "Once UI",
15
18
  "license": "MIT",
@@ -22,6 +25,21 @@
22
25
  "url": "https://github.com/once-ui-system/core/issues"
23
26
  },
24
27
  "homepage": "https://docs.once-ui.com",
28
+ "onceUi": {
29
+ "harness": "./ai/manifest.json",
30
+ "bootstrap": [
31
+ "./ai/rules.compact.md",
32
+ "./ai/catalog.json"
33
+ ],
34
+ "tasks": "./ai/tasks/index.json",
35
+ "validate": "./scripts/validate-ai-code.js",
36
+ "initAgent": "./scripts/init-agent.js",
37
+ "docs": "https://docs.once-ui.com/once-ui/ai-coding"
38
+ },
39
+ "bin": {
40
+ "once-ui-init-agent": "./scripts/init-agent.js",
41
+ "once-ui-validate-ai-code": "./scripts/validate-ai-code.js"
42
+ },
25
43
  "main": "dist/index.js",
26
44
  "exports": {
27
45
  ".": {
@@ -80,7 +98,8 @@
80
98
  "./ai/tasks/*": "./ai/tasks/*",
81
99
  "./ai/components/*": "./ai/components/*",
82
100
  "./ai/examples/*": "./ai/examples/*",
83
- "./ai/examples/blocks/*": "./ai/examples/blocks/*"
101
+ "./ai/examples/blocks/*": "./ai/examples/blocks/*",
102
+ "./AGENTS.md": "./AGENTS.md"
84
103
  },
85
104
  "scripts": {
86
105
  "build": "pnpm clean && pnpm generate-emoji-data && pnpm generate-ai-spec && tsc --project tsconfig.build.json && pnpm copy-files && pnpm build:css",
@@ -97,6 +116,7 @@
97
116
  "prepack": "pnpm build",
98
117
  "generate-emoji-data": "node scripts/generate-emoji-data.js",
99
118
  "generate-ai-spec": "node scripts/generate-ai-spec.js",
119
+ "init-agent": "node scripts/init-agent.js",
100
120
  "validate-ai-code": "node scripts/validate-ai-code.js"
101
121
  },
102
122
  "dependencies": {
@@ -0,0 +1,103 @@
1
+ const fs = require("fs");
2
+ const path = require("path");
3
+
4
+ // Function to copy directory recursively
5
+ function copyDir(src, dest) {
6
+ // Create destination directory if it doesn't exist
7
+ if (!fs.existsSync(dest)) {
8
+ fs.mkdirSync(dest, { recursive: true });
9
+ }
10
+
11
+ // Read source directory
12
+ const entries = fs.readdirSync(src, { withFileTypes: true });
13
+
14
+ for (const entry of entries) {
15
+ const srcPath = path.join(src, entry.name);
16
+ const destPath = path.join(dest, entry.name);
17
+
18
+ if (entry.isDirectory()) {
19
+ // Recursively copy directory
20
+ copyDir(srcPath, destPath);
21
+ } else {
22
+ // Copy file if it's not a TypeScript file (TS files are handled by tsc)
23
+ const ext = path.extname(entry.name).toLowerCase();
24
+ if (![".ts", ".tsx"].includes(ext)) {
25
+ fs.copyFileSync(srcPath, destPath);
26
+ }
27
+ }
28
+ }
29
+ }
30
+
31
+ // Copy all style files and other assets
32
+ const srcDir = path.resolve(__dirname, "../src");
33
+ const destDir = path.resolve(__dirname, "../dist");
34
+
35
+ // Copy package.json with modifications
36
+ const packageJson = require("../package.json");
37
+
38
+ // Remove unnecessary fields for the published package
39
+ const fieldsToRemove = ["scripts", "devDependencies", "overrides"];
40
+
41
+ fieldsToRemove.forEach((field) => {
42
+ delete packageJson[field];
43
+ });
44
+
45
+ // Move some dependencies to peerDependencies
46
+ const peerDeps = {
47
+ react: packageJson.dependencies.react,
48
+ "react-dom": packageJson.dependencies["react-dom"],
49
+ next: packageJson.dependencies.next,
50
+ };
51
+
52
+ // Add peer dependencies
53
+ packageJson.peerDependencies = {
54
+ ...peerDeps,
55
+ react: ">=18.0.0",
56
+ "react-dom": ">=18.0.0",
57
+ next: ">=13.0.0",
58
+ };
59
+
60
+ // Remove peer deps from dependencies
61
+ Object.keys(peerDeps).forEach((dep) => {
62
+ delete packageJson.dependencies[dep];
63
+ });
64
+
65
+ // Write the modified package.json to dist
66
+ fs.writeFileSync(path.resolve(destDir, "package.json"), JSON.stringify(packageJson, null, 2));
67
+
68
+ // Copy README and AGENTS.md
69
+ if (fs.existsSync(path.resolve(__dirname, "../README.md"))) {
70
+ fs.copyFileSync(path.resolve(__dirname, "../README.md"), path.resolve(destDir, "README.md"));
71
+ }
72
+ if (fs.existsSync(path.resolve(__dirname, "../AGENTS.md"))) {
73
+ fs.copyFileSync(path.resolve(__dirname, "../AGENTS.md"), path.resolve(destDir, "AGENTS.md"));
74
+ }
75
+
76
+ // Copy CLI scripts and agent templates for npm publish
77
+ const scriptsDir = path.resolve(destDir, "scripts");
78
+ fs.mkdirSync(scriptsDir, { recursive: true });
79
+ for (const script of ["init-agent.js", "validate-ai-code.js"]) {
80
+ fs.copyFileSync(
81
+ path.resolve(__dirname, script),
82
+ path.join(scriptsDir, script),
83
+ );
84
+ }
85
+ const agentSrc = path.resolve(__dirname, "../agent");
86
+ const agentDest = path.resolve(destDir, "agent");
87
+ if (fs.existsSync(agentSrc)) {
88
+ copyDir(agentSrc, agentDest);
89
+ }
90
+
91
+ // Copy style files
92
+ console.log("Copying style files and other assets...");
93
+ copyDir(srcDir, destDir);
94
+
95
+ // Copy AI harness artifacts for npm publish
96
+ const aiDir = path.resolve(__dirname, "../ai");
97
+ const aiDest = path.resolve(destDir, "ai");
98
+ if (fs.existsSync(aiDir)) {
99
+ console.log("Copying AI artifacts...");
100
+ copyDir(aiDir, aiDest);
101
+ }
102
+
103
+ console.log("Files copied successfully!");