Best JavaScript code snippet using playwright-internal
FramebufferSpec.js
Source:FramebufferSpec.js
1/*global defineSuite*/2defineSuite([3 'Renderer/Framebuffer',4 'Core/Color',5 'Core/PixelFormat',6 'Core/PrimitiveType',7 'Core/WebGLConstants',8 'Renderer/Buffer',9 'Renderer/BufferUsage',10 'Renderer/ClearCommand',11 'Renderer/ContextLimits',12 'Renderer/CubeMap',13 'Renderer/DrawCommand',14 'Renderer/PixelDatatype',15 'Renderer/Renderbuffer',16 'Renderer/RenderbufferFormat',17 'Renderer/RenderState',18 'Renderer/ShaderProgram',19 'Renderer/Texture',20 'Renderer/VertexArray',21 'Specs/createContext'22 ], function(23 Framebuffer,24 Color,25 PixelFormat,26 PrimitiveType,27 WebGLConstants,28 Buffer,29 BufferUsage,30 ClearCommand,31 ContextLimits,32 CubeMap,33 DrawCommand,34 PixelDatatype,35 Renderbuffer,36 RenderbufferFormat,37 RenderState,38 ShaderProgram,39 Texture,40 VertexArray,41 createContext) {42 'use strict';43 var context;44 var sp;45 var va;46 var framebuffer;47 beforeAll(function() {48 context = createContext();49 });50 afterAll(function() {51 context.destroyForSpecs();52 });53 afterEach(function() {54 sp = sp && sp.destroy();55 va = va && va.destroy();56 framebuffer = framebuffer && framebuffer.destroy();57 });58 it('has a color texture attachment', function() {59 framebuffer = new Framebuffer({60 context : context,61 colorTextures : [new Texture({62 context : context,63 width : 1,64 height : 165 })]66 });67 expect(framebuffer.getColorTexture(0)).toBeDefined();68 });69 it('has a color renderbuffer attachment', function() {70 framebuffer = new Framebuffer({71 context : context,72 colorRenderbuffers : [new Renderbuffer({73 context : context,74 format : RenderbufferFormat.RGBA475 })]76 });77 expect(framebuffer.getColorRenderbuffer(0)).toBeDefined();78 });79 it('has a depth texture attachment', function() {80 if (context.depthTexture) {81 framebuffer = new Framebuffer({82 context : context,83 depthTexture : new Texture({84 context : context,85 width : 1,86 height : 1,87 pixelFormat : PixelFormat.DEPTH_COMPONENT,88 pixelDatatype : PixelDatatype.UNSIGNED_SHORT89 })90 });91 expect(framebuffer.depthTexture).toBeDefined();92 }93 });94 it('has a depth renderbuffer attachment', function() {95 framebuffer = new Framebuffer({96 context : context,97 depthRenderbuffer : new Renderbuffer({98 context : context,99 format : RenderbufferFormat.DEPTH_COMPONENT16100 })101 });102 expect(framebuffer.depthRenderbuffer).toBeDefined();103 });104 it('has a stencil renderbuffer attachment', function() {105 framebuffer = new Framebuffer({106 context : context,107 stencilRenderbuffer : new Renderbuffer({108 context : context,109 format : RenderbufferFormat.STENCIL_INDEX8110 })111 });112 expect(framebuffer.stencilRenderbuffer).toBeDefined();113 });114 it('has a depth-stencil texture attachment', function() {115 if (context.depthTexture) {116 framebuffer = new Framebuffer({117 context : context,118 depthStencilTexture : new Texture({119 context : context,120 width : 1,121 height : 1,122 pixelFormat : PixelFormat.DEPTH_STENCIL,123 pixelDatatype : PixelDatatype.UNSIGNED_INT_24_8124 })125 });126 expect(framebuffer.depthStencilTexture).toBeDefined();127 }128 });129 it('has a depth-stencil renderbuffer attachment', function() {130 framebuffer = new Framebuffer({131 context : context,132 depthStencilRenderbuffer : new Renderbuffer({133 context : context,134 format : RenderbufferFormat.DEPTH_STENCIL135 })136 });137 expect(framebuffer.depthStencilRenderbuffer).toBeDefined();138 });139 it('has a depth attachment', function() {140 framebuffer = new Framebuffer({141 context : context142 });143 expect(framebuffer.hasDepthAttachment).toEqual(false);144 framebuffer.destroy();145 framebuffer = new Framebuffer({146 context : context,147 depthRenderbuffer : new Renderbuffer({148 context : context,149 format : RenderbufferFormat.DEPTH_COMPONENT16150 })151 });152 expect(framebuffer.hasDepthAttachment).toEqual(true);153 });154 it('clears a color attachment', function() {155 // 1 of 3. Clear default color buffer to black.156 ClearCommand.ALL.execute(context);157 expect(context).toReadPixels([0, 0, 0, 255]);158 // 2 of 3. Clear framebuffer color attachment to green.159 var colorTexture = new Texture({160 context : context,161 width : 1,162 height : 1163 });164 framebuffer = new Framebuffer({165 context : context,166 colorTextures : [colorTexture]167 });168 var clearCommand = new ClearCommand({169 color : new Color (0.0, 1.0, 0.0, 1.0),170 framebuffer : framebuffer171 });172 clearCommand.execute(context);173 // 3 of 3. Render green to default color buffer by reading from previous color attachment174 var fs = 'uniform sampler2D u_texture; void main() { gl_FragColor = texture2D(u_texture, vec2(0.0)); }';175 var uniformMap = {176 u_texture : function() {177 return colorTexture;178 }179 };180 expect({181 context : context,182 fragmentShader : fs,183 uniformMap : uniformMap184 }).contextToRender([0, 255, 0, 255]);185 });186 it('clears a cube map face color attachment', function() {187 var cubeMap = new CubeMap({188 context : context,189 width : 1,190 height : 1191 });192 // 1 of 3. Clear default color buffer to black.193 ClearCommand.ALL.execute(context);194 expect(context).toReadPixels([0, 0, 0, 255]);195 // 2 of 3. Clear framebuffer color attachment to green.196 framebuffer = new Framebuffer({197 context : context,198 colorTextures : [cubeMap.positiveX],199 destroyAttachments : false200 });201 var clearCommand = new ClearCommand({202 color : new Color (0.0, 1.0, 0.0, 1.0),203 framebuffer : framebuffer204 });205 clearCommand.execute(context);206 // 3 of 3. Render green to default color buffer by reading from previous color attachment207 var fs = 'uniform samplerCube u_cubeMap; void main() { gl_FragColor = textureCube(u_cubeMap, vec3(1.0, 0.0, 0.0)); }';208 var uniformMap = {209 u_cubeMap : function() {210 return cubeMap;211 }212 };213 expect({214 context : context,215 fragmentShader : fs,216 uniformMap : uniformMap217 }).contextToRender([0, 255, 0, 255]);218 cubeMap = cubeMap.destroy();219 });220 it('draws to a color attachment', function() {221 var colorTexture = new Texture({222 context : context,223 width : 1,224 height : 1225 });226 framebuffer = new Framebuffer({227 context : context,228 colorTextures : [colorTexture]229 });230 // 1 of 4. Clear default color buffer to black.231 ClearCommand.ALL.execute(context);232 expect(context).toReadPixels([0, 0, 0, 255]);233 // 2 of 4. Render green point into color attachment.234 var vs = 'attribute vec4 position; void main() { gl_PointSize = 1.0; gl_Position = position; }';235 var fs = 'void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }';236 sp = ShaderProgram.fromCache({237 context : context,238 vertexShaderSource : vs,239 fragmentShaderSource : fs,240 attributeLocations : {241 position : 0242 }243 });244 va = new VertexArray({245 context : context,246 attributes : [{247 index : 0,248 vertexBuffer : Buffer.createVertexBuffer({249 context : context,250 typedArray : new Float32Array([0, 0, 0, 1]),251 usage : BufferUsage.STATIC_DRAW252 }),253 componentsPerAttribute : 4254 }]255 });256 var command = new DrawCommand({257 primitiveType : PrimitiveType.POINTS,258 shaderProgram : sp,259 vertexArray : va,260 framebuffer : framebuffer261 });262 command.execute(context);263 // 3 of 4. Verify default color buffer is still black.264 expect(context).toReadPixels([0, 0, 0, 255]);265 // 4 of 4. Render green to default color buffer by reading from previous color attachment266 var fs2 = 'uniform sampler2D u_texture; void main() { gl_FragColor = texture2D(u_texture, vec2(0.0)); }';267 var uniformMap = {268 u_texture : function() {269 return colorTexture;270 }271 };272 expect({273 context : context,274 fragmentShader : fs2,275 uniformMap : uniformMap276 }).contextToRender([0, 255, 0, 255]);277 });278 function renderDepthAttachment(framebuffer, texture) {279 ClearCommand.ALL.execute(context);280 // 1 of 3. Render green point into color attachment.281 var vs = 'attribute vec4 position; void main() { gl_PointSize = 1.0; gl_Position = position; }';282 var fs = 'void main() { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); }';283 sp = ShaderProgram.fromCache({284 context : context,285 vertexShaderSource : vs,286 fragmentShaderSource : fs,287 attributeLocations : {288 position : 0289 }290 });291 va = new VertexArray({292 context : context,293 attributes : [{294 index : 0,295 vertexBuffer : Buffer.createVertexBuffer({296 context : context,297 typedArray : new Float32Array([0, 0, 0, 1]),298 usage : BufferUsage.STATIC_DRAW299 }),300 componentsPerAttribute : 4301 }]302 });303 var command = new DrawCommand({304 primitiveType : PrimitiveType.POINTS,305 shaderProgram : sp,306 vertexArray : va,307 framebuffer : framebuffer,308 renderState : RenderState.fromCache({309 depthTest : {310 enabled : true311 }312 })313 });314 command.execute(context);315 // 2 of 3. Verify default color buffer is still black.316 expect(context).toReadPixels([0, 0, 0, 255]);317 // 3 of 3. Render green to default color buffer by reading from previous color attachment318 var vs2 = 'attribute vec4 position; void main() { gl_PointSize = 1.0; gl_Position = position; }';319 var fs2 = 'uniform sampler2D u_texture; void main() { gl_FragColor = texture2D(u_texture, vec2(0.0)).rrrr; }';320 var sp2 = ShaderProgram.fromCache({321 context : context,322 vertexShaderSource : vs2,323 fragmentShaderSource : fs2,324 attributeLocations : {325 position : 0326 }327 });328 var uniformMap = {329 u_texture : function() {330 return texture;331 }332 };333 command = new DrawCommand({334 primitiveType : PrimitiveType.POINTS,335 shaderProgram : sp2,336 vertexArray : va,337 uniformMap : uniformMap338 });339 command.execute(context);340 sp2 = sp2.destroy();341 return context.readPixels();342 }343 it('draws to a depth texture attachment', function() {344 if (context.depthTexture) {345 framebuffer = new Framebuffer({346 context : context,347 colorTextures : [new Texture({348 context : context,349 width : 1,350 height : 1351 })],352 depthTexture : new Texture({353 context : context,354 width : 1,355 height : 1,356 pixelFormat : PixelFormat.DEPTH_COMPONENT,357 pixelDatatype : PixelDatatype.UNSIGNED_SHORT358 })359 });360 if (framebuffer.status === WebGLConstants.FRAMEBUFFER_COMPLETE) {361 expect(renderDepthAttachment(framebuffer, framebuffer.depthTexture)).toEqualEpsilon([128, 128, 128, 255], 1);362 }363 }364 });365 it('draws to a depth-stencil texture attachment', function() {366 if (context.depthTexture) {367 framebuffer = new Framebuffer({368 context : context,369 colorTextures : [new Texture({370 context : context,371 width : 1,372 height : 1373 })],374 depthStencilTexture : new Texture({375 context : context,376 width : 1,377 height : 1,378 pixelFormat : PixelFormat.DEPTH_STENCIL,379 pixelDatatype : PixelDatatype.UNSIGNED_INT_24_8380 })381 });382 if (framebuffer.status === WebGLConstants.FRAMEBUFFER_COMPLETE) {383 expect(renderDepthAttachment(framebuffer, framebuffer.depthStencilTexture)).toEqualEpsilon([128, 128, 128, 255], 1);384 }385 }386 });387 it('draws with a depth attachment', function() {388 framebuffer = new Framebuffer({389 context : context,390 colorTextures : [new Texture({391 context : context,392 width : 1,393 height : 1394 })],395 depthRenderbuffer : new Renderbuffer({396 context : context,397 format : RenderbufferFormat.DEPTH_COMPONENT16,398 width : 1,399 height : 1400 })401 });402 var vs = 'attribute vec4 position; void main() { gl_PointSize = 1.0; gl_Position = position; }';403 var fs = 'void main() { gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); }';404 sp = ShaderProgram.fromCache({405 context : context,406 vertexShaderSource : vs,407 fragmentShaderSource : fs,408 attributeLocations : {409 position : 0410 }411 });412 va = new VertexArray({413 context : context,414 attributes : [{415 index : 0,416 vertexBuffer : Buffer.createVertexBuffer({417 context : context,418 typedArray : new Float32Array([0, 0, 0, 1]),419 usage : BufferUsage.STATIC_DRAW420 }),421 componentsPerAttribute : 4422 }]423 });424 // 1 of 3. Clear framebuffer425 var clearCommand = new ClearCommand({426 color : new Color(0.0, 0.0, 0.0, 0.0),427 depth : 1.0,428 framebuffer : framebuffer429 });430 clearCommand.execute(context);431 expect({432 context : context,433 framebuffer : framebuffer434 }).toReadPixels([0, 0, 0, 0]);435 // 2 of 3. Does not pass depth test436 var command = new DrawCommand({437 primitiveType : PrimitiveType.POINTS,438 shaderProgram : sp,439 vertexArray : va,440 framebuffer : framebuffer,441 renderState : RenderState.fromCache({442 depthTest : {443 enabled : true,444 func : WebGLConstants.NEVER445 }446 })447 });448 command.execute(context);449 expect({450 context : context,451 framebuffer : framebuffer452 }).toReadPixels([0, 0, 0, 0]);453 // 3 of 3. Passes depth test454 command = new DrawCommand({455 primitiveType : PrimitiveType.POINTS,456 shaderProgram : sp,457 vertexArray : va,458 framebuffer : framebuffer,459 renderState : RenderState.fromCache({460 depthTest : {461 enabled : true,462 func : WebGLConstants.ALWAYS463 }464 })465 });466 command.execute(context);467 expect({468 context : context,469 framebuffer : framebuffer470 }).toReadPixels([255, 255, 255, 255]);471 });472 it('draws with multiple render targets', function() {473 if (!context.drawBuffers) {474 return;475 }476 var source = new Uint8Array(4);477 var colorTexture0 = new Texture({478 context : context,479 source : {480 arrayBufferView : source,481 width : 1,482 height : 1483 }484 });485 var colorTexture1 = new Texture({486 context : context,487 source : {488 arrayBufferView : source,489 width : 1,490 height : 1491 }492 });493 framebuffer = new Framebuffer({494 context : context,495 colorTextures : [colorTexture0, colorTexture1]496 });497 // 1 of 5. Clear default color buffer to black.498 ClearCommand.ALL.execute(context);499 expect(context).toReadPixels([0, 0, 0, 255]);500 // 2 of 5. Render red point into color attachment 0 and green point to color attachment 1.501 var vs = 'attribute vec4 position; void main() { gl_PointSize = 1.0; gl_Position = position; }';502 var fs = '#extension GL_EXT_draw_buffers : enable \n void main() { gl_FragData[0] = vec4(1.0, 0.0, 0.0, 1.0); gl_FragData[1] = vec4(0.0, 1.0, 0.0, 1.0); }';503 sp = ShaderProgram.fromCache({504 context : context,505 vertexShaderSource : vs,506 fragmentShaderSource : fs,507 attributeLocations : {508 position : 0509 }510 });511 va = new VertexArray({512 context : context,513 attributes : [{514 index : 0,515 vertexBuffer : Buffer.createVertexBuffer({516 context : context,517 typedArray : new Float32Array([0, 0, 0, 1]),518 usage : BufferUsage.STATIC_DRAW519 }),520 componentsPerAttribute : 4521 }]522 });523 var command = new DrawCommand({524 primitiveType : PrimitiveType.POINTS,525 shaderProgram : sp,526 vertexArray : va,527 framebuffer : framebuffer528 });529 command.execute(context);530 // 3 of 5. Verify default color buffer is still black.531 expect(context).toReadPixels([0, 0, 0, 255]);532 // 4 of 5. Render yellow to default color buffer by reading from previous color attachments533 var vs2 = 'attribute vec4 position; void main() { gl_PointSize = 1.0; gl_Position = position; }';534 var fs2 = 'uniform sampler2D u_texture0; uniform sampler2D u_texture1; void main() { gl_FragColor = texture2D(u_texture0, vec2(0.0)) + texture2D(u_texture1, vec2(0.0)); }';535 var sp2 = ShaderProgram.fromCache({536 context : context,537 vertexShaderSource : vs2,538 fragmentShaderSource : fs2,539 attributeLocations : {540 position : 0541 }542 });543 var uniformMap = {544 u_texture0 : function() {545 return colorTexture0;546 },547 u_texture1 : function() {548 return colorTexture1;549 }550 };551 command = new DrawCommand({552 primitiveType : PrimitiveType.POINTS,553 shaderProgram : sp2,554 vertexArray : va,555 uniformMap : uniformMap556 });557 command.execute(context);558 expect(context).toReadPixels([255, 255, 0, 255]);559 // 5 of 5. Verify clearing multiple color attachments560 var clearCommand = new ClearCommand({561 color : new Color (0.0, 0.0, 0.0, 0.0),562 framebuffer : framebuffer563 });564 clearCommand.execute(context);565 command = new DrawCommand({566 primitiveType : PrimitiveType.POINTS,567 shaderProgram : sp2,568 vertexArray : va569 });570 command.execute(context);571 expect(context).toReadPixels([0, 0, 0, 255]);572 sp2 = sp2.destroy();573 });574 it('gets the status of a complete framebuffer', function() {575 framebuffer = new Framebuffer({576 context : context,577 colorTextures : [new Texture({578 context : context,579 width : 1,580 height : 1581 })],582 depthRenderbuffer : new Renderbuffer({583 context : context,584 format : RenderbufferFormat.DEPTH_COMPONENT16,585 width : 1,586 height : 1587 })588 });589 expect(framebuffer.status).toEqual(WebGLConstants.FRAMEBUFFER_COMPLETE);590 });591 it('gets the status of a incomplete framebuffer', function() {592 if (!!window.webglStub) {593 return;594 }595 framebuffer = new Framebuffer({596 context : context,597 colorTextures : [new Texture({598 context : context,599 width : 1,600 height : 1601 })],602 depthRenderbuffer : new Renderbuffer({603 context : context,604 format : RenderbufferFormat.RGBA4,605 width : 2,606 height : 2607 })608 });609 expect(framebuffer.status).not.toEqual(WebGLConstants.FRAMEBUFFER_COMPLETE);610 });611 it('destroys', function() {612 var f = new Framebuffer({613 context : context614 });615 expect(f.isDestroyed()).toEqual(false);616 f.destroy();617 expect(f.isDestroyed()).toEqual(true);618 });619 it('throws when created with color texture and color renderbuffer attachments', function() {620 expect(function() {621 framebuffer = new Framebuffer({622 context : context,623 colorTextures : 'not undefined',624 colorRenderbuffers : 'not undefined'625 });626 }).toThrowDeveloperError();627 });628 it('throws when created with depth texture and depth renderbuffer attachments', function() {629 expect(function() {630 framebuffer = new Framebuffer({631 context : context,632 depthTexture : 'not undefined',633 depthRenderbuffer : 'not undefined'634 });635 }).toThrowDeveloperError();636 });637 it('throws when created with depth-stencil texture and depth-stencil renderbuffer attachments', function() {638 expect(function() {639 framebuffer = new Framebuffer({640 context : context,641 depthStencilTexture : 'not undefined',642 depthStencilRenderbuffer : 'not undefined'643 });644 }).toThrowDeveloperError();645 });646 it('throws when created with depth and depth-stencil attachments', function() {647 expect(function() {648 framebuffer = new Framebuffer({649 context : context,650 depthRenderbuffer : 'not undefined',651 depthStencilRenderbuffer : 'not undefined'652 });653 }).toThrowDeveloperError();654 });655 it('throws when created with stencil and depth-stencil attachments', function() {656 expect(function() {657 framebuffer = new Framebuffer({658 context : context,659 stencilRenderbuffer : 'not undefined',660 depthStencilRenderbuffer : 'not undefined'661 });662 }).toThrowDeveloperError();663 });664 it('throws when created with depth and stencil attachments', function() {665 expect(function() {666 framebuffer = new Framebuffer({667 context : context,668 depthRenderbuffer : 'not undefined',669 stencilRenderbuffer : 'not undefined'670 });671 }).toThrowDeveloperError();672 });673 it('throws when created with a color texture with a non-color pixel format', function() {674 if (context.depthTexture) {675 expect(function() {676 framebuffer = new Framebuffer({677 context : context,678 colorTextures : [new Texture({679 context : context,680 width : 1,681 height : 1,682 pixelFormat : PixelFormat.DEPTH_COMPONENT,683 pixelDatatype : PixelDatatype.UNSIGNED_SHORT684 })]685 });686 }).toThrowDeveloperError();687 }688 });689 it('throws when created with a depth texture without a DEPTH_COMPONENT pixel format', function() {690 expect(function() {691 framebuffer = new Framebuffer({692 context : context,693 depthTexture : new Texture({694 context : context,695 width : 1,696 height : 1697 })698 });699 }).toThrowDeveloperError();700 });701 it('throws when created with a depth-stencil texture without a DEPTH_STENCIL pixel format', function() {702 expect(function() {703 framebuffer = new Framebuffer({704 context : context,705 depthStencilTexture : new Texture({706 context : context,707 width : 1,708 height : 1709 })710 });711 }).toThrowDeveloperError();712 });713 it('throws when the depth test is enabled without an appropriate attachment', function() {714 framebuffer = new Framebuffer({715 context : context,716 colorTextures : [new Texture({717 context : context,718 width : 1,719 height : 1720 })]721 });722 var vs = 'attribute vec4 position; void main() { gl_PointSize = 1.0; gl_Position = position; }';723 var fs = 'void main() { gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); }';724 sp = ShaderProgram.fromCache({725 context : context,726 vertexShaderSource : vs,727 fragmentShaderSource : fs,728 attributeLocations : {729 position : 0730 }731 });732 va = new VertexArray({733 context : context,734 attributes : [{735 index : 0,736 vertexBuffer : Buffer.createVertexBuffer({737 context : context,738 typedArray : new Float32Array([0, 0, 0, 1]),739 usage : BufferUsage.STATIC_DRAW740 }),741 componentsPerAttribute : 4742 }]743 });744 expect(function() {745 var command = new DrawCommand({746 primitiveType : PrimitiveType.POINTS,747 shaderProgram : sp,748 vertexArray : va,749 framebuffer : framebuffer,750 renderState : RenderState.fromCache({751 depthTest : {752 enabled : true753 }754 })755 });756 command.execute(context);757 }).toThrowDeveloperError();758 });759 it('throws when the number of color texture exceeds the number color attachments supported', function() {760 expect(function() {761 return new Framebuffer({762 context : context,763 colorTextures : new Array(ContextLimits.maximumColorAttachments + 1)764 });765 }).toThrowDeveloperError();766 });767 it('throws when the number of color renderbuffers exceeds the number color attachments supported', function() {768 expect(function() {769 return new Framebuffer({770 context : context,771 colorRenderbuffers : new Array(ContextLimits.maximumColorAttachments + 1)772 });773 }).toThrowDeveloperError();774 });775 it('throws when the index to getColorTexture is out of bounds', function(){776 framebuffer = new Framebuffer({777 context : context778 });779 expect(function() {780 framebuffer.getColorTexture();781 }).toThrowDeveloperError();782 expect(function() {783 framebuffer.getColorTexture(-1);784 }).toThrowDeveloperError();785 expect(function() {786 framebuffer.getColorTexture(ContextLimits.maximumColorAttachments + 1);787 }).toThrowDeveloperError();788 });789 it('throws when the index to getColorRenderbuffer is out of bounds', function(){790 framebuffer = new Framebuffer({791 context : context792 });793 expect(function() {794 framebuffer.getColorRenderbuffer();795 }).toThrowDeveloperError();796 expect(function() {797 framebuffer.getColorRenderbuffer(-1);798 }).toThrowDeveloperError();799 expect(function() {800 framebuffer.getColorRenderbuffer(ContextLimits.maximumColorAttachments + 1);801 }).toThrowDeveloperError();802 });803 it('fails to destroy', function() {804 var f = new Framebuffer({805 context : context806 });807 f.destroy();808 expect(function() {809 f.destroy();810 }).toThrowDeveloperError();811 });812 it('throws when there is no context', function() {813 expect(function() {814 return new Framebuffer();815 }).toThrowDeveloperError();816 });...
parser.js
Source:parser.js
1"use strict";2Object.defineProperty(exports, "__esModule", { value: true });3/**4 * @license5 * Copyright Google Inc. All Rights Reserved.6 *7 * Use of this source code is governed by an MIT-style license that can be8 * found in the LICENSE file at https://angular.io/license9 */10const exception_1 = require("../exception");11class JsonException extends exception_1.BaseException {12}13exports.JsonException = JsonException;14/**15 * A character was invalid in this context.16 */17class InvalidJsonCharacterException extends JsonException {18 constructor(context) {19 const pos = context.previous;20 const invalidChar = JSON.stringify(_peek(context));21 super(`Invalid JSON character: ${invalidChar} at ${pos.line}:${pos.character}.`);22 this.invalidChar = invalidChar;23 this.line = pos.line;24 this.offset = pos.offset;25 this.character = pos.character;26 }27}28exports.InvalidJsonCharacterException = InvalidJsonCharacterException;29/**30 * More input was expected, but we reached the end of the stream.31 */32class UnexpectedEndOfInputException extends JsonException {33 constructor(_context) {34 super(`Unexpected end of file.`);35 }36}37exports.UnexpectedEndOfInputException = UnexpectedEndOfInputException;38/**39 * An error happened within a file.40 */41class PathSpecificJsonException extends JsonException {42 constructor(path, exception) {43 super(`An error happened at file path ${JSON.stringify(path)}: ${exception.message}`);44 this.path = path;45 this.exception = exception;46 }47}48exports.PathSpecificJsonException = PathSpecificJsonException;49/**50 * Peek and return the next character from the context.51 * @private52 */53function _peek(context) {54 return context.original[context.position.offset];55}56/**57 * Move the context to the next character, including incrementing the line if necessary.58 * @private59 */60function _next(context) {61 context.previous = context.position;62 let { offset, line, character } = context.position;63 const char = context.original[offset];64 offset++;65 if (char == '\n') {66 line++;67 character = 0;68 }69 else {70 character++;71 }72 context.position = { offset, line, character };73}74function _token(context, valid) {75 const char = _peek(context);76 if (valid) {77 if (!char) {78 throw new UnexpectedEndOfInputException(context);79 }80 if (valid.indexOf(char) == -1) {81 throw new InvalidJsonCharacterException(context);82 }83 }84 // Move the position of the context to the next character.85 _next(context);86 return char;87}88/**89 * Read the exponent part of a number. The exponent part is looser for JSON than the number90 * part. `str` is the string of the number itself found so far, and start the position91 * where the full number started. Returns the node found.92 * @private93 */94function _readExpNumber(context, start, str, comments) {95 let char;96 let signed = false;97 while (true) {98 char = _token(context);99 if (char == '+' || char == '-') {100 if (signed) {101 break;102 }103 signed = true;104 str += char;105 }106 else if (char == '0' || char == '1' || char == '2' || char == '3' || char == '4'107 || char == '5' || char == '6' || char == '7' || char == '8' || char == '9') {108 signed = true;109 str += char;110 }111 else {112 break;113 }114 }115 // We're done reading this number.116 context.position = context.previous;117 return {118 kind: 'number',119 start,120 end: context.position,121 text: context.original.substring(start.offset, context.position.offset),122 value: Number.parseFloat(str),123 comments: comments,124 };125}126/**127 * Read the hexa part of a 0xBADCAFE hexadecimal number.128 * @private129 */130function _readHexaNumber(context, isNegative, start, comments) {131 // Read an hexadecimal number, until it's not hexadecimal.132 let hexa = '';133 const valid = '0123456789abcdefABCDEF';134 for (let ch = _peek(context); ch && valid.includes(ch); ch = _peek(context)) {135 // Add it to the hexa string.136 hexa += ch;137 // Move the position of the context to the next character.138 _next(context);139 }140 const value = Number.parseInt(hexa, 16);141 // We're done reading this number.142 return {143 kind: 'number',144 start,145 end: context.position,146 text: context.original.substring(start.offset, context.position.offset),147 value: isNegative ? -value : value,148 comments,149 };150}151/**152 * Read a number from the context.153 * @private154 */155function _readNumber(context, comments = _readBlanks(context)) {156 let str = '';157 let dotted = false;158 const start = context.position;159 // read until `e` or end of line.160 while (true) {161 const char = _token(context);162 // Read tokens, one by one.163 if (char == '-') {164 if (str != '') {165 throw new InvalidJsonCharacterException(context);166 }167 }168 else if (char == 'I'169 && (str == '-' || str == '' || str == '+')170 && (context.mode & JsonParseMode.NumberConstantsAllowed) != 0) {171 // Infinity?172 // _token(context, 'I'); Already read.173 _token(context, 'n');174 _token(context, 'f');175 _token(context, 'i');176 _token(context, 'n');177 _token(context, 'i');178 _token(context, 't');179 _token(context, 'y');180 str += 'Infinity';181 break;182 }183 else if (char == '0') {184 if (str == '0' || str == '-0') {185 throw new InvalidJsonCharacterException(context);186 }187 }188 else if (char == '1' || char == '2' || char == '3' || char == '4' || char == '5'189 || char == '6' || char == '7' || char == '8' || char == '9') {190 if (str == '0' || str == '-0') {191 throw new InvalidJsonCharacterException(context);192 }193 }194 else if (char == '+' && str == '') {195 // Pass over.196 }197 else if (char == '.') {198 if (dotted) {199 throw new InvalidJsonCharacterException(context);200 }201 dotted = true;202 }203 else if (char == 'e' || char == 'E') {204 return _readExpNumber(context, start, str + char, comments);205 }206 else if (char == 'x' && (str == '0' || str == '-0')207 && (context.mode & JsonParseMode.HexadecimalNumberAllowed) != 0) {208 return _readHexaNumber(context, str == '-0', start, comments);209 }210 else {211 // We read one too many characters, so rollback the last character.212 context.position = context.previous;213 break;214 }215 str += char;216 }217 // We're done reading this number.218 if (str.endsWith('.') && (context.mode & JsonParseMode.HexadecimalNumberAllowed) == 0) {219 throw new InvalidJsonCharacterException(context);220 }221 return {222 kind: 'number',223 start,224 end: context.position,225 text: context.original.substring(start.offset, context.position.offset),226 value: Number.parseFloat(str),227 comments,228 };229}230/**231 * Read a string from the context. Takes the comments of the string or read the blanks before the232 * string.233 * @private234 */235function _readString(context, comments = _readBlanks(context)) {236 const start = context.position;237 // Consume the first string delimiter.238 const delim = _token(context);239 if ((context.mode & JsonParseMode.SingleQuotesAllowed) == 0) {240 if (delim == '\'') {241 throw new InvalidJsonCharacterException(context);242 }243 }244 let str = '';245 while (true) {246 let char = _token(context);247 if (char == delim) {248 return {249 kind: 'string',250 start,251 end: context.position,252 text: context.original.substring(start.offset, context.position.offset),253 value: str,254 comments: comments,255 };256 }257 else if (char == '\\') {258 char = _token(context);259 switch (char) {260 case '\\':261 case '\/':262 case '"':263 case delim:264 str += char;265 break;266 case 'b':267 str += '\b';268 break;269 case 'f':270 str += '\f';271 break;272 case 'n':273 str += '\n';274 break;275 case 'r':276 str += '\r';277 break;278 case 't':279 str += '\t';280 break;281 case 'u':282 const [c0] = _token(context, '0123456789abcdefABCDEF');283 const [c1] = _token(context, '0123456789abcdefABCDEF');284 const [c2] = _token(context, '0123456789abcdefABCDEF');285 const [c3] = _token(context, '0123456789abcdefABCDEF');286 str += String.fromCharCode(parseInt(c0 + c1 + c2 + c3, 16));287 break;288 case undefined:289 throw new UnexpectedEndOfInputException(context);290 case '\n':291 // Only valid when multiline strings are allowed.292 if ((context.mode & JsonParseMode.MultiLineStringAllowed) == 0) {293 throw new InvalidJsonCharacterException(context);294 }295 str += char;296 break;297 default:298 throw new InvalidJsonCharacterException(context);299 }300 }301 else if (char === undefined) {302 throw new UnexpectedEndOfInputException(context);303 }304 else if (char == '\b' || char == '\f' || char == '\n' || char == '\r' || char == '\t') {305 throw new InvalidJsonCharacterException(context);306 }307 else {308 str += char;309 }310 }311}312/**313 * Read the constant `true` from the context.314 * @private315 */316function _readTrue(context, comments = _readBlanks(context)) {317 const start = context.position;318 _token(context, 't');319 _token(context, 'r');320 _token(context, 'u');321 _token(context, 'e');322 const end = context.position;323 return {324 kind: 'true',325 start,326 end,327 text: context.original.substring(start.offset, end.offset),328 value: true,329 comments,330 };331}332/**333 * Read the constant `false` from the context.334 * @private335 */336function _readFalse(context, comments = _readBlanks(context)) {337 const start = context.position;338 _token(context, 'f');339 _token(context, 'a');340 _token(context, 'l');341 _token(context, 's');342 _token(context, 'e');343 const end = context.position;344 return {345 kind: 'false',346 start,347 end,348 text: context.original.substring(start.offset, end.offset),349 value: false,350 comments,351 };352}353/**354 * Read the constant `null` from the context.355 * @private356 */357function _readNull(context, comments = _readBlanks(context)) {358 const start = context.position;359 _token(context, 'n');360 _token(context, 'u');361 _token(context, 'l');362 _token(context, 'l');363 const end = context.position;364 return {365 kind: 'null',366 start,367 end,368 text: context.original.substring(start.offset, end.offset),369 value: null,370 comments: comments,371 };372}373/**374 * Read the constant `NaN` from the context.375 * @private376 */377function _readNaN(context, comments = _readBlanks(context)) {378 const start = context.position;379 _token(context, 'N');380 _token(context, 'a');381 _token(context, 'N');382 const end = context.position;383 return {384 kind: 'number',385 start,386 end,387 text: context.original.substring(start.offset, end.offset),388 value: NaN,389 comments: comments,390 };391}392/**393 * Read an array of JSON values from the context.394 * @private395 */396function _readArray(context, comments = _readBlanks(context)) {397 const start = context.position;398 // Consume the first delimiter.399 _token(context, '[');400 const value = [];401 const elements = [];402 _readBlanks(context);403 if (_peek(context) != ']') {404 const node = _readValue(context);405 elements.push(node);406 value.push(node.value);407 }408 while (_peek(context) != ']') {409 _token(context, ',');410 const valueComments = _readBlanks(context);411 if ((context.mode & JsonParseMode.TrailingCommasAllowed) !== 0 && _peek(context) === ']') {412 break;413 }414 const node = _readValue(context, valueComments);415 elements.push(node);416 value.push(node.value);417 }418 _token(context, ']');419 return {420 kind: 'array',421 start,422 end: context.position,423 text: context.original.substring(start.offset, context.position.offset),424 value,425 elements,426 comments,427 };428}429/**430 * Read an identifier from the context. An identifier is a valid JavaScript identifier, and this431 * function is only used in Loose mode.432 * @private433 */434function _readIdentifier(context, comments = _readBlanks(context)) {435 const start = context.position;436 let char = _peek(context);437 if (char && '0123456789'.indexOf(char) != -1) {438 const identifierNode = _readNumber(context);439 return {440 kind: 'identifier',441 start,442 end: identifierNode.end,443 text: identifierNode.text,444 value: identifierNode.value.toString(),445 };446 }447 const identValidFirstChar = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ';448 const identValidChar = '_$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ0123456789';449 let first = true;450 let value = '';451 while (true) {452 char = _token(context);453 if (char == undefined454 || (first ? identValidFirstChar.indexOf(char) : identValidChar.indexOf(char)) == -1) {455 context.position = context.previous;456 return {457 kind: 'identifier',458 start,459 end: context.position,460 text: context.original.substr(start.offset, context.position.offset),461 value,462 comments,463 };464 }465 value += char;466 first = false;467 }468}469/**470 * Read a property from the context. A property is a string or (in Loose mode only) a number or471 * an identifier, followed by a colon `:`.472 * @private473 */474function _readProperty(context, comments = _readBlanks(context)) {475 const start = context.position;476 let key;477 if ((context.mode & JsonParseMode.IdentifierKeyNamesAllowed) != 0) {478 const top = _peek(context);479 if (top == '"' || top == '\'') {480 key = _readString(context);481 }482 else {483 key = _readIdentifier(context);484 }485 }486 else {487 key = _readString(context);488 }489 _readBlanks(context);490 _token(context, ':');491 const value = _readValue(context);492 const end = context.position;493 return {494 kind: 'keyvalue',495 key,496 value,497 start,498 end,499 text: context.original.substring(start.offset, end.offset),500 comments,501 };502}503/**504 * Read an object of properties -> JSON values from the context.505 * @private506 */507function _readObject(context, comments = _readBlanks(context)) {508 const start = context.position;509 // Consume the first delimiter.510 _token(context, '{');511 const value = {};512 const properties = [];513 _readBlanks(context);514 if (_peek(context) != '}') {515 const property = _readProperty(context);516 value[property.key.value] = property.value.value;517 properties.push(property);518 while (_peek(context) != '}') {519 _token(context, ',');520 const propertyComments = _readBlanks(context);521 if ((context.mode & JsonParseMode.TrailingCommasAllowed) !== 0 && _peek(context) === '}') {522 break;523 }524 const property = _readProperty(context, propertyComments);525 value[property.key.value] = property.value.value;526 properties.push(property);527 }528 }529 _token(context, '}');530 return {531 kind: 'object',532 properties,533 start,534 end: context.position,535 value,536 text: context.original.substring(start.offset, context.position.offset),537 comments,538 };539}540/**541 * Remove any blank character or comments (in Loose mode) from the context, returning an array542 * of comments if any are found.543 * @private544 */545function _readBlanks(context) {546 if ((context.mode & JsonParseMode.CommentsAllowed) != 0) {547 const comments = [];548 while (true) {549 const char = context.original[context.position.offset];550 if (char == '/' && context.original[context.position.offset + 1] == '*') {551 const start = context.position;552 // Multi line comment.553 _next(context);554 _next(context);555 while (context.original[context.position.offset] != '*'556 || context.original[context.position.offset + 1] != '/') {557 _next(context);558 if (context.position.offset >= context.original.length) {559 throw new UnexpectedEndOfInputException(context);560 }561 }562 // Remove "*/".563 _next(context);564 _next(context);565 comments.push({566 kind: 'multicomment',567 start,568 end: context.position,569 text: context.original.substring(start.offset, context.position.offset),570 content: context.original.substring(start.offset + 2, context.position.offset - 2),571 });572 }573 else if (char == '/' && context.original[context.position.offset + 1] == '/') {574 const start = context.position;575 // Multi line comment.576 _next(context);577 _next(context);578 while (context.original[context.position.offset] != '\n') {579 _next(context);580 if (context.position.offset >= context.original.length) {581 break;582 }583 }584 // Remove "\n".585 if (context.position.offset < context.original.length) {586 _next(context);587 }588 comments.push({589 kind: 'comment',590 start,591 end: context.position,592 text: context.original.substring(start.offset, context.position.offset),593 content: context.original.substring(start.offset + 2, context.position.offset - 1),594 });595 }596 else if (char == ' ' || char == '\t' || char == '\n' || char == '\r' || char == '\f') {597 _next(context);598 }599 else {600 break;601 }602 }603 return comments;604 }605 else {606 let char = context.original[context.position.offset];607 while (char == ' ' || char == '\t' || char == '\n' || char == '\r' || char == '\f') {608 _next(context);609 char = context.original[context.position.offset];610 }611 return [];612 }613}614/**615 * Read a JSON value from the context, which can be any form of JSON value.616 * @private617 */618function _readValue(context, comments = _readBlanks(context)) {619 let result;620 // Clean up before.621 const char = _peek(context);622 switch (char) {623 case undefined:624 throw new UnexpectedEndOfInputException(context);625 case '-':626 case '0':627 case '1':628 case '2':629 case '3':630 case '4':631 case '5':632 case '6':633 case '7':634 case '8':635 case '9':636 result = _readNumber(context, comments);637 break;638 case '.':639 case '+':640 if ((context.mode & JsonParseMode.LaxNumberParsingAllowed) == 0) {641 throw new InvalidJsonCharacterException(context);642 }643 result = _readNumber(context, comments);644 break;645 case '\'':646 case '"':647 result = _readString(context, comments);648 break;649 case 'I':650 if ((context.mode & JsonParseMode.NumberConstantsAllowed) == 0) {651 throw new InvalidJsonCharacterException(context);652 }653 result = _readNumber(context, comments);654 break;655 case 'N':656 if ((context.mode & JsonParseMode.NumberConstantsAllowed) == 0) {657 throw new InvalidJsonCharacterException(context);658 }659 result = _readNaN(context, comments);660 break;661 case 't':662 result = _readTrue(context, comments);663 break;664 case 'f':665 result = _readFalse(context, comments);666 break;667 case 'n':668 result = _readNull(context, comments);669 break;670 case '[':671 result = _readArray(context, comments);672 break;673 case '{':674 result = _readObject(context, comments);675 break;676 default:677 throw new InvalidJsonCharacterException(context);678 }679 // Clean up after.680 _readBlanks(context);681 return result;682}683/**684 * The Parse mode used for parsing the JSON string.685 */686var JsonParseMode;687(function (JsonParseMode) {688 JsonParseMode[JsonParseMode["Strict"] = 0] = "Strict";689 JsonParseMode[JsonParseMode["CommentsAllowed"] = 1] = "CommentsAllowed";690 JsonParseMode[JsonParseMode["SingleQuotesAllowed"] = 2] = "SingleQuotesAllowed";691 JsonParseMode[JsonParseMode["IdentifierKeyNamesAllowed"] = 4] = "IdentifierKeyNamesAllowed";692 JsonParseMode[JsonParseMode["TrailingCommasAllowed"] = 8] = "TrailingCommasAllowed";693 JsonParseMode[JsonParseMode["HexadecimalNumberAllowed"] = 16] = "HexadecimalNumberAllowed";694 JsonParseMode[JsonParseMode["MultiLineStringAllowed"] = 32] = "MultiLineStringAllowed";695 JsonParseMode[JsonParseMode["LaxNumberParsingAllowed"] = 64] = "LaxNumberParsingAllowed";696 JsonParseMode[JsonParseMode["NumberConstantsAllowed"] = 128] = "NumberConstantsAllowed";697 JsonParseMode[JsonParseMode["Default"] = 0] = "Default";698 JsonParseMode[JsonParseMode["Loose"] = 255] = "Loose";699 JsonParseMode[JsonParseMode["Json"] = 0] = "Json";700 JsonParseMode[JsonParseMode["Json5"] = 255] = "Json5";701})(JsonParseMode = exports.JsonParseMode || (exports.JsonParseMode = {}));702/**703 * Parse the JSON string and return its AST. The AST may be losing data (end comments are704 * discarded for example, and space characters are not represented in the AST), but all values705 * will have a single node in the AST (a 1-to-1 mapping).706 * @param input The string to use.707 * @param mode The mode to parse the input with. {@see JsonParseMode}.708 * @returns {JsonAstNode} The root node of the value of the AST.709 */710function parseJsonAst(input, mode = JsonParseMode.Default) {711 if (mode == JsonParseMode.Default) {712 mode = JsonParseMode.Strict;713 }714 const context = {715 position: { offset: 0, line: 0, character: 0 },716 previous: { offset: 0, line: 0, character: 0 },717 original: input,718 comments: undefined,719 mode,720 };721 const ast = _readValue(context);722 if (context.position.offset < input.length) {723 const rest = input.substr(context.position.offset);724 const i = rest.length > 20 ? rest.substr(0, 20) + '...' : rest;725 throw new Error(`Expected end of file, got "${i}" at `726 + `${context.position.line}:${context.position.character}.`);727 }728 return ast;729}730exports.parseJsonAst = parseJsonAst;731/**732 * Parse a JSON string into its value. This discards the AST and only returns the value itself.733 *734 * If a path option is pass, it also absorbs JSON parsing errors and return a new error with the735 * path in it. Useful for showing errors when parsing from a file.736 *737 * @param input The string to parse.738 * @param mode The mode to parse the input with. {@see JsonParseMode}.739 * @param options Additional optinos for parsing.740 * @returns {JsonValue} The value represented by the JSON string.741 */742function parseJson(input, mode = JsonParseMode.Default, options) {743 try {744 // Try parsing for the fastest path available, if error, uses our own parser for better errors.745 if (mode == JsonParseMode.Strict) {746 try {747 return JSON.parse(input);748 }749 catch (err) {750 return parseJsonAst(input, mode).value;751 }752 }753 return parseJsonAst(input, mode).value;754 }755 catch (e) {756 if (options && options.path && e instanceof JsonException) {757 throw new PathSpecificJsonException(options.path, e);758 }759 throw e;760 }761}...
LZString.js
Source:LZString.js
1// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>2// This work is free. You can redistribute it and/or modify it3// under the terms of the WTFPL, Version 24// For more information see LICENSE.txt or http://www.wtfpl.net/5//6// For more information, the home page:7// http://pieroxy.net/blog/pages/lz-string/testing.html8// https://github.com/pieroxy/lz-string/blob/master/libs/lz-string.js9//10// LZ-based compression algorithm, version 1.4.411var LZString = (function() {12 // private property13 var f = String.fromCharCode;14 var keyStrBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";15 var keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$";16 var baseReverseDic = {};17 function getBaseValue(alphabet, character) {18 if (!baseReverseDic[alphabet]) {19 baseReverseDic[alphabet] = {};20 for (var i=0 ; i<alphabet.length ; i++) {21 baseReverseDic[alphabet][alphabet.charAt(i)] = i;22 }23 }24 return baseReverseDic[alphabet][character];25 }26 var LZString = {27 compressToBase64 : function (input) {28 if (input == null) return "";29 var res = LZString._compress(input, 6, function(a){return keyStrBase64.charAt(a);});30 switch (res.length % 4) { // To produce valid Base6431 default: // When could this happen ?32 case 0 : return res;33 case 1 : return res+"===";34 case 2 : return res+"==";35 case 3 : return res+"=";36 }37 },38 decompressFromBase64 : function (input) {39 if (input == null) return "";40 if (input == "") return null;41 return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrBase64, input.charAt(index)); });42 },43 compressToUTF16 : function (input) {44 if (input == null) return "";45 return LZString._compress(input, 15, function(a){return f(a+32);}) + " ";46 },47 decompressFromUTF16: function (compressed) {48 if (compressed == null) return "";49 if (compressed == "") return null;50 return LZString._decompress(compressed.length, 16384, function(index) { return compressed.charCodeAt(index) - 32; });51 },52 //compress into uint8array (UCS-2 big endian format)53 compressToUint8Array: function (uncompressed) {54 var compressed = LZString.compress(uncompressed);55 var buf=new Uint8Array(compressed.length*2); // 2 bytes per character56 for (var i=0, TotalLen=compressed.length; i<TotalLen; i++) {57 var current_value = compressed.charCodeAt(i);58 buf[i*2] = current_value >>> 8;59 buf[i*2+1] = current_value % 256;60 }61 return buf;62 },63 //decompress from uint8array (UCS-2 big endian format)64 decompressFromUint8Array:function (compressed) {65 if (compressed===null || compressed===undefined){66 return LZString.decompress(compressed);67 } else {68 var buf=new Array(compressed.length/2); // 2 bytes per character69 for (var i=0, TotalLen=buf.length; i<TotalLen; i++) {70 buf[i]=compressed[i*2]*256+compressed[i*2+1];71 }72 var result = [];73 buf.forEach(function (c) {74 result.push(f(c));75 });76 return LZString.decompress(result.join(''));77 }78 },79 //compress into a string that is already URI encoded80 compressToEncodedURIComponent: function (input) {81 if (input == null) return "";82 return LZString._compress(input, 6, function(a){return keyStrUriSafe.charAt(a);});83 },84 //decompress from an output of compressToEncodedURIComponent85 decompressFromEncodedURIComponent:function (input) {86 if (input == null) return "";87 if (input == "") return null;88 input = input.replace(/ /g, "+");89 return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrUriSafe, input.charAt(index)); });90 },91 compress: function (uncompressed) {92 return LZString._compress(uncompressed, 16, function(a){return f(a);});93 },94 _compress: function (uncompressed, bitsPerChar, getCharFromInt) {95 if (uncompressed == null) return "";96 var i, value,97 context_dictionary= {},98 context_dictionaryToCreate= {},99 context_c="",100 context_wc="",101 context_w="",102 context_enlargeIn= 2, // Compensate for the first entry which should not count103 context_dictSize= 3,104 context_numBits= 2,105 context_data=[],106 context_data_val=0,107 context_data_position=0,108 ii;109 for (ii = 0; ii < uncompressed.length; ii += 1) {110 context_c = uncompressed.charAt(ii);111 if (!Object.prototype.hasOwnProperty.call(context_dictionary,context_c)) {112 context_dictionary[context_c] = context_dictSize++;113 context_dictionaryToCreate[context_c] = true;114 }115 context_wc = context_w + context_c;116 if (Object.prototype.hasOwnProperty.call(context_dictionary,context_wc)) {117 context_w = context_wc;118 } else {119 if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {120 if (context_w.charCodeAt(0)<256) {121 for (i=0 ; i<context_numBits ; i++) {122 context_data_val = (context_data_val << 1);123 if (context_data_position == bitsPerChar-1) {124 context_data_position = 0;125 context_data.push(getCharFromInt(context_data_val));126 context_data_val = 0;127 } else {128 context_data_position++;129 }130 }131 value = context_w.charCodeAt(0);132 for (i=0 ; i<8 ; i++) {133 context_data_val = (context_data_val << 1) | (value&1);134 if (context_data_position == bitsPerChar-1) {135 context_data_position = 0;136 context_data.push(getCharFromInt(context_data_val));137 context_data_val = 0;138 } else {139 context_data_position++;140 }141 value = value >> 1;142 }143 } else {144 value = 1;145 for (i=0 ; i<context_numBits ; i++) {146 context_data_val = (context_data_val << 1) | value;147 if (context_data_position ==bitsPerChar-1) {148 context_data_position = 0;149 context_data.push(getCharFromInt(context_data_val));150 context_data_val = 0;151 } else {152 context_data_position++;153 }154 value = 0;155 }156 value = context_w.charCodeAt(0);157 for (i=0 ; i<16 ; i++) {158 context_data_val = (context_data_val << 1) | (value&1);159 if (context_data_position == bitsPerChar-1) {160 context_data_position = 0;161 context_data.push(getCharFromInt(context_data_val));162 context_data_val = 0;163 } else {164 context_data_position++;165 }166 value = value >> 1;167 }168 }169 context_enlargeIn--;170 if (context_enlargeIn == 0) {171 context_enlargeIn = Math.pow(2, context_numBits);172 context_numBits++;173 }174 delete context_dictionaryToCreate[context_w];175 } else {176 value = context_dictionary[context_w];177 for (i=0 ; i<context_numBits ; i++) {178 context_data_val = (context_data_val << 1) | (value&1);179 if (context_data_position == bitsPerChar-1) {180 context_data_position = 0;181 context_data.push(getCharFromInt(context_data_val));182 context_data_val = 0;183 } else {184 context_data_position++;185 }186 value = value >> 1;187 }188 }189 context_enlargeIn--;190 if (context_enlargeIn == 0) {191 context_enlargeIn = Math.pow(2, context_numBits);192 context_numBits++;193 }194 // Add wc to the dictionary.195 context_dictionary[context_wc] = context_dictSize++;196 context_w = String(context_c);197 }198 }199 // Output the code for w.200 if (context_w !== "") {201 if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {202 if (context_w.charCodeAt(0)<256) {203 for (i=0 ; i<context_numBits ; i++) {204 context_data_val = (context_data_val << 1);205 if (context_data_position == bitsPerChar-1) {206 context_data_position = 0;207 context_data.push(getCharFromInt(context_data_val));208 context_data_val = 0;209 } else {210 context_data_position++;211 }212 }213 value = context_w.charCodeAt(0);214 for (i=0 ; i<8 ; i++) {215 context_data_val = (context_data_val << 1) | (value&1);216 if (context_data_position == bitsPerChar-1) {217 context_data_position = 0;218 context_data.push(getCharFromInt(context_data_val));219 context_data_val = 0;220 } else {221 context_data_position++;222 }223 value = value >> 1;224 }225 } else {226 value = 1;227 for (i=0 ; i<context_numBits ; i++) {228 context_data_val = (context_data_val << 1) | value;229 if (context_data_position == bitsPerChar-1) {230 context_data_position = 0;231 context_data.push(getCharFromInt(context_data_val));232 context_data_val = 0;233 } else {234 context_data_position++;235 }236 value = 0;237 }238 value = context_w.charCodeAt(0);239 for (i=0 ; i<16 ; i++) {240 context_data_val = (context_data_val << 1) | (value&1);241 if (context_data_position == bitsPerChar-1) {242 context_data_position = 0;243 context_data.push(getCharFromInt(context_data_val));244 context_data_val = 0;245 } else {246 context_data_position++;247 }248 value = value >> 1;249 }250 }251 context_enlargeIn--;252 if (context_enlargeIn == 0) {253 context_enlargeIn = Math.pow(2, context_numBits);254 context_numBits++;255 }256 delete context_dictionaryToCreate[context_w];257 } else {258 value = context_dictionary[context_w];259 for (i=0 ; i<context_numBits ; i++) {260 context_data_val = (context_data_val << 1) | (value&1);261 if (context_data_position == bitsPerChar-1) {262 context_data_position = 0;263 context_data.push(getCharFromInt(context_data_val));264 context_data_val = 0;265 } else {266 context_data_position++;267 }268 value = value >> 1;269 }270 }271 context_enlargeIn--;272 if (context_enlargeIn == 0) {273 context_enlargeIn = Math.pow(2, context_numBits);274 context_numBits++;275 }276 }277 // Mark the end of the stream278 value = 2;279 for (i=0 ; i<context_numBits ; i++) {280 context_data_val = (context_data_val << 1) | (value&1);281 if (context_data_position == bitsPerChar-1) {282 context_data_position = 0;283 context_data.push(getCharFromInt(context_data_val));284 context_data_val = 0;285 } else {286 context_data_position++;287 }288 value = value >> 1;289 }290 // Flush the last char291 while (true) {292 context_data_val = (context_data_val << 1);293 if (context_data_position == bitsPerChar-1) {294 context_data.push(getCharFromInt(context_data_val));295 break;296 }297 else context_data_position++;298 }299 return context_data.join('');300 },301 decompress: function (compressed) {302 if (compressed == null) return "";303 if (compressed == "") return null;304 return LZString._decompress(compressed.length, 32768, function(index) { return compressed.charCodeAt(index); });305 },306 _decompress: function (length, resetValue, getNextValue) {307 var dictionary = [],308 next,309 enlargeIn = 4,310 dictSize = 4,311 numBits = 3,312 entry = "",313 result = [],314 i,315 w,316 bits, resb, maxpower, power,317 c,318 data = {val:getNextValue(0), position:resetValue, index:1};319 for (i = 0; i < 3; i += 1) {320 dictionary[i] = i;321 }322 bits = 0;323 maxpower = Math.pow(2,2);324 power=1;325 while (power!=maxpower) {326 resb = data.val & data.position;327 data.position >>= 1;328 if (data.position == 0) {329 data.position = resetValue;330 data.val = getNextValue(data.index++);331 }332 bits |= (resb>0 ? 1 : 0) * power;333 power <<= 1;334 }335 switch (next = bits) {336 case 0:337 bits = 0;338 maxpower = Math.pow(2,8);339 power=1;340 while (power!=maxpower) {341 resb = data.val & data.position;342 data.position >>= 1;343 if (data.position == 0) {344 data.position = resetValue;345 data.val = getNextValue(data.index++);346 }347 bits |= (resb>0 ? 1 : 0) * power;348 power <<= 1;349 }350 c = f(bits);351 break;352 case 1:353 bits = 0;354 maxpower = Math.pow(2,16);355 power=1;356 while (power!=maxpower) {357 resb = data.val & data.position;358 data.position >>= 1;359 if (data.position == 0) {360 data.position = resetValue;361 data.val = getNextValue(data.index++);362 }363 bits |= (resb>0 ? 1 : 0) * power;364 power <<= 1;365 }366 c = f(bits);367 break;368 case 2:369 return "";370 }371 dictionary[3] = c;372 w = c;373 result.push(c);374 while (true) {375 if (data.index > length) {376 return "";377 }378 bits = 0;379 maxpower = Math.pow(2,numBits);380 power=1;381 while (power!=maxpower) {382 resb = data.val & data.position;383 data.position >>= 1;384 if (data.position == 0) {385 data.position = resetValue;386 data.val = getNextValue(data.index++);387 }388 bits |= (resb>0 ? 1 : 0) * power;389 power <<= 1;390 }391 switch (c = bits) {392 case 0:393 bits = 0;394 maxpower = Math.pow(2,8);395 power=1;396 while (power!=maxpower) {397 resb = data.val & data.position;398 data.position >>= 1;399 if (data.position == 0) {400 data.position = resetValue;401 data.val = getNextValue(data.index++);402 }403 bits |= (resb>0 ? 1 : 0) * power;404 power <<= 1;405 }406 dictionary[dictSize++] = f(bits);407 c = dictSize-1;408 enlargeIn--;409 break;410 case 1:411 bits = 0;412 maxpower = Math.pow(2,16);413 power=1;414 while (power!=maxpower) {415 resb = data.val & data.position;416 data.position >>= 1;417 if (data.position == 0) {418 data.position = resetValue;419 data.val = getNextValue(data.index++);420 }421 bits |= (resb>0 ? 1 : 0) * power;422 power <<= 1;423 }424 dictionary[dictSize++] = f(bits);425 c = dictSize-1;426 enlargeIn--;427 break;428 case 2:429 return result.join('');430 }431 if (enlargeIn == 0) {432 enlargeIn = Math.pow(2, numBits);433 numBits++;434 }435 if (dictionary[c]) {436 entry = dictionary[c];437 } else {438 if (c === dictSize) {439 entry = w + w.charAt(0);440 } else {441 return null;442 }443 }444 result.push(entry);445 // Add w+entry[0] to the dictionary.446 dictionary[dictSize++] = w + entry.charAt(0);447 enlargeIn--;448 w = entry;449 if (enlargeIn == 0) {450 enlargeIn = Math.pow(2, numBits);451 numBits++;452 }453 }454 }455 };456 return LZString;457})();458if (typeof define === 'function' && define.amd) {459 define(function () { return LZString; });460} else if( typeof module !== 'undefined' && module != null ) {461 module.exports = LZString462} else if( typeof angular !== 'undefined' && angular != null ) {463 angular.module('LZString', [])464 .factory('LZString', function () {465 return LZString;466 });...
read-sources.js
Source:read-sources.js
1var fs = require('fs');2var path = require('path');3var applySourceMaps = require('./apply-source-maps');4var extractImportUrlAndMedia = require('./extract-import-url-and-media');5var isAllowedResource = require('./is-allowed-resource');6var loadOriginalSources = require('./load-original-sources');7var normalizePath = require('./normalize-path');8var rebase = require('./rebase');9var rebaseLocalMap = require('./rebase-local-map');10var rebaseRemoteMap = require('./rebase-remote-map');11var restoreImport = require('./restore-import');12var tokenize = require('../tokenizer/tokenize');13var Token = require('../tokenizer/token');14var Marker = require('../tokenizer/marker');15var hasProtocol = require('../utils/has-protocol');16var isImport = require('../utils/is-import');17var isRemoteResource = require('../utils/is-remote-resource');18var UNKNOWN_URI = 'uri:unknown';19function readSources(input, context, callback) {20 return doReadSources(input, context, function (tokens) {21 return applySourceMaps(tokens, context, function () {22 return loadOriginalSources(context, function () { return callback(tokens); });23 });24 });25}26function doReadSources(input, context, callback) {27 if (typeof input == 'string') {28 return fromString(input, context, callback);29 } else if (Buffer.isBuffer(input)) {30 return fromString(input.toString(), context, callback);31 } else if (Array.isArray(input)) {32 return fromArray(input, context, callback);33 } else if (typeof input == 'object') {34 return fromHash(input, context, callback);35 }36}37function fromString(input, context, callback) {38 context.source = undefined;39 context.sourcesContent[undefined] = input;40 context.stats.originalSize += input.length;41 return fromStyles(input, context, { inline: context.options.inline }, callback);42}43function fromArray(input, context, callback) {44 var inputAsImports = input.reduce(function (accumulator, uriOrHash) {45 if (typeof uriOrHash === 'string') {46 return addStringSource(uriOrHash, accumulator);47 } else {48 return addHashSource(uriOrHash, context, accumulator);49 }50 }, []);51 return fromStyles(inputAsImports.join(''), context, { inline: ['all'] }, callback);52}53function fromHash(input, context, callback) {54 var inputAsImports = addHashSource(input, context, []);55 return fromStyles(inputAsImports.join(''), context, { inline: ['all'] }, callback);56}57function addStringSource(input, imports) {58 imports.push(restoreAsImport(normalizeUri(input)));59 return imports;60}61function addHashSource(input, context, imports) {62 var uri;63 var normalizedUri;64 var source;65 for (uri in input) {66 source = input[uri];67 normalizedUri = normalizeUri(uri);68 imports.push(restoreAsImport(normalizedUri));69 context.sourcesContent[normalizedUri] = source.styles;70 if (source.sourceMap) {71 trackSourceMap(source.sourceMap, normalizedUri, context);72 }73 }74 return imports;75}76function normalizeUri(uri) {77 var currentPath = path.resolve('');78 var absoluteUri;79 var relativeToCurrentPath;80 var normalizedUri;81 if (isRemoteResource(uri)) {82 return uri;83 }84 absoluteUri = path.isAbsolute(uri) ?85 uri :86 path.resolve(uri);87 relativeToCurrentPath = path.relative(currentPath, absoluteUri);88 normalizedUri = normalizePath(relativeToCurrentPath);89 return normalizedUri;90}91function trackSourceMap(sourceMap, uri, context) {92 var parsedMap = typeof sourceMap == 'string' ?93 JSON.parse(sourceMap) :94 sourceMap;95 var rebasedMap = isRemoteResource(uri) ?96 rebaseRemoteMap(parsedMap, uri) :97 rebaseLocalMap(parsedMap, uri || UNKNOWN_URI, context.options.rebaseTo);98 context.inputSourceMapTracker.track(uri, rebasedMap);99}100function restoreAsImport(uri) {101 return restoreImport('url(' + uri + ')', '') + Marker.SEMICOLON;102}103function fromStyles(styles, context, parentInlinerContext, callback) {104 var tokens;105 var rebaseConfig = {};106 if (!context.source) {107 rebaseConfig.fromBase = path.resolve('');108 rebaseConfig.toBase = context.options.rebaseTo;109 } else if (isRemoteResource(context.source)) {110 rebaseConfig.fromBase = context.source;111 rebaseConfig.toBase = context.source;112 } else if (path.isAbsolute(context.source)) {113 rebaseConfig.fromBase = path.dirname(context.source);114 rebaseConfig.toBase = context.options.rebaseTo;115 } else {116 rebaseConfig.fromBase = path.dirname(path.resolve(context.source));117 rebaseConfig.toBase = context.options.rebaseTo;118 }119 tokens = tokenize(styles, context);120 tokens = rebase(tokens, context.options.rebase, context.validator, rebaseConfig);121 return allowsAnyImports(parentInlinerContext.inline) ?122 inline(tokens, context, parentInlinerContext, callback) :123 callback(tokens);124}125function allowsAnyImports(inline) {126 return !(inline.length == 1 && inline[0] == 'none');127}128function inline(tokens, externalContext, parentInlinerContext, callback) {129 var inlinerContext = {130 afterContent: false,131 callback: callback,132 errors: externalContext.errors,133 externalContext: externalContext,134 fetch: externalContext.options.fetch,135 inlinedStylesheets: parentInlinerContext.inlinedStylesheets || externalContext.inlinedStylesheets,136 inline: parentInlinerContext.inline,137 inlineRequest: externalContext.options.inlineRequest,138 inlineTimeout: externalContext.options.inlineTimeout,139 isRemote: parentInlinerContext.isRemote || false,140 localOnly: externalContext.localOnly,141 outputTokens: [],142 rebaseTo: externalContext.options.rebaseTo,143 sourceTokens: tokens,144 warnings: externalContext.warnings145 };146 return doInlineImports(inlinerContext);147}148function doInlineImports(inlinerContext) {149 var token;150 var i, l;151 for (i = 0, l = inlinerContext.sourceTokens.length; i < l; i++) {152 token = inlinerContext.sourceTokens[i];153 if (token[0] == Token.AT_RULE && isImport(token[1])) {154 inlinerContext.sourceTokens.splice(0, i);155 return inlineStylesheet(token, inlinerContext);156 } else if (token[0] == Token.AT_RULE || token[0] == Token.COMMENT) {157 inlinerContext.outputTokens.push(token);158 } else {159 inlinerContext.outputTokens.push(token);160 inlinerContext.afterContent = true;161 }162 }163 inlinerContext.sourceTokens = [];164 return inlinerContext.callback(inlinerContext.outputTokens);165}166function inlineStylesheet(token, inlinerContext) {167 var uriAndMediaQuery = extractImportUrlAndMedia(token[1]);168 var uri = uriAndMediaQuery[0];169 var mediaQuery = uriAndMediaQuery[1];170 var metadata = token[2];171 return isRemoteResource(uri) ?172 inlineRemoteStylesheet(uri, mediaQuery, metadata, inlinerContext) :173 inlineLocalStylesheet(uri, mediaQuery, metadata, inlinerContext);174}175function inlineRemoteStylesheet(uri, mediaQuery, metadata, inlinerContext) {176 var isAllowed = isAllowedResource(uri, true, inlinerContext.inline);177 var originalUri = uri;178 var isLoaded = uri in inlinerContext.externalContext.sourcesContent;179 var isRuntimeResource = !hasProtocol(uri);180 if (inlinerContext.inlinedStylesheets.indexOf(uri) > -1) {181 inlinerContext.warnings.push('Ignoring remote @import of "' + uri + '" as it has already been imported.');182 inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);183 return doInlineImports(inlinerContext);184 } else if (inlinerContext.localOnly && inlinerContext.afterContent) {185 inlinerContext.warnings.push('Ignoring remote @import of "' + uri + '" as no callback given and after other content.');186 inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);187 return doInlineImports(inlinerContext);188 } else if (isRuntimeResource) {189 inlinerContext.warnings.push('Skipping remote @import of "' + uri + '" as no protocol given.');190 inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));191 inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);192 return doInlineImports(inlinerContext);193 } else if (inlinerContext.localOnly && !isLoaded) {194 inlinerContext.warnings.push('Skipping remote @import of "' + uri + '" as no callback given.');195 inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));196 inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);197 return doInlineImports(inlinerContext);198 } else if (!isAllowed && inlinerContext.afterContent) {199 inlinerContext.warnings.push('Ignoring remote @import of "' + uri + '" as resource is not allowed and after other content.');200 inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);201 return doInlineImports(inlinerContext);202 } else if (!isAllowed) {203 inlinerContext.warnings.push('Skipping remote @import of "' + uri + '" as resource is not allowed.');204 inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));205 inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);206 return doInlineImports(inlinerContext);207 }208 inlinerContext.inlinedStylesheets.push(uri);209 function whenLoaded(error, importedStyles) {210 if (error) {211 inlinerContext.errors.push('Broken @import declaration of "' + uri + '" - ' + error);212 return process.nextTick(function () {213 inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));214 inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);215 doInlineImports(inlinerContext);216 });217 }218 inlinerContext.inline = inlinerContext.externalContext.options.inline;219 inlinerContext.isRemote = true;220 inlinerContext.externalContext.source = originalUri;221 inlinerContext.externalContext.sourcesContent[uri] = importedStyles;222 inlinerContext.externalContext.stats.originalSize += importedStyles.length;223 return fromStyles(importedStyles, inlinerContext.externalContext, inlinerContext, function (importedTokens) {224 importedTokens = wrapInMedia(importedTokens, mediaQuery, metadata);225 inlinerContext.outputTokens = inlinerContext.outputTokens.concat(importedTokens);226 inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);227 return doInlineImports(inlinerContext);228 });229 }230 return isLoaded ?231 whenLoaded(null, inlinerContext.externalContext.sourcesContent[uri]) :232 inlinerContext.fetch(uri, inlinerContext.inlineRequest, inlinerContext.inlineTimeout, whenLoaded);233}234function inlineLocalStylesheet(uri, mediaQuery, metadata, inlinerContext) {235 var currentPath = path.resolve('');236 var absoluteUri = path.isAbsolute(uri) ?237 path.resolve(currentPath, uri[0] == '/' ? uri.substring(1) : uri) :238 path.resolve(inlinerContext.rebaseTo, uri);239 var relativeToCurrentPath = path.relative(currentPath, absoluteUri);240 var importedStyles;241 var isAllowed = isAllowedResource(uri, false, inlinerContext.inline);242 var normalizedPath = normalizePath(relativeToCurrentPath);243 var isLoaded = normalizedPath in inlinerContext.externalContext.sourcesContent;244 if (inlinerContext.inlinedStylesheets.indexOf(absoluteUri) > -1) {245 inlinerContext.warnings.push('Ignoring local @import of "' + uri + '" as it has already been imported.');246 } else if (!isLoaded && (!fs.existsSync(absoluteUri) || !fs.statSync(absoluteUri).isFile())) {247 inlinerContext.errors.push('Ignoring local @import of "' + uri + '" as resource is missing.');248 } else if (!isAllowed && inlinerContext.afterContent) {249 inlinerContext.warnings.push('Ignoring local @import of "' + uri + '" as resource is not allowed and after other content.');250 } else if (inlinerContext.afterContent) {251 inlinerContext.warnings.push('Ignoring local @import of "' + uri + '" as after other content.');252 } else if (!isAllowed) {253 inlinerContext.warnings.push('Skipping local @import of "' + uri + '" as resource is not allowed.');254 inlinerContext.outputTokens = inlinerContext.outputTokens.concat(inlinerContext.sourceTokens.slice(0, 1));255 } else {256 importedStyles = isLoaded ?257 inlinerContext.externalContext.sourcesContent[normalizedPath] :258 fs.readFileSync(absoluteUri, 'utf-8');259 inlinerContext.inlinedStylesheets.push(absoluteUri);260 inlinerContext.inline = inlinerContext.externalContext.options.inline;261 inlinerContext.externalContext.source = normalizedPath;262 inlinerContext.externalContext.sourcesContent[normalizedPath] = importedStyles;263 inlinerContext.externalContext.stats.originalSize += importedStyles.length;264 return fromStyles(importedStyles, inlinerContext.externalContext, inlinerContext, function (importedTokens) {265 importedTokens = wrapInMedia(importedTokens, mediaQuery, metadata);266 inlinerContext.outputTokens = inlinerContext.outputTokens.concat(importedTokens);267 inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);268 return doInlineImports(inlinerContext);269 });270 }271 inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1);272 return doInlineImports(inlinerContext);273}274function wrapInMedia(tokens, mediaQuery, metadata) {275 if (mediaQuery) {276 return [[Token.NESTED_BLOCK, [[Token.NESTED_BLOCK_SCOPE, '@media ' + mediaQuery, metadata]], tokens]];277 } else {278 return tokens;279 }280}...
qgis2web_expressions.js
Source:qgis2web_expressions.js
1// Aggregates2// Color3// Conditionals4function fnc_coalesce(values, context) {5 for (i = 0; i < values.length; i++) {6 if (values[i] !== null) {7 return values[i];8 }9 10 }11 return 'ERROR';12};13// Conversions14// Custom15// Date and Time16// Fields and Values17// Fuzzy Matching18// General19// Geometry20function fnc_azimuth(values, context) {21 return false;22};23function fnc_project(values, context) {24 return false;25};26// Math27function fnc_abs(values, context) {28 return Math.abs(values[0]);29};30function fnc_degrees(values, context) {31 return values[0] * (180/Math.PI);32};33function fnc_radians(values, context) {34 return values[0] * (Math.PI/180);35};36function fnc_sqrt(values, context) {37 return Math.sqrt(values[0]);38};39function fnc_cos(values, context) {40 return Math.cos(values[0]);41};42function fnc_sin(values, context) {43 return Math.sin(values[0]);44};45function fnc_tan(values, context) {46 return Math.tan(values[0]);47};48function fnc_asin(values, context) {49 return Math.asin(values[0]);50};51function fnc_acos(values, context) {52 return Math.acos(values[0]);53};54function fnc_atan(values, context) {55 return Math.atan(values[0]);56};57function fnc_atan2(values, context) {58 return Math.atan2(values[0]);59};60function fnc_exp(values, context) {61 return Math.exp(values[0]);62};63function fnc_ln(values, context) {64 return Math.log(values[0]);65};66function fnc_log10(values, context) {67 return Math.log10(values[0]);68};69function fnc_log(values, context) {70 return Math.log(values[0]) / Math.log(values[1]);71};72function fnc_round(values, context) {73 return false;74};75function fnc_rand(values, context) {76 return Math.floor(Math.random()*(values[1]-values[0]+1)+values[0]);77};78function fnc_randf(values, context) {79 return Math.random()*(values[1]-values[0]+1)+values[0];80};81function fnc_max(values, context) {82 return Math.max.apply(this, values);83};84function fnc_min(values, context) {85 return Math.min.apply(this, values);86};87function fnc_clamp(values, context) {88 return false;89};90// Operators91// Record92// String93// TimeManager94// Variables95function fnc_scale_linear(values, context) {96 return false;97};98function fnc_scale_exp(values, context) {99 return false;100};101function fnc_floor(values, context) {102 return false;103};104function fnc_ceil(values, context) {105 return false;106};107function fnc_pi(values, context) {108 return false;109};110function fnc_to_int(values, context) {111 return false;112};113function fnc_to_real(values, context) {114 return false;115};116function fnc_to_string(values, context) {117 return false;118};119function fnc_to_datetime(values, context) {120 return false;121};122function fnc_to_date(values, context) {123 return false;124};125function fnc_to_time(values, context) {126 return false;127};128function fnc_to_interval(values, context) {129 return false;130};131function fnc_if(values, context) {132 return false;133};134function fnc_aggregate(values, context) {135 return false;136};137function fnc_relation_aggregate(values, context) {138 return false;139};140function fnc_count(values, context) {141 return false;142};143function fnc_count_distinct(values, context) {144 return false;145};146function fnc_count_missing(values, context) {147 return false;148};149function fnc_minimum(values, context) {150 return false;151};152function fnc_maximum(values, context) {153 return false;154};155function fnc_sum(values, context) {156 return false;157};158function fnc_mean(values, context) {159 return false;160};161function fnc_median(values, context) {162 return false;163};164function fnc_stdev(values, context) {165 return false;166};167function fnc_range(values, context) {168 return false;169};170function fnc_minority(values, context) {171 return false;172};173function fnc_majority(values, context) {174 return false;175};176function fnc_q1(values, context) {177 return false;178};179function fnc_q3(values, context) {180 return false;181};182function fnc_iqr(values, context) {183 return false;184};185function fnc_min_length(values, context) {186 return false;187};188function fnc_max_length(values, context) {189 return false;190};191function fnc_concatenate(values, context) {192 return false;193};194function fnc_regexp_match(values, context) {195 return false;196};197function fnc_now(values, context) {198 return false;199};200function fnc_age(values, context) {201 return false;202};203function fnc_year(values, context) {204 return false;205};206function fnc_month(values, context) {207 return false;208};209function fnc_week(values, context) {210 return false;211};212function fnc_day(values, context) {213 return false;214};215function fnc_hour(values, context) {216 return false;217};218function fnc_minute(values, context) {219 return false;220};221function fnc_second(values, context) {222 return false;223};224function fnc_day_of_week(values, context) {225 return false;226};227function fnc_lower(values, context) {228 return values[0].toLowerCase();229};230function fnc_upper(values, context) {231 return false;232};233function fnc_title(values, context) {234 return false;235};236function fnc_trim(values, context) {237 return false;238};239function fnc_levenshtein(values, context) {240 return false;241};242function fnc_longest_common_substring(values, context) {243 return false;244};245function fnc_hamming_distance(values, context) {246 return false;247};248function fnc_soundex(values, context) {249 return false;250};251function fnc_char(values, context) {252 return false;253};254function fnc_wordwrap(values, context) {255 return false;256};257function fnc_length(values, context) {258 return false;259};260function fnc_replace(values, context) {261 return false;262};263function fnc_regexp_replace(values, context) {264 return false;265};266function fnc_regexp_substr(values, context) {267 return false;268};269function fnc_substr(values, context) {270 return false;271};272function fnc_concat(values, context) {273 return false;274};275function fnc_strpos(values, context) {276 return false;277};278function fnc_left(values, context) {279 return false;280};281function fnc_right(values, context) {282 return false;283};284function fnc_rpad(values, context) {285 return false;286};287function fnc_lpad(values, context) {288 return false;289};290function fnc_format(values, context) {291 return false;292};293function fnc_format_number(values, context) {294 return false;295};296function fnc_format_date(values, context) {297 return false;298};299function fnc_color_rgb(values, context) {300 return false;301};302function fnc_color_rgba(values, context) {303 return false;304};305function fnc_ramp_color(values, context) {306 return false;307};308function fnc_color_hsl(values, context) {309 return false;310};311function fnc_color_hsla(values, context) {312 return false;313};314function fnc_color_hsv(values, context) {315 return false;316};317function fnc_color_hsva(values, context) {318 return false;319};320function fnc_color_cmyk(values, context) {321 return false;322};323function fnc_color_cmyka(values, context) {324 return false;325};326function fnc_color_part(values, context) {327 return false;328};329function fnc_darker(values, context) {330 return false;331};332function fnc_lighter(values, context) {333 return false;334};335function fnc_set_color_part(values, context) {336 return false;337};338function fnc_area(values, context) {339 return false;340};341function fnc_perimeter(values, context) {342 return false;343};344function fnc_x(values, context) {345 return false;346};347function fnc_y(values, context) {348 return false;349};350function fnc_z(values, context) {351 return false;352};353function fnc_m(values, context) {354 return false;355};356function fnc_point_n(values, context) {357 return false;358};359function fnc_start_point(values, context) {360 return false;361};362function fnc_end_point(values, context) {363 return false;364};365function fnc_nodes_to_points(values, context) {366 return false;367};368function fnc_segments_to_lines(values, context) {369 return false;370};371function fnc_make_point(values, context) {372 return false;373};374function fnc_make_point_m(values, context) {375 return false;376};377function fnc_make_line(values, context) {378 return false;379};380function fnc_make_polygon(values, context) {381 return false;382};383function fnc_x_min(values, context) {384 return false;385};386function fnc_x_max(values, context) {387 return false;388};389function fnc_y_min(values, context) {390 return false;391};392function fnc_y_max(values, context) {393 return false;394};395function fnc_geom_from_wkt(values, context) {396 return false;397};398function fnc_geom_from_gml(values, context) {399 return false;400};401function fnc_relate(values, context) {402 return false;403};404function fnc_intersects_bbox(values, context) {405 return false;406};407function fnc_disjoint(values, context) {408 return false;409};410function fnc_intersects(values, context) {411 return false;412};413function fnc_touches(values, context) {414 return false;415};416function fnc_crosses(values, context) {417 return false;418};419function fnc_contains(values, context) {420 return false;421};422function fnc_overlaps(values, context) {423 return false;424};425function fnc_within(values, context) {426 return false;427};428function fnc_translate(values, context) {429 return false;430};431function fnc_buffer(values, context) {432 return false;433};434function fnc_centroid(values, context) {435 return false;436};437function fnc_point_on_surface(values, context) {438 return false;439};440function fnc_reverse(values, context) {441 return false;442};443function fnc_exterior_ring(values, context) {444 return false;445};446function fnc_interior_ring_n(values, context) {447 return false;448};449function fnc_geometry_n(values, context) {450 return false;451};452function fnc_boundary(values, context) {453 return false;454};455function fnc_line_merge(values, context) {456 return false;457};458function fnc_bounds(values, context) {459 return false;460};461function fnc_num_points(values, context) {462 return false;463};464function fnc_num_interior_rings(values, context) {465 return false;466};467function fnc_num_rings(values, context) {468 return false;469};470function fnc_num_geometries(values, context) {471 return false;472};473function fnc_bounds_width(values, context) {474 return false;475};476function fnc_bounds_height(values, context) {477 return false;478};479function fnc_is_closed(values, context) {480 return false;481};482function fnc_convex_hull(values, context) {483 return false;484};485function fnc_difference(values, context) {486 return false;487};488function fnc_distance(values, context) {489 return false;490};491function fnc_intersection(values, context) {492 return false;493};494function fnc_sym_difference(values, context) {495 return false;496};497function fnc_combine(values, context) {498 return false;499};500function fnc_union(values, context) {501 return false;502};503function fnc_geom_to_wkt(values, context) {504 return false;505};506function fnc_geometry(values, context) {507 return false;508};509function fnc_transform(values, context) {510 return false;511};512function fnc_extrude(values, context) {513 return false;514};515function fnc_order_parts(values, context) {516 return false;517};518function fnc_closest_point(values, context) {519 return false;520};521function fnc_shortest_line(values, context) {522 return false;523};524function fnc_line_interpolate_point(values, context) {525 return false;526};527function fnc_line_interpolate_angle(values, context) {528 return false;529};530function fnc_line_locate_point(values, context) {531 return false;532};533function fnc_angle_at_vertex(values, context) {534 return false;535};536function fnc_distance_to_vertex(values, context) {537 return false;538};539function fnc_uuid(values, context) {540 return false;541};542function fnc_get_feature(values, context) {543 return false;544};545function fnc_layer_property(values, context) {546 return false;547};548function fnc_var(values, context) {549 return false;550};551function fnc_eval(values, context) {552 return false;553};554function fnc_attribute(values, context) {555 return false;556};557function fnc__specialcol_(values, context) {558 return false;559};560function fnc_project_color(values, context) {561 return false;...
repositoryViewContext.js
Source:repositoryViewContext.js
1cap.model("RepositoryViewContext", function ($q, $filter, HttpMethodVerbs) {2 return function RepositoryViewContext() {3 var repositoryViewContext = this;4 var children = {};5 var shortenContextUri = function (contextUri) {6 return repositoryViewContext.repositoryView.rootUri ? $filter('shortenUri')(contextUri, repositoryViewContext.repositoryView.rootUri) : contextUri;7 };8 var fetchContext = function (contextUri) {9 return repositoryViewContext.repositoryView.performRequest(repositoryViewContext.getMapping().load, {10 method: HttpMethodVerbs.GET,11 query: {12 contextUri: shortenContextUri(contextUri)13 }14 });15 };16 repositoryViewContext.before(function () {17 var defer = $q.defer();18 if (repositoryViewContext.fetch) {19 fetchContext(repositoryViewContext.uri).then(function (res) {20 angular.extend(repositoryViewContext, angular.fromJson(res.body).payload.RepositoryViewContext, {21 fetch: false22 });23 repositoryViewContext.repositoryView.cacheContext(repositoryViewContext);24 defer.resolve(repositoryViewContext);25 repositoryViewContext.ready().then(function () {26 if (repositoryViewContext.repositoryView.inTransaction()) {27 repositoryViewContext.repositoryView.startTransactionTimer();28 }29 });30 });31 } else {32 defer.resolve(repositoryViewContext);33 }34 return defer.promise;35 });36 repositoryViewContext.reloadContext = function () {37 var reloadPromise = fetchContext(repositoryViewContext.uri);38 reloadPromise.then(function (res) {39 angular.extend(repositoryViewContext, angular.fromJson(res.body).payload.RepositoryViewContext, {40 fetch: false41 });42 });43 return reloadPromise;44 };45 repositoryViewContext.getChildContext = function (triple) {46 if (!children[triple.object]) {47 children[triple.object] = new RepositoryViewContext({48 fetch: false49 });50 var cachedContext = repositoryViewContext.repositoryView.getCachedContext(triple.object);51 if (cachedContext) {52 angular.extend(children[triple.object], cachedContext);53 } else {54 fetchContext(triple.object).then(function (res) {55 angular.extend(children[triple.object], angular.fromJson(res.body).payload.RepositoryViewContext, {56 repositoryView: repositoryViewContext.repositoryView,57 uri: triple.object58 });59 repositoryViewContext.repositoryView.cacheContext(children[triple.object]);60 });61 }62 }63 return children[triple.object];64 };65 repositoryViewContext.getCachedChildContext = function (contextUri) {66 return children[contextUri];67 };68 repositoryViewContext.createContainer = function (metadata) {69 var createPromise = repositoryViewContext.repositoryView.performRequest(repositoryViewContext.getMapping().children, {70 method: HttpMethodVerbs.POST,71 query: {72 contextUri: shortenContextUri(repositoryViewContext.uri)73 },74 data: metadata75 });76 createPromise.then(function (res) {77 angular.extend(repositoryViewContext, angular.fromJson(res.body).payload.RepositoryViewContext);78 });79 return createPromise;80 };81 repositoryViewContext.removeContainers = function (containerTriples) {82 var promises = [];83 angular.forEach(containerTriples, function (containerTriple) {84 var removePromise = repositoryViewContext.repositoryView.performRequest(repositoryViewContext.getMapping().load, {85 method: HttpMethodVerbs.DELETE,86 query: {87 contextUri: shortenContextUri(containerTriple.subject)88 }89 });90 removePromise.then(function (res) {91 var children = repositoryViewContext.children;92 for (var i in children) {93 if (children.hasOwnProperty(i)) {94 var child = children[i];95 if (child.triple.object === containerTriple.subject) {96 children.splice(i, 1);97 break;98 }99 }100 }101 });102 promises.push(removePromise);103 });104 var allRemovePromses = $q.all(promises);105 return allRemovePromses;106 };107 repositoryViewContext.removeResources = function (resourceTriples) {108 var promises = [];109 angular.forEach(resourceTriples, function (resourceTriple) {110 var removePromise = repositoryViewContext.repositoryView.performRequest(repositoryViewContext.getMapping().resource, {111 method: HttpMethodVerbs.DELETE,112 query: {113 contextUri: shortenContextUri(resourceTriple.subject)114 }115 });116 removePromise.then(function (res) {117 var children = repositoryViewContext.children;118 for (var i in children) {119 if (children.hasOwnProperty(i)) {120 var child = children[i];121 if (child.triple.object === resourceTriple.subject) {122 children.splice(i, 1);123 break;124 }125 }126 }127 });128 promises.push(removePromise);129 });130 var allRemovePromses = $q.all(promises);131 return allRemovePromses;132 };133 repositoryViewContext.createResource = function (file) {134 var formData = new FormData();135 formData.append("file", file, file.name);136 var createPromise = repositoryViewContext.repositoryView.performRequest(repositoryViewContext.getMapping().resource, {137 method: HttpMethodVerbs.POST,138 headers: {139 "Content-Type": undefined140 },141 query: {142 contextUri: shortenContextUri(repositoryViewContext.uri)143 },144 data: formData145 });146 createPromise.then(function (res) {147 angular.extend(repositoryViewContext, angular.fromJson(res.body).payload.RepositoryViewContext);148 });149 return createPromise;150 };151 repositoryViewContext.refreshContext = function () {152 var refreshPromise = repositoryViewContext.repositoryView.performRequest(repositoryViewContext.getMapping().refreshContext, {153 method: HttpMethodVerbs.POST,154 query: {155 contextUri: repositoryViewContext.uri156 }157 });158 return refreshPromise;159 };160 repositoryViewContext.createMetadata = function (metadataTriples) {161 var promises = [];162 angular.forEach(metadataTriples, function (metadataTriple) {163 var createPromise = repositoryViewContext.repositoryView.performRequest(repositoryViewContext.getMapping().metadata, {164 method: HttpMethodVerbs.POST,165 query: {166 contextUri: shortenContextUri(repositoryViewContext.uri)167 },168 data: metadataTriple169 });170 createPromise.then(function (res) {171 angular.extend(repositoryViewContext, angular.fromJson(res.body).payload.RepositoryViewContext);172 });173 promises.push(createPromise);174 });175 var allCreatePromses = $q.all(promises);176 return allCreatePromses;177 };178 repositoryViewContext.removeMetadata = function (metadataTriples) {179 var promises = [];180 angular.forEach(metadataTriples, function (metadataTriple) {181 var removePromise = repositoryViewContext.repositoryView.performRequest(repositoryViewContext.getMapping().metadata, {182 method: HttpMethodVerbs.DELETE,183 query: {184 contextUri: shortenContextUri(repositoryViewContext.uri)185 },186 data: metadataTriple187 });188 removePromise.then(function (response) {189 var payload = angular.fromJson(response.body).payload;190 if (payload) {191 angular.extend(repositoryViewContext, payload.RepositoryViewContext);192 }193 });194 promises.push(removePromise);195 });196 var allRemovePromses = $q.all(promises);197 return allRemovePromses;198 };199 repositoryViewContext.updateMetadatum = function (metadataTriple, value) {200 var updatePromise = repositoryViewContext.repositoryView.performRequest(repositoryViewContext.getMapping().metadata, {201 method: HttpMethodVerbs.PUT,202 query: {203 contextUri: shortenContextUri(repositoryViewContext.uri),204 value: encodeURIComponent($filter("escapeLiteral")(value))205 },206 data: metadataTriple207 });208 return updatePromise;209 };210 repositoryViewContext.createVersion = function (form) {211 var versionPromise = repositoryViewContext.repositoryView.performRequest(repositoryViewContext.getMapping().version, {212 method: HttpMethodVerbs.POST,213 query: {214 contextUri: shortenContextUri(repositoryViewContext.uri),215 name: form.name216 }217 });218 versionPromise.then(function (apiRes) {219 var newContext = angular.fromJson(apiRes.body).payload.RepositoryViewContext;220 angular.extend(repositoryViewContext, newContext);221 if (form) {222 form.$setPristine();223 form.$setUntouched();224 form.name = "";225 }226 });227 return versionPromise;228 };229 repositoryViewContext.deleteVersion = function (versionContext) {230 return repositoryViewContext.repositoryView.performRequest(repositoryViewContext.getMapping().version, {231 method: HttpMethodVerbs.DELETE,232 query: {233 contextUri: shortenContextUri(versionContext.uri)234 }235 });236 };237 repositoryViewContext.revertVersion = function (versionContext) {238 var revertVersionPromise = repositoryViewContext.repositoryView.performRequest(repositoryViewContext.getMapping().version, {239 method: HttpMethodVerbs.PATCH,240 query: {241 contextUri: shortenContextUri(versionContext.uri)242 }243 });244 return revertVersionPromise;245 };246 repositoryViewContext.advancedUpdate = function (query) {247 var updatePromise = repositoryViewContext.repositoryView.performRequest(repositoryViewContext.getMapping().advancedQuery, {248 method: HttpMethodVerbs.POST,249 query: {250 contextUri: shortenContextUri(repositoryViewContext.uri)251 },252 data: query253 });254 updatePromise.then(function (res) {255 angular.extend(repositoryViewContext, angular.fromJson(res.body).payload.RepositoryViewContext);256 });257 return updatePromise;258 };259 var queryHelp = {};260 repositoryViewContext.getQueryHelp = function () {261 if (!queryHelp.message) {262 var updatePromise = repositoryViewContext.repositoryView.performRequest(repositoryViewContext.getMapping().advancedQuery, {263 method: HttpMethodVerbs.GET264 });265 updatePromise.then(function (res) {266 queryHelp.query = angular.fromJson(res.body).payload.String;267 });268 }269 return queryHelp;270 };271 return repositoryViewContext;272 };...
helpers.js
Source:helpers.js
1var emptyCharacter = '';2var Breaks = require('../options/format').Breaks;3var Spaces = require('../options/format').Spaces;4var Marker = require('../tokenizer/marker');5var Token = require('../tokenizer/token');6function supportsAfterClosingBrace(token) {7 return token[1][1] == 'background' || token[1][1] == 'transform' || token[1][1] == 'src';8}9function afterClosingBrace(token, valueIndex) {10 return token[valueIndex][1][token[valueIndex][1].length - 1] == Marker.CLOSE_ROUND_BRACKET;11}12function afterComma(token, valueIndex) {13 return token[valueIndex][1] == Marker.COMMA;14}15function afterSlash(token, valueIndex) {16 return token[valueIndex][1] == Marker.FORWARD_SLASH;17}18function beforeComma(token, valueIndex) {19 return token[valueIndex + 1] && token[valueIndex + 1][1] == Marker.COMMA;20}21function beforeSlash(token, valueIndex) {22 return token[valueIndex + 1] && token[valueIndex + 1][1] == Marker.FORWARD_SLASH;23}24function inFilter(token) {25 return token[1][1] == 'filter' || token[1][1] == '-ms-filter';26}27function disallowsSpace(context, token, valueIndex) {28 return !context.spaceAfterClosingBrace && supportsAfterClosingBrace(token) && afterClosingBrace(token, valueIndex) ||29 beforeSlash(token, valueIndex) ||30 afterSlash(token, valueIndex) ||31 beforeComma(token, valueIndex) ||32 afterComma(token, valueIndex);33}34function rules(context, tokens) {35 var store = context.store;36 for (var i = 0, l = tokens.length; i < l; i++) {37 store(context, tokens[i]);38 if (i < l - 1) {39 store(context, comma(context));40 }41 }42}43function body(context, tokens) {44 var lastPropertyAt = lastPropertyIndex(tokens);45 for (var i = 0, l = tokens.length; i < l; i++) {46 property(context, tokens, i, lastPropertyAt);47 }48}49function lastPropertyIndex(tokens) {50 var index = tokens.length - 1;51 for (; index >= 0; index--) {52 if (tokens[index][0] != Token.COMMENT) {53 break;54 }55 }56 return index;57}58function property(context, tokens, position, lastPropertyAt) {59 var store = context.store;60 var token = tokens[position];61 var isPropertyBlock = token[2][0] == Token.PROPERTY_BLOCK;62 var needsSemicolon;63 if ( context.format ) {64 if ( context.format.semicolonAfterLastProperty || isPropertyBlock ) {65 needsSemicolon = true;66 } else if ( position < lastPropertyAt ) {67 needsSemicolon = true;68 } else {69 needsSemicolon = false;70 }71 } else {72 needsSemicolon = position < lastPropertyAt || isPropertyBlock;73 }74 var isLast = position === lastPropertyAt;75 switch (token[0]) {76 case Token.AT_RULE:77 store(context, token);78 store(context, semicolon(context, Breaks.AfterProperty, false));79 break;80 case Token.AT_RULE_BLOCK:81 rules(context, token[1]);82 store(context, openBrace(context, Breaks.AfterRuleBegins, true));83 body(context, token[2]);84 store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast));85 break;86 case Token.COMMENT:87 store(context, token);88 break;89 case Token.PROPERTY:90 store(context, token[1]);91 store(context, colon(context));92 value(context, token);93 store(context, needsSemicolon ? semicolon(context, Breaks.AfterProperty, isLast) : emptyCharacter);94 break;95 case Token.RAW:96 store(context, token);97 }98}99function value(context, token) {100 var store = context.store;101 var j, m;102 if (token[2][0] == Token.PROPERTY_BLOCK) {103 store(context, openBrace(context, Breaks.AfterBlockBegins, false));104 body(context, token[2][1]);105 store(context, closeBrace(context, Breaks.AfterBlockEnds, false, true));106 } else {107 for (j = 2, m = token.length; j < m; j++) {108 store(context, token[j]);109 if (j < m - 1 && (inFilter(token) || !disallowsSpace(context, token, j))) {110 store(context, Marker.SPACE);111 }112 }113 }114}115function allowsBreak(context, where) {116 return context.format && context.format.breaks[where];117}118function allowsSpace(context, where) {119 return context.format && context.format.spaces[where];120}121function openBrace(context, where, needsPrefixSpace) {122 if (context.format) {123 context.indentBy += context.format.indentBy;124 context.indentWith = context.format.indentWith.repeat(context.indentBy);125 return (needsPrefixSpace && allowsSpace(context, Spaces.BeforeBlockBegins) ? Marker.SPACE : emptyCharacter) +126 Marker.OPEN_CURLY_BRACKET +127 (allowsBreak(context, where) ? context.format.breakWith : emptyCharacter) +128 context.indentWith;129 } else {130 return Marker.OPEN_CURLY_BRACKET;131 }132}133function closeBrace(context, where, beforeBlockEnd, isLast) {134 if (context.format) {135 context.indentBy -= context.format.indentBy;136 context.indentWith = context.format.indentWith.repeat(context.indentBy);137 return (allowsBreak(context, Breaks.AfterProperty) || beforeBlockEnd && allowsBreak(context, Breaks.BeforeBlockEnds) ? context.format.breakWith : emptyCharacter) +138 context.indentWith +139 Marker.CLOSE_CURLY_BRACKET +140 (isLast ? emptyCharacter : (allowsBreak(context, where) ? context.format.breakWith : emptyCharacter) + context.indentWith);141 } else {142 return Marker.CLOSE_CURLY_BRACKET;143 }144}145function colon(context) {146 return context.format ?147 Marker.COLON + (allowsSpace(context, Spaces.BeforeValue) ? Marker.SPACE : emptyCharacter) :148 Marker.COLON;149}150function semicolon(context, where, isLast) {151 return context.format ?152 Marker.SEMICOLON + (isLast || !allowsBreak(context, where) ? emptyCharacter : context.format.breakWith + context.indentWith) :153 Marker.SEMICOLON;154}155function comma(context) {156 return context.format ?157 Marker.COMMA + (allowsBreak(context, Breaks.BetweenSelectors) ? context.format.breakWith : emptyCharacter) + context.indentWith :158 Marker.COMMA;159}160function all(context, tokens) {161 var store = context.store;162 var token;163 var isLast;164 var i, l;165 for (i = 0, l = tokens.length; i < l; i++) {166 token = tokens[i];167 isLast = i == l - 1;168 switch (token[0]) {169 case Token.AT_RULE:170 store(context, token);171 store(context, semicolon(context, Breaks.AfterAtRule, isLast));172 break;173 case Token.AT_RULE_BLOCK:174 rules(context, token[1]);175 store(context, openBrace(context, Breaks.AfterRuleBegins, true));176 body(context, token[2]);177 store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast));178 break;179 case Token.NESTED_BLOCK:180 rules(context, token[1]);181 store(context, openBrace(context, Breaks.AfterBlockBegins, true));182 all(context, token[2]);183 store(context, closeBrace(context, Breaks.AfterBlockEnds, true, isLast));184 break;185 case Token.COMMENT:186 store(context, token);187 store(context, allowsBreak(context, Breaks.AfterComment) ? context.format.breakWith : emptyCharacter);188 break;189 case Token.RAW:190 store(context, token);191 break;192 case Token.RULE:193 rules(context, token[1]);194 store(context, openBrace(context, Breaks.AfterRuleBegins, true));195 body(context, token[2]);196 store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast));197 break;198 }199 }200}201module.exports = {202 all: all,203 body: body,204 property: property,205 rules: rules,206 value: value...
node.js
Source:node.js
1/*2 MIT License http://www.opensource.org/licenses/mit-license.php3 Author Tobias Koppers @sokra4*/5"use strict";6const ResolverFactory = require("./ResolverFactory");7const NodeJsInputFileSystem = require("./NodeJsInputFileSystem");8const CachedInputFileSystem = require("./CachedInputFileSystem");9const nodeFileSystem = new CachedInputFileSystem(new NodeJsInputFileSystem(), 4000);10const nodeContext = {11 environments: [12 "node+es3+es5+process+native"13 ]14};15const asyncResolver = ResolverFactory.createResolver({16 extensions: [".js", ".json", ".node"],17 fileSystem: nodeFileSystem18});19module.exports = function resolve(context, path, request, resolveContext, callback) {20 if(typeof context === "string") {21 callback = resolveContext;22 resolveContext = request;23 request = path;24 path = context;25 context = nodeContext;26 }27 if(typeof callback !== "function") {28 callback = resolveContext;29 }30 asyncResolver.resolve(context, path, request, resolveContext, callback);31};32const syncResolver = ResolverFactory.createResolver({33 extensions: [".js", ".json", ".node"],34 useSyncFileSystemCalls: true,35 fileSystem: nodeFileSystem36});37module.exports.sync = function resolveSync(context, path, request) {38 if(typeof context === "string") {39 request = path;40 path = context;41 context = nodeContext;42 }43 return syncResolver.resolveSync(context, path, request);44};45const asyncContextResolver = ResolverFactory.createResolver({46 extensions: [".js", ".json", ".node"],47 resolveToContext: true,48 fileSystem: nodeFileSystem49});50module.exports.context = function resolveContext(context, path, request, resolveContext, callback) {51 if(typeof context === "string") {52 callback = resolveContext;53 resolveContext = request;54 request = path;55 path = context;56 context = nodeContext;57 }58 if(typeof callback !== "function") {59 callback = resolveContext;60 }61 asyncContextResolver.resolve(context, path, request, resolveContext, callback);62};63const syncContextResolver = ResolverFactory.createResolver({64 extensions: [".js", ".json", ".node"],65 resolveToContext: true,66 useSyncFileSystemCalls: true,67 fileSystem: nodeFileSystem68});69module.exports.context.sync = function resolveContextSync(context, path, request) {70 if(typeof context === "string") {71 request = path;72 path = context;73 context = nodeContext;74 }75 return syncContextResolver.resolveSync(context, path, request);76};77const asyncLoaderResolver = ResolverFactory.createResolver({78 extensions: [".js", ".json", ".node"],79 moduleExtensions: ["-loader"],80 mainFields: ["loader", "main"],81 fileSystem: nodeFileSystem82});83module.exports.loader = function resolveLoader(context, path, request, resolveContext, callback) {84 if(typeof context === "string") {85 callback = resolveContext;86 resolveContext = request;87 request = path;88 path = context;89 context = nodeContext;90 }91 if(typeof callback !== "function") {92 callback = resolveContext;93 }94 asyncLoaderResolver.resolve(context, path, request, resolveContext, callback);95};96const syncLoaderResolver = ResolverFactory.createResolver({97 extensions: [".js", ".json", ".node"],98 moduleExtensions: ["-loader"],99 mainFields: ["loader", "main"],100 useSyncFileSystemCalls: true,101 fileSystem: nodeFileSystem102});103module.exports.loader.sync = function resolveLoaderSync(context, path, request) {104 if(typeof context === "string") {105 request = path;106 path = context;107 context = nodeContext;108 }109 return syncLoaderResolver.resolveSync(context, path, request);110};111module.exports.create = function create(options) {112 options = Object.assign({113 fileSystem: nodeFileSystem114 }, options);115 const resolver = ResolverFactory.createResolver(options);116 return function(context, path, request, resolveContext, callback) {117 if(typeof context === "string") {118 callback = resolveContext;119 resolveContext = request;120 request = path;121 path = context;122 context = nodeContext;123 }124 if(typeof callback !== "function") {125 callback = resolveContext;126 }127 resolver.resolve(context, path, request, resolveContext, callback);128 };129};130module.exports.create.sync = function createSync(options) {131 options = Object.assign({132 useSyncFileSystemCalls: true,133 fileSystem: nodeFileSystem134 }, options);135 const resolver = ResolverFactory.createResolver(options);136 return function(context, path, request) {137 if(typeof context === "string") {138 request = path;139 path = context;140 context = nodeContext;141 }142 return resolver.resolveSync(context, path, request);143 };144};145// Export Resolver, FileSystems and Plugins146module.exports.ResolverFactory = ResolverFactory;147module.exports.NodeJsInputFileSystem = NodeJsInputFileSystem;...
Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const context = await browser.newContext();5 const page = await context.newPage();6 await page.screenshot({ path: 'example.png' });7 await browser.close();8})();9const { chromium } = require('playwright');10(async () => {11 const browser = await chromium.launch();12 const context = await browser.newContext();13 const page = await context.newPage();14 await page.screenshot({ path: 'example.png' });15 await browser.close();16})();17const { chromium } = require('playwright');18(async () => {19 const browser = await chromium.launch();20 const context = await browser.newContext();21 const page = await context.newPage();22 await page.screenshot({ path: 'example.png' });23 await browser.close();24})();25const { chromium } = require('playwright');26(async () => {27 const browser = await chromium.launch();28 const context = await browser.newContext();29 const page = await context.newPage();30 await page.screenshot({ path: 'example.png' });31 await browser.close();32})();33const { chromium } = require('playwright');34(async () => {35 const browser = await chromium.launch();36 const context = await browser.newContext();37 const page = await context.newPage();38 await page.screenshot({ path: 'example.png' });39 await browser.close();40})();41const { chromium } = require('playwright');42(async () => {43 const browser = await chromium.launch();44 const context = await browser.newContext();45 const page = await context.newPage();
Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch({ headless: false });4 const context = await browser.newContext();5 const page = await context.newPage();6 await page.screenshot({ path: `example.png` });7 await browser.close();8})();9const { chromium } = require('playwright');10(async () => {11 const browser = await chromium.launch({ headless: false });12 const context = await browser.newContext();13 const page = await context.newPage();14 await page.screenshot({ path: `example.png` });15 await browser.close();16})();17const { chromium } = require('playwright');18(async () => {19 const browser = await chromium.launch({ headless: false });20 const context = await browser.newContext();21 const page = await context.newPage();22 await page.screenshot({ path: `example.png` });23 await browser.close();24})();25const { chromium } = require('playwright');26(async () => {27 const browser = await chromium.launch({ headless: false });28 const context = await browser.newContext();29 const page = await context.newPage();30 await page.screenshot({ path: `example.png` });31 await browser.close();32})();33const { chromium } = require('playwright');34(async () => {35 const browser = await chromium.launch({ headless: false });36 const context = await browser.newContext();37 const page = await context.newPage();38 await page.screenshot({ path: `example.png` });39 await browser.close();40})();41const { chromium } = require('playwright');42(async () => {43 const browser = await chromium.launch({ headless: false });
Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const context = await browser.newContext();5 await context.close();6 await browser.close();7})();8const { chromium } = require('playwright');9(async () => {10 const browser = await chromium.launch();11 const context = await browser.newContext();12 await context.close();13 await browser.close();14})();15const { chromium } = require('playwright');16(async () => {17 const browser = await chromium.launch();18 const context = await browser.newContext();19 await context.close();20 await browser.close();21})();22const { chromium } = require('playwright');23(async () => {24 const browser = await chromium.launch();25 const context = await browser.newContext();26 await context.close();27 await browser.close();28})();29const { chromium } = require('playwright');30(async () => {31 const browser = await chromium.launch();32 const context = await browser.newContext();33 await context.close();34 await browser.close();35})();36const { chromium } = require('playwright');37(async () => {38 const browser = await chromium.launch();39 const context = await browser.newContext();40 await context.close();41 await browser.close();42})();43const { chromium } = require('playwright');44(async () => {45 const browser = await chromium.launch();46 const context = await browser.newContext();47 await context.close();48 await browser.close();49})();50const { chromium } = require('playwright');51(async () => {52 const browser = await chromium.launch();53 const context = await browser.newContext();54 await context.close();
Using AI Code Generation
1const { context } = require('playwright');2(async () => {3 const browser = await context.newBrowser();4 const page = await browser.newPage();5 await page.screenshot({ path: 'example.png' });6 await browser.close();7})();8module.exports = {9 use: {10 internal: {11 context: require('test.js'),12 },13 },14};
Using AI Code Generation
1const { context } = require('playwright');2const { chromium } = require('playwright');3const { firefox } = require('playwright');4const { webkit } = require('playwright');5const { devices } = require('playwright');6const { expect } = require('playwright');7const { expect as chaiExpect } = require('chai');8const { assert } = require('chai');9const { test } = require('playwright');10const { context } = require('playwright');11const { chromium } = require('playwright');12const { firefox } = require('playwright');13const { webkit } = require('playwright');14const { devices } = require('playwright');15const { expect } = require('playwright');16const { expect as chaiExpect } = require('chai');17const { assert } = require('chai');18const { test } = require('playwright');19const { context } = require('playwright');20const { chromium } = require('playwright');21const { firefox } = require('playwright');22const { webkit } = require('playwright');23const { devices } = require('playwright');24const { expect } = require('playwright');25const { expect as chaiExpect } = require('chai');26const { assert } = require('chai');27const { test } = require('playwright');28const { context } = require('playwright');29const { chromium } = require('playwright');30const { firefox } = require('playwright');31const { webkit } = require('playwright');32const { devices } = require('playwright');33const { expect } = require('playwright');34const { expect as chaiExpect } = require('chai');35const { assert } = require('chai');36const { test } = require('playwright');37const { context } = require('playwright');38const { chromium } = require('playwright');39const { firefox } = require('playwright');40const { webkit } = require('playwright');41const { devices } = require('playwright');42const { expect } = require('playwright');43const { expect as chaiExpect } = require('chai');44const { assert } = require('chai
Using AI Code Generation
1const { chromium } = require('playwright');2const context = await chromium.launchPersistentContext(userDataDir, { headless: false });3const page = await context.newPage();4await page.screenshot({ path: `example.png` });5await context.close();6const { chromium } = require('playwright');7const browser = await chromium.launch({ headless: false });8const context = await browser.newContext({ userDataDir });9const page = await context.newPage();10await page.screenshot({ path: `example.png` });11await context.close();12const { chromium } = require('playwright');13const browser = await chromium.launch({ headless: false, userDataDir });14const page = await browser.newPage();15await page.screenshot({ path: `example.png` });16await browser.close();17const { chromium } = require('playwright');18const browser = await chromium.launchPersistentContext(userDataDir, { headless: false });19const page = await browser.newPage();20await page.screenshot({ path: `example.png` });21await browser.close();22const { chromium } = require('playwright');23const browserServer = await chromium.launchServer({ headless: false, userDataDir });24const browserURL = browserServer.wsEndpoint();25const browser = await chromium.connect({ wsEndpoint: browserURL });26const page = await browser.newPage();27await page.screenshot({ path: `example.png` });28await browser.close();29await browserServer.close();30const { chromium } = require('playwright');31const browserServer = await chromium.launchPersistentServer(userDataDir, { headless: false });32const browserURL = browserServer.wsEndpoint();33const browser = await chromium.connect({ wsEndpoint: browserURL });34const page = await browser.newPage();35await page.screenshot({ path: `example.png` });36await browser.close();37await browserServer.close();
Using AI Code Generation
1const { test, expect } = require('@playwright/test');2test('should be able to use context method of Playwright Internal Module', async ({ context }) => {3 const page = await context.newPage();4 const title = await page.title();5 expect(title).toBe('Playwright');6});
Using AI Code Generation
1const { context } = require('@playwright/test');2const { page } = require('@playwright/test');3const browser = await context.launch();4const page = await context.newPage();5await browser.close();6const browser = await context.launch();7const page = await context.newPage();8await browser.close();9const browser = await context.launch();10const page = await context.newPage();11await browser.close();12const browser = await context.launch();13const page = await context.newPage();14await browser.close();15const browser = await context.launch();16const page = await context.newPage();17await browser.close();18const browser = await context.launch();19const page = await context.newPage();20await browser.close();21const browser = await context.launch();22const page = await context.newPage();23await browser.close();24const browser = await context.launch();25const page = await context.newPage();
Using AI Code Generation
1const { context } = require('@playwright/test');2const { chromium } = require('playwright');3module.exports = {4 use: {5 viewport: { width: 1280, height: 720 },6 launchOptions: {7 },8 },9 {10 use: {11 },12 },13 {14 use: {15 },16 },17 {18 use: {19 },20 },21};22const { test } = require('@playwright/test');23test('My first test', async ({ page }) => {24 const title = page.locator('text=Playwright');25 await title.waitFor();26});27const { test } = require('@playwright/test');28test('My second test', async ({ page }) => {29 const title = page.locator('text=Playwright');30 await title.waitFor();31});32const { test } = require('@playwright/test');33test('My third test', async ({ page }) => {34 const title = page.locator('text=Playwright');35 await title.waitFor();36});37const { test } = require('@playwright/test');38test('My fourth test', async ({ page }) => {39 const title = page.locator('text=Playwright');40 await title.waitFor();41});42const { test } = require('@playwright/test');43test('My fifth test', async ({ page }) => {44 const title = page.locator('text=Playwright');
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!