oc 0.50.27 → 0.50.28

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 (55) hide show
  1. package/.github/workflows/node.js.yml +1 -1
  2. package/CHANGELOG.md +8 -0
  3. package/dist/cli/commands.d.ts +19 -0
  4. package/dist/cli/commands.js +19 -0
  5. package/dist/cli/domain/ocConfig.d.ts +16 -0
  6. package/dist/cli/domain/ocConfig.js +3 -1
  7. package/dist/cli/domain/registry.d.ts +4 -0
  8. package/dist/cli/domain/registry.js +41 -0
  9. package/dist/cli/facade/dev.js +29 -20
  10. package/dist/cli/facade/validate.d.ts +20 -0
  11. package/dist/cli/facade/validate.js +127 -0
  12. package/dist/cli/index.js +3 -1
  13. package/dist/components/oc-client/_package/package.json +4 -4
  14. package/dist/components/oc-client/_package/server.js +1 -1
  15. package/dist/components/oc-client/_package/src/oc-client.js +2 -2
  16. package/dist/components/oc-client/_package/src/oc-client.min.js +1 -1
  17. package/dist/components/oc-client/package.json +1 -1
  18. package/dist/components/oc-client/src/oc-client.js +2 -2
  19. package/dist/components/oc-client/src/oc-client.min.js +1 -1
  20. package/dist/registry/domain/options-sanitiser.d.ts +1 -0
  21. package/dist/registry/domain/options-sanitiser.js +55 -1
  22. package/dist/registry/domain/validators/registry-configuration.js +4 -2
  23. package/dist/registry/index.js +1 -1
  24. package/dist/registry/router.js +15 -3
  25. package/dist/registry/routes/component-info.js +9 -2
  26. package/dist/registry/routes/component-preview.js +1 -0
  27. package/dist/registry/routes/component.js +7 -0
  28. package/dist/registry/routes/components.js +14 -0
  29. package/dist/registry/routes/helpers/format-error-stack.d.ts +7 -0
  30. package/dist/registry/routes/helpers/format-error-stack.js +172 -0
  31. package/dist/registry/routes/helpers/get-component.d.ts +7 -1
  32. package/dist/registry/routes/helpers/get-component.js +37 -5
  33. package/dist/registry/routes/validate.d.ts +2 -0
  34. package/dist/registry/routes/validate.js +153 -0
  35. package/dist/registry/views/info.js +10 -1
  36. package/dist/registry/views/partials/component-author.js +1 -1
  37. package/dist/registry/views/partials/component-parameters.d.ts +2 -1
  38. package/dist/registry/views/partials/component-parameters.js +20 -3
  39. package/dist/registry/views/partials/component-versions.js +1 -1
  40. package/dist/registry/views/partials/components-dependencies.js +1 -1
  41. package/dist/registry/views/partials/components-list.js +2 -2
  42. package/dist/registry/views/partials/components-templates.js +2 -2
  43. package/dist/registry/views/partials/layout.js +1 -1
  44. package/dist/registry/views/partials/property.js +2 -2
  45. package/dist/registry/views/preview.d.ts +1 -0
  46. package/dist/registry/views/preview.js +256 -3
  47. package/dist/registry/views/static/info.d.ts +1 -1
  48. package/dist/registry/views/static/info.js +62 -0
  49. package/dist/registry/views/static/style.d.ts +1 -1
  50. package/dist/registry/views/static/style.js +1 -1
  51. package/dist/resources/index.d.ts +3 -1
  52. package/dist/resources/index.js +3 -1
  53. package/dist/types.d.ts +14 -1
  54. package/logintervals.md +1 -1
  55. package/package.json +3 -2
@@ -15,7 +15,7 @@ jobs:
15
15
 
16
16
  strategy:
17
17
  matrix:
18
- node-version: [18.x, 20.x, 22.x]
18
+ node-version: [20.x, 22.x, 24.x]
19
19
  # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
20
20
 
21
21
  steps:
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  ## Change Log
2
2
 
