12345 |
- /*
- All material copyright ESRI, All Rights Reserved, unless otherwise specified.
- See https://js.arcgis.com/4.25/esri/copyright.txt for details.
- */
- import e from"../../core/Error.js";import{json as t}from"../../portal/schemas/webScene.js";import{ScanContext as r,sorted as n}from"./utils.js";function s(e,t){if(t.properties){if("layerType"in t.properties)return t.properties.layerType.enum[0];if("type"in t.properties)return t.properties.type.enum[0]}switch(e){case"multipoint_geometry_schema.json":return"multipoint";case"point_geometry_schema.json":return"point";case"polyline_geometry_schema.json":return"polyline";case"polygon_geometry_schema.json":return"polygon";case"extent_schema.json":return"extent"}}function i(e){return"array"===e.type?`${i(e.items)}[]`:e.type}function a(e){const t={count:e.length,refsCount:0,typesCount:0,distinctTypes:[],type:null},r=new Set;for(const n in e){const s=e[n];s.$ref?t.refsCount++:s.type&&(t.typesCount++,r.add(i(s)))}return r.forEach((e=>t.distinctTypes.push(e))),t.distinctTypes.sort(),t.refsCount===t.count?t.type="refs":2===t.count&&t.refsCount>0&&1===t.distinctTypes.length&&"null"===t.distinctTypes[0]?t.type="refsAndNull":t.typesCount===t.count?(t.type="types",t.distinctTypes=t.distinctTypes):t.type="mix",t}function o(e){return"array"===e.type||!("properties"in e)}function c(e,t,r){if(!r.hasFilteredProperties)return`${e}--${t}`;return`${e}--${t}--${r.filteredPropertiesArray.join("/")}`}async function l(e,t,r,n,i){i.schemaStack.push(e);const a=s(e,r),l=n?n.replace("<?TYPE?>",a?`<${a}>`:""):"";if(o(r)){const n=i.currentClass?null:{type:e,name:e,id:`${e}--${t}`,typeValue:t,properties:[]};return n&&i.push(null,n),await L(r,l,i),i.schemaStack.pop(),n}const p=c(e,t,i),u="drawingInfo_schema.json"!==e&&"layer_schema.json"!==e&&i.seen.get(p);if(u&&l)return i.addProperty({name:l,type:u}),i.schemaStack.pop(),u;const f={type:e,name:e,id:p,typeValue:t,properties:[]};return l&&i.addProperty({name:l,type:f}),i.push(l,f),await L(r,"",i),i.schemaStack.pop(),i.pop()}async function p(e,t,r){const n=await r.requestSchema(e.$ref),s=R(n.schema);if(s){for(const e of s){const s={...n.schema};s.properties={...s.properties,type:{type:"string",enum:[e]}};const i=t&&!t.includes("<?TYPE?>")?`${t}<?TYPE?>`:t;await l(n.schemaId,e,s,i,r)}return}const i="layer_schema.json"===n.schemaId&&r.schemaStack.length?r.schemaStack[r.schemaStack.length-1].replace(/_schema\.json/,""):null;await l(n.schemaId,i,n.schema,t,r)}function u(e,t){if(!h(e))return!1;const r=e.stack.map((e=>e.klass.type)).join("/");return/.*pointCloudLayer_schema\.json\/layerDefinition_schema\.json\/drawingInfo_schema\.json$/.test(r)&&"renderer"===t}function f(e,t){if(!h(e))return!1;const r=e.stack.map((e=>e.klass.type)).join("/");return/.*(imageServiceLayer|tiledImageServiceLayer)_schema\.json\/layerDefinition_schema\.json\/drawingInfo_schema\.json$/.test(r)&&"renderer"===t}function h(e){return!!e.currentClass&&"drawingInfo_schema.json"===e.currentClass.name}function m(e){switch(e.schemaStack[e.schemaStack.length-1]){case"operationalLayers_schema.json":case"elevationLayers_schema.json":case"baseMapLayer_schema.json":return!0}return!1}const y=/raster.*Renderer|vectorFieldRenderer/,d=/(uniqueValueRenderer|classBreaksRenderer|raster.*Renderer|vectorFieldRenderer)/,_=/(rasterUniqueValueRenderer|rasterClassBreaksRenderer)/;function w(e,t,r){if(h(r)){const n=u(r,t),s=f(r,t);return e.filter((e=>{if(/uniqueValueFromStyleRenderer_schema\.json$/.test(e.$ref))return!1;if(s)return d.test(e.$ref)&&!_.test(e.$ref);if(y.test(e.$ref))return!1;const t=/pointCloud.*Renderer/.test(e.$ref);return n===t}))}if(m(r)){const t=["kmlLayer","rasterDataElevationLayer","rasterDataLayer"];return e.filter((e=>!t.some((t=>e.$ref.replace(/.*\//,"")===`${t}_schema.json`))))}return e}async function j(e,t,r){await L(e.items,`${t}[]`,r)}async function $(e,t,r){for(const n in e.properties)if(("webscene_schema.json"!==r.currentClass?.name||"tables"!==n&&"mapRangeInfo"!==n&&"widgets"!==n)&&("baseMap_schema.json"!==r.currentClass?.name||"elevationLayers"!==n)){if(h(r)){const e=r.stack.map((e=>e.klass.type)).join("/");if(/imageServiceLayer|tiledImageServiceLayer/.test(e)&&"transparency"===n)continue}await r.withFilter(n,(async()=>{const s=t?`${t}.${n}`:n;await L(e.properties[n],s,r)}))}}function g(e,t="",r=new Set){for(const n of e)if("properties"in n)for(const e in n.properties){const s=n.properties[e],i=t?`${t}.${e}`:e,a=Object.keys(s);if(0===a.length||1===a.length&&"$ref"===a[0])r.add(i);else{if(1!==a.length||"allOf"!==a[0])throw new Error(`unexpected allOf filter construct: ${JSON.stringify(s)}`);r.add(i),g(s.allOf,i,r)}}return r}async function P(e,t,r){let n=null;for(const i of e.allOf)if("$ref"in i){if(n)throw new Error("Cannot process more than 1 ref in an allOf construct");n=i}else if(!("properties"in i))throw new Error("allOf construct only allows simple top-level property filters");const s=g(e.allOf);await r.addFilter(s,(()=>p(n,t,r)))}async function S(e,t,r){const s=a(e.oneOf);if("refs"!==s.type&&"refsAndNull"!==s.type)if("types"!==s.type)for(const n in e.oneOf){const s=`.oneOf[${n}]`;await L(e.oneOf[n],`${t}${s}`,r)}else r.addProperty({name:t,type:n(s.distinctTypes).join("|")});else{const n=w(e.oneOf,t,r);for(const e of n)if("null"===e.type);else{const s=`${t||""}`+(1!==n.length?"<?TYPE?>":"");await L(e,s,r)}}}function R(e){if("layerDefinition"===e.title)return null;const t=e.properties&&e.properties.type;return t&&t.enum?t.enum:null}async function k(e,t,r){await p(e,t,r)}async function O(e,t,r){let s="unknown";e.type&&(s=Array.isArray(e.type)?n(e.type).join("|"):e.type.replace(/ /g,"").split(",").join("|"));const i={name:t,type:s,default:e.default};e.enum&&(i.enum=n(e.enum).map((e=>"string"==typeof e?`"${e}"`:`${e}`)).join("|")),r.addProperty(i)}async function L(e,t,r){return"array"===e.type?j(e,t,r):"properties"in e?$(e,t,r):"allOf"in e?P(e,t,r):"oneOf"in e?S(e,t,r):"$ref"in e?k(e,t,r):O(e,t,r)}const C="#/definitions/";function T(e){return 0===e.indexOf(C)?e.slice(C.length):e}async function b(e,t){const r=await E.create(e,t);return l(`${e||"webscene"}_schema.json`,null,r.schemaRoot,null,r)}class E extends r{constructor(e,t,r){super(),this.definitions=e,this.schemaRoot=t,this.requestSchema=r,this._filteredProperties=null,this.schemaStack=[],this.requestSchema.bind(this)}get hasFilteredProperties(){return!!this._filteredProperties&&this._filteredProperties.size>0}get filteredPropertiesArray(){const e=[];return this._filteredProperties?.forEach((t=>e.push(t))),e}async withFilter(e,t){if(!this.hasFilteredProperties)return t();if(!this._filteredProperties?.has(e))return;const r=this._filteredProperties;this._filteredProperties=null;const n=e=>{this._filteredProperties||(this._filteredProperties=new Set),this._filteredProperties.add(e)};r.forEach((t=>{const r=t.split(".",2);r.length>1&&r[0]===e&&n(r[1])})),await t(),this._filteredProperties=r}async addFilter(e,t){const r=this._filteredProperties;this._filteredProperties=null;const n=e=>{this._filteredProperties||(this._filteredProperties=new Set),this._filteredProperties.add(e)};r&&r.forEach(n),e&&e.forEach(n);const s=await t();return this._filteredProperties=r,s}static async create(e,t){return t&&t.useRemoteSchema?E.createRemote(e,t?.baseUrl):E.createLocal(e)}static createLocal(e){const r=e&&"webscene"!==e?t.definitions[`${e}_schema.json`]:t;return new E(t.definitions,r,E._getLocalSchemaRequest())}static async createRemote(e,t){const r=await E._getRemoteSchemaRequest(t),n=new E({},null,r),s=(await n.requestSchema(`${e||"webscene"}_schema.json`)).schema;return new E(n.definitions,s,r)}static _getLocalSchemaRequest(){return function(t){const r=T(t),n=this.definitions[r];return n?Promise.resolve({schemaId:r,schema:n}):Promise.reject(new e("spec-certification:spec-invalid-local-schema","Schema reference is not a local reference"))}}static async _getRemoteSchemaRequest(t){if(!t)return Promise.reject(new e("spec-certification:spec-missing-base-url","The base url of the remote schema directory must be specified when using a remote schema"));const r=E._getLocalSchemaRequest(),n=(await import("../../request.js")).default;return function(e){return r.call(this,e).catch((()=>n(`${t}/${e}`,{responseType:"json"}).then((t=>(this.definitions[T(e)]=t.data,{schemaId:e,schema:t.data})))))}}}const q=Object.keys(t.definitions).map((e=>e.replace(/_schema\.json$/,"")));export{b as scan,q as schemaDefinitions};
|