3
+ ### v0.50.28
4
+ - [#1442](https://github.com/opencomponents/oc/pull/1442) add routes option in oc.json
5
+ - [#1441](https://github.com/opencomponents/oc/pull/1441) add preload option
6
+ - [#1440](https://github.com/opencomponents/oc/pull/1440) validate command
7
+ - [#1439](https://github.com/opencomponents/oc/pull/1439) add editable fields
8
+ - [#1436](https://github.com/opencomponents/oc/pull/1436) add preview overlay
9
+ - [#1438](https://github.com/opencomponents/oc/pull/1438) feat: add setCookie functionality to component context
10
+
3
11
  ### v0.50.27
4
12
  - [#1435](https://github.com/opencomponents/oc/pull/1435) Fix loading info correctly
5
13
 
@@ -132,6 +132,25 @@ declare const _default: {
132
132
  description: string;
133
133
  usage: string;
134
134
  };
135
+ validate: {
136
+ cmd: string;
137
+ example: {
138
+ cmd: string;
139
+ };
140
+ options: {
141
+ skipPackage: {
142
+ boolean: boolean;
143
+ description: string;
144
+ default: boolean;
145
+ };
146
+ registries: {
147
+ array: boolean;
148
+ description: string;
149
+ };
150
+ };
151
+ description: string;
152
+ usage: string;
153
+ };
135
154
  registry: {
136
155
  cmd: string;
137
156
  description: string;
@@ -132,6 +132,25 @@ exports.default = {
132
132
  description: 'Publish a component',
133
133
  usage: 'Usage: $0 publish <componentPath>'
134
134
  },
135
+ validate: {
136
+ cmd: 'validate <componentPath>',
137
+ example: {
138
+ cmd: '$0 validate my-new-component/'
139
+ },
140
+ options: {
141
+ skipPackage: {
142
+ boolean: true,
143
+ description: 'Skip packaging step and validate existing package.json',
144
+ default: false
145
+ },
146
+ registries: {
147
+ array: true,
148
+ description: 'List of registries to validate against. This setting will take precedence over oc.json file'
149
+ }
150
+ },
151
+ description: 'Validate a component against registry requirements without publishing',
152
+ usage: 'Usage: $0 validate <componentPath>'
153
+ },
135
154
  registry: {
136
155
  cmd: 'registry <command>',
137
156
  description: 'Manage oc registries in the current project',
@@ -5,6 +5,16 @@ export interface OpenComponentsConfig {
5
5
  registries?: string[];
6
6
  /** Development-specific configuration settings */
7
7
  development?: {
8
+ /** Additional Express routes to mount on the registry application */
9
+ routes?: Array<{
10
+ route: string;
11
+ method: string;
12
+ handler: string;
13
+ }>;
14
+ /** JavaScript code to be included in the preview HTML's <head> section.
15
+ * Can be either a filepath to a JS script or inline JavaScript code.
16
+ */
17
+ preload?: string;
8
18
  /** Fallback configuration for when components cannot be found locally */
9
19
  fallback?: {
10
20
  /** URL of the fallback registry to use when components cannot be found locally */
@@ -35,6 +45,12 @@ type ParsedConfig = {
35
45
  sourcePath?: string;
36
46
  registries: string[];
37
47
  development: {
48
+ routes?: Array<{
49
+ route: string;
50
+ method: string;
51
+ handler: string;
52
+ }>;
53
+ preload?: string;
38
54
  plugins: {
39
55
  dynamic?: Record<string, string>;
40
56
  static?: Record<string, string>;
@@ -30,8 +30,10 @@ function parseConfig(config) {
30
30
  ...config,
31
31
  registries: config.registries || [],
32
32
  development: {
33
+ preload: config.development?.preload,
33
34
  plugins,
34
- fallback: config.development?.fallback
35
+ fallback: config.development?.fallback,
36
+ routes: config.development?.routes
35
37
  }
36
38
  };
37
39
  return parsedConfig;
@@ -14,6 +14,10 @@ export default function registry(opts?: RegistryOptions): {
14
14
  path: string;
15
15
  }): Promise<void>;
16
16
  remove(registry: string): Promise<void>;
17
+ validateComponent(options: {
18
+ url: string;
19
+ packageJson: any;
20
+ }): Promise<void>;
17
21
  };
18
22
  export type RegistryCli = ReturnType<typeof registry>;
19
23
  export {};
@@ -144,6 +144,47 @@ function registry(opts = {}) {
144
144
  const res = (0, ocConfig_1.getOcConfig)();
145
145
  res.registries = res.registries?.filter((x) => x !== registry) || [];
146
146
  (0, ocConfig_1.setOcConfig)(res);
147
+ },
148
+ async validateComponent(options) {
149
+ try {
150
+ const response = await (0, undici_1.request)(options.url, {
151
+ method: 'POST',
152
+ headers: {
153
+ ...requestsHeaders,
154
+ 'Content-Type': 'application/json'
155
+ },
156
+ body: JSON.stringify({ packageJson: options.packageJson })
157
+ });
158
+ if (response.statusCode === 404) {
159
+ throw 'Registry URL is invalid or does not exist';
160
+ }
161
+ const result = (await response.body.json());
162
+ if (response.statusCode !== 200) {
163
+ throw result;
164
+ }
165
+ }
166
+ catch (err) {
167
+ let parsedError = err;
168
+ let errMsg = '';
169
+ if (!parsedError || typeof parsedError !== 'object') {
170
+ try {
171
+ parsedError = JSON.parse(String(parsedError));
172
+ }
173
+ catch { }
174
+ }
175
+ if (!!parsedError.code && parsedError.code === 'ECONNREFUSED') {
176
+ errMsg = 'Connection to registry has not been established';
177
+ }
178
+ else if (parsedError.code !== 'cli_version_not_valid' &&
179
+ parsedError.code !== 'node_version_not_valid' &&
180
+ !!parsedError.error) {
181
+ errMsg = parsedError.error;
182
+ }
183
+ else {
184
+ errMsg = parsedError;
185
+ }
186
+ throw errMsg;
187
+ }
147
188
  }
148
189
  };
149
190
  }
@@ -58,9 +58,9 @@ const dev = ({ local, logger }) => (0, universalify_1.fromPromise)(async (opts)
58
58
  const baseUrl = opts.baseUrl || `http://localhost:${port}/`;
59
59
  let fallbackRegistryUrl = opts.fallbackRegistryUrl;
60
60
  let fallbackClient = false;
61
+ const localConfig = (0, ocConfig_1.getOcConfig)(componentsDir);
61
62
  if (!fallbackRegistryUrl) {
62
63
  try {
63
- const localConfig = (0, ocConfig_1.getOcConfig)(componentsDir);
64
64
  if (!fallbackRegistryUrl &&
65
65
  typeof localConfig.development?.fallback?.url === 'string') {
66
66
  fallbackRegistryUrl = localConfig.development?.fallback?.url;
@@ -174,25 +174,34 @@ const dev = ({ local, logger }) => (0, universalify_1.fromPromise)(async (opts)
174
174
  const refresher = () => liveReloadServer.refresh('/');
175
175
  liveReload = { refresher, port: otherPort };
176
176
  }
177
- const registry = oc.Registry({
178
- baseUrl,
179
- prefix: opts.prefix || '',
180
- dependencies: dependencies.modules,
181
- compileClient: true,
182
- discovery: true,
183
- env: { name: 'local' },
184
- fallbackRegistryUrl,
185
- fallbackClient,
186
- hotReloading,
187
- liveReloadPort: liveReload.port,
188
- local: true,
189
- postRequestPayloadSize,
190
- components: opts.components,
191
- path: node_path_1.default.resolve(componentsDir),
192
- port,
193
- templates: dependencies.templates,
194
- verbosity: 1
195
- });
177
+ let registry;
178
+ try {
179
+ registry = oc.Registry({
180
+ baseUrl,
181
+ prefix: opts.prefix || '',
182
+ dependencies: dependencies.modules,
183
+ compileClient: true,
184
+ discovery: true,
185
+ env: { name: 'local' },
186
+ fallbackRegistryUrl,
187
+ fallbackClient,
188
+ hotReloading,
189
+ liveReloadPort: liveReload.port,
190
+ local: true,
191
+ postRequestPayloadSize,
192
+ components: opts.components,
193
+ path: node_path_1.default.resolve(componentsDir),
194
+ port,
195
+ templates: dependencies.templates,
196
+ verbosity: 1,
197
+ preload: localConfig.development?.preload,
198
+ routes: localConfig.development?.routes
199
+ });
200
+ }
201
+ catch (err) {
202
+ logger.err(String(err));
203
+ throw err;
204
+ }
196
205
  registerPlugins(registry);
197
206
  logger.warn(cliMessages.REGISTRY_STARTING(baseUrl));
198
207
  if (liveReload.port) {
@@ -0,0 +1,20 @@
1
+ import type { Local } from '../domain/local';
2
+ import type { RegistryCli } from '../domain/registry';
3
+ import type { Logger } from '../logger';
4
+ declare const validate: ({ logger, registry, local }: {
5
+ logger: Logger;
6
+ registry: RegistryCli;
7
+ local: Local;
8
+ }) => {
9
+ (opts: {
10
+ componentPath: string;
11
+ skipPackage?: boolean;
12
+ registries?: string[];
13
+ }): Promise<void>;
14
+ (opts: {
15
+ componentPath: string;
16
+ skipPackage?: boolean;
17
+ registries?: string[];
18
+ }, arguments__1: (error: unknown, value: void) => void): void;
19
+ };
20
+ export default validate;
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_path_1 = __importDefault(require("node:path"));
7
+ const safe_1 = __importDefault(require("colors/safe"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const universalify_1 = require("universalify");
10
+ const index_1 = __importDefault(require("../../resources/index"));
11
+ const handle_dependencies_1 = __importDefault(require("../domain/handle-dependencies"));
12
+ const validate = ({ logger, registry, local }) => (0, universalify_1.fromPromise)(async (opts) => {
13
+ const componentPath = opts.componentPath;
14
+ const skipPackage = opts.skipPackage;
15
+ const packageDir = node_path_1.default.resolve(componentPath, '_package');
16
+ let errorMessage;
17
+ const readPackageJson = () => fs_extra_1.default.readJson(node_path_1.default.join(packageDir, 'package.json'));
18
+ const packageComponent = async () => {
19
+ logger.warn(index_1.default.messages.cli.PACKAGING(packageDir));
20
+ const packageOptions = {
21
+ production: true,
22
+ componentPath: node_path_1.default.resolve(componentPath)
23
+ };
24
+ const component = await local.package(packageOptions);
25
+ return component;
26
+ };
27
+ const validateComponentWithRegistry = async (options) => {
28
+ const { registryUrl, packageJson, componentName, componentVersion } = options;
29
+ const registryNormalised = registryUrl.replace(/\/$/, '');
30
+ const validateUrl = `${registryNormalised}/~registry/validate/${componentName}/${componentVersion}`;
31
+ logger.warn(`Validating component against registry: ${registryNormalised}`);
32
+ try {
33
+ await registry.validateComponent({
34
+ url: validateUrl,
35
+ packageJson
36
+ });
37
+ logger.ok(`✓ Validation successful for registry: ${registryNormalised}`);
38
+ }
39
+ catch (err) {
40
+ if (err.code === 'cli_version_not_valid') {
41
+ const upgradeCommand = index_1.default.commands.cli.UPGRADE(err.details.suggestedVersion);
42
+ const errorDetails = index_1.default.errors.cli.OC_CLI_VERSION_NEEDS_UPGRADE(safe_1.default.blue(upgradeCommand));
43
+ errorMessage = index_1.default.errors.cli.VALIDATION_FAIL(errorDetails);
44
+ logger.err(errorMessage);
45
+ throw errorMessage;
46
+ }
47
+ else if (err.code === 'node_version_not_valid') {
48
+ const details = index_1.default.errors.cli.NODE_CLI_VERSION_NEEDS_UPGRADE(err.details.suggestedVersion);
49
+ errorMessage = index_1.default.errors.cli.VALIDATION_FAIL(details);
50
+ logger.err(errorMessage);
51
+ throw errorMessage;
52
+ }
53
+ else {
54
+ if (err.message) {
55
+ errorMessage = err.message;
56
+ }
57
+ else if (err && typeof err === 'object') {
58
+ try {
59
+ errorMessage = JSON.stringify(err);
60
+ }
61
+ catch {
62
+ errorMessage = String(err);
63
+ }
64
+ }
65
+ else {
66
+ errorMessage = String(err);
67
+ }
68
+ errorMessage = `✗ Validation failed for registry ${registryNormalised}: ${errorMessage}`;
69
+ logger.err(errorMessage);
70
+ throw errorMessage;
71
+ }
72
+ }
73
+ };
74
+ const validateWithRegistries = async (registryLocations, component) => {
75
+ const packageJsonPath = node_path_1.default.join(packageDir, 'package.json');
76
+ const packageJson = await fs_extra_1.default.readJson(packageJsonPath);
77
+ for (const registryUrl of registryLocations) {
78
+ await validateComponentWithRegistry({
79
+ registryUrl,
80
+ packageJson,
81
+ componentName: component.name,
82
+ componentVersion: component.version
83
+ });
84
+ }
85
+ };
86
+ try {
87
+ const registryLocations = opts.registries || (await registry.get());
88
+ if (!skipPackage) {
89
+ await (0, handle_dependencies_1.default)({
90
+ components: [node_path_1.default.resolve(componentPath)],
91
+ logger
92
+ }).catch((err) => {
93
+ logger.err(err);
94
+ return Promise.reject(err);
95
+ });
96
+ const component = await packageComponent().catch((err) => {
97
+ errorMessage = index_1.default.errors.cli.PACKAGE_CREATION_FAIL(String(err));
98
+ logger.err(errorMessage);
99
+ return Promise.reject(errorMessage);
100
+ });
101
+ await validateWithRegistries(registryLocations, component);
102
+ }
103
+ else {
104
+ if (fs_extra_1.default.existsSync(packageDir)) {
105
+ const component = await readPackageJson().catch((err) => {
106
+ logger.err(String(err));
107
+ return Promise.reject(err);
108
+ });
109
+ await validateWithRegistries(registryLocations, component);
110
+ }
111
+ else {
112
+ errorMessage = index_1.default.errors.cli.PACKAGE_FOLDER_MISSING;
113
+ logger.err(errorMessage);
114
+ throw errorMessage;
115
+ }
116
+ }
117
+ logger.ok('✓ Component validation completed successfully for all registries');
118
+ }
119
+ catch (err) {
120
+ // Don't log again if it's already been logged by validateComponentWithRegistry
121
+ if (!String(err).includes('✗ Validation failed for registry')) {
122
+ logger.err(String(err));
123
+ }
124
+ throw err;
125
+ }
126
+ });
127
+ exports.default = validate;
package/dist/cli/index.js CHANGED
@@ -20,6 +20,7 @@ const registry_2 = __importDefault(require("./facade/registry"));
20
20
  const registry_add_1 = __importDefault(require("./facade/registry-add"));
21
21
  const registry_ls_1 = __importDefault(require("./facade/registry-ls"));
22
22
  const registry_remove_1 = __importDefault(require("./facade/registry-remove"));
23
+ const validate_1 = __importDefault(require("./facade/validate"));
23
24
  const logger_1 = __importDefault(require("./logger"));
24
25
  const validate_command_1 = __importDefault(require("./validate-command"));
25
26
  const cliFunctions = {
@@ -33,7 +34,8 @@ const cliFunctions = {
33
34
  registry: registry_2.default,
34
35
  'registry-add': registry_add_1.default,
35
36
  'registry-ls': registry_ls_1.default,
36
- 'registry-remove': registry_remove_1.default
37
+ 'registry-remove': registry_remove_1.default,
38
+ validate: validate_1.default
37
39
  };
38
40
  const currentNodeVersion = process.version;
39
41
  const minSupportedVersion = '6.0.0';
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "oc-client",
3
3
  "description": "The OpenComponents client-side javascript client",
4
- "version": "0.50.27",
4
+ "version": "0.50.28",
5
5
  "repository": "https://github.com/opencomponents/oc/tree/master/components/oc-client",
6
6
  "author": "Matteo Figus <matteofigus@gmail.com>",
7
7
  "oc": {
@@ -22,14 +22,14 @@
22
22
  ],
23
23
  "dataProvider": {
24
24
  "type": "node.js",
25
- "hashKey": "8f29903f1d53f460ce634ecf007a25b1bd3f1cee",
25
+ "hashKey": "8d9e7c4d166e0630573f2c69470003476451d7c5",
26
26
  "src": "server.js",
27
27
  "size": 613
28
28
  }
29
29
  },
30
- "version": "0.50.27",
30
+ "version": "0.50.28",
31
31
  "packaged": true,
32
- "date": 1756270183453
32
+ "date": 1756715231220
33
33
  },
34
34
  "devDependencies": {
35
35
  "oc-template-es6-compiler": "^1.0.1"
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=(t,s)=>{const{staticPath:e,templates:a}=t;return s(null,{staticPath:e,templates:a})},o=(t,s)=>{r(t,(e,a)=>{if(e)return s(e);if(a==null)return s(null,{__oc_emptyResponse:!0});const n=t.action?a:Object.assign({},a,{_staticPath:t.staticPath,_baseUrl:t.baseUrl,_componentName:"oc-client",_componentVersion:"0.50.27"}),c=t.staticPath.indexOf("http")===0?t.staticPath:"https:"+t.staticPath;return s(null,Object.assign({},{component:{key:"8b7545cba94f7c029b9d46108bfe8e4e6040ea09",src:c+"template.js",props:n}}))})};exports.data=o;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=(t,s)=>{const{staticPath:e,templates:a}=t;return s(null,{staticPath:e,templates:a})},o=(t,s)=>{r(t,(e,a)=>{if(e)return s(e);if(a==null)return s(null,{__oc_emptyResponse:!0});const n=t.action?a:Object.assign({},a,{_staticPath:t.staticPath,_baseUrl:t.baseUrl,_componentName:"oc-client",_componentVersion:"0.50.28"}),c=t.staticPath.indexOf("http")===0?t.staticPath:"https:"+t.staticPath;return s(null,Object.assign({},{component:{key:"8b7545cba94f7c029b9d46108bfe8e4e6040ea09",src:c+"template.js",props:n}}))})};exports.data=o;
@@ -1,4 +1,4 @@
1
- /*! OpenComponents client v2.1.3 | (c) 2015-2025 OpenComponents community | https://github.com/opencomponents/oc-client-browser/tree/master/LICENSES */
1
+ /*! OpenComponents client v2.1.4 | (c) 2015-2025 OpenComponents community | https://github.com/opencomponents/oc-client-browser/tree/master/LICENSES */
2
2
  (() => {
3
3
  // <define:__EXTERNALS__>
4
4
  var define_EXTERNALS_default = [];
@@ -453,7 +453,7 @@
453
453
  oc2.conf = oc2.conf || {};
454
454
  oc2.cmd = oc2.cmd || [];
455
455
  oc2.renderedComponents = oc2.renderedComponents || {};
456
- oc2.clientVersion = "2.1.3";
456
+ oc2.clientVersion = "2.1.4";
457
457
  let isRequired = (name, value) => {
458
458
  if (!value) {
459
459
  throw name + " parameter is required";
@@ -1,2 +1,2 @@
1
- (()=>{var R=[],D={},I={"oc-template-handlebars":{externals:[{global:"Handlebars",url:"https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.7/handlebars.runtime.min.js"}]},"oc-template-jade":{externals:[{global:"jade",url:"https://cdnjs.cloudflare.com/ajax/libs/jade/1.11.0/runtime.min.js"}]},"oc-template-es6":{externals:[]}},k=-1,U=-2,L=-3,T=-4,H=-5,M=-6,P=-7,q="B",$="D",B="E",J="M",V="N",W="P",F="R",G="S",Y="Y",Z="U",z="Z",K=class{promise;resolve;reject;constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}};Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var Q="undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:void 0;function i(e){const{hydrated:t,values:r}=this;if("number"==typeof e)return a.call(this,e);if(!Array.isArray(e)||!e.length)throw new SyntaxError;var n=r.length;for(const o of e)r.push(o);return t.length=r.length,a.call(this,n)}function a(e){const{hydrated:r,values:t,deferred:n,plugins:o}=this;let a;const s=[[e,e=>{a=e}]];let i=[];for(;0<s.length;){const[y,v]=s.pop();switch(y){case P:v(void 0);continue;case H:v(null);continue;case U:v(NaN);continue;case M:v(1/0);continue;case L:v(-1/0);continue;case T:v(-0);continue}if(r[y])v(r[y]);else{const b=t[y];if(b&&"object"==typeof b)if(Array.isArray(b))if("string"==typeof b[0]){var[l,c,d]=b;switch(l){case $:v(r[y]=new Date(c));continue;case Z:v(r[y]=new URL(c));continue;case q:v(r[y]=BigInt(c));continue;case F:v(r[y]=new RegExp(c,d));continue;case Y:v(r[y]=Symbol.for(c));continue;case G:const w=new Set;r[y]=w;for(let e=1;e<b.length;e++)s.push([b[e],e=>{w.add(e)}]);v(w);continue;case J:const g=new Map;r[y]=g;for(let e=1;e<b.length;e+=2){const E=[];s.push([b[e+1],e=>{E[1]=e}]),s.push([b[e],e=>{E[0]=e}]),i.push(()=>{g.set(E[0],E[1])})}v(g);continue;case V:const j=Object.create(null);r[y]=j;for(const x of Object.keys(c).reverse()){const S=[];s.push([c[x],e=>{S[1]=e}]),s.push([Number(x.slice(1)),e=>{S[0]=e}]),i.push(()=>{j[S[0]]=S[1]})}v(j);continue;case W:r[c]?v(r[y]=r[c]):(m=new K,n[c]=m,v(r[y]=m.promise));continue;case B:var[,u,m]=b,u=new(m&&Q&&Q[m]?Q[m]:Error)(u);r[y]=u,v(u);continue;case z:v(r[y]=r[c]);continue;default:if(Array.isArray(o)){const A=[];var p=b.slice(1);for(let t=0;t<p.length;t++){var h=p[t];s.push([h,e=>{A[t]=e}])}i.push(()=>{for(const t of o){var e=t(b[0],...A);if(e)return void v(r[y]=e.value)}throw new SyntaxError});continue}throw new SyntaxError}}else{const N=[];r[y]=N;for(let t=0;t<b.length;t++){var f=b[t];f!==k&&s.push([f,e=>{N[t]=e}])}v(N)}else{const C={};r[y]=C;for(const O of Object.keys(b).reverse()){const _=[];s.push([b[O],e=>{_[1]=e}]),s.push([Number(O.slice(1)),e=>{_[0]=e}]),i.push(()=>{C[_[0]]=_[1]})}v(C)}else r[y]=b,v(b)}}for(;0<i.length;)i.pop()();return a}async function X(e,t){var t=(t??{})["plugins"];const r=new K,n=e.pipeThrough(function(){const o=new TextDecoder;let a="";return new TransformStream({transform(e,t){e=o.decode(e,{stream:!0});const r=(a+e).split("\n");a=r.pop()||"";for(const n of r)t.enqueue(n)},flush(e){a&&e.enqueue(a)}})}()).getReader(),o={values:[],hydrated:[],deferred:{},plugins:t};t=await async function(e){e=await e.read();if(!e.value)throw new SyntaxError;let t;try{t=JSON.parse(e.value)}catch(e){throw new SyntaxError}return{done:e.done,value:i.call(this,t)}}.call(o,n);let a=r.promise;return t.done?r.resolve():a=async function(e){let t=await e.read();for(;!t.done;)if(t.value){const o=t.value;switch(o[0]){case W:{var r=o.indexOf(":"),n=Number(o.slice(1,r));const a=this.deferred[n];if(!a)throw new Error(`Deferred ID ${n} not found in stream`);n=o.slice(r+1);let e;try{e=JSON.parse(n)}catch(e){throw new SyntaxError}r=i.call(this,e);a.resolve(r);break}case B:{n=o.indexOf(":"),r=Number(o.slice(1,n));const s=this.deferred[r];if(!s)throw new Error(`Deferred ID ${r} not found in stream`);n=o.slice(n+1);let e;try{e=JSON.parse(n)}catch(e){throw new SyntaxError}n=i.call(this,e);s.reject(n);break}default:throw new SyntaxError}t=await e.read()}}.call(o,n).then(r.resolve).catch(e=>{for(const t of Object.values(o.deferred))t.reject(e);r.reject(e)}),{done:a.then(()=>n.closed),value:t.value}}function ee(e){const t=new Error(e.message||e);return e.stack&&(t.stack=e.stack),Object.assign(t,e.originalError,e)}var e=window.oc||{},t=new class{loaded=new Set;errors=new Set;parse(e){const[t,r]=e.split("#");var n=t.startsWith("module:"),o=t.replace(/^module:/,""),[a,e]=(r?.split("=")||[]).reduce((e,t)=>t.startsWith("=")?[t.slice(1),e[1]]:[e[0],t],[]);return{src:o,isModule:n,fallback:a,id:e}}async load(...e){for(const t of e)Array.isArray(t)?await Promise.all(t.map(e=>this._load(e))):"function"==typeof t?await t():await this._load(t);return this}async _load(t){if(!this.loaded.has(t))try{t.endsWith(".css")?await this.css(t):await this.js(t),this.loaded.add(t)}catch(e){for(const r of this.errors)r(t);throw e}}js(e){const{src:n,isModule:o,fallback:a}=this.parse(e);return new Promise((e,t)=>{const r=document.createElement("script");r.type=o?"module":"text/javascript",r.src=n,r.onload=e,r.onerror=()=>a?this._load(a).then(e).catch(t):t(),document.head.append(r)})}css(e){const n=this.parse(e)["src"];return new Promise((e,t)=>{const r=document.createElement("link");r.rel="stylesheet",r.href=n,r.onload=e,r.onerror=t,document.head.append(r)})}onError(e){return this.errors.add(e),this}};window.ljs=t,window.oc=function(l){if(l.status)return l;l.status="loading",l.conf=l.conf||{},l.cmd=l.cmd||[],l.renderedComponents=l.renderedComponents||{},l.clientVersion="2.1.3";let i=(e,t)=>{if(!t)throw e+" parameter is required"},s=document,c=window,d=()=>{},t=!1,r=!1,u={};var e=e=>"boolean"==typeof e;let m=setTimeout,n=l.cmd,p=l.conf,h=l.renderedComponents,f="data-rendered",y="data-rendering",v=e=>console.log(e),b=e=>p.debug&&console.log(e),w=e=>"x-text/stream"!==e.headers.get("Content-Type")?e.json():X(e.body).then(e=>e.value),g=p.retryInterval||Number(5e3),j=p.retryLimit||Number(30),a=!!e(p.disableLoader)&&p.disableLoader,E=p.retrySendNumber||!0,x=p.pollingInterval||500,S=p.tag||"oc-component";e=!!e(p.disableLifecycles)&&p.disableLifecycles;let A="Failed to load % component "+j+" times. Giving up",N="Error rendering component: %, error: ",C="Failed to retrieve the component. Retrying in "+g/1e3+" seconds...",O=p.loadingMessage||"",_=(e,t)=>e.replace("%",t),k=I,o=R,U=D,L=(e,t)=>{(e=Array.isArray(e)?e:[e]).map(e=>{!t&&k[e.type]||(k[e.type]={externals:e.externals})})};p.templates&&L(p.templates,!0);let T=()=>{let e=p.globalHeaders;return{Accept:"application/vnd.oc.unrendered+json","Content-Type":"application/json",..."function"==typeof e?e():e}};l.addStylesToHead=e=>{let t=s.createElement("style");t.textContent=e,s.head.appendChild(t)};let H=()=>{l.ready(l.renderUnloadedComponents)};l.registerTemplates=e=>(L(e),H(),k),l.require=(r,e,t)=>{t||(t=e,e=r,r=void 0),"string"==typeof r&&(r=[r]);let n=()=>{let e=c;if(null!=r){for(var t in r)if(e=e[r[t]],!e)return;return e}};var o=()=>{t(n())};n()?o():ljs.load(e,o)};let M=(t,r,n)=>{var e;n||(n=r,r=[]),t.length?(e=t[0],l.require(e.global,e.url,e=>{M(t.slice(1),r.concat(e),n)})):n(r)};l.requireSeries=M;let P=(e,t,r)=>{let n=e.setAttribute.bind(e);var o=t.name,a=t.version;n("id",t.id),n(f,!0),n(y,!1),n("data-version",a),n("data-id",t.ocId),"string"==typeof t.html&&(e.innerHTML=t.html),(e=>{for(var t of Array.from(e.querySelectorAll("script"))){let e=s.createElement("script");e.textContent=t.textContent;for(var r of Array.from(t.attributes))e.setAttribute(r.name,r.value);t.parentNode?.replaceChild(e,t)}})(e),t.key&&n("data-hash",t.key),o&&(n("data-name",o),h[o]={version:a},t.baseUrl&&(h[o].baseUrl=t.baseUrl),t.element=e,l.events.fire("oc:rendered",t)),r()},q=(n,o)=>{o=o||d;let e=n.version,t=n.baseUrl,r=n.name;i("version",e),i("baseUrl",t),i("name",r),n.action&&(t=`${t}~actions/${n.action}/${n.name}/${n.version||""}`);var a={...p.globalParameters,...n.parameters},s=n.action?a:{components:[{action:n.action,name:r,version:e,parameters:a}]},a=T();fetch(t,{method:"POST",headers:a,body:JSON.stringify(s)}).then(w).then(e=>{var t,r;n.action?(r=e.error?ee(e.details||e.error):null,o(r,e.data)):(r=(t=e[0].response).error?ee(t.details||t.error):null,o(r,t.data,e[0]))}).catch(o)};l.getData=q,l.getAction=t=>new Promise((r,n)=>{var e=t.component;q({json:!0,name:e,...h[e],...t},(e,t)=>{if(e)n(e);else if(t.component){let e=t.component.props;delete e._staticPath,delete e._baseUrl,delete e._componentName,delete e._componentVersion,r(e)}else r()})}),l.build=e=>{i("baseUrl",e.baseUrl),i("name",e.name);var t=e=>e?e.match(/\/$/)?e:e+"/":"";let r=t(e.baseUrl)+t(e.name)+t(e.version);if(e.parameters){r+="?";for(var[n,o]of Object.entries(e.parameters))/[+&=]/.test(o)&&(o=encodeURIComponent(o)),r+=n+"="+o+"&";r=r.slice(0,-1)}return"<"+S+' href="'+r+'"></'+S+">"},l.ready=e=>{t?e():r?n.push(e):(r=!0,l.requireSeries(o,()=>{t=!0,r=!1,l.events=(()=>{let n={};return{fire(e,t){if(n[e])for(var r of n[e])r({type:e},t)},on(e,t){if(!t)throw new Error("Callback is required");n[e]||(n[e]=[]),n[e].push(t)},off(e,t){for(var r of e="string"==typeof e?[e]:e)n[r]&&(t?n[r]=n[r].filter(e=>e!==t):delete n[r])},reset(){n={}}}})(),0<Object.keys(U).length&&s.head.appendChild(Object.assign(s.createElement("script"),{type:"importmap",textContent:JSON.stringify({imports:U})})),e(),l.events.fire("oc:ready",l),l.status="ready",n.map(e=>{e(l)}),l.cmd={push:e=>e(l)}}))};const $=(e,t,r)=>{!!t.data?.component?.esm?(async(t,r)=>{try{const{_staticPath:n,_componentName:o,_componentVersion:a}=t.component.props;window.oc._esm=window.oc._esm||{};window.oc._esm[`${o}@${a}`]=e=>{return n+"public/"+e};const{mount:s}=await import(t.component.src);let e={};if(t.component.development)e.development=t.component.development;s(t.element,t.component.props,e);r(null)}catch(e){console.error("Error rendering ESM component",e);r(e)}})(t.data,r):l.render(e,t.data,r)};return l.render=(n,o,a)=>{l.ready(()=>{if(o&&1==o.__oc_emptyResponse)return a(null,"");let t=n.type;"jade"!=t&&"handlebars"!=t||(t="oc-template-"+t);let r=k[t];r?l.require(["oc","components",n.key],n.src,e=>{e?M(r.externals,()=>{try{a(null,("oc-template-handlebars"==t?c.Handlebars.template(e,[]):e)(o))}catch(e){a(""+e)}}):a(_("Error getting compiled view: %",n.src))}):a(_('Error loading component: view engine "%" not supported',n.type))})},l.renderNestedComponent=(n,o)=>{l.ready(()=>{let e=(n=n[0]||n).getAttribute.bind(n),r=n.setAttribute.bind(n);var t="true"==e(y);"true"==e(f)?o():t?m(()=>{l.renderNestedComponent(n,o)},x):(b("Unrendered component found. Trying to retrieve it..."),r(y,!0),a||(n.innerHTML='<div class="oc-loading">'+O+"</div>"),l.renderByHref({href:e("href"),id:e("id"),element:n},(e,t)=>{e||!t?(r(y,!1),r(f,!1),r("data-failed",!0),n.innerHTML="",l.events.fire("oc:failed",{originalError:e,data:t,component:n}),v(e),o()):P(n,t,o)}))})},l.renderByHref=(e,t,o)=>{o=o||t;let a=Math.floor(9999999999*Math.random()),r=e.retryNumber||+t||0,n=e.href||e,s=e.id||a,i=e.element;l.ready(()=>{var e,t;n?fetch((e=n,t={...p.globalParameters,...E?{__oc_Retry:r}:{}},e+(~e.indexOf("?")?"&":"?")+new URLSearchParams(t)),{headers:T()}).then(w).then(r=>{let n=r.template;r.data.id=a,r.data.element=i,$(n,r,(e,t)=>{e?o(_(N,r.href)+e):(b(_("Component '%' correctly rendered",n.src)),o(null,{id:s,ocId:a,html:t,baseUrl:r.baseUrl,key:n.key,version:r.version,name:r.name}))})}).catch(e=>{var t,r;e&&429==e.status&&(u[n]=0),v(C),t=n,r=e=>{l.renderByHref({href:n,retryNumber:e,id:s,element:i},o)},e=()=>{o(_(A,n))},null==u[t]&&(u[t]=j),u[t]<=0?e():(m(()=>{r(j-u[t]+1)},g),u[t]--)}):o(N+"Href parameter missing")})},l.renderUnloadedComponents=()=>{l.ready(()=>{let r=s.querySelectorAll(`${S}:not([data-rendered="true"]):not([data-failed="true"])`);r.forEach((e,t)=>{l.renderNestedComponent(e,()=>{t==r.length-1&&l.renderUnloadedComponents()})})})},l.load=(t,r,n)=>{l.ready(()=>{if(n=n||d,t){(t=t[0]||t).innerHTML="<"+S+' href="'+r+'" />';let e=t.querySelector(S);l.renderNestedComponent(e,()=>{n(e)})}})},H(),window.customElements&&window.customElements.define(S,class extends HTMLElement{#connected=!1;#manageLifecycle=!e;constructor(){super()}connectedCallback(){this.#connected=!0,"true"==this.getAttribute("disable-lifecycle")||""==this.getAttribute("disable-lifecycle")?this.#manageLifecycle=!1:"false"==this.getAttribute("disable-lifecycle")&&(this.#manageLifecycle=!0),this.#manageLifecycle&&l.renderNestedComponent(this,()=>{})}disconnectedCallback(){var e;this.#connected&&(this.#connected=!1,(e=this.getAttribute("id"))&&l.events.fire("oc:unrendered",{element:this,id:e}),this.#manageLifecycle&&this.unmount&&"true"==this.getAttribute("data-rendered")&&(this.unmount(),this.removeAttribute("data-rendered")))}}),l}(e)})();
1
+ (()=>{var R=[],D={},I={"oc-template-handlebars":{externals:[{global:"Handlebars",url:"https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.7/handlebars.runtime.min.js"}]},"oc-template-jade":{externals:[{global:"jade",url:"https://cdnjs.cloudflare.com/ajax/libs/jade/1.11.0/runtime.min.js"}]},"oc-template-es6":{externals:[]}},k=-1,U=-2,L=-3,T=-4,H=-5,M=-6,P=-7,q="B",$="D",B="E",J="M",V="N",W="P",F="R",G="S",Y="Y",Z="U",z="Z",K=class{promise;resolve;reject;constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}};Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var Q="undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:void 0;function i(e){const{hydrated:t,values:r}=this;if("number"==typeof e)return a.call(this,e);if(!Array.isArray(e)||!e.length)throw new SyntaxError;var n=r.length;for(const o of e)r.push(o);return t.length=r.length,a.call(this,n)}function a(e){const{hydrated:r,values:t,deferred:n,plugins:o}=this;let a;const s=[[e,e=>{a=e}]];let i=[];for(;0<s.length;){const[y,v]=s.pop();switch(y){case P:v(void 0);continue;case H:v(null);continue;case U:v(NaN);continue;case M:v(1/0);continue;case L:v(-1/0);continue;case T:v(-0);continue}if(r[y])v(r[y]);else{const b=t[y];if(b&&"object"==typeof b)if(Array.isArray(b))if("string"==typeof b[0]){var[l,c,d]=b;switch(l){case $:v(r[y]=new Date(c));continue;case Z:v(r[y]=new URL(c));continue;case q:v(r[y]=BigInt(c));continue;case F:v(r[y]=new RegExp(c,d));continue;case Y:v(r[y]=Symbol.for(c));continue;case G:const w=new Set;r[y]=w;for(let e=1;e<b.length;e++)s.push([b[e],e=>{w.add(e)}]);v(w);continue;case J:const g=new Map;r[y]=g;for(let e=1;e<b.length;e+=2){const E=[];s.push([b[e+1],e=>{E[1]=e}]),s.push([b[e],e=>{E[0]=e}]),i.push(()=>{g.set(E[0],E[1])})}v(g);continue;case V:const j=Object.create(null);r[y]=j;for(const x of Object.keys(c).reverse()){const S=[];s.push([c[x],e=>{S[1]=e}]),s.push([Number(x.slice(1)),e=>{S[0]=e}]),i.push(()=>{j[S[0]]=S[1]})}v(j);continue;case W:r[c]?v(r[y]=r[c]):(m=new K,n[c]=m,v(r[y]=m.promise));continue;case B:var[,u,m]=b,u=new(m&&Q&&Q[m]?Q[m]:Error)(u);r[y]=u,v(u);continue;case z:v(r[y]=r[c]);continue;default:if(Array.isArray(o)){const A=[];var p=b.slice(1);for(let t=0;t<p.length;t++){var h=p[t];s.push([h,e=>{A[t]=e}])}i.push(()=>{for(const t of o){var e=t(b[0],...A);if(e)return void v(r[y]=e.value)}throw new SyntaxError});continue}throw new SyntaxError}}else{const N=[];r[y]=N;for(let t=0;t<b.length;t++){var f=b[t];f!==k&&s.push([f,e=>{N[t]=e}])}v(N)}else{const C={};r[y]=C;for(const O of Object.keys(b).reverse()){const _=[];s.push([b[O],e=>{_[1]=e}]),s.push([Number(O.slice(1)),e=>{_[0]=e}]),i.push(()=>{C[_[0]]=_[1]})}v(C)}else r[y]=b,v(b)}}for(;0<i.length;)i.pop()();return a}async function X(e,t){var t=(t??{})["plugins"];const r=new K,n=e.pipeThrough(function(){const o=new TextDecoder;let a="";return new TransformStream({transform(e,t){e=o.decode(e,{stream:!0});const r=(a+e).split("\n");a=r.pop()||"";for(const n of r)t.enqueue(n)},flush(e){a&&e.enqueue(a)}})}()).getReader(),o={values:[],hydrated:[],deferred:{},plugins:t};t=await async function(e){e=await e.read();if(!e.value)throw new SyntaxError;let t;try{t=JSON.parse(e.value)}catch(e){throw new SyntaxError}return{done:e.done,value:i.call(this,t)}}.call(o,n);let a=r.promise;return t.done?r.resolve():a=async function(e){let t=await e.read();for(;!t.done;)if(t.value){const o=t.value;switch(o[0]){case W:{var r=o.indexOf(":"),n=Number(o.slice(1,r));const a=this.deferred[n];if(!a)throw new Error(`Deferred ID ${n} not found in stream`);n=o.slice(r+1);let e;try{e=JSON.parse(n)}catch(e){throw new SyntaxError}r=i.call(this,e);a.resolve(r);break}case B:{n=o.indexOf(":"),r=Number(o.slice(1,n));const s=this.deferred[r];if(!s)throw new Error(`Deferred ID ${r} not found in stream`);n=o.slice(n+1);let e;try{e=JSON.parse(n)}catch(e){throw new SyntaxError}n=i.call(this,e);s.reject(n);break}default:throw new SyntaxError}t=await e.read()}}.call(o,n).then(r.resolve).catch(e=>{for(const t of Object.values(o.deferred))t.reject(e);r.reject(e)}),{done:a.then(()=>n.closed),value:t.value}}function ee(e){const t=new Error(e.message||e);return e.stack&&(t.stack=e.stack),Object.assign(t,e.originalError,e)}var e=window.oc||{},t=new class{loaded=new Set;errors=new Set;parse(e){const[t,r]=e.split("#");var n=t.startsWith("module:"),o=t.replace(/^module:/,""),[a,e]=(r?.split("=")||[]).reduce((e,t)=>t.startsWith("=")?[t.slice(1),e[1]]:[e[0],t],[]);return{src:o,isModule:n,fallback:a,id:e}}async load(...e){for(const t of e)Array.isArray(t)?await Promise.all(t.map(e=>this._load(e))):"function"==typeof t?await t():await this._load(t);return this}async _load(t){if(!this.loaded.has(t))try{t.endsWith(".css")?await this.css(t):await this.js(t),this.loaded.add(t)}catch(e){for(const r of this.errors)r(t);throw e}}js(e){const{src:n,isModule:o,fallback:a}=this.parse(e);return new Promise((e,t)=>{const r=document.createElement("script");r.type=o?"module":"text/javascript",r.src=n,r.onload=e,r.onerror=()=>a?this._load(a).then(e).catch(t):t(),document.head.append(r)})}css(e){const n=this.parse(e)["src"];return new Promise((e,t)=>{const r=document.createElement("link");r.rel="stylesheet",r.href=n,r.onload=e,r.onerror=t,document.head.append(r)})}onError(e){return this.errors.add(e),this}};window.ljs=t,window.oc=function(l){if(l.status)return l;l.status="loading",l.conf=l.conf||{},l.cmd=l.cmd||[],l.renderedComponents=l.renderedComponents||{},l.clientVersion="2.1.4";let i=(e,t)=>{if(!t)throw e+" parameter is required"},s=document,c=window,d=()=>{},t=!1,r=!1,u={};var e=e=>"boolean"==typeof e;let m=setTimeout,n=l.cmd,p=l.conf,h=l.renderedComponents,f="data-rendered",y="data-rendering",v=e=>console.log(e),b=e=>p.debug&&console.log(e),w=e=>"x-text/stream"!==e.headers.get("Content-Type")?e.json():X(e.body).then(e=>e.value),g=p.retryInterval||Number(5e3),j=p.retryLimit||Number(30),a=!!e(p.disableLoader)&&p.disableLoader,E=p.retrySendNumber||!0,x=p.pollingInterval||500,S=p.tag||"oc-component";e=!!e(p.disableLifecycles)&&p.disableLifecycles;let A="Failed to load % component "+j+" times. Giving up",N="Error rendering component: %, error: ",C="Failed to retrieve the component. Retrying in "+g/1e3+" seconds...",O=p.loadingMessage||"",_=(e,t)=>e.replace("%",t),k=I,o=R,U=D,L=(e,t)=>{(e=Array.isArray(e)?e:[e]).map(e=>{!t&&k[e.type]||(k[e.type]={externals:e.externals})})};p.templates&&L(p.templates,!0);let T=()=>{let e=p.globalHeaders;return{Accept:"application/vnd.oc.unrendered+json","Content-Type":"application/json",..."function"==typeof e?e():e}};l.addStylesToHead=e=>{let t=s.createElement("style");t.textContent=e,s.head.appendChild(t)};let H=()=>{l.ready(l.renderUnloadedComponents)};l.registerTemplates=e=>(L(e),H(),k),l.require=(r,e,t)=>{t||(t=e,e=r,r=void 0),"string"==typeof r&&(r=[r]);let n=()=>{let e=c;if(null!=r){for(var t in r)if(e=e[r[t]],!e)return;return e}};var o=()=>{t(n())};n()?o():ljs.load(e,o)};let M=(t,r,n)=>{var e;n||(n=r,r=[]),t.length?(e=t[0],l.require(e.global,e.url,e=>{M(t.slice(1),r.concat(e),n)})):n(r)};l.requireSeries=M;let P=(e,t,r)=>{let n=e.setAttribute.bind(e);var o=t.name,a=t.version;n("id",t.id),n(f,!0),n(y,!1),n("data-version",a),n("data-id",t.ocId),"string"==typeof t.html&&(e.innerHTML=t.html),(e=>{for(var t of Array.from(e.querySelectorAll("script"))){let e=s.createElement("script");e.textContent=t.textContent;for(var r of Array.from(t.attributes))e.setAttribute(r.name,r.value);t.parentNode?.replaceChild(e,t)}})(e),t.key&&n("data-hash",t.key),o&&(n("data-name",o),h[o]={version:a},t.baseUrl&&(h[o].baseUrl=t.baseUrl),t.element=e,l.events.fire("oc:rendered",t)),r()},q=(n,o)=>{o=o||d;let e=n.version,t=n.baseUrl,r=n.name;i("version",e),i("baseUrl",t),i("name",r),n.action&&(t=`${t}~actions/${n.action}/${n.name}/${n.version||""}`);var a={...p.globalParameters,...n.parameters},s=n.action?a:{components:[{action:n.action,name:r,version:e,parameters:a}]},a=T();fetch(t,{method:"POST",headers:a,body:JSON.stringify(s)}).then(w).then(e=>{var t,r;n.action?(r=e.error?ee(e.details||e.error):null,o(r,e.data)):(r=(t=e[0].response).error?ee(t.details||t.error):null,o(r,t.data,e[0]))}).catch(o)};l.getData=q,l.getAction=t=>new Promise((r,n)=>{var e=t.component;q({json:!0,name:e,...h[e],...t},(e,t)=>{if(e)n(e);else if(t.component){let e=t.component.props;delete e._staticPath,delete e._baseUrl,delete e._componentName,delete e._componentVersion,r(e)}else r()})}),l.build=e=>{i("baseUrl",e.baseUrl),i("name",e.name);var t=e=>e?e.match(/\/$/)?e:e+"/":"";let r=t(e.baseUrl)+t(e.name)+t(e.version);if(e.parameters){r+="?";for(var[n,o]of Object.entries(e.parameters))/[+&=]/.test(o)&&(o=encodeURIComponent(o)),r+=n+"="+o+"&";r=r.slice(0,-1)}return"<"+S+' href="'+r+'"></'+S+">"},l.ready=e=>{t?e():r?n.push(e):(r=!0,l.requireSeries(o,()=>{t=!0,r=!1,l.events=(()=>{let n={};return{fire(e,t){if(n[e])for(var r of n[e])r({type:e},t)},on(e,t){if(!t)throw new Error("Callback is required");n[e]||(n[e]=[]),n[e].push(t)},off(e,t){for(var r of e="string"==typeof e?[e]:e)n[r]&&(t?n[r]=n[r].filter(e=>e!==t):delete n[r])},reset(){n={}}}})(),0<Object.keys(U).length&&s.head.appendChild(Object.assign(s.createElement("script"),{type:"importmap",textContent:JSON.stringify({imports:U})})),e(),l.events.fire("oc:ready",l),l.status="ready",n.map(e=>{e(l)}),l.cmd={push:e=>e(l)}}))};const $=(e,t,r)=>{!!t.data?.component?.esm?(async(t,r)=>{try{const{_staticPath:n,_componentName:o,_componentVersion:a}=t.component.props;window.oc._esm=window.oc._esm||{};window.oc._esm[`${o}@${a}`]=e=>{return n+"public/"+e};const{mount:s}=await import(t.component.src);let e={};if(t.component.development)e.development=t.component.development;s(t.element,t.component.props,e);r(null)}catch(e){console.error("Error rendering ESM component",e);r(e)}})(t.data,r):l.render(e,t.data,r)};return l.render=(n,o,a)=>{l.ready(()=>{if(o&&1==o.__oc_emptyResponse)return a(null,"");let t=n.type;"jade"!=t&&"handlebars"!=t||(t="oc-template-"+t);let r=k[t];r?l.require(["oc","components",n.key],n.src,e=>{e?M(r.externals,()=>{try{a(null,("oc-template-handlebars"==t?c.Handlebars.template(e,[]):e)(o))}catch(e){a(""+e)}}):a(_("Error getting compiled view: %",n.src))}):a(_('Error loading component: view engine "%" not supported',n.type))})},l.renderNestedComponent=(n,o)=>{l.ready(()=>{let e=(n=n[0]||n).getAttribute.bind(n),r=n.setAttribute.bind(n);var t="true"==e(y);"true"==e(f)?o():t?m(()=>{l.renderNestedComponent(n,o)},x):(b("Unrendered component found. Trying to retrieve it..."),r(y,!0),a||(n.innerHTML='<div class="oc-loading">'+O+"</div>"),l.renderByHref({href:e("href"),id:e("id"),element:n},(e,t)=>{e||!t?(r(y,!1),r(f,!1),r("data-failed",!0),n.innerHTML="",l.events.fire("oc:failed",{originalError:e,data:t,component:n}),v(e),o()):P(n,t,o)}))})},l.renderByHref=(e,t,o)=>{o=o||t;let a=Math.floor(9999999999*Math.random()),r=e.retryNumber||+t||0,n=e.href||e,s=e.id||a,i=e.element;l.ready(()=>{var e,t;n?fetch((e=n,t={...p.globalParameters,...E?{__oc_Retry:r}:{}},e+(~e.indexOf("?")?"&":"?")+new URLSearchParams(t)),{headers:T()}).then(w).then(r=>{let n=r.template;r.data.id=a,r.data.element=i,$(n,r,(e,t)=>{e?o(_(N,r.href)+e):(b(_("Component '%' correctly rendered",n.src)),o(null,{id:s,ocId:a,html:t,baseUrl:r.baseUrl,key:n.key,version:r.version,name:r.name}))})}).catch(e=>{var t,r;e&&429==e.status&&(u[n]=0),v(C),t=n,r=e=>{l.renderByHref({href:n,retryNumber:e,id:s,element:i},o)},e=()=>{o(_(A,n))},null==u[t]&&(u[t]=j),u[t]<=0?e():(m(()=>{r(j-u[t]+1)},g),u[t]--)}):o(N+"Href parameter missing")})},l.renderUnloadedComponents=()=>{l.ready(()=>{let r=s.querySelectorAll(`${S}:not([data-rendered="true"]):not([data-failed="true"])`);r.forEach((e,t)=>{l.renderNestedComponent(e,()=>{t==r.length-1&&l.renderUnloadedComponents()})})})},l.load=(t,r,n)=>{l.ready(()=>{if(n=n||d,t){(t=t[0]||t).innerHTML="<"+S+' href="'+r+'" />';let e=t.querySelector(S);l.renderNestedComponent(e,()=>{n(e)})}})},H(),window.customElements&&window.customElements.define(S,class extends HTMLElement{#connected=!1;#manageLifecycle=!e;constructor(){super()}connectedCallback(){this.#connected=!0,"true"==this.getAttribute("disable-lifecycle")||""==this.getAttribute("disable-lifecycle")?this.#manageLifecycle=!1:"false"==this.getAttribute("disable-lifecycle")&&(this.#manageLifecycle=!0),this.#manageLifecycle&&l.renderNestedComponent(this,()=>{})}disconnectedCallback(){var e;this.#connected&&(this.#connected=!1,(e=this.getAttribute("id"))&&l.events.fire("oc:unrendered",{element:this,id:e}),this.#manageLifecycle&&this.unmount&&"true"==this.getAttribute("data-rendered")&&(this.unmount(),this.removeAttribute("data-rendered")))}}),l}(e)})();
2
2
  //# sourceMappingURL=oc-client.min.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "oc-client",
3
3
  "description": "The OpenComponents client-side javascript client",
4
- "version": "0.50.27",
4
+ "version": "0.50.28",
5
5
  "repository": "https://github.com/opencomponents/oc/tree/master/components/oc-client",
6
6
  "author": "Matteo Figus <matteofigus@gmail.com>",
7
7
  "oc": {
@@ -1,4 +1,4 @@
1
- /*! OpenComponents client v2.1.3 | (c) 2015-2025 OpenComponents community | https://github.com/opencomponents/oc-client-browser/tree/master/LICENSES */
1
+ /*! OpenComponents client v2.1.4 | (c) 2015-2025 OpenComponents community | https://github.com/opencomponents/oc-client-browser/tree/master/LICENSES */
2
2
  (() => {
3
3
  // <define:__EXTERNALS__>
4
4
  var define_EXTERNALS_default = [];
@@ -453,7 +453,7 @@
453
453
  oc2.conf = oc2.conf || {};
454
454
  oc2.cmd = oc2.cmd || [];
455
455
  oc2.renderedComponents = oc2.renderedComponents || {};
456
- oc2.clientVersion = "2.1.3";
456
+ oc2.clientVersion = "2.1.4";
457
457
  let isRequired = (name, value) => {
458
458
  if (!value) {
459
459
  throw name + " parameter is required";
@@ -1,2 +1,2 @@
1
- (()=>{var R=[],D={},I={"oc-template-handlebars":{externals:[{global:"Handlebars",url:"https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.7/handlebars.runtime.min.js"}]},"oc-template-jade":{externals:[{global:"jade",url:"https://cdnjs.cloudflare.com/ajax/libs/jade/1.11.0/runtime.min.js"}]},"oc-template-es6":{externals:[]}},k=-1,U=-2,L=-3,T=-4,H=-5,M=-6,P=-7,q="B",$="D",B="E",J="M",V="N",W="P",F="R",G="S",Y="Y",Z="U",z="Z",K=class{promise;resolve;reject;constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}};Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var Q="undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:void 0;function i(e){const{hydrated:t,values:r}=this;if("number"==typeof e)return a.call(this,e);if(!Array.isArray(e)||!e.length)throw new SyntaxError;var n=r.length;for(const o of e)r.push(o);return t.length=r.length,a.call(this,n)}function a(e){const{hydrated:r,values:t,deferred:n,plugins:o}=this;let a;const s=[[e,e=>{a=e}]];let i=[];for(;0<s.length;){const[y,v]=s.pop();switch(y){case P:v(void 0);continue;case H:v(null);continue;case U:v(NaN);continue;case M:v(1/0);continue;case L:v(-1/0);continue;case T:v(-0);continue}if(r[y])v(r[y]);else{const b=t[y];if(b&&"object"==typeof b)if(Array.isArray(b))if("string"==typeof b[0]){var[l,c,d]=b;switch(l){case $:v(r[y]=new Date(c));continue;case Z:v(r[y]=new URL(c));continue;case q:v(r[y]=BigInt(c));continue;case F:v(r[y]=new RegExp(c,d));continue;case Y:v(r[y]=Symbol.for(c));continue;case G:const w=new Set;r[y]=w;for(let e=1;e<b.length;e++)s.push([b[e],e=>{w.add(e)}]);v(w);continue;case J:const g=new Map;r[y]=g;for(let e=1;e<b.length;e+=2){const E=[];s.push([b[e+1],e=>{E[1]=e}]),s.push([b[e],e=>{E[0]=e}]),i.push(()=>{g.set(E[0],E[1])})}v(g);continue;case V:const j=Object.create(null);r[y]=j;for(const x of Object.keys(c).reverse()){const S=[];s.push([c[x],e=>{S[1]=e}]),s.push([Number(x.slice(1)),e=>{S[0]=e}]),i.push(()=>{j[S[0]]=S[1]})}v(j);continue;case W:r[c]?v(r[y]=r[c]):(m=new K,n[c]=m,v(r[y]=m.promise));continue;case B:var[,u,m]=b,u=new(m&&Q&&Q[m]?Q[m]:Error)(u);r[y]=u,v(u);continue;case z:v(r[y]=r[c]);continue;default:if(Array.isArray(o)){const A=[];var p=b.slice(1);for(let t=0;t<p.length;t++){var h=p[t];s.push([h,e=>{A[t]=e}])}i.push(()=>{for(const t of o){var e=t(b[0],...A);if(e)return void v(r[y]=e.value)}throw new SyntaxError});continue}throw new SyntaxError}}else{const N=[];r[y]=N;for(let t=0;t<b.length;t++){var f=b[t];f!==k&&s.push([f,e=>{N[t]=e}])}v(N)}else{const C={};r[y]=C;for(const O of Object.keys(b).reverse()){const _=[];s.push([b[O],e=>{_[1]=e}]),s.push([Number(O.slice(1)),e=>{_[0]=e}]),i.push(()=>{C[_[0]]=_[1]})}v(C)}else r[y]=b,v(b)}}for(;0<i.length;)i.pop()();return a}async function X(e,t){var t=(t??{})["plugins"];const r=new K,n=e.pipeThrough(function(){const o=new TextDecoder;let a="";return new TransformStream({transform(e,t){e=o.decode(e,{stream:!0});const r=(a+e).split("\n");a=r.pop()||"";for(const n of r)t.enqueue(n)},flush(e){a&&e.enqueue(a)}})}()).getReader(),o={values:[],hydrated:[],deferred:{},plugins:t};t=await async function(e){e=await e.read();if(!e.value)throw new SyntaxError;let t;try{t=JSON.parse(e.value)}catch(e){throw new SyntaxError}return{done:e.done,value:i.call(this,t)}}.call(o,n);let a=r.promise;return t.done?r.resolve():a=async function(e){let t=await e.read();for(;!t.done;)if(t.value){const o=t.value;switch(o[0]){case W:{var r=o.indexOf(":"),n=Number(o.slice(1,r));const a=this.deferred[n];if(!a)throw new Error(`Deferred ID ${n} not found in stream`);n=o.slice(r+1);let e;try{e=JSON.parse(n)}catch(e){throw new SyntaxError}r=i.call(this,e);a.resolve(r);break}case B:{n=o.indexOf(":"),r=Number(o.slice(1,n));const s=this.deferred[r];if(!s)throw new Error(`Deferred ID ${r} not found in stream`);n=o.slice(n+1);let e;try{e=JSON.parse(n)}catch(e){throw new SyntaxError}n=i.call(this,e);s.reject(n);break}default:throw new SyntaxError}t=await e.read()}}.call(o,n).then(r.resolve).catch(e=>{for(const t of Object.values(o.deferred))t.reject(e);r.reject(e)}),{done:a.then(()=>n.closed),value:t.value}}function ee(e){const t=new Error(e.message||e);return e.stack&&(t.stack=e.stack),Object.assign(t,e.originalError,e)}var e=window.oc||{},t=new class{loaded=new Set;errors=new Set;parse(e){const[t,r]=e.split("#");var n=t.startsWith("module:"),o=t.replace(/^module:/,""),[a,e]=(r?.split("=")||[]).reduce((e,t)=>t.startsWith("=")?[t.slice(1),e[1]]:[e[0],t],[]);return{src:o,isModule:n,fallback:a,id:e}}async load(...e){for(const t of e)Array.isArray(t)?await Promise.all(t.map(e=>this._load(e))):"function"==typeof t?await t():await this._load(t);return this}async _load(t){if(!this.loaded.has(t))try{t.endsWith(".css")?await this.css(t):await this.js(t),this.loaded.add(t)}catch(e){for(const r of this.errors)r(t);throw e}}js(e){const{src:n,isModule:o,fallback:a}=this.parse(e);return new Promise((e,t)=>{const r=document.createElement("script");r.type=o?"module":"text/javascript",r.src=n,r.onload=e,r.onerror=()=>a?this._load(a).then(e).catch(t):t(),document.head.append(r)})}css(e){const n=this.parse(e)["src"];return new Promise((e,t)=>{const r=document.createElement("link");r.rel="stylesheet",r.href=n,r.onload=e,r.onerror=t,document.head.append(r)})}onError(e){return this.errors.add(e),this}};window.ljs=t,window.oc=function(l){if(l.status)return l;l.status="loading",l.conf=l.conf||{},l.cmd=l.cmd||[],l.renderedComponents=l.renderedComponents||{},l.clientVersion="2.1.3";let i=(e,t)=>{if(!t)throw e+" parameter is required"},s=document,c=window,d=()=>{},t=!1,r=!1,u={};var e=e=>"boolean"==typeof e;let m=setTimeout,n=l.cmd,p=l.conf,h=l.renderedComponents,f="data-rendered",y="data-rendering",v=e=>console.log(e),b=e=>p.debug&&console.log(e),w=e=>"x-text/stream"!==e.headers.get("Content-Type")?e.json():X(e.body).then(e=>e.value),g=p.retryInterval||Number(5e3),j=p.retryLimit||Number(30),a=!!e(p.disableLoader)&&p.disableLoader,E=p.retrySendNumber||!0,x=p.pollingInterval||500,S=p.tag||"oc-component";e=!!e(p.disableLifecycles)&&p.disableLifecycles;let A="Failed to load % component "+j+" times. Giving up",N="Error rendering component: %, error: ",C="Failed to retrieve the component. Retrying in "+g/1e3+" seconds...",O=p.loadingMessage||"",_=(e,t)=>e.replace("%",t),k=I,o=R,U=D,L=(e,t)=>{(e=Array.isArray(e)?e:[e]).map(e=>{!t&&k[e.type]||(k[e.type]={externals:e.externals})})};p.templates&&L(p.templates,!0);let T=()=>{let e=p.globalHeaders;return{Accept:"application/vnd.oc.unrendered+json","Content-Type":"application/json",..."function"==typeof e?e():e}};l.addStylesToHead=e=>{let t=s.createElement("style");t.textContent=e,s.head.appendChild(t)};let H=()=>{l.ready(l.renderUnloadedComponents)};l.registerTemplates=e=>(L(e),H(),k),l.require=(r,e,t)=>{t||(t=e,e=r,r=void 0),"string"==typeof r&&(r=[r]);let n=()=>{let e=c;if(null!=r){for(var t in r)if(e=e[r[t]],!e)return;return e}};var o=()=>{t(n())};n()?o():ljs.load(e,o)};let M=(t,r,n)=>{var e;n||(n=r,r=[]),t.length?(e=t[0],l.require(e.global,e.url,e=>{M(t.slice(1),r.concat(e),n)})):n(r)};l.requireSeries=M;let P=(e,t,r)=>{let n=e.setAttribute.bind(e);var o=t.name,a=t.version;n("id",t.id),n(f,!0),n(y,!1),n("data-version",a),n("data-id",t.ocId),"string"==typeof t.html&&(e.innerHTML=t.html),(e=>{for(var t of Array.from(e.querySelectorAll("script"))){let e=s.createElement("script");e.textContent=t.textContent;for(var r of Array.from(t.attributes))e.setAttribute(r.name,r.value);t.parentNode?.replaceChild(e,t)}})(e),t.key&&n("data-hash",t.key),o&&(n("data-name",o),h[o]={version:a},t.baseUrl&&(h[o].baseUrl=t.baseUrl),t.element=e,l.events.fire("oc:rendered",t)),r()},q=(n,o)=>{o=o||d;let e=n.version,t=n.baseUrl,r=n.name;i("version",e),i("baseUrl",t),i("name",r),n.action&&(t=`${t}~actions/${n.action}/${n.name}/${n.version||""}`);var a={...p.globalParameters,...n.parameters},s=n.action?a:{components:[{action:n.action,name:r,version:e,parameters:a}]},a=T();fetch(t,{method:"POST",headers:a,body:JSON.stringify(s)}).then(w).then(e=>{var t,r;n.action?(r=e.error?ee(e.details||e.error):null,o(r,e.data)):(r=(t=e[0].response).error?ee(t.details||t.error):null,o(r,t.data,e[0]))}).catch(o)};l.getData=q,l.getAction=t=>new Promise((r,n)=>{var e=t.component;q({json:!0,name:e,...h[e],...t},(e,t)=>{if(e)n(e);else if(t.component){let e=t.component.props;delete e._staticPath,delete e._baseUrl,delete e._componentName,delete e._componentVersion,r(e)}else r()})}),l.build=e=>{i("baseUrl",e.baseUrl),i("name",e.name);var t=e=>e?e.match(/\/$/)?e:e+"/":"";let r=t(e.baseUrl)+t(e.name)+t(e.version);if(e.parameters){r+="?";for(var[n,o]of Object.entries(e.parameters))/[+&=]/.test(o)&&(o=encodeURIComponent(o)),r+=n+"="+o+"&";r=r.slice(0,-1)}return"<"+S+' href="'+r+'"></'+S+">"},l.ready=e=>{t?e():r?n.push(e):(r=!0,l.requireSeries(o,()=>{t=!0,r=!1,l.events=(()=>{let n={};return{fire(e,t){if(n[e])for(var r of n[e])r({type:e},t)},on(e,t){if(!t)throw new Error("Callback is required");n[e]||(n[e]=[]),n[e].push(t)},off(e,t){for(var r of e="string"==typeof e?[e]:e)n[r]&&(t?n[r]=n[r].filter(e=>e!==t):delete n[r])},reset(){n={}}}})(),0<Object.keys(U).length&&s.head.appendChild(Object.assign(s.createElement("script"),{type:"importmap",textContent:JSON.stringify({imports:U})})),e(),l.events.fire("oc:ready",l),l.status="ready",n.map(e=>{e(l)}),l.cmd={push:e=>e(l)}}))};const $=(e,t,r)=>{!!t.data?.component?.esm?(async(t,r)=>{try{const{_staticPath:n,_componentName:o,_componentVersion:a}=t.component.props;window.oc._esm=window.oc._esm||{};window.oc._esm[`${o}@${a}`]=e=>{return n+"public/"+e};const{mount:s}=await import(t.component.src);let e={};if(t.component.development)e.development=t.component.development;s(t.element,t.component.props,e);r(null)}catch(e){console.error("Error rendering ESM component",e);r(e)}})(t.data,r):l.render(e,t.data,r)};return l.render=(n,o,a)=>{l.ready(()=>{if(o&&1==o.__oc_emptyResponse)return a(null,"");let t=n.type;"jade"!=t&&"handlebars"!=t||(t="oc-template-"+t);let r=k[t];r?l.require(["oc","components",n.key],n.src,e=>{e?M(r.externals,()=>{try{a(null,("oc-template-handlebars"==t?c.Handlebars.template(e,[]):e)(o))}catch(e){a(""+e)}}):a(_("Error getting compiled view: %",n.src))}):a(_('Error loading component: view engine "%" not supported',n.type))})},l.renderNestedComponent=(n,o)=>{l.ready(()=>{let e=(n=n[0]||n).getAttribute.bind(n),r=n.setAttribute.bind(n);var t="true"==e(y);"true"==e(f)?o():t?m(()=>{l.renderNestedComponent(n,o)},x):(b("Unrendered component found. Trying to retrieve it..."),r(y,!0),a||(n.innerHTML='<div class="oc-loading">'+O+"</div>"),l.renderByHref({href:e("href"),id:e("id"),element:n},(e,t)=>{e||!t?(r(y,!1),r(f,!1),r("data-failed",!0),n.innerHTML="",l.events.fire("oc:failed",{originalError:e,data:t,component:n}),v(e),o()):P(n,t,o)}))})},l.renderByHref=(e,t,o)=>{o=o||t;let a=Math.floor(9999999999*Math.random()),r=e.retryNumber||+t||0,n=e.href||e,s=e.id||a,i=e.element;l.ready(()=>{var e,t;n?fetch((e=n,t={...p.globalParameters,...E?{__oc_Retry:r}:{}},e+(~e.indexOf("?")?"&":"?")+new URLSearchParams(t)),{headers:T()}).then(w).then(r=>{let n=r.template;r.data.id=a,r.data.element=i,$(n,r,(e,t)=>{e?o(_(N,r.href)+e):(b(_("Component '%' correctly rendered",n.src)),o(null,{id:s,ocId:a,html:t,baseUrl:r.baseUrl,key:n.key,version:r.version,name:r.name}))})}).catch(e=>{var t,r;e&&429==e.status&&(u[n]=0),v(C),t=n,r=e=>{l.renderByHref({href:n,retryNumber:e,id:s,element:i},o)},e=()=>{o(_(A,n))},null==u[t]&&(u[t]=j),u[t]<=0?e():(m(()=>{r(j-u[t]+1)},g),u[t]--)}):o(N+"Href parameter missing")})},l.renderUnloadedComponents=()=>{l.ready(()=>{let r=s.querySelectorAll(`${S}:not([data-rendered="true"]):not([data-failed="true"])`);r.forEach((e,t)=>{l.renderNestedComponent(e,()=>{t==r.length-1&&l.renderUnloadedComponents()})})})},l.load=(t,r,n)=>{l.ready(()=>{if(n=n||d,t){(t=t[0]||t).innerHTML="<"+S+' href="'+r+'" />';let e=t.querySelector(S);l.renderNestedComponent(e,()=>{n(e)})}})},H(),window.customElements&&window.customElements.define(S,class extends HTMLElement{#connected=!1;#manageLifecycle=!e;constructor(){super()}connectedCallback(){this.#connected=!0,"true"==this.getAttribute("disable-lifecycle")||""==this.getAttribute("disable-lifecycle")?this.#manageLifecycle=!1:"false"==this.getAttribute("disable-lifecycle")&&(this.#manageLifecycle=!0),this.#manageLifecycle&&l.renderNestedComponent(this,()=>{})}disconnectedCallback(){var e;this.#connected&&(this.#connected=!1,(e=this.getAttribute("id"))&&l.events.fire("oc:unrendered",{element:this,id:e}),this.#manageLifecycle&&this.unmount&&"true"==this.getAttribute("data-rendered")&&(this.unmount(),this.removeAttribute("data-rendered")))}}),l}(e)})();
1
+ (()=>{var R=[],D={},I={"oc-template-handlebars":{externals:[{global:"Handlebars",url:"https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.7/handlebars.runtime.min.js"}]},"oc-template-jade":{externals:[{global:"jade",url:"https://cdnjs.cloudflare.com/ajax/libs/jade/1.11.0/runtime.min.js"}]},"oc-template-es6":{externals:[]}},k=-1,U=-2,L=-3,T=-4,H=-5,M=-6,P=-7,q="B",$="D",B="E",J="M",V="N",W="P",F="R",G="S",Y="Y",Z="U",z="Z",K=class{promise;resolve;reject;constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}};Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var Q="undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:void 0;function i(e){const{hydrated:t,values:r}=this;if("number"==typeof e)return a.call(this,e);if(!Array.isArray(e)||!e.length)throw new SyntaxError;var n=r.length;for(const o of e)r.push(o);return t.length=r.length,a.call(this,n)}function a(e){const{hydrated:r,values:t,deferred:n,plugins:o}=this;let a;const s=[[e,e=>{a=e}]];let i=[];for(;0<s.length;){const[y,v]=s.pop();switch(y){case P:v(void 0);continue;case H:v(null);continue;case U:v(NaN);continue;case M:v(1/0);continue;case L:v(-1/0);continue;case T:v(-0);continue}if(r[y])v(r[y]);else{const b=t[y];if(b&&"object"==typeof b)if(Array.isArray(b))if("string"==typeof b[0]){var[l,c,d]=b;switch(l){case $:v(r[y]=new Date(c));continue;case Z:v(r[y]=new URL(c));continue;case q:v(r[y]=BigInt(c));continue;case F:v(r[y]=new RegExp(c,d));continue;case Y:v(r[y]=Symbol.for(c));continue;case G:const w=new Set;r[y]=w;for(let e=1;e<b.length;e++)s.push([b[e],e=>{w.add(e)}]);v(w);continue;case J:const g=new Map;r[y]=g;for(let e=1;e<b.length;e+=2){const E=[];s.push([b[e+1],e=>{E[1]=e}]),s.push([b[e],e=>{E[0]=e}]),i.push(()=>{g.set(E[0],E[1])})}v(g);continue;case V:const j=Object.create(null);r[y]=j;for(const x of Object.keys(c).reverse()){const S=[];s.push([c[x],e=>{S[1]=e}]),s.push([Number(x.slice(1)),e=>{S[0]=e}]),i.push(()=>{j[S[0]]=S[1]})}v(j);continue;case W:r[c]?v(r[y]=r[c]):(m=new K,n[c]=m,v(r[y]=m.promise));continue;case B:var[,u,m]=b,u=new(m&&Q&&Q[m]?Q[m]:Error)(u);r[y]=u,v(u);continue;case z:v(r[y]=r[c]);continue;default:if(Array.isArray(o)){const A=[];var p=b.slice(1);for(let t=0;t<p.length;t++){var h=p[t];s.push([h,e=>{A[t]=e}])}i.push(()=>{for(const t of o){var e=t(b[0],...A);if(e)return void v(r[y]=e.value)}throw new SyntaxError});continue}throw new SyntaxError}}else{const N=[];r[y]=N;for(let t=0;t<b.length;t++){var f=b[t];f!==k&&s.push([f,e=>{N[t]=e}])}v(N)}else{const C={};r[y]=C;for(const O of Object.keys(b).reverse()){const _=[];s.push([b[O],e=>{_[1]=e}]),s.push([Number(O.slice(1)),e=>{_[0]=e}]),i.push(()=>{C[_[0]]=_[1]})}v(C)}else r[y]=b,v(b)}}for(;0<i.length;)i.pop()();return a}async function X(e,t){var t=(t??{})["plugins"];const r=new K,n=e.pipeThrough(function(){const o=new TextDecoder;let a="";return new TransformStream({transform(e,t){e=o.decode(e,{stream:!0});const r=(a+e).split("\n");a=r.pop()||"";for(const n of r)t.enqueue(n)},flush(e){a&&e.enqueue(a)}})}()).getReader(),o={values:[],hydrated:[],deferred:{},plugins:t};t=await async function(e){e=await e.read();if(!e.value)throw new SyntaxError;let t;try{t=JSON.parse(e.value)}catch(e){throw new SyntaxError}return{done:e.done,value:i.call(this,t)}}.call(o,n);let a=r.promise;return t.done?r.resolve():a=async function(e){let t=await e.read();for(;!t.done;)if(t.value){const o=t.value;switch(o[0]){case W:{var r=o.indexOf(":"),n=Number(o.slice(1,r));const a=this.deferred[n];if(!a)throw new Error(`Deferred ID ${n} not found in stream`);n=o.slice(r+1);let e;try{e=JSON.parse(n)}catch(e){throw new SyntaxError}r=i.call(this,e);a.resolve(r);break}case B:{n=o.indexOf(":"),r=Number(o.slice(1,n));const s=this.deferred[r];if(!s)throw new Error(`Deferred ID ${r} not found in stream`);n=o.slice(n+1);let e;try{e=JSON.parse(n)}catch(e){throw new SyntaxError}n=i.call(this,e);s.reject(n);break}default:throw new SyntaxError}t=await e.read()}}.call(o,n).then(r.resolve).catch(e=>{for(const t of Object.values(o.deferred))t.reject(e);r.reject(e)}),{done:a.then(()=>n.closed),value:t.value}}function ee(e){const t=new Error(e.message||e);return e.stack&&(t.stack=e.stack),Object.assign(t,e.originalError,e)}var e=window.oc||{},t=new class{loaded=new Set;errors=new Set;parse(e){const[t,r]=e.split("#");var n=t.startsWith("module:"),o=t.replace(/^module:/,""),[a,e]=(r?.split("=")||[]).reduce((e,t)=>t.startsWith("=")?[t.slice(1),e[1]]:[e[0],t],[]);return{src:o,isModule:n,fallback:a,id:e}}async load(...e){for(const t of e)Array.isArray(t)?await Promise.all(t.map(e=>this._load(e))):"function"==typeof t?await t():await this._load(t);return this}async _load(t){if(!this.loaded.has(t))try{t.endsWith(".css")?await this.css(t):await this.js(t),this.loaded.add(t)}catch(e){for(const r of this.errors)r(t);throw e}}js(e){const{src:n,isModule:o,fallback:a}=this.parse(e);return new Promise((e,t)=>{const r=document.createElement("script");r.type=o?"module":"text/javascript",r.src=n,r.onload=e,r.onerror=()=>a?this._load(a).then(e).catch(t):t(),document.head.append(r)})}css(e){const n=this.parse(e)["src"];return new Promise((e,t)=>{const r=document.createElement("link");r.rel="stylesheet",r.href=n,r.onload=e,r.onerror=t,document.head.append(r)})}onError(e){return this.errors.add(e),this}};window.ljs=t,window.oc=function(l){if(l.status)return l;l.status="loading",l.conf=l.conf||{},l.cmd=l.cmd||[],l.renderedComponents=l.renderedComponents||{},l.clientVersion="2.1.4";let i=(e,t)=>{if(!t)throw e+" parameter is required"},s=document,c=window,d=()=>{},t=!1,r=!1,u={};var e=e=>"boolean"==typeof e;let m=setTimeout,n=l.cmd,p=l.conf,h=l.renderedComponents,f="data-rendered",y="data-rendering",v=e=>console.log(e),b=e=>p.debug&&console.log(e),w=e=>"x-text/stream"!==e.headers.get("Content-Type")?e.json():X(e.body).then(e=>e.value),g=p.retryInterval||Number(5e3),j=p.retryLimit||Number(30),a=!!e(p.disableLoader)&&p.disableLoader,E=p.retrySendNumber||!0,x=p.pollingInterval||500,S=p.tag||"oc-component";e=!!e(p.disableLifecycles)&&p.disableLifecycles;let A="Failed to load % component "+j+" times. Giving up",N="Error rendering component: %, error: ",C="Failed to retrieve the component. Retrying in "+g/1e3+" seconds...",O=p.loadingMessage||"",_=(e,t)=>e.replace("%",t),k=I,o=R,U=D,L=(e,t)=>{(e=Array.isArray(e)?e:[e]).map(e=>{!t&&k[e.type]||(k[e.type]={externals:e.externals})})};p.templates&&L(p.templates,!0);let T=()=>{let e=p.globalHeaders;return{Accept:"application/vnd.oc.unrendered+json","Content-Type":"application/json",..."function"==typeof e?e():e}};l.addStylesToHead=e=>{let t=s.createElement("style");t.textContent=e,s.head.appendChild(t)};let H=()=>{l.ready(l.renderUnloadedComponents)};l.registerTemplates=e=>(L(e),H(),k),l.require=(r,e,t)=>{t||(t=e,e=r,r=void 0),"string"==typeof r&&(r=[r]);let n=()=>{let e=c;if(null!=r){for(var t in r)if(e=e[r[t]],!e)return;return e}};var o=()=>{t(n())};n()?o():ljs.load(e,o)};let M=(t,r,n)=>{var e;n||(n=r,r=[]),t.length?(e=t[0],l.require(e.global,e.url,e=>{M(t.slice(1),r.concat(e),n)})):n(r)};l.requireSeries=M;let P=(e,t,r)=>{let n=e.setAttribute.bind(e);var o=t.name,a=t.version;n("id",t.id),n(f,!0),n(y,!1),n("data-version",a),n("data-id",t.ocId),"string"==typeof t.html&&(e.innerHTML=t.html),(e=>{for(var t of Array.from(e.querySelectorAll("script"))){let e=s.createElement("script");e.textContent=t.textContent;for(var r of Array.from(t.attributes))e.setAttribute(r.name,r.value);t.parentNode?.replaceChild(e,t)}})(e),t.key&&n("data-hash",t.key),o&&(n("data-name",o),h[o]={version:a},t.baseUrl&&(h[o].baseUrl=t.baseUrl),t.element=e,l.events.fire("oc:rendered",t)),r()},q=(n,o)=>{o=o||d;let e=n.version,t=n.baseUrl,r=n.name;i("version",e),i("baseUrl",t),i("name",r),n.action&&(t=`${t}~actions/${n.action}/${n.name}/${n.version||""}`);var a={...p.globalParameters,...n.parameters},s=n.action?a:{components:[{action:n.action,name:r,version:e,parameters:a}]},a=T();fetch(t,{method:"POST",headers:a,body:JSON.stringify(s)}).then(w).then(e=>{var t,r;n.action?(r=e.error?ee(e.details||e.error):null,o(r,e.data)):(r=(t=e[0].response).error?ee(t.details||t.error):null,o(r,t.data,e[0]))}).catch(o)};l.getData=q,l.getAction=t=>new Promise((r,n)=>{var e=t.component;q({json:!0,name:e,...h[e],...t},(e,t)=>{if(e)n(e);else if(t.component){let e=t.component.props;delete e._staticPath,delete e._baseUrl,delete e._componentName,delete e._componentVersion,r(e)}else r()})}),l.build=e=>{i("baseUrl",e.baseUrl),i("name",e.name);var t=e=>e?e.match(/\/$/)?e:e+"/":"";let r=t(e.baseUrl)+t(e.name)+t(e.version);if(e.parameters){r+="?";for(var[n,o]of Object.entries(e.parameters))/[+&=]/.test(o)&&(o=encodeURIComponent(o)),r+=n+"="+o+"&";r=r.slice(0,-1)}return"<"+S+' href="'+r+'"></'+S+">"},l.ready=e=>{t?e():r?n.push(e):(r=!0,l.requireSeries(o,()=>{t=!0,r=!1,l.events=(()=>{let n={};return{fire(e,t){if(n[e])for(var r of n[e])r({type:e},t)},on(e,t){if(!t)throw new Error("Callback is required");n[e]||(n[e]=[]),n[e].push(t)},off(e,t){for(var r of e="string"==typeof e?[e]:e)n[r]&&(t?n[r]=n[r].filter(e=>e!==t):delete n[r])},reset(){n={}}}})(),0<Object.keys(U).length&&s.head.appendChild(Object.assign(s.createElement("script"),{type:"importmap",textContent:JSON.stringify({imports:U})})),e(),l.events.fire("oc:ready",l),l.status="ready",n.map(e=>{e(l)}),l.cmd={push:e=>e(l)}}))};const $=(e,t,r)=>{!!t.data?.component?.esm?(async(t,r)=>{try{const{_staticPath:n,_componentName:o,_componentVersion:a}=t.component.props;window.oc._esm=window.oc._esm||{};window.oc._esm[`${o}@${a}`]=e=>{return n+"public/"+e};const{mount:s}=await import(t.component.src);let e={};if(t.component.development)e.development=t.component.development;s(t.element,t.component.props,e);r(null)}catch(e){console.error("Error rendering ESM component",e);r(e)}})(t.data,r):l.render(e,t.data,r)};return l.render=(n,o,a)=>{l.ready(()=>{if(o&&1==o.__oc_emptyResponse)return a(null,"");let t=n.type;"jade"!=t&&"handlebars"!=t||(t="oc-template-"+t);let r=k[t];r?l.require(["oc","components",n.key],n.src,e=>{e?M(r.externals,()=>{try{a(null,("oc-template-handlebars"==t?c.Handlebars.template(e,[]):e)(o))}catch(e){a(""+e)}}):a(_("Error getting compiled view: %",n.src))}):a(_('Error loading component: view engine "%" not supported',n.type))})},l.renderNestedComponent=(n,o)=>{l.ready(()=>{let e=(n=n[0]||n).getAttribute.bind(n),r=n.setAttribute.bind(n);var t="true"==e(y);"true"==e(f)?o():t?m(()=>{l.renderNestedComponent(n,o)},x):(b("Unrendered component found. Trying to retrieve it..."),r(y,!0),a||(n.innerHTML='<div class="oc-loading">'+O+"</div>"),l.renderByHref({href:e("href"),id:e("id"),element:n},(e,t)=>{e||!t?(r(y,!1),r(f,!1),r("data-failed",!0),n.innerHTML="",l.events.fire("oc:failed",{originalError:e,data:t,component:n}),v(e),o()):P(n,t,o)}))})},l.renderByHref=(e,t,o)=>{o=o||t;let a=Math.floor(9999999999*Math.random()),r=e.retryNumber||+t||0,n=e.href||e,s=e.id||a,i=e.element;l.ready(()=>{var e,t;n?fetch((e=n,t={...p.globalParameters,...E?{__oc_Retry:r}:{}},e+(~e.indexOf("?")?"&":"?")+new URLSearchParams(t)),{headers:T()}).then(w).then(r=>{let n=r.template;r.data.id=a,r.data.element=i,$(n,r,(e,t)=>{e?o(_(N,r.href)+e):(b(_("Component '%' correctly rendered",n.src)),o(null,{id:s,ocId:a,html:t,baseUrl:r.baseUrl,key:n.key,version:r.version,name:r.name}))})}).catch(e=>{var t,r;e&&429==e.status&&(u[n]=0),v(C),t=n,r=e=>{l.renderByHref({href:n,retryNumber:e,id:s,element:i},o)},e=()=>{o(_(A,n))},null==u[t]&&(u[t]=j),u[t]<=0?e():(m(()=>{r(j-u[t]+1)},g),u[t]--)}):o(N+"Href parameter missing")})},l.renderUnloadedComponents=()=>{l.ready(()=>{let r=s.querySelectorAll(`${S}:not([data-rendered="true"]):not([data-failed="true"])`);r.forEach((e,t)=>{l.renderNestedComponent(e,()=>{t==r.length-1&&l.renderUnloadedComponents()})})})},l.load=(t,r,n)=>{l.ready(()=>{if(n=n||d,t){(t=t[0]||t).innerHTML="<"+S+' href="'+r+'" />';let e=t.querySelector(S);l.renderNestedComponent(e,()=>{n(e)})}})},H(),window.customElements&&window.customElements.define(S,class extends HTMLElement{#connected=!1;#manageLifecycle=!e;constructor(){super()}connectedCallback(){this.#connected=!0,"true"==this.getAttribute("disable-lifecycle")||""==this.getAttribute("disable-lifecycle")?this.#manageLifecycle=!1:"false"==this.getAttribute("disable-lifecycle")&&(this.#manageLifecycle=!0),this.#manageLifecycle&&l.renderNestedComponent(this,()=>{})}disconnectedCallback(){var e;this.#connected&&(this.#connected=!1,(e=this.getAttribute("id"))&&l.events.fire("oc:unrendered",{element:this,id:e}),this.#manageLifecycle&&this.unmount&&"true"==this.getAttribute("data-rendered")&&(this.unmount(),this.removeAttribute("data-rendered")))}}),l}(e)})();
2
2
  //# sourceMappingURL=oc-client.min.map
@@ -11,6 +11,7 @@ export interface RegistryOptions<T = any> extends Partial<Omit<Config<T>, 'befor
11
11
  ui?: boolean;
12
12
  experimental?: boolean;
13
13
  api?: boolean;
14
+ validate?: boolean;
14
15
  } | boolean;
15
16
  /**
16
17
  * Public base URL where the registry will be accessible by consumers